diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..fe312261 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +# +root = true + +[*.js] +indent_style = space +indent_size = 2 + +[*.php] +indent_style = space +indent_size = 4 + +[Makefile] +indent_style = tab + +# Matches the exact files either package.json or .travis.yml +[{package.json, .travis.yml}] +indent_style = space +indent_size = 2 diff --git a/.eslintrc b/.eslintrc index 2ab1039a..b4aef794 100644 --- a/.eslintrc +++ b/.eslintrc @@ -2,13 +2,16 @@ "extends": "airbnb", "env": { "es6": true, - "mocha": true + "browser": true }, "parserOptions": { "ecmaVersion": 8 }, "rules": { "camelcase": 0, + "no-console": 0, + "func-names": 0, + "prefer-object-spread": 0, "no-param-reassign": [ 2, { diff --git a/.travis/deploy_script.sh b/.travis/deploy_script.sh index ee9d3dfb..b6e44610 100755 --- a/.travis/deploy_script.sh +++ b/.travis/deploy_script.sh @@ -14,7 +14,7 @@ if [ "$TRAVIS" = "true" ]; then exit 0; fi; - BASE_VERSION=`php artisan phpvms:version --base-only` + BASE_VERSION=$(php artisan phpvms:version --base-only) PKG_NAME=${BASE_VERSION}-${TRAVIS_BRANCH} fi @@ -23,7 +23,7 @@ if [ "$TRAVIS" = "true" ]; then echo "Writing $TAR_NAME" php artisan phpvms:version --write > VERSION - VERSION=`cat VERSION` + VERSION=$(cat VERSION) echo "Version: $VERSION" echo "Cleaning files" @@ -59,6 +59,7 @@ if [ "$TRAVIS" = "true" ]; then tests _ide_helper.php .dpl + .editorconfig .eslintignore .eslintrc .php_cs diff --git a/app/Http/Controllers/Admin/PirepController.php b/app/Http/Controllers/Admin/PirepController.php index 8748fd4f..1549a96c 100644 --- a/app/Http/Controllers/Admin/PirepController.php +++ b/app/Http/Controllers/Admin/PirepController.php @@ -181,6 +181,7 @@ class PirepController extends Controller Log::info('aircraft', $aircraft->toArray()); return view('admin.pireps.fares', [ + 'pirep' => null, 'aircraft' => $aircraft, 'read_only' => false, ]); diff --git a/app/Http/Controllers/Api/AcarsController.php b/app/Http/Controllers/Api/AcarsController.php index 9ff26e0b..0957a0f5 100644 --- a/app/Http/Controllers/Api/AcarsController.php +++ b/app/Http/Controllers/Api/AcarsController.php @@ -73,8 +73,8 @@ class AcarsController extends Controller $pireps = $this->acarsRepo->getPositions(setting('acars.live_time')); $positions = $this->geoSvc->getFeatureForLiveFlights($pireps); - return response(json_encode($positions), 200, [ - 'Content-type' => 'application/json', + return response()->json([ + 'data' => $positions, ]); } @@ -84,15 +84,15 @@ class AcarsController extends Controller * @param $pirep_id * @param Request $request * - * @return \Illuminate\Contracts\Routing\ResponseFactory + * @return \Illuminate\Http\JsonResponse */ public function acars_geojson($pirep_id, Request $request) { $pirep = Pirep::find($pirep_id); $geodata = $this->geoSvc->getFeatureFromAcars($pirep); - return response(\json_encode($geodata), 200, [ - 'Content-Type' => 'application/json', + return response()->json([ + 'data' => $geodata, ]); } diff --git a/app/Http/Controllers/Api/PirepController.php b/app/Http/Controllers/Api/PirepController.php index 2cd6205b..f6ac21c5 100644 --- a/app/Http/Controllers/Api/PirepController.php +++ b/app/Http/Controllers/Api/PirepController.php @@ -505,6 +505,7 @@ class PirepController extends Controller public function route_get($id, Request $request) { $pirep = Pirep::find($id); + return AcarsRouteResource::collection(Acars::where([ 'pirep_id' => $id, 'type' => AcarsType::ROUTE, diff --git a/app/Http/Resources/PirepFieldCollection.php b/app/Http/Resources/PirepFieldCollection.php index fe89e12f..03634562 100644 --- a/app/Http/Resources/PirepFieldCollection.php +++ b/app/Http/Resources/PirepFieldCollection.php @@ -4,9 +4,6 @@ namespace App\Http\Resources; use Illuminate\Http\Resources\Json\ResourceCollection; -/** - * Class PirepFieldCollection - */ class PirepFieldCollection extends ResourceCollection { public function toArray($request) diff --git a/package.json b/package.json index 586858f7..4d517520 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,12 @@ }, "devDependencies": { "copy-webpack-plugin": "^4.6.0", + "eslint": "^6.2.2", + "eslint-config-airbnb": "^18.0.1", + "eslint-config-airbnb-base": "^14.0.0", + "eslint-plugin-import": "^2.18.2", + "eslint-plugin-jsx-a11y": "^6.2.3", + "eslint-plugin-react": "^7.14.3", "tailwindcss": "^0.5.3", "webpack-bundle-analyzer": "^3.3", "webpack-dev-server": "^3.1.11" diff --git a/public/assets/admin/js/app.js b/public/assets/admin/js/app.js index 2e1b4522..db433efe 100644 --- a/public/assets/admin/js/app.js +++ b/public/assets/admin/js/app.js @@ -271,17 +271,24 @@ eval("/*!\n * Determine if an object is a Buffer\n *\n * @author Feross Aboukh /***/ }), -/***/ "./node_modules/babel-runtime/regenerator/index.js": +/***/ "./node_modules/babel-runtime/node_modules/regenerator-runtime/runtime-module.js": /***/ (function(module, exports, __webpack_require__) { -eval("module.exports = __webpack_require__(\"./node_modules/regenerator-runtime/runtime-module.js\");\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvci9pbmRleC5qcz81ZjE2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQixtQkFBTyxDQUFDLHNEQUFxQiIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL3JlZ2VuZXJhdG9yL2luZGV4LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZVwiKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3IvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3IvaW5kZXguanNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/babel-runtime/regenerator/index.js\n"); +eval("/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n// This method of obtaining a reference to the global object needs to be\n// kept identical to the way it is obtained in runtime.js\nvar g = (function() { return this })() || Function(\"return this\")();\n\n// Use `getOwnPropertyNames` because not all browsers support calling\n// `hasOwnProperty` on the global `self` object in a worker. See #183.\nvar hadRuntime = g.regeneratorRuntime &&\n Object.getOwnPropertyNames(g).indexOf(\"regeneratorRuntime\") >= 0;\n\n// Save the old regeneratorRuntime in case it needs to be restored later.\nvar oldRuntime = hadRuntime && g.regeneratorRuntime;\n\n// Force reevalutation of runtime.js.\ng.regeneratorRuntime = undefined;\n\nmodule.exports = __webpack_require__(\"./node_modules/babel-runtime/node_modules/regenerator-runtime/runtime.js\");\n\nif (hadRuntime) {\n // Restore the original runtime.\n g.regeneratorRuntime = oldRuntime;\n} else {\n // Remove the global property added by runtime.js.\n try {\n delete g.regeneratorRuntime;\n } catch(e) {\n g.regeneratorRuntime = undefined;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLW1vZHVsZS5qcz9kNDdlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCLGNBQWM7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQywwRUFBVzs7QUFFcEM7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLW1vZHVsZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuLy8gVGhpcyBtZXRob2Qgb2Ygb2J0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0IG5lZWRzIHRvIGJlXG4vLyBrZXB0IGlkZW50aWNhbCB0byB0aGUgd2F5IGl0IGlzIG9idGFpbmVkIGluIHJ1bnRpbWUuanNcbnZhciBnID0gKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcyB9KSgpIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcblxuLy8gVXNlIGBnZXRPd25Qcm9wZXJ0eU5hbWVzYCBiZWNhdXNlIG5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCBjYWxsaW5nXG4vLyBgaGFzT3duUHJvcGVydHlgIG9uIHRoZSBnbG9iYWwgYHNlbGZgIG9iamVjdCBpbiBhIHdvcmtlci4gU2VlICMxODMuXG52YXIgaGFkUnVudGltZSA9IGcucmVnZW5lcmF0b3JSdW50aW1lICYmXG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGcpLmluZGV4T2YoXCJyZWdlbmVyYXRvclJ1bnRpbWVcIikgPj0gMDtcblxuLy8gU2F2ZSB0aGUgb2xkIHJlZ2VuZXJhdG9yUnVudGltZSBpbiBjYXNlIGl0IG5lZWRzIHRvIGJlIHJlc3RvcmVkIGxhdGVyLlxudmFyIG9sZFJ1bnRpbWUgPSBoYWRSdW50aW1lICYmIGcucmVnZW5lcmF0b3JSdW50aW1lO1xuXG4vLyBGb3JjZSByZWV2YWx1dGF0aW9uIG9mIHJ1bnRpbWUuanMuXG5nLnJlZ2VuZXJhdG9yUnVudGltZSA9IHVuZGVmaW5lZDtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi9ydW50aW1lXCIpO1xuXG5pZiAoaGFkUnVudGltZSkge1xuICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBydW50aW1lLlxuICBnLnJlZ2VuZXJhdG9yUnVudGltZSA9IG9sZFJ1bnRpbWU7XG59IGVsc2Uge1xuICAvLyBSZW1vdmUgdGhlIGdsb2JhbCBwcm9wZXJ0eSBhZGRlZCBieSBydW50aW1lLmpzLlxuICB0cnkge1xuICAgIGRlbGV0ZSBnLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgfSBjYXRjaChlKSB7XG4gICAgZy5yZWdlbmVyYXRvclJ1bnRpbWUgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS1tb2R1bGUuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS1tb2R1bGUuanNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/babel-runtime/node_modules/regenerator-runtime/runtime-module.js\n"); /***/ }), -/***/ "./node_modules/geolib/dist/geolib.js": +/***/ "./node_modules/babel-runtime/node_modules/regenerator-runtime/runtime.js": +/***/ (function(module, exports) { + +eval("/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n!(function(global) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // In sloppy mode, unbound `this` refers to the global object, fallback to\n // Function constructor if we're in global strict mode. That is sadly a form\n // of indirect eval which violates Content Security Policy.\n (function() { return this })() || Function(\"return this\")()\n);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzPzFlMTMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsS0FBSztBQUNMLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBLHdDQUF3QyxXQUFXO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW9DLGNBQWM7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlDQUFpQyxrQkFBa0I7QUFDbkQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGlCQUFpQjtBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsOENBQThDLFFBQVE7QUFDdEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUEsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsOENBQThDLFFBQVE7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxlQUFlLGNBQWM7QUFDN0IiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4hKGZ1bmN0aW9uKGdsb2JhbCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgT3AgPSBPYmplY3QucHJvdG90eXBlO1xuICB2YXIgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHk7XG4gIHZhciB1bmRlZmluZWQ7IC8vIE1vcmUgY29tcHJlc3NpYmxlIHRoYW4gdm9pZCAwLlxuICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbCA6IHt9O1xuICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiO1xuICB2YXIgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiO1xuICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuXG4gIHZhciBpbk1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCI7XG4gIHZhciBydW50aW1lID0gZ2xvYmFsLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgaWYgKHJ1bnRpbWUpIHtcbiAgICBpZiAoaW5Nb2R1bGUpIHtcbiAgICAgIC8vIElmIHJlZ2VuZXJhdG9yUnVudGltZSBpcyBkZWZpbmVkIGdsb2JhbGx5IGFuZCB3ZSdyZSBpbiBhIG1vZHVsZSxcbiAgICAgIC8vIG1ha2UgdGhlIGV4cG9ydHMgb2JqZWN0IGlkZW50aWNhbCB0byByZWdlbmVyYXRvclJ1bnRpbWUuXG4gICAgICBtb2R1bGUuZXhwb3J0cyA9IHJ1bnRpbWU7XG4gICAgfVxuICAgIC8vIERvbid0IGJvdGhlciBldmFsdWF0aW5nIHRoZSByZXN0IG9mIHRoaXMgZmlsZSBpZiB0aGUgcnVudGltZSB3YXNcbiAgICAvLyBhbHJlYWR5IGRlZmluZWQgZ2xvYmFsbHkuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRGVmaW5lIHRoZSBydW50aW1lIGdsb2JhbGx5IChhcyBleHBlY3RlZCBieSBnZW5lcmF0ZWQgY29kZSkgYXMgZWl0aGVyXG4gIC8vIG1vZHVsZS5leHBvcnRzIChpZiB3ZSdyZSBpbiBhIG1vZHVsZSkgb3IgYSBuZXcsIGVtcHR5IG9iamVjdC5cbiAgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWUgPSBpbk1vZHVsZSA/IG1vZHVsZS5leHBvcnRzIDoge307XG5cbiAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIC8vIElmIG91dGVyRm4gcHJvdmlkZWQgYW5kIG91dGVyRm4ucHJvdG90eXBlIGlzIGEgR2VuZXJhdG9yLCB0aGVuIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yLlxuICAgIHZhciBwcm90b0dlbmVyYXRvciA9IG91dGVyRm4gJiYgb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBvdXRlckZuIDogR2VuZXJhdG9yO1xuICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSk7XG4gICAgdmFyIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7XG5cbiAgICAvLyBUaGUgLl9pbnZva2UgbWV0aG9kIHVuaWZpZXMgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzLlxuICAgIGdlbmVyYXRvci5faW52b2tlID0gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH1cbiAgcnVudGltZS53cmFwID0gd3JhcDtcblxuICAvLyBUcnkvY2F0Y2ggaGVscGVyIHRvIG1pbmltaXplIGRlb3B0aW1pemF0aW9ucy4gUmV0dXJucyBhIGNvbXBsZXRpb25cbiAgLy8gcmVjb3JkIGxpa2UgY29udGV4dC50cnlFbnRyaWVzW2ldLmNvbXBsZXRpb24uIFRoaXMgaW50ZXJmYWNlIGNvdWxkXG4gIC8vIGhhdmUgYmVlbiAoYW5kIHdhcyBwcmV2aW91c2x5KSBkZXNpZ25lZCB0byB0YWtlIGEgY2xvc3VyZSB0byBiZVxuICAvLyBpbnZva2VkIHdpdGhvdXQgYXJndW1lbnRzLCBidXQgaW4gYWxsIHRoZSBjYXNlcyB3ZSBjYXJlIGFib3V0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBtZXRob2Qgd2Ugd2FudCB0byBjYWxsLCBzbyB0aGVyZSdzIG5vIG5lZWRcbiAgLy8gdG8gY3JlYXRlIGEgbmV3IGZ1bmN0aW9uIG9iamVjdC4gV2UgY2FuIGV2ZW4gZ2V0IGF3YXkgd2l0aCBhc3N1bWluZ1xuICAvLyB0aGUgbWV0aG9kIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50LCBzaW5jZSB0aGF0IGhhcHBlbnMgdG8gYmUgdHJ1ZVxuICAvLyBpbiBldmVyeSBjYXNlLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHRvdWNoIHRoZSBhcmd1bWVudHMgb2JqZWN0LiBUaGVcbiAgLy8gb25seSBhZGRpdGlvbmFsIGFsbG9jYXRpb24gcmVxdWlyZWQgaXMgdGhlIGNvbXBsZXRpb24gcmVjb3JkLCB3aGljaFxuICAvLyBoYXMgYSBzdGFibGUgc2hhcGUgYW5kIHNvIGhvcGVmdWxseSBzaG91bGQgYmUgY2hlYXAgdG8gYWxsb2NhdGUuXG4gIGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcIm5vcm1hbFwiLCBhcmc6IGZuLmNhbGwob2JqLCBhcmcpIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInRocm93XCIsIGFyZzogZXJyIH07XG4gICAgfVxuICB9XG5cbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkU3RhcnQgPSBcInN1c3BlbmRlZFN0YXJ0XCI7XG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkID0gXCJzdXNwZW5kZWRZaWVsZFwiO1xuICB2YXIgR2VuU3RhdGVFeGVjdXRpbmcgPSBcImV4ZWN1dGluZ1wiO1xuICB2YXIgR2VuU3RhdGVDb21wbGV0ZWQgPSBcImNvbXBsZXRlZFwiO1xuXG4gIC8vIFJldHVybmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBpbm5lckZuIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXNcbiAgLy8gYnJlYWtpbmcgb3V0IG9mIHRoZSBkaXNwYXRjaCBzd2l0Y2ggc3RhdGVtZW50LlxuICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9O1xuXG4gIC8vIER1bW15IGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyB0aGF0IHdlIHVzZSBhcyB0aGUgLmNvbnN0cnVjdG9yIGFuZFxuICAvLyAuY29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMgZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0cy4gRm9yIGZ1bGwgc3BlYyBjb21wbGlhbmNlLCB5b3UgbWF5IHdpc2ggdG8gY29uZmlndXJlIHlvdXJcbiAgLy8gbWluaWZpZXIgbm90IHRvIG1hbmdsZSB0aGUgbmFtZXMgb2YgdGhlc2UgdHdvIGZ1bmN0aW9ucy5cbiAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9XG5cbiAgLy8gVGhpcyBpcyBhIHBvbHlmaWxsIGZvciAlSXRlcmF0b3JQcm90b3R5cGUlIGZvciBlbnZpcm9ubWVudHMgdGhhdFxuICAvLyBkb24ndCBuYXRpdmVseSBzdXBwb3J0IGl0LlxuICB2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcbiAgSXRlcmF0b3JQcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiAgdmFyIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpO1xuICBpZiAoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiZcbiAgICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJlxuICAgICAgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSkge1xuICAgIC8vIFRoaXMgZW52aXJvbm1lbnQgaGFzIGEgbmF0aXZlICVJdGVyYXRvclByb3RvdHlwZSU7IHVzZSBpdCBpbnN0ZWFkXG4gICAgLy8gb2YgdGhlIHBvbHlmaWxsLlxuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cblxuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPVxuICAgIEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR3AuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvbjtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGVbdG9TdHJpbmdUYWdTeW1ib2xdID1cbiAgICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcblxuICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLlxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICBwcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKGFyZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBydW50aW1lLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGlmICghKHRvU3RyaW5nVGFnU3ltYm9sIGluIGdlbkZ1bikpIHtcbiAgICAgICAgZ2VuRnVuW3RvU3RyaW5nVGFnU3ltYm9sXSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgIHJldHVybiBnZW5GdW47XG4gIH07XG5cbiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvXG4gIC8vIGB5aWVsZCByZWdlbmVyYXRvclJ1bnRpbWUuYXdyYXAoeClgLCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiB0ZXN0XG4gIC8vIGBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpYCB0byBkZXRlcm1pbmUgaWYgdGhlIHlpZWxkZWQgdmFsdWUgaXNcbiAgLy8gbWVhbnQgdG8gYmUgYXdhaXRlZC5cbiAgcnVudGltZS5hd3JhcCA9IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB7IF9fYXdhaXQ6IGFyZyB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJ0aHJvd1wiLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uKHVud3JhcHBlZCkge1xuICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzXG4gICAgICAgICAgLy8gdGhlIC52YWx1ZSBvZiB0aGUgUHJvbWlzZTx7dmFsdWUsZG9uZX0+IHJlc3VsdCBmb3IgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCBpdGVyYXRpb24uIElmIHRoZSBQcm9taXNlIGlzIHJlamVjdGVkLCBob3dldmVyLCB0aGVcbiAgICAgICAgICAvLyByZXN1bHQgZm9yIHRoaXMgaXRlcmF0aW9uIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCB0aGUgc2FtZVxuICAgICAgICAgIC8vIHJlYXNvbi4gTm90ZSB0aGF0IHJlamVjdGlvbnMgb2YgeWllbGRlZCBQcm9taXNlcyBhcmUgbm90XG4gICAgICAgICAgLy8gdGhyb3duIGJhY2sgaW50byB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBhcyBpcyB0aGUgY2FzZVxuICAgICAgICAgIC8vIHdoZW4gYW4gYXdhaXRlZCBQcm9taXNlIGlzIHJlamVjdGVkLiBUaGlzIGRpZmZlcmVuY2UgaW5cbiAgICAgICAgICAvLyBiZWhhdmlvciBiZXR3ZWVuIHlpZWxkIGFuZCBhd2FpdCBpcyBpbXBvcnRhbnQsIGJlY2F1c2UgaXRcbiAgICAgICAgICAvLyBhbGxvd3MgdGhlIGNvbnN1bWVyIHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggdGhlIHlpZWxkZWRcbiAgICAgICAgICAvLyByZWplY3Rpb24gKHN3YWxsb3cgaXQgYW5kIGNvbnRpbnVlLCBtYW51YWxseSAudGhyb3cgaXQgYmFja1xuICAgICAgICAgIC8vIGludG8gdGhlIGdlbmVyYXRvciwgYWJhbmRvbiBpdGVyYXRpb24sIHdoYXRldmVyKS4gV2l0aFxuICAgICAgICAgIC8vIGF3YWl0LCBieSBjb250cmFzdCwgdGhlcmUgaXMgbm8gb3Bwb3J0dW5pdHkgdG8gZXhhbWluZSB0aGVcbiAgICAgICAgICAvLyByZWplY3Rpb24gcmVhc29uIG91dHNpZGUgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiwgc28gdGhlXG4gICAgICAgICAgLy8gb25seSBvcHRpb24gaXMgdG8gdGhyb3cgaXQgZnJvbSB0aGUgYXdhaXQgZXhwcmVzc2lvbiwgYW5kXG4gICAgICAgICAgLy8gbGV0IHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gaGFuZGxlIHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkO1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykge1xuICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID1cbiAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKFxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLFxuICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyXG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnXG4gICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiAoc2VlIGRlZmluZUl0ZXJhdG9yTWV0aG9kcykuXG4gICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTtcbiAgfVxuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7XG4gIEFzeW5jSXRlcmF0b3IucHJvdG90eXBlW2FzeW5jSXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBydW50aW1lLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBydW50aW1lLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKFxuICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdClcbiAgICApO1xuXG4gICAgcmV0dXJuIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXliZUludm9rZURlbGVnYXRlKGNvbnRleHQpIGNoYW5nZWQgY29udGV4dC5tZXRob2QgZnJvbVxuICAgICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCEgaW5mbykge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKTtcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgIC8vIHZhcmlhYmxlIHNwZWNpZmllZCBieSBkZWxlZ2F0ZS5yZXN1bHROYW1lIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcblxuICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcblxuICAgICAgLy8gSWYgY29udGV4dC5tZXRob2Qgd2FzIFwidGhyb3dcIiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlXG4gICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmXG4gICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgLy8gXCJjb25zdW1lZFwiIGJ5IHRoZSBkZWxlZ2F0ZSBpdGVyYXRvci4gSWYgY29udGV4dC5tZXRob2Qgd2FzXG4gICAgICAvLyBcInJldHVyblwiLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZVxuICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlLXlpZWxkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGRlbGVnYXRlIG1ldGhvZC5cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoXG4gICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci5cbiAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBHcFt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvclwiO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIHJ1bnRpbWUua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBydW50aW1lLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xufSkoXG4gIC8vIEluIHNsb3BweSBtb2RlLCB1bmJvdW5kIGB0aGlzYCByZWZlcnMgdG8gdGhlIGdsb2JhbCBvYmplY3QsIGZhbGxiYWNrIHRvXG4gIC8vIEZ1bmN0aW9uIGNvbnN0cnVjdG9yIGlmIHdlJ3JlIGluIGdsb2JhbCBzdHJpY3QgbW9kZS4gVGhhdCBpcyBzYWRseSBhIGZvcm1cbiAgLy8gb2YgaW5kaXJlY3QgZXZhbCB3aGljaCB2aW9sYXRlcyBDb250ZW50IFNlY3VyaXR5IFBvbGljeS5cbiAgKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcyB9KSgpIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKVxuKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/babel-runtime/node_modules/regenerator-runtime/runtime.js\n"); + +/***/ }), + +/***/ "./node_modules/babel-runtime/regenerator/index.js": /***/ (function(module, exports, __webpack_require__) { -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! geolib 2.0.23 by Manuel Bieh\r\n* Library to provide geo functions like distance calculation,\r\n* conversion of decimal coordinates to sexagesimal and vice versa, etc.\r\n* WGS 84 (World Geodetic System 1984)\r\n* \r\n* @author Manuel Bieh\r\n* @url http://www.manuelbieh.com/\r\n* @version 2.0.23\r\n* @license MIT \r\n**/;(function(global, undefined) {\n\n \"use strict\";\n\n function Geolib() {}\n\n // Constants\n Geolib.TO_RAD = Math.PI / 180;\n Geolib.TO_DEG = 180 / Math.PI;\n Geolib.PI_X2 = Math.PI * 2;\n Geolib.PI_DIV4 = Math.PI / 4;\n\n // Setting readonly defaults\n var geolib = Object.create(Geolib.prototype, {\n version: {\n value: \"2.0.23\"\n },\n radius: {\n value: 6378137\n },\n minLat: {\n value: -90\n },\n maxLat: {\n value: 90\n },\n minLon: {\n value: -180\n },\n maxLon: {\n value: 180\n },\n sexagesimalPattern: {\n value: /^([0-9]{1,3})°\\s*([0-9]{1,3}(?:\\.(?:[0-9]{1,2}))?)'\\s*(([0-9]{1,3}(\\.([0-9]{1,4}))?)\"\\s*)?([NEOSW]?)$/\n },\n measures: {\n value: Object.create(Object.prototype, {\n \"m\" : {value: 1},\n \"km\": {value: 0.001},\n \"cm\": {value: 100},\n \"mm\": {value: 1000},\n \"mi\": {value: (1 / 1609.344)},\n \"sm\": {value: (1 / 1852.216)},\n \"ft\": {value: (100 / 30.48)},\n \"in\": {value: (100 / 2.54)},\n \"yd\": {value: (1 / 0.9144)}\n })\n },\n prototype: {\n value: Geolib.prototype\n },\n extend: {\n value: function(methods, overwrite) {\n for(var prop in methods) {\n if(typeof geolib.prototype[prop] === 'undefined' || overwrite === true) {\n if(typeof methods[prop] === 'function' && typeof methods[prop].bind === 'function') {\n geolib.prototype[prop] = methods[prop].bind(geolib);\n } else {\n geolib.prototype[prop] = methods[prop];\n }\n }\n }\n }\n }\n });\n\n if (typeof(Number.prototype.toRad) === 'undefined') {\n Number.prototype.toRad = function() {\n return this * Geolib.TO_RAD;\n };\n }\n\n if (typeof(Number.prototype.toDeg) === 'undefined') {\n Number.prototype.toDeg = function() {\n return this * Geolib.TO_DEG;\n };\n }\n\n // Here comes the magic\n geolib.extend({\n\n decimal: {},\n\n sexagesimal: {},\n\n distance: null,\n\n getKeys: function(point) {\n\n // GeoJSON Array [longitude, latitude(, elevation)]\n if(Object.prototype.toString.call(point) == '[object Array]') {\n\n return {\n longitude: point.length >= 1 ? 0 : undefined,\n latitude: point.length >= 2 ? 1 : undefined,\n elevation: point.length >= 3 ? 2 : undefined\n };\n\n }\n\n var getKey = function(possibleValues) {\n\n var key;\n\n possibleValues.every(function(val) {\n // TODO: check if point is an object\n if(typeof point != 'object') {\n return true;\n }\n return point.hasOwnProperty(val) ? (function() { key = val; return false; }()) : true;\n });\n\n return key;\n\n };\n\n var longitude = getKey(['lng', 'lon', 'longitude']);\n var latitude = getKey(['lat', 'latitude']);\n var elevation = getKey(['alt', 'altitude', 'elevation', 'elev']);\n\n // return undefined if not at least one valid property was found\n if(typeof latitude == 'undefined' &&\n typeof longitude == 'undefined' &&\n typeof elevation == 'undefined') {\n return undefined;\n }\n\n return {\n latitude: latitude,\n longitude: longitude,\n elevation: elevation\n };\n\n },\n\n // returns latitude of a given point, converted to decimal\n // set raw to true to avoid conversion\n getLat: function(point, raw) {\n return raw === true ? point[this.getKeys(point).latitude] : this.useDecimal(point[this.getKeys(point).latitude]);\n },\n\n // Alias for getLat\n latitude: function(point) {\n return this.getLat.call(this, point);\n },\n\n // returns longitude of a given point, converted to decimal\n // set raw to true to avoid conversion\n getLon: function(point, raw) {\n return raw === true ? point[this.getKeys(point).longitude] : this.useDecimal(point[this.getKeys(point).longitude]);\n },\n\n // Alias for getLon\n longitude: function(point) {\n return this.getLon.call(this, point);\n },\n\n getElev: function(point) {\n return point[this.getKeys(point).elevation];\n },\n\n // Alias for getElev\n elevation: function(point) {\n return this.getElev.call(this, point);\n },\n\n coords: function(point, raw) {\n\n var retval = {\n latitude: raw === true ? point[this.getKeys(point).latitude] : this.useDecimal(point[this.getKeys(point).latitude]),\n longitude: raw === true ? point[this.getKeys(point).longitude] : this.useDecimal(point[this.getKeys(point).longitude])\n };\n\n var elev = point[this.getKeys(point).elevation];\n\n if(typeof elev !== 'undefined') {\n retval['elevation'] = elev;\n }\n\n return retval;\n\n },\n\n // Alias for coords\n ll: function(point, raw) {\n return this.coords.call(this, point, raw);\n },\n\n\n // checks if a variable contains a valid latlong object\n validate: function(point) {\n\n var keys = this.getKeys(point);\n\n if(typeof keys === 'undefined' || typeof keys.latitude === 'undefined' || keys.longitude === 'undefined') {\n return false;\n }\n\n var lat = point[keys.latitude];\n var lng = point[keys.longitude];\n\n if(typeof lat === 'undefined' || !this.isDecimal(lat) && !this.isSexagesimal(lat)) {\n return false;\n }\n\n if(typeof lng === 'undefined' || !this.isDecimal(lng) && !this.isSexagesimal(lng)) {\n return false;\n }\n\n lat = this.useDecimal(lat);\n lng = this.useDecimal(lng);\n\n if(lat < this.minLat || lat > this.maxLat || lng < this.minLon || lng > this.maxLon) {\n return false;\n }\n\n return true;\n\n },\n\n /**\n * Calculates geodetic distance between two points specified by latitude/longitude using\n * Vincenty inverse formula for ellipsoids\n * Vincenty Inverse Solution of Geodesics on the Ellipsoid (c) Chris Veness 2002-2010\n * (Licensed under CC BY 3.0)\n *\n * @param object Start position {latitude: 123, longitude: 123}\n * @param object End position {latitude: 123, longitude: 123}\n * @param integer Accuracy (in meters)\n * @param integer Precision (in decimal cases)\n * @return integer Distance (in meters)\n */\n getDistance: function(start, end, accuracy, precision) {\n\n accuracy = Math.floor(accuracy) || 1;\n precision = Math.floor(precision) || 0;\n\n var s = this.coords(start);\n var e = this.coords(end);\n\n var a = 6378137, b = 6356752.314245, f = 1/298.257223563; // WGS-84 ellipsoid params\n var L = (e['longitude']-s['longitude']).toRad();\n\n var cosSigma, sigma, sinAlpha, cosSqAlpha, cos2SigmaM, sinSigma;\n\n var U1 = Math.atan((1-f) * Math.tan(parseFloat(s['latitude']).toRad()));\n var U2 = Math.atan((1-f) * Math.tan(parseFloat(e['latitude']).toRad()));\n var sinU1 = Math.sin(U1), cosU1 = Math.cos(U1);\n var sinU2 = Math.sin(U2), cosU2 = Math.cos(U2);\n\n var lambda = L, lambdaP, iterLimit = 100;\n do {\n var sinLambda = Math.sin(lambda), cosLambda = Math.cos(lambda);\n sinSigma = (\n Math.sqrt(\n (\n cosU2 * sinLambda\n ) * (\n cosU2 * sinLambda\n ) + (\n cosU1 * sinU2 - sinU1 * cosU2 * cosLambda\n ) * (\n cosU1 * sinU2 - sinU1 * cosU2 * cosLambda\n )\n )\n );\n if (sinSigma === 0) {\n return geolib.distance = 0; // co-incident points\n }\n\n cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda;\n sigma = Math.atan2(sinSigma, cosSigma);\n sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma;\n cosSqAlpha = 1 - sinAlpha * sinAlpha;\n cos2SigmaM = cosSigma - 2 * sinU1 * sinU2 / cosSqAlpha;\n\n if (isNaN(cos2SigmaM)) {\n cos2SigmaM = 0; // equatorial line: cosSqAlpha=0 (§6)\n }\n var C = (\n f / 16 * cosSqAlpha * (\n 4 + f * (\n 4 - 3 * cosSqAlpha\n )\n )\n );\n lambdaP = lambda;\n lambda = (\n L + (\n 1 - C\n ) * f * sinAlpha * (\n sigma + C * sinSigma * (\n cos2SigmaM + C * cosSigma * (\n -1 + 2 * cos2SigmaM * cos2SigmaM\n )\n )\n )\n );\n\n } while (Math.abs(lambda-lambdaP) > 1e-12 && --iterLimit>0);\n\n if (iterLimit === 0) {\n return NaN; // formula failed to converge\n }\n\n var uSq = (\n cosSqAlpha * (\n a * a - b * b\n ) / (\n b*b\n )\n );\n\n var A = (\n 1 + uSq / 16384 * (\n 4096 + uSq * (\n -768 + uSq * (\n 320 - 175 * uSq\n )\n )\n )\n );\n\n var B = (\n uSq / 1024 * (\n 256 + uSq * (\n -128 + uSq * (\n 74-47 * uSq\n )\n )\n )\n );\n\n var deltaSigma = (\n B * sinSigma * (\n cos2SigmaM + B / 4 * (\n cosSigma * (\n -1 + 2 * cos2SigmaM * cos2SigmaM\n ) -B / 6 * cos2SigmaM * (\n -3 + 4 * sinSigma * sinSigma\n ) * (\n -3 + 4 * cos2SigmaM * cos2SigmaM\n )\n )\n )\n );\n\n var distance = b * A * (sigma - deltaSigma);\n\n distance = distance.toFixed(precision); // round to 1mm precision\n\n //if (start.hasOwnProperty(elevation) && end.hasOwnProperty(elevation)) {\n if (typeof this.elevation(start) !== 'undefined' && typeof this.elevation(end) !== 'undefined') {\n var climb = Math.abs(this.elevation(start) - this.elevation(end));\n distance = Math.sqrt(distance * distance + climb * climb);\n }\n\n return this.distance = Math.round(distance * Math.pow(10, precision) / accuracy) * accuracy / Math.pow(10, precision);\n\n /*\n // note: to return initial/final bearings in addition to distance, use something like:\n var fwdAz = Math.atan2(cosU2*sinLambda, cosU1*sinU2-sinU1*cosU2*cosLambda);\n var revAz = Math.atan2(cosU1*sinLambda, -sinU1*cosU2+cosU1*sinU2*cosLambda);\n\n return { distance: s, initialBearing: fwdAz.toDeg(), finalBearing: revAz.toDeg() };\n */\n\n },\n\n\n /**\n * Calculates the distance between two spots.\n * This method is more simple but also far more inaccurate\n *\n * @param object Start position {latitude: 123, longitude: 123}\n * @param object End position {latitude: 123, longitude: 123}\n * @param integer Accuracy (in meters)\n * @return integer Distance (in meters)\n */\n getDistanceSimple: function(start, end, accuracy) {\n\n accuracy = Math.floor(accuracy) || 1;\n\n var distance =\n Math.round(\n Math.acos(\n Math.sin(\n this.latitude(end).toRad()\n ) *\n Math.sin(\n this.latitude(start).toRad()\n ) +\n Math.cos(\n this.latitude(end).toRad()\n ) *\n Math.cos(\n this.latitude(start).toRad()\n ) *\n Math.cos(\n this.longitude(start).toRad() - this.longitude(end).toRad()\n )\n ) * this.radius\n );\n\n return geolib.distance = Math.floor(Math.round(distance/accuracy)*accuracy);\n\n },\n\n\n /**\n * Calculates the center of a collection of geo coordinates\n *\n * @param array Collection of coords [{latitude: 51.510, longitude: 7.1321}, {latitude: 49.1238, longitude: \"8° 30' W\"}, ...]\n * @return object {latitude: centerLat, longitude: centerLng}\n */\n getCenter: function(coords) {\n\n var coordsArray = coords;\n if(typeof coords === 'object' && !(coords instanceof Array)) {\n\n coordsArray = [];\n\n for(var key in coords) {\n coordsArray.push(\n this.coords(coords[key])\n );\n }\n\n }\n\n if(!coordsArray.length) {\n return false;\n }\n\n var X = 0.0;\n var Y = 0.0;\n var Z = 0.0;\n var lat, lon, hyp;\n\n coordsArray.forEach(function(coord) {\n\n lat = this.latitude(coord).toRad();\n lon = this.longitude(coord).toRad();\n\n X += Math.cos(lat) * Math.cos(lon);\n Y += Math.cos(lat) * Math.sin(lon);\n Z += Math.sin(lat);\n\n }, this);\n\n var nb_coords = coordsArray.length;\n X = X / nb_coords;\n Y = Y / nb_coords;\n Z = Z / nb_coords;\n\n lon = Math.atan2(Y, X);\n hyp = Math.sqrt(X * X + Y * Y);\n lat = Math.atan2(Z, hyp);\n\n return {\n latitude: (lat * Geolib.TO_DEG).toFixed(6),\n longitude: (lon * Geolib.TO_DEG).toFixed(6)\n };\n\n },\n\n\n /**\n * Gets the max and min, latitude, longitude, and elevation (if provided).\n * @param array array with coords e.g. [{latitude: 51.5143, longitude: 7.4138}, {latitude: 123, longitude: 123}, ...]\n * @return object {maxLat: maxLat,\n * minLat: minLat\n * maxLng: maxLng,\n * minLng: minLng,\n * maxElev: maxElev,\n * minElev: minElev}\n */\n getBounds: function(coords) {\n\n if (!coords.length) {\n return false;\n }\n\n var useElevation = this.elevation(coords[0]);\n\n var stats = {\n maxLat: -Infinity,\n minLat: Infinity,\n maxLng: -Infinity,\n minLng: Infinity\n };\n\n if (typeof useElevation != 'undefined') {\n stats.maxElev = 0;\n stats.minElev = Infinity;\n }\n\n for (var i = 0, l = coords.length; i < l; ++i) {\n\n stats.maxLat = Math.max(this.latitude(coords[i]), stats.maxLat);\n stats.minLat = Math.min(this.latitude(coords[i]), stats.minLat);\n stats.maxLng = Math.max(this.longitude(coords[i]), stats.maxLng);\n stats.minLng = Math.min(this.longitude(coords[i]), stats.minLng);\n\n if (useElevation) {\n stats.maxElev = Math.max(this.elevation(coords[i]), stats.maxElev);\n stats.minElev = Math.min(this.elevation(coords[i]), stats.minElev);\n }\n\n }\n\n return stats;\n\n },\n\n /**\n * Calculates the center of the bounds of geo coordinates.\n *\n * On polygons like political borders (eg. states)\n * this may gives a closer result to human expectation, than `getCenter`,\n * because that function can be disturbed by uneven distribution of\n * point in different sides.\n * Imagine the US state Oklahoma: `getCenter` on that gives a southern\n * point, because the southern border contains a lot more nodes,\n * than the others.\n *\n * @param array Collection of coords [{latitude: 51.510, longitude: 7.1321}, {latitude: 49.1238, longitude: \"8° 30' W\"}, ...]\n * @return object {latitude: centerLat, longitude: centerLng}\n */\n getCenterOfBounds: function(coords) {\n var b = this.getBounds(coords);\n var latitude = b.minLat + ((b.maxLat - b.minLat) / 2);\n var longitude = b.minLng + ((b.maxLng - b.minLng) / 2);\n return {\n latitude: parseFloat(latitude.toFixed(6)),\n longitude: parseFloat(longitude.toFixed(6))\n };\n },\n\n\n /**\n * Computes the bounding coordinates of all points on the surface\n * of the earth less than or equal to the specified great circle\n * distance.\n *\n * @param object Point position {latitude: 123, longitude: 123}\n * @param number Distance (in meters).\n * @return array Collection of two points defining the SW and NE corners.\n */\n getBoundsOfDistance: function(point, distance) {\n\n var latitude = this.latitude(point);\n var longitude = this.longitude(point);\n\n var radLat = latitude.toRad();\n var radLon = longitude.toRad();\n\n var radDist = distance / this.radius;\n var minLat = radLat - radDist;\n var maxLat = radLat + radDist;\n\n var MAX_LAT_RAD = this.maxLat.toRad();\n var MIN_LAT_RAD = this.minLat.toRad();\n var MAX_LON_RAD = this.maxLon.toRad();\n var MIN_LON_RAD = this.minLon.toRad();\n\n var minLon;\n var maxLon;\n\n if (minLat > MIN_LAT_RAD && maxLat < MAX_LAT_RAD) {\n\n var deltaLon = Math.asin(Math.sin(radDist) / Math.cos(radLat));\n minLon = radLon - deltaLon;\n\n if (minLon < MIN_LON_RAD) {\n minLon += Geolib.PI_X2;\n }\n\n maxLon = radLon + deltaLon;\n\n if (maxLon > MAX_LON_RAD) {\n maxLon -= Geolib.PI_X2;\n }\n\n } else {\n // A pole is within the distance.\n minLat = Math.max(minLat, MIN_LAT_RAD);\n maxLat = Math.min(maxLat, MAX_LAT_RAD);\n minLon = MIN_LON_RAD;\n maxLon = MAX_LON_RAD;\n }\n\n return [\n // Southwest\n {\n latitude: minLat.toDeg(),\n longitude: minLon.toDeg()\n },\n // Northeast\n {\n latitude: maxLat.toDeg(),\n longitude: maxLon.toDeg()\n }\n ];\n\n },\n\n\n /**\n * Checks whether a point is inside of a polygon or not.\n * Note that the polygon coords must be in correct order!\n *\n * @param object coordinate to check e.g. {latitude: 51.5023, longitude: 7.3815}\n * @param array array with coords e.g. [{latitude: 51.5143, longitude: 7.4138}, {latitude: 123, longitude: 123}, ...]\n * @return bool true if the coordinate is inside the given polygon\n */\n isPointInside: function(latlng, coords) {\n\n for(var c = false, i = -1, l = coords.length, j = l - 1; ++i < l; j = i) {\n\n if(\n (\n (this.longitude(coords[i]) <= this.longitude(latlng) && this.longitude(latlng) < this.longitude(coords[j])) ||\n (this.longitude(coords[j]) <= this.longitude(latlng) && this.longitude(latlng) < this.longitude(coords[i]))\n ) &&\n (\n this.latitude(latlng) < (this.latitude(coords[j]) - this.latitude(coords[i])) *\n (this.longitude(latlng) - this.longitude(coords[i])) /\n (this.longitude(coords[j]) - this.longitude(coords[i])) +\n this.latitude(coords[i])\n )\n ) {\n c = !c;\n }\n\n }\n\n return c;\n\n },\n\n\n /**\n * Pre calculate the polygon coords, to speed up the point inside check.\n * Use this function before calling isPointInsideWithPreparedPolygon()\n * @see Algorythm from http://alienryderflex.com/polygon/\n * @param array array with coords e.g. [{latitude: 51.5143, longitude: 7.4138}, {latitude: 123, longitude: 123}, ...]\n */\n preparePolygonForIsPointInsideOptimized: function(coords) {\n\n for(var i = 0, j = coords.length-1; i < coords.length; i++) {\n\n if(this.longitude(coords[j]) === this.longitude(coords[i])) {\n\n coords[i].constant = this.latitude(coords[i]);\n coords[i].multiple = 0;\n\n } else {\n\n coords[i].constant = this.latitude(coords[i]) - (\n this.longitude(coords[i]) * this.latitude(coords[j])\n ) / (\n this.longitude(coords[j]) - this.longitude(coords[i])\n ) + (\n this.longitude(coords[i])*this.latitude(coords[i])\n ) / (\n this.longitude(coords[j])-this.longitude(coords[i])\n );\n\n coords[i].multiple = (\n this.latitude(coords[j])-this.latitude(coords[i])\n ) / (\n this.longitude(coords[j])-this.longitude(coords[i])\n );\n\n }\n\n j=i;\n\n }\n\n },\n\n /**\n * Checks whether a point is inside of a polygon or not.\n * \"This is useful if you have many points that need to be tested against the same (static) polygon.\"\n * Please call the function preparePolygonForIsPointInsideOptimized() with the same coords object before using this function.\n * Note that the polygon coords must be in correct order!\n *\n * @see Algorythm from http://alienryderflex.com/polygon/\n *\n * @param object coordinate to check e.g. {latitude: 51.5023, longitude: 7.3815}\n * @param array array with coords e.g. [{latitude: 51.5143, longitude: 7.4138}, {latitude: 123, longitude: 123}, ...]\n * @return bool true if the coordinate is inside the given polygon\n */\n isPointInsideWithPreparedPolygon: function(point, coords) {\n\n var flgPointInside = false,\n y = this.longitude(point),\n x = this.latitude(point);\n\n for(var i = 0, j = coords.length-1; i < coords.length; i++) {\n\n if ((this.longitude(coords[i]) < y && this.longitude(coords[j]) >=y ||\n this.longitude(coords[j]) < y && this.longitude(coords[i]) >= y)) {\n\n flgPointInside^=(y*coords[i].multiple+coords[i].constant < x);\n\n }\n\n j=i;\n\n }\n\n return flgPointInside;\n\n },\n\n\n /**\n * Shortcut for geolib.isPointInside()\n */\n isInside: function() {\n return this.isPointInside.apply(this, arguments);\n },\n\n\n /**\n * Checks whether a point is inside of a circle or not.\n *\n * @param object coordinate to check (e.g. {latitude: 51.5023, longitude: 7.3815})\n * @param object coordinate of the circle's center (e.g. {latitude: 51.4812, longitude: 7.4025})\n * @param integer maximum radius in meters\n * @return bool true if the coordinate is within the given radius\n */\n isPointInCircle: function(latlng, center, radius) {\n return this.getDistance(latlng, center) < radius;\n },\n\n\n /**\n * Shortcut for geolib.isPointInCircle()\n */\n withinRadius: function() {\n return this.isPointInCircle.apply(this, arguments);\n },\n\n\n /**\n * Gets rhumb line bearing of two points. Find out about the difference between rhumb line and\n * great circle bearing on Wikipedia. It's quite complicated. Rhumb line should be fine in most cases:\n *\n * http://en.wikipedia.org/wiki/Rhumb_line#General_and_mathematical_description\n *\n * Function heavily based on Doug Vanderweide's great PHP version (licensed under GPL 3.0)\n * http://www.dougv.com/2009/07/13/calculating-the-bearing-and-compass-rose-direction-between-two-latitude-longitude-coordinates-in-php/\n *\n * @param object origin coordinate (e.g. {latitude: 51.5023, longitude: 7.3815})\n * @param object destination coordinate\n * @return integer calculated bearing\n */\n getRhumbLineBearing: function(originLL, destLL) {\n\n // difference of longitude coords\n var diffLon = this.longitude(destLL).toRad() - this.longitude(originLL).toRad();\n\n // difference latitude coords phi\n var diffPhi = Math.log(\n Math.tan(\n this.latitude(destLL).toRad() / 2 + Geolib.PI_DIV4\n ) /\n Math.tan(\n this.latitude(originLL).toRad() / 2 + Geolib.PI_DIV4\n )\n );\n\n // recalculate diffLon if it is greater than pi\n if(Math.abs(diffLon) > Math.PI) {\n if(diffLon > 0) {\n diffLon = (Geolib.PI_X2 - diffLon) * -1;\n }\n else {\n diffLon = Geolib.PI_X2 + diffLon;\n }\n }\n\n //return the angle, normalized\n return (Math.atan2(diffLon, diffPhi).toDeg() + 360) % 360;\n\n },\n\n\n /**\n * Gets great circle bearing of two points. See description of getRhumbLineBearing for more information\n *\n * @param object origin coordinate (e.g. {latitude: 51.5023, longitude: 7.3815})\n * @param object destination coordinate\n * @return integer calculated bearing\n */\n getBearing: function(originLL, destLL) {\n\n destLL['latitude'] = this.latitude(destLL);\n destLL['longitude'] = this.longitude(destLL);\n originLL['latitude'] = this.latitude(originLL);\n originLL['longitude'] = this.longitude(originLL);\n\n var bearing = (\n (\n Math.atan2(\n Math.sin(\n destLL['longitude'].toRad() -\n originLL['longitude'].toRad()\n ) *\n Math.cos(\n destLL['latitude'].toRad()\n ),\n Math.cos(\n originLL['latitude'].toRad()\n ) *\n Math.sin(\n destLL['latitude'].toRad()\n ) -\n Math.sin(\n originLL['latitude'].toRad()\n ) *\n Math.cos(\n destLL['latitude'].toRad()\n ) *\n Math.cos(\n destLL['longitude'].toRad() - originLL['longitude'].toRad()\n )\n )\n ).toDeg() + 360\n ) % 360;\n\n return bearing;\n\n },\n\n\n /**\n * Gets the compass direction from an origin coordinate to a destination coordinate.\n *\n * @param object origin coordinate (e.g. {latitude: 51.5023, longitude: 7.3815})\n * @param object destination coordinate\n * @param string Bearing mode. Can be either circle or rhumbline\n * @return object Returns an object with a rough (NESW) and an exact direction (NNE, NE, ENE, E, ESE, etc).\n */\n getCompassDirection: function(originLL, destLL, bearingMode) {\n\n var direction;\n var bearing;\n\n if(bearingMode == 'circle') {\n // use great circle bearing\n bearing = this.getBearing(originLL, destLL);\n } else {\n // default is rhumb line bearing\n bearing = this.getRhumbLineBearing(originLL, destLL);\n }\n\n switch(Math.round(bearing/22.5)) {\n case 1:\n direction = {exact: \"NNE\", rough: \"N\"};\n break;\n case 2:\n direction = {exact: \"NE\", rough: \"N\"};\n break;\n case 3:\n direction = {exact: \"ENE\", rough: \"E\"};\n break;\n case 4:\n direction = {exact: \"E\", rough: \"E\"};\n break;\n case 5:\n direction = {exact: \"ESE\", rough: \"E\"};\n break;\n case 6:\n direction = {exact: \"SE\", rough: \"E\"};\n break;\n case 7:\n direction = {exact: \"SSE\", rough: \"S\"};\n break;\n case 8:\n direction = {exact: \"S\", rough: \"S\"};\n break;\n case 9:\n direction = {exact: \"SSW\", rough: \"S\"};\n break;\n case 10:\n direction = {exact: \"SW\", rough: \"S\"};\n break;\n case 11:\n direction = {exact: \"WSW\", rough: \"W\"};\n break;\n case 12:\n direction = {exact: \"W\", rough: \"W\"};\n break;\n case 13:\n direction = {exact: \"WNW\", rough: \"W\"};\n break;\n case 14:\n direction = {exact: \"NW\", rough: \"W\"};\n break;\n case 15:\n direction = {exact: \"NNW\", rough: \"N\"};\n break;\n default:\n direction = {exact: \"N\", rough: \"N\"};\n }\n\n direction['bearing'] = bearing;\n return direction;\n\n },\n\n\n /**\n * Shortcut for getCompassDirection\n */\n getDirection: function(originLL, destLL, bearingMode) {\n return this.getCompassDirection.apply(this, arguments);\n },\n\n\n /**\n * Sorts an array of coords by distance from a reference coordinate\n *\n * @param object reference coordinate e.g. {latitude: 51.5023, longitude: 7.3815}\n * @param mixed array or object with coords [{latitude: 51.5143, longitude: 7.4138}, {latitude: 123, longitude: 123}, ...]\n * @return array ordered array\n */\n orderByDistance: function(latlng, coords) {\n\n var coordsArray = Object.keys(coords).map(function(idx) {\n var distance = this.getDistance(latlng, coords[idx]);\n var augmentedCoord = Object.create(coords[idx]);\n augmentedCoord.distance = distance;\n augmentedCoord.key = idx;\n return augmentedCoord;\n }, this);\n\n return coordsArray.sort(function(a, b) {\n return a.distance - b.distance;\n });\n\n },\n\n /**\n * Check if a point lies in line created by two other points\n *\n * @param object Point to check: {latitude: 123, longitude: 123}\n * @param object Start of line {latitude: 123, longitude: 123}\n * @param object End of line {latitude: 123, longitude: 123}\n * @return boolean\n */\n isPointInLine: function(point, start, end) {\n\n return (this.getDistance(start, point, 1, 3)+this.getDistance(point, end, 1, 3)).toFixed(3)==this.getDistance(start, end, 1, 3);\n },\n\n /**\n * Check if a point lies within a given distance from a line created by two other points\n *\n * @param object Point to check: {latitude: 123, longitude: 123}\n * @param object Start of line {latitude: 123, longitude: 123}\n * @param object End of line {latitude: 123, longitude: 123}\n * @pararm float maximum distance from line\n * @return boolean\n */\n isPointNearLine: function(point, start, end, distance) {\n return this.getDistanceFromLine(point, start, end) < distance;\n },\n\n /**\n * return the minimum distance from a point to a line\n *\n * @param object Point away from line\n * @param object Start of line {latitude: 123, longitude: 123}\n * @param object End of line {latitude: 123, longitude: 123}\n * @return float distance from point to line\n */\n getDistanceFromLine: function(point, start, end) {\n var d1 = this.getDistance(start, point, 1, 3);\n var d2 = this.getDistance(point, end, 1, 3);\n var d3 = this.getDistance(start, end, 1, 3);\n var distance = 0;\n\n // alpha is the angle between the line from start to point, and from start to end //\n var alpha = Math.acos((d1*d1 + d3*d3 - d2*d2)/(2*d1*d3));\n // beta is the angle between the line from end to point and from end to start //\n var beta = Math.acos((d2*d2 + d3*d3 - d1*d1)/(2*d2*d3));\n\n // if the angle is greater than 90 degrees, then the minimum distance is the\n // line from the start to the point //\n if(alpha>Math.PI/2) {\n distance = d1;\n }\n // same for the beta //\n else if(beta > Math.PI/2) {\n distance = d2;\n }\n // otherwise the minimum distance is achieved through a line perpendular to the start-end line,\n // which goes from the start-end line to the point //\n else {\n distance = Math.sin(alpha) * d1;\n }\n\n return distance;\n },\n\n /**\n * Finds the nearest coordinate to a reference coordinate\n *\n * @param object reference coordinate e.g. {latitude: 51.5023, longitude: 7.3815}\n * @param mixed array or object with coords [{latitude: 51.5143, longitude: 7.4138}, {latitude: 123, longitude: 123}, ...]\n * @return array ordered array\n */\n findNearest: function(latlng, coords, offset, limit) {\n\n offset = offset || 0;\n limit = limit || 1;\n var ordered = this.orderByDistance(latlng, coords);\n\n if(limit === 1) {\n return ordered[offset];\n } else {\n return ordered.splice(offset, limit);\n }\n\n },\n\n\n /**\n * Calculates the length of a given path\n *\n * @param mixed array or object with coords [{latitude: 51.5143, longitude: 7.4138}, {latitude: 123, longitude: 123}, ...]\n * @return integer length of the path (in meters)\n */\n getPathLength: function(coords) {\n\n var dist = 0;\n var last;\n\n for (var i = 0, l = coords.length; i < l; ++i) {\n if(last) {\n //console.log(coords[i], last, this.getDistance(coords[i], last));\n dist += this.getDistance(this.coords(coords[i]), last);\n }\n last = this.coords(coords[i]);\n }\n\n return dist;\n\n },\n\n\n /**\n * Calculates the speed between to points within a given time span.\n *\n * @param object coords with javascript timestamp {latitude: 51.5143, longitude: 7.4138, time: 1360231200880}\n * @param object coords with javascript timestamp {latitude: 51.5502, longitude: 7.4323, time: 1360245600460}\n * @param object options (currently \"unit\" is the only option. Default: km(h));\n * @return float speed in unit per hour\n */\n getSpeed: function(start, end, options) {\n\n var unit = options && options.unit || 'km';\n\n if(unit == 'mph') {\n unit = 'mi';\n } else if(unit == 'kmh') {\n unit = 'km';\n }\n\n var distance = geolib.getDistance(start, end);\n var time = ((end.time*1)/1000) - ((start.time*1)/1000);\n var mPerHr = (distance/time)*3600;\n var speed = Math.round(mPerHr * this.measures[unit] * 10000)/10000;\n return speed;\n\n },\n\n\n /**\n * Computes the destination point given an initial point, a distance\n * and a bearing\n *\n * see http://www.movable-type.co.uk/scripts/latlong.html for the original code\n *\n * @param object start coordinate (e.g. {latitude: 51.5023, longitude: 7.3815})\n * @param float longitude of the inital point in degree\n * @param float distance to go from the inital point in meter\n * @param float bearing in degree of the direction to go, e.g. 0 = north, 180 = south\n * @param float optional (in meter), defaults to mean radius of the earth\n * @return object {latitude: destLat (in degree), longitude: destLng (in degree)}\n */\n computeDestinationPoint: function(start, distance, bearing, radius) {\n\n var lat = this.latitude(start);\n var lng = this.longitude(start);\n\n radius = (typeof radius === 'undefined') ? this.radius : Number(radius);\n\n var δ = Number(distance) / radius; // angular distance in radians\n var θ = Number(bearing).toRad();\n\n var φ1 = Number(lat).toRad();\n var λ1 = Number(lng).toRad();\n\n var φ2 = Math.asin( Math.sin(φ1)*Math.cos(δ) +\n Math.cos(φ1)*Math.sin(δ)*Math.cos(θ) );\n var λ2 = λ1 + Math.atan2(Math.sin(θ)*Math.sin(δ)*Math.cos(φ1),\n Math.cos(δ)-Math.sin(φ1)*Math.sin(φ2));\n λ2 = (λ2+3*Math.PI) % (2*Math.PI) - Math.PI; // normalise to -180..+180°\n\n return {\n latitude: φ2.toDeg(),\n longitude: λ2.toDeg()\n };\n\n },\n\n\n /**\n * Converts a distance from meters to km, mm, cm, mi, ft, in or yd\n *\n * @param string Format to be converted in\n * @param float Distance in meters\n * @param float Decimal places for rounding (default: 4)\n * @return float Converted distance\n */\n convertUnit: function(unit, distance, round) {\n\n if(distance === 0) {\n\n return 0;\n\n } else if(typeof distance === 'undefined') {\n\n if(this.distance === null) {\n throw new Error('No distance was given');\n } else if(this.distance === 0) {\n return 0;\n } else {\n distance = this.distance;\n }\n\n }\n\n unit = unit || 'm';\n round = (null == round ? 4 : round);\n\n if(typeof this.measures[unit] !== 'undefined') {\n return this.round(distance * this.measures[unit], round);\n } else {\n throw new Error('Unknown unit for conversion.');\n }\n\n },\n\n\n /**\n * Checks if a value is in decimal format or, if neccessary, converts to decimal\n *\n * @param mixed Value(s) to be checked/converted (array of latlng objects, latlng object, sexagesimal string, float)\n * @return float Input data in decimal format\n */\n useDecimal: function(value) {\n\n if(Object.prototype.toString.call(value) === '[object Array]') {\n\n var geolib = this;\n\n value = value.map(function(val) {\n\n //if(!isNaN(parseFloat(val))) {\n if(geolib.isDecimal(val)) {\n\n return geolib.useDecimal(val);\n\n } else if(typeof val == 'object') {\n\n if(geolib.validate(val)) {\n\n return geolib.coords(val);\n\n } else {\n\n for(var prop in val) {\n val[prop] = geolib.useDecimal(val[prop]);\n }\n\n return val;\n\n }\n\n } else if(geolib.isSexagesimal(val)) {\n\n return geolib.sexagesimal2decimal(val);\n\n } else {\n\n return val;\n\n }\n\n });\n\n return value;\n\n } else if(typeof value === 'object' && this.validate(value)) {\n\n return this.coords(value);\n\n } else if(typeof value === 'object') {\n\n for(var prop in value) {\n value[prop] = this.useDecimal(value[prop]);\n }\n\n return value;\n\n }\n\n\n if (this.isDecimal(value)) {\n\n return parseFloat(value);\n\n } else if(this.isSexagesimal(value) === true) {\n\n return parseFloat(this.sexagesimal2decimal(value));\n\n }\n\n throw new Error('Unknown format.');\n\n },\n\n /**\n * Converts a decimal coordinate value to sexagesimal format\n *\n * @param float decimal\n * @return string Sexagesimal value (XX° YY' ZZ\")\n */\n decimal2sexagesimal: function(dec) {\n\n if (dec in this.sexagesimal) {\n return this.sexagesimal[dec];\n }\n\n var tmp = dec.toString().split('.');\n\n var deg = Math.abs(tmp[0]);\n var min = ('0.' + (tmp[1] || 0))*60;\n var sec = min.toString().split('.');\n\n min = Math.floor(min);\n sec = (('0.' + (sec[1] || 0)) * 60).toFixed(2);\n\n this.sexagesimal[dec] = (deg + '° ' + min + \"' \" + sec + '\"');\n\n return this.sexagesimal[dec];\n\n },\n\n\n /**\n * Converts a sexagesimal coordinate to decimal format\n *\n * @param float Sexagesimal coordinate\n * @return string Decimal value (XX.XXXXXXXX)\n */\n sexagesimal2decimal: function(sexagesimal) {\n\n if (sexagesimal in this.decimal) {\n return this.decimal[sexagesimal];\n }\n\n var regEx = new RegExp(this.sexagesimalPattern);\n var data = regEx.exec(sexagesimal);\n var min = 0, sec = 0;\n\n if(data) {\n min = parseFloat(data[2]/60);\n sec = parseFloat(data[4]/3600) || 0;\n }\n\n var dec = ((parseFloat(data[1]) + min + sec)).toFixed(8);\n //var dec = ((parseFloat(data[1]) + min + sec));\n\n // South and West are negative decimals\n dec = (data[7] == 'S' || data[7] == 'W') ? parseFloat(-dec) : parseFloat(dec);\n //dec = (data[7] == 'S' || data[7] == 'W') ? -dec : dec;\n\n this.decimal[sexagesimal] = dec;\n\n return dec;\n\n },\n\n\n /**\n * Checks if a value is in decimal format\n *\n * @param string Value to be checked\n * @return bool True if in sexagesimal format\n */\n isDecimal: function(value) {\n\n value = value.toString().replace(/\\s*/, '');\n\n // looks silly but works as expected\n // checks if value is in decimal format\n return (!isNaN(parseFloat(value)) && parseFloat(value) == value);\n\n },\n\n\n /**\n * Checks if a value is in sexagesimal format\n *\n * @param string Value to be checked\n * @return bool True if in sexagesimal format\n */\n isSexagesimal: function(value) {\n\n value = value.toString().replace(/\\s*/, '');\n\n return this.sexagesimalPattern.test(value);\n\n },\n\n round: function(value, n) {\n var decPlace = Math.pow(10, n);\n return Math.round(value * decPlace)/decPlace;\n }\n\n });\n\n // Node module\n if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {\n\n module.exports = geolib;\n\n // react native\n if (typeof global === 'object') {\n global.geolib = geolib;\n }\n\n // AMD module\n } else if (true) {\n\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n return geolib;\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n // we're in a browser\n } else {\n\n global.geolib = geolib;\n\n }\n\n}(this));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2VvbGliL2Rpc3QvZ2VvbGliLmpzPzcwNmYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLDRCQUE0QixJQUFJLFlBQVksSUFBSSxjQUFjLElBQUksZ0JBQWdCLElBQUksVUFBVSxJQUFJO0FBQ3BHLFNBQVM7QUFDVDtBQUNBO0FBQ0EsdUJBQXVCLFNBQVM7QUFDaEMsdUJBQXVCLGFBQWE7QUFDcEMsdUJBQXVCLFdBQVc7QUFDbEMsdUJBQXVCLFlBQVk7QUFDbkMsdUJBQXVCLHNCQUFzQjtBQUM3Qyx1QkFBdUIsc0JBQXNCO0FBQzdDLHVCQUF1QixxQkFBcUI7QUFDNUMsdUJBQXVCLG9CQUFvQjtBQUMzQyx1QkFBdUI7QUFDdkIsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG1CQUFtQjs7QUFFbkIsdUJBQXVCOztBQUV2Qjs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9FQUFvRSxXQUFXLGNBQWMsRUFBRTtBQUMvRixpQkFBaUI7O0FBRWpCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDO0FBQzlDLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxzRUFBc0U7QUFDdEU7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEs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O0FBQzdCO0FBQ0EsU0FBUztBQUFBLG9HQUFDOztBQUVWO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTs7QUFFQSxDQUFDIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2dlb2xpYi9kaXN0L2dlb2xpYi5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qISBnZW9saWIgMi4wLjIzIGJ5IE1hbnVlbCBCaWVoXHJcbiogTGlicmFyeSB0byBwcm92aWRlIGdlbyBmdW5jdGlvbnMgbGlrZSBkaXN0YW5jZSBjYWxjdWxhdGlvbixcclxuKiBjb252ZXJzaW9uIG9mIGRlY2ltYWwgY29vcmRpbmF0ZXMgdG8gc2V4YWdlc2ltYWwgYW5kIHZpY2UgdmVyc2EsIGV0Yy5cclxuKiBXR1MgODQgKFdvcmxkIEdlb2RldGljIFN5c3RlbSAxOTg0KVxyXG4qIFxyXG4qIEBhdXRob3IgTWFudWVsIEJpZWhcclxuKiBAdXJsIGh0dHA6Ly93d3cubWFudWVsYmllaC5jb20vXHJcbiogQHZlcnNpb24gMi4wLjIzXHJcbiogQGxpY2Vuc2UgTUlUIFxyXG4qKi87KGZ1bmN0aW9uKGdsb2JhbCwgdW5kZWZpbmVkKSB7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIGZ1bmN0aW9uIEdlb2xpYigpIHt9XG5cbiAgICAvLyBDb25zdGFudHNcbiAgICBHZW9saWIuVE9fUkFEID0gTWF0aC5QSSAvIDE4MDtcbiAgICBHZW9saWIuVE9fREVHID0gMTgwIC8gTWF0aC5QSTtcbiAgICBHZW9saWIuUElfWDIgPSBNYXRoLlBJICogMjtcbiAgICBHZW9saWIuUElfRElWNCA9IE1hdGguUEkgLyA0O1xuXG4gICAgLy8gU2V0dGluZyByZWFkb25seSBkZWZhdWx0c1xuICAgIHZhciBnZW9saWIgPSBPYmplY3QuY3JlYXRlKEdlb2xpYi5wcm90b3R5cGUsIHtcbiAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgdmFsdWU6IFwiMi4wLjIzXCJcbiAgICAgICAgfSxcbiAgICAgICAgcmFkaXVzOiB7XG4gICAgICAgICAgICB2YWx1ZTogNjM3ODEzN1xuICAgICAgICB9LFxuICAgICAgICBtaW5MYXQ6IHtcbiAgICAgICAgICAgIHZhbHVlOiAtOTBcbiAgICAgICAgfSxcbiAgICAgICAgbWF4TGF0OiB7XG4gICAgICAgICAgICB2YWx1ZTogOTBcbiAgICAgICAgfSxcbiAgICAgICAgbWluTG9uOiB7XG4gICAgICAgICAgICB2YWx1ZTogLTE4MFxuICAgICAgICB9LFxuICAgICAgICBtYXhMb246IHtcbiAgICAgICAgICAgIHZhbHVlOiAxODBcbiAgICAgICAgfSxcbiAgICAgICAgc2V4YWdlc2ltYWxQYXR0ZXJuOiB7XG4gICAgICAgICAgICB2YWx1ZTogL14oWzAtOV17MSwzfSnCsFxccyooWzAtOV17MSwzfSg/OlxcLig/OlswLTldezEsMn0pKT8pJ1xccyooKFswLTldezEsM30oXFwuKFswLTldezEsNH0pKT8pXCJcXHMqKT8oW05FT1NXXT8pJC9cbiAgICAgICAgfSxcbiAgICAgICAgbWVhc3VyZXM6IHtcbiAgICAgICAgICAgIHZhbHVlOiBPYmplY3QuY3JlYXRlKE9iamVjdC5wcm90b3R5cGUsIHtcbiAgICAgICAgICAgICAgICBcIm1cIiA6IHt2YWx1ZTogMX0sXG4gICAgICAgICAgICAgICAgXCJrbVwiOiB7dmFsdWU6IDAuMDAxfSxcbiAgICAgICAgICAgICAgICBcImNtXCI6IHt2YWx1ZTogMTAwfSxcbiAgICAgICAgICAgICAgICBcIm1tXCI6IHt2YWx1ZTogMTAwMH0sXG4gICAgICAgICAgICAgICAgXCJtaVwiOiB7dmFsdWU6ICgxIC8gMTYwOS4zNDQpfSxcbiAgICAgICAgICAgICAgICBcInNtXCI6IHt2YWx1ZTogKDEgLyAxODUyLjIxNil9LFxuICAgICAgICAgICAgICAgIFwiZnRcIjoge3ZhbHVlOiAoMTAwIC8gMzAuNDgpfSxcbiAgICAgICAgICAgICAgICBcImluXCI6IHt2YWx1ZTogKDEwMCAvIDIuNTQpfSxcbiAgICAgICAgICAgICAgICBcInlkXCI6IHt2YWx1ZTogKDEgLyAwLjkxNDQpfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAgcHJvdG90eXBlOiB7XG4gICAgICAgICAgICB2YWx1ZTogR2VvbGliLnByb3RvdHlwZVxuICAgICAgICB9LFxuICAgICAgICBleHRlbmQ6IHtcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihtZXRob2RzLCBvdmVyd3JpdGUpIHtcbiAgICAgICAgICAgICAgICBmb3IodmFyIHByb3AgaW4gbWV0aG9kcykge1xuICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgZ2VvbGliLnByb3RvdHlwZVtwcm9wXSA9PT0gJ3VuZGVmaW5lZCcgfHwgb3ZlcndyaXRlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgbWV0aG9kc1twcm9wXSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbWV0aG9kc1twcm9wXS5iaW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbGliLnByb3RvdHlwZVtwcm9wXSA9IG1ldGhvZHNbcHJvcF0uYmluZChnZW9saWIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9saWIucHJvdG90eXBlW3Byb3BdID0gbWV0aG9kc1twcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHR5cGVvZihOdW1iZXIucHJvdG90eXBlLnRvUmFkKSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgTnVtYmVyLnByb3RvdHlwZS50b1JhZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMgKiBHZW9saWIuVE9fUkFEO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YoTnVtYmVyLnByb3RvdHlwZS50b0RlZykgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIE51bWJlci5wcm90b3R5cGUudG9EZWcgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzICogR2VvbGliLlRPX0RFRztcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBIZXJlIGNvbWVzIHRoZSBtYWdpY1xuICAgIGdlb2xpYi5leHRlbmQoe1xuXG4gICAgICAgIGRlY2ltYWw6IHt9LFxuXG4gICAgICAgIHNleGFnZXNpbWFsOiB7fSxcblxuICAgICAgICBkaXN0YW5jZTogbnVsbCxcblxuICAgICAgICBnZXRLZXlzOiBmdW5jdGlvbihwb2ludCkge1xuXG4gICAgICAgICAgICAvLyBHZW9KU09OIEFycmF5IFtsb25naXR1ZGUsIGxhdGl0dWRlKCwgZWxldmF0aW9uKV1cbiAgICAgICAgICAgIGlmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwb2ludCkgPT0gJ1tvYmplY3QgQXJyYXldJykge1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbG9uZ2l0dWRlOiBwb2ludC5sZW5ndGggPj0gMSA/IDAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlOiBwb2ludC5sZW5ndGggPj0gMiA/IDEgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGVsZXZhdGlvbjogcG9pbnQubGVuZ3RoID49IDMgPyAyIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZ2V0S2V5ID0gZnVuY3Rpb24ocG9zc2libGVWYWx1ZXMpIHtcblxuICAgICAgICAgICAgICAgIHZhciBrZXk7XG5cbiAgICAgICAgICAgICAgICBwb3NzaWJsZVZhbHVlcy5ldmVyeShmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgaWYgcG9pbnQgaXMgYW4gb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBwb2ludCAhPSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvaW50Lmhhc093blByb3BlcnR5KHZhbCkgPyAoZnVuY3Rpb24oKSB7IGtleSA9IHZhbDsgcmV0dXJuIGZhbHNlOyB9KCkpIDogdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG5cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHZhciBsb25naXR1ZGUgPSBnZXRLZXkoWydsbmcnLCAnbG9uJywgJ2xvbmdpdHVkZSddKTtcbiAgICAgICAgICAgIHZhciBsYXRpdHVkZSA9IGdldEtleShbJ2xhdCcsICdsYXRpdHVkZSddKTtcbiAgICAgICAgICAgIHZhciBlbGV2YXRpb24gPSBnZXRLZXkoWydhbHQnLCAnYWx0aXR1ZGUnLCAnZWxldmF0aW9uJywgJ2VsZXYnXSk7XG5cbiAgICAgICAgICAgIC8vIHJldHVybiB1bmRlZmluZWQgaWYgbm90IGF0IGxlYXN0IG9uZSB2YWxpZCBwcm9wZXJ0eSB3YXMgZm91bmRcbiAgICAgICAgICAgIGlmKHR5cGVvZiBsYXRpdHVkZSA9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBsb25naXR1ZGUgPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZWxldmF0aW9uID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBsYXRpdHVkZTogbGF0aXR1ZGUsXG4gICAgICAgICAgICAgICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUsXG4gICAgICAgICAgICAgICAgZWxldmF0aW9uOiBlbGV2YXRpb25cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgfSxcblxuICAgICAgICAvLyByZXR1cm5zIGxhdGl0dWRlIG9mIGEgZ2l2ZW4gcG9pbnQsIGNvbnZlcnRlZCB0byBkZWNpbWFsXG4gICAgICAgIC8vIHNldCByYXcgdG8gdHJ1ZSB0byBhdm9pZCBjb252ZXJzaW9uXG4gICAgICAgIGdldExhdDogZnVuY3Rpb24ocG9pbnQsIHJhdykge1xuICAgICAgICAgICAgcmV0dXJuIHJhdyA9PT0gdHJ1ZSA/IHBvaW50W3RoaXMuZ2V0S2V5cyhwb2ludCkubGF0aXR1ZGVdIDogdGhpcy51c2VEZWNpbWFsKHBvaW50W3RoaXMuZ2V0S2V5cyhwb2ludCkubGF0aXR1ZGVdKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBBbGlhcyBmb3IgZ2V0TGF0XG4gICAgICAgIGxhdGl0dWRlOiBmdW5jdGlvbihwb2ludCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGF0LmNhbGwodGhpcywgcG9pbnQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIHJldHVybnMgbG9uZ2l0dWRlIG9mIGEgZ2l2ZW4gcG9pbnQsIGNvbnZlcnRlZCB0byBkZWNpbWFsXG4gICAgICAgIC8vIHNldCByYXcgdG8gdHJ1ZSB0byBhdm9pZCBjb252ZXJzaW9uXG4gICAgICAgIGdldExvbjogZnVuY3Rpb24ocG9pbnQsIHJhdykge1xuICAgICAgICAgICAgcmV0dXJuIHJhdyA9PT0gdHJ1ZSA/IHBvaW50W3RoaXMuZ2V0S2V5cyhwb2ludCkubG9uZ2l0dWRlXSA6IHRoaXMudXNlRGVjaW1hbChwb2ludFt0aGlzLmdldEtleXMocG9pbnQpLmxvbmdpdHVkZV0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIEFsaWFzIGZvciBnZXRMb25cbiAgICAgICAgbG9uZ2l0dWRlOiBmdW5jdGlvbihwb2ludCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9uLmNhbGwodGhpcywgcG9pbnQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldEVsZXY6IGZ1bmN0aW9uKHBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gcG9pbnRbdGhpcy5nZXRLZXlzKHBvaW50KS5lbGV2YXRpb25dO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIEFsaWFzIGZvciBnZXRFbGV2XG4gICAgICAgIGVsZXZhdGlvbjogZnVuY3Rpb24ocG9pbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEVsZXYuY2FsbCh0aGlzLCBwb2ludCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY29vcmRzOiBmdW5jdGlvbihwb2ludCwgcmF3KSB7XG5cbiAgICAgICAgICAgIHZhciByZXR2YWwgPSB7XG4gICAgICAgICAgICAgICAgbGF0aXR1ZGU6IHJhdyA9PT0gdHJ1ZSA/IHBvaW50W3RoaXMuZ2V0S2V5cyhwb2ludCkubGF0aXR1ZGVdIDogdGhpcy51c2VEZWNpbWFsKHBvaW50W3RoaXMuZ2V0S2V5cyhwb2ludCkubGF0aXR1ZGVdKSxcbiAgICAgICAgICAgICAgICBsb25naXR1ZGU6IHJhdyA9PT0gdHJ1ZSA/IHBvaW50W3RoaXMuZ2V0S2V5cyhwb2ludCkubG9uZ2l0dWRlXSA6IHRoaXMudXNlRGVjaW1hbChwb2ludFt0aGlzLmdldEtleXMocG9pbnQpLmxvbmdpdHVkZV0pXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB2YXIgZWxldiA9IHBvaW50W3RoaXMuZ2V0S2V5cyhwb2ludCkuZWxldmF0aW9uXTtcblxuICAgICAgICAgICAgaWYodHlwZW9mIGVsZXYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dmFsWydlbGV2YXRpb24nXSA9IGVsZXY7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXR2YWw7XG5cbiAgICAgICAgfSxcblxuICAgICAgICAvLyBBbGlhcyBmb3IgY29vcmRzXG4gICAgICAgIGxsOiBmdW5jdGlvbihwb2ludCwgcmF3KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb29yZHMuY2FsbCh0aGlzLCBwb2ludCwgcmF3KTtcbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8vIGNoZWNrcyBpZiBhIHZhcmlhYmxlIGNvbnRhaW5zIGEgdmFsaWQgbGF0bG9uZyBvYmplY3RcbiAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKHBvaW50KSB7XG5cbiAgICAgICAgICAgIHZhciBrZXlzID0gdGhpcy5nZXRLZXlzKHBvaW50KTtcblxuICAgICAgICAgICAgaWYodHlwZW9mIGtleXMgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBrZXlzLmxhdGl0dWRlID09PSAndW5kZWZpbmVkJyB8fCBrZXlzLmxvbmdpdHVkZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBsYXQgPSBwb2ludFtrZXlzLmxhdGl0dWRlXTtcbiAgICAgICAgICAgIHZhciBsbmcgPSBwb2ludFtrZXlzLmxvbmdpdHVkZV07XG5cbiAgICAgICAgICAgIGlmKHR5cGVvZiBsYXQgPT09ICd1bmRlZmluZWQnIHx8ICF0aGlzLmlzRGVjaW1hbChsYXQpICYmICF0aGlzLmlzU2V4YWdlc2ltYWwobGF0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYodHlwZW9mIGxuZyA9PT0gJ3VuZGVmaW5lZCcgfHwgIXRoaXMuaXNEZWNpbWFsKGxuZykgJiYgIXRoaXMuaXNTZXhhZ2VzaW1hbChsbmcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsYXQgPSB0aGlzLnVzZURlY2ltYWwobGF0KTtcbiAgICAgICAgICAgIGxuZyA9IHRoaXMudXNlRGVjaW1hbChsbmcpO1xuXG4gICAgICAgICAgICBpZihsYXQgPCB0aGlzLm1pbkxhdCB8fCBsYXQgPiB0aGlzLm1heExhdCB8fCBsbmcgPCB0aGlzLm1pbkxvbiB8fCBsbmcgPiB0aGlzLm1heExvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgKiBDYWxjdWxhdGVzIGdlb2RldGljIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50cyBzcGVjaWZpZWQgYnkgbGF0aXR1ZGUvbG9uZ2l0dWRlIHVzaW5nXG4gICAgICAgICogVmluY2VudHkgaW52ZXJzZSBmb3JtdWxhIGZvciBlbGxpcHNvaWRzXG4gICAgICAgICogVmluY2VudHkgSW52ZXJzZSBTb2x1dGlvbiBvZiBHZW9kZXNpY3Mgb24gdGhlIEVsbGlwc29pZCAoYykgQ2hyaXMgVmVuZXNzIDIwMDItMjAxMFxuICAgICAgICAqIChMaWNlbnNlZCB1bmRlciBDQyBCWSAzLjApXG4gICAgICAgICpcbiAgICAgICAgKiBAcGFyYW0gICAgb2JqZWN0ICAgIFN0YXJ0IHBvc2l0aW9uIHtsYXRpdHVkZTogMTIzLCBsb25naXR1ZGU6IDEyM31cbiAgICAgICAgKiBAcGFyYW0gICAgb2JqZWN0ICAgIEVuZCBwb3NpdGlvbiB7bGF0aXR1ZGU6IDEyMywgbG9uZ2l0dWRlOiAxMjN9XG4gICAgICAgICogQHBhcmFtICAgIGludGVnZXIgICBBY2N1cmFjeSAoaW4gbWV0ZXJzKVxuICAgICAgICAqIEBwYXJhbSAgICBpbnRlZ2VyICAgUHJlY2lzaW9uIChpbiBkZWNpbWFsIGNhc2VzKVxuICAgICAgICAqIEByZXR1cm4gICBpbnRlZ2VyICAgRGlzdGFuY2UgKGluIG1ldGVycylcbiAgICAgICAgKi9cbiAgICAgICAgZ2V0RGlzdGFuY2U6IGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIGFjY3VyYWN5LCBwcmVjaXNpb24pIHtcblxuICAgICAgICAgICAgYWNjdXJhY3kgPSBNYXRoLmZsb29yKGFjY3VyYWN5KSB8fCAxO1xuICAgICAgICAgICAgcHJlY2lzaW9uID0gTWF0aC5mbG9vcihwcmVjaXNpb24pIHx8IDA7XG5cbiAgICAgICAgICAgIHZhciBzID0gdGhpcy5jb29yZHMoc3RhcnQpO1xuICAgICAgICAgICAgdmFyIGUgPSB0aGlzLmNvb3JkcyhlbmQpO1xuXG4gICAgICAgICAgICB2YXIgYSA9IDYzNzgxMzcsIGIgPSA2MzU2NzUyLjMxNDI0NSwgIGYgPSAxLzI5OC4yNTcyMjM1NjM7ICAvLyBXR1MtODQgZWxsaXBzb2lkIHBhcmFtc1xuICAgICAgICAgICAgdmFyIEwgPSAoZVsnbG9uZ2l0dWRlJ10tc1snbG9uZ2l0dWRlJ10pLnRvUmFkKCk7XG5cbiAgICAgICAgICAgIHZhciBjb3NTaWdtYSwgc2lnbWEsIHNpbkFscGhhLCBjb3NTcUFscGhhLCBjb3MyU2lnbWFNLCBzaW5TaWdtYTtcblxuICAgICAgICAgICAgdmFyIFUxID0gTWF0aC5hdGFuKCgxLWYpICogTWF0aC50YW4ocGFyc2VGbG9hdChzWydsYXRpdHVkZSddKS50b1JhZCgpKSk7XG4gICAgICAgICAgICB2YXIgVTIgPSBNYXRoLmF0YW4oKDEtZikgKiBNYXRoLnRhbihwYXJzZUZsb2F0KGVbJ2xhdGl0dWRlJ10pLnRvUmFkKCkpKTtcbiAgICAgICAgICAgIHZhciBzaW5VMSA9IE1hdGguc2luKFUxKSwgY29zVTEgPSBNYXRoLmNvcyhVMSk7XG4gICAgICAgICAgICB2YXIgc2luVTIgPSBNYXRoLnNpbihVMiksIGNvc1UyID0gTWF0aC5jb3MoVTIpO1xuXG4gICAgICAgICAgICB2YXIgbGFtYmRhID0gTCwgbGFtYmRhUCwgaXRlckxpbWl0ID0gMTAwO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHZhciBzaW5MYW1iZGEgPSBNYXRoLnNpbihsYW1iZGEpLCBjb3NMYW1iZGEgPSBNYXRoLmNvcyhsYW1iZGEpO1xuICAgICAgICAgICAgICAgIHNpblNpZ21hID0gKFxuICAgICAgICAgICAgICAgICAgICBNYXRoLnNxcnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zVTIgKiBzaW5MYW1iZGFcbiAgICAgICAgICAgICAgICAgICAgICAgICkgKiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zVTIgKiBzaW5MYW1iZGFcbiAgICAgICAgICAgICAgICAgICAgICAgICkgKyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zVTEgKiBzaW5VMiAtIHNpblUxICogY29zVTIgKiBjb3NMYW1iZGFcbiAgICAgICAgICAgICAgICAgICAgICAgICkgKiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zVTEgKiBzaW5VMiAtIHNpblUxICogY29zVTIgKiBjb3NMYW1iZGFcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKHNpblNpZ21hID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZW9saWIuZGlzdGFuY2UgPSAwOyAgLy8gY28taW5jaWRlbnQgcG9pbnRzXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29zU2lnbWEgPSBzaW5VMSAqIHNpblUyICsgY29zVTEgKiBjb3NVMiAqIGNvc0xhbWJkYTtcbiAgICAgICAgICAgICAgICBzaWdtYSA9IE1hdGguYXRhbjIoc2luU2lnbWEsIGNvc1NpZ21hKTtcbiAgICAgICAgICAgICAgICBzaW5BbHBoYSA9IGNvc1UxICogY29zVTIgKiBzaW5MYW1iZGEgLyBzaW5TaWdtYTtcbiAgICAgICAgICAgICAgICBjb3NTcUFscGhhID0gMSAtIHNpbkFscGhhICogc2luQWxwaGE7XG4gICAgICAgICAgICAgICAgY29zMlNpZ21hTSA9IGNvc1NpZ21hIC0gMiAqIHNpblUxICogc2luVTIgLyBjb3NTcUFscGhhO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKGNvczJTaWdtYU0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvczJTaWdtYU0gPSAwOyAgLy8gZXF1YXRvcmlhbCBsaW5lOiBjb3NTcUFscGhhPTAgKMKnNilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIEMgPSAoXG4gICAgICAgICAgICAgICAgICAgIGYgLyAxNiAqIGNvc1NxQWxwaGEgKiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA0ICsgZiAqIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0IC0gMyAqIGNvc1NxQWxwaGFcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgbGFtYmRhUCA9IGxhbWJkYTtcbiAgICAgICAgICAgICAgICBsYW1iZGEgPSAoXG4gICAgICAgICAgICAgICAgICAgIEwgKyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAxIC0gQ1xuICAgICAgICAgICAgICAgICAgICApICogZiAqIHNpbkFscGhhICogKFxuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbWEgKyBDICogc2luU2lnbWEgKiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zMlNpZ21hTSArIEMgKiBjb3NTaWdtYSAqIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgKyAyICogY29zMlNpZ21hTSAqIGNvczJTaWdtYU1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB9IHdoaWxlIChNYXRoLmFicyhsYW1iZGEtbGFtYmRhUCkgPiAxZS0xMiAmJiAtLWl0ZXJMaW1pdD4wKTtcblxuICAgICAgICAgICAgaWYgKGl0ZXJMaW1pdCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBOYU47ICAvLyBmb3JtdWxhIGZhaWxlZCB0byBjb252ZXJnZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdVNxID0gKFxuICAgICAgICAgICAgICAgIGNvc1NxQWxwaGEgKiAoXG4gICAgICAgICAgICAgICAgICAgIGEgKiBhIC0gYiAqIGJcbiAgICAgICAgICAgICAgICApIC8gKFxuICAgICAgICAgICAgICAgICAgICBiKmJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB2YXIgQSA9IChcbiAgICAgICAgICAgICAgICAxICsgdVNxIC8gMTYzODQgKiAoXG4gICAgICAgICAgICAgICAgICAgIDQwOTYgKyB1U3EgKiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAtNzY4ICsgdVNxICogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMCAtIDE3NSAqIHVTcVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdmFyIEIgPSAoXG4gICAgICAgICAgICAgICAgdVNxIC8gMTAyNCAqIChcbiAgICAgICAgICAgICAgICAgICAgMjU2ICsgdVNxICogKFxuICAgICAgICAgICAgICAgICAgICAgICAgLTEyOCArIHVTcSAqIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NC00NyAqIHVTcVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdmFyIGRlbHRhU2lnbWEgPSAoXG4gICAgICAgICAgICAgICAgQiAqIHNpblNpZ21hICogKFxuICAgICAgICAgICAgICAgICAgICBjb3MyU2lnbWFNICsgQiAvIDQgKiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3NTaWdtYSAqIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSArIDIgKiBjb3MyU2lnbWFNICogY29zMlNpZ21hTVxuICAgICAgICAgICAgICAgICAgICAgICAgKSAtQiAvIDYgKiBjb3MyU2lnbWFNICogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zICsgNCAqIHNpblNpZ21hICogc2luU2lnbWFcbiAgICAgICAgICAgICAgICAgICAgICAgICkgKiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLTMgKyA0ICogY29zMlNpZ21hTSAqIGNvczJTaWdtYU1cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9IGIgKiBBICogKHNpZ21hIC0gZGVsdGFTaWdtYSk7XG5cbiAgICAgICAgICAgIGRpc3RhbmNlID0gZGlzdGFuY2UudG9GaXhlZChwcmVjaXNpb24pOyAvLyByb3VuZCB0byAxbW0gcHJlY2lzaW9uXG5cbiAgICAgICAgICAgIC8vaWYgKHN0YXJ0Lmhhc093blByb3BlcnR5KGVsZXZhdGlvbikgJiYgZW5kLmhhc093blByb3BlcnR5KGVsZXZhdGlvbikpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5lbGV2YXRpb24oc3RhcnQpICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgdGhpcy5lbGV2YXRpb24oZW5kKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2xpbWIgPSBNYXRoLmFicyh0aGlzLmVsZXZhdGlvbihzdGFydCkgLSB0aGlzLmVsZXZhdGlvbihlbmQpKTtcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IE1hdGguc3FydChkaXN0YW5jZSAqIGRpc3RhbmNlICsgY2xpbWIgKiBjbGltYik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRpc3RhbmNlID0gTWF0aC5yb3VuZChkaXN0YW5jZSAqIE1hdGgucG93KDEwLCBwcmVjaXNpb24pIC8gYWNjdXJhY3kpICogYWNjdXJhY3kgLyBNYXRoLnBvdygxMCwgcHJlY2lzaW9uKTtcblxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgIC8vIG5vdGU6IHRvIHJldHVybiBpbml0aWFsL2ZpbmFsIGJlYXJpbmdzIGluIGFkZGl0aW9uIHRvIGRpc3RhbmNlLCB1c2Ugc29tZXRoaW5nIGxpa2U6XG4gICAgICAgICAgICB2YXIgZndkQXogPSBNYXRoLmF0YW4yKGNvc1UyKnNpbkxhbWJkYSwgIGNvc1UxKnNpblUyLXNpblUxKmNvc1UyKmNvc0xhbWJkYSk7XG4gICAgICAgICAgICB2YXIgcmV2QXogPSBNYXRoLmF0YW4yKGNvc1UxKnNpbkxhbWJkYSwgLXNpblUxKmNvc1UyK2Nvc1UxKnNpblUyKmNvc0xhbWJkYSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7IGRpc3RhbmNlOiBzLCBpbml0aWFsQmVhcmluZzogZndkQXoudG9EZWcoKSwgZmluYWxCZWFyaW5nOiByZXZBei50b0RlZygpIH07XG4gICAgICAgICAgICAqL1xuXG4gICAgICAgIH0sXG5cblxuICAgICAgICAvKipcbiAgICAgICAgKiBDYWxjdWxhdGVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBzcG90cy5cbiAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBtb3JlIHNpbXBsZSBidXQgYWxzbyBmYXIgbW9yZSBpbmFjY3VyYXRlXG4gICAgICAgICpcbiAgICAgICAgKiBAcGFyYW0gICAgb2JqZWN0ICAgIFN0YXJ0IHBvc2l0aW9uIHtsYXRpdHVkZTogMTIzLCBsb25naXR1ZGU6IDEyM31cbiAgICAgICAgKiBAcGFyYW0gICAgb2JqZWN0ICAgIEVuZCBwb3NpdGlvbiB7bGF0aXR1ZGU6IDEyMywgbG9uZ2l0dWRlOiAxMjN9XG4gICAgICAgICogQHBhcmFtICAgIGludGVnZXIgICBBY2N1cmFjeSAoaW4gbWV0ZXJzKVxuICAgICAgICAqIEByZXR1cm4gICBpbnRlZ2VyICAgRGlzdGFuY2UgKGluIG1ldGVycylcbiAgICAgICAgKi9cbiAgICAgICAgZ2V0RGlzdGFuY2VTaW1wbGU6IGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIGFjY3VyYWN5KSB7XG5cbiAgICAgICAgICAgIGFjY3VyYWN5ID0gTWF0aC5mbG9vcihhY2N1cmFjeSkgfHwgMTtcblxuICAgICAgICAgICAgdmFyIGRpc3RhbmNlID1cbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKFxuICAgICAgICAgICAgICAgICAgICBNYXRoLmFjb3MoXG4gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnNpbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhdGl0dWRlKGVuZCkudG9SYWQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSAqXG4gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnNpbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhdGl0dWRlKHN0YXJ0KS50b1JhZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICApICtcbiAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguY29zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF0aXR1ZGUoZW5kKS50b1JhZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICApICpcbiAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguY29zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF0aXR1ZGUoc3RhcnQpLnRvUmFkKClcbiAgICAgICAgICAgICAgICAgICAgICAgICkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5jb3MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb25naXR1ZGUoc3RhcnQpLnRvUmFkKCkgLSB0aGlzLmxvbmdpdHVkZShlbmQpLnRvUmFkKClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKSAqIHRoaXMucmFkaXVzXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgcmV0dXJuIGdlb2xpYi5kaXN0YW5jZSA9IE1hdGguZmxvb3IoTWF0aC5yb3VuZChkaXN0YW5jZS9hY2N1cmFjeSkqYWNjdXJhY3kpO1xuXG4gICAgICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAgICAqIENhbGN1bGF0ZXMgdGhlIGNlbnRlciBvZiBhIGNvbGxlY3Rpb24gb2YgZ2VvIGNvb3JkaW5hdGVzXG4gICAgICAgICpcbiAgICAgICAgKiBAcGFyYW0gICAgICAgIGFycmF5ICAgICAgIENvbGxlY3Rpb24gb2YgY29vcmRzIFt7bGF0aXR1ZGU6IDUxLjUxMCwgbG9uZ2l0dWRlOiA3LjEzMjF9LCB7bGF0aXR1ZGU6IDQ5LjEyMzgsIGxvbmdpdHVkZTogXCI4wrAgMzAnIFdcIn0sIC4uLl1cbiAgICAgICAgKiBAcmV0dXJuICAgICAgIG9iamVjdCAgICAgIHtsYXRpdHVkZTogY2VudGVyTGF0LCBsb25naXR1ZGU6IGNlbnRlckxuZ31cbiAgICAgICAgKi9cbiAgICAgICAgZ2V0Q2VudGVyOiBmdW5jdGlvbihjb29yZHMpIHtcblxuICAgICAgICAgICAgdmFyIGNvb3Jkc0FycmF5ID0gY29vcmRzO1xuICAgICAgICAgICAgaWYodHlwZW9mIGNvb3JkcyA9PT0gJ29iamVjdCcgJiYgIShjb29yZHMgaW5zdGFuY2VvZiBBcnJheSkpIHtcblxuICAgICAgICAgICAgICAgIGNvb3Jkc0FycmF5ID0gW107XG5cbiAgICAgICAgICAgICAgICBmb3IodmFyIGtleSBpbiBjb29yZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29vcmRzQXJyYXkucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29vcmRzKGNvb3Jkc1trZXldKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZighY29vcmRzQXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgWCA9IDAuMDtcbiAgICAgICAgICAgIHZhciBZID0gMC4wO1xuICAgICAgICAgICAgdmFyIFogPSAwLjA7XG4gICAgICAgICAgICB2YXIgbGF0LCBsb24sIGh5cDtcblxuICAgICAgICAgICAgY29vcmRzQXJyYXkuZm9yRWFjaChmdW5jdGlvbihjb29yZCkge1xuXG4gICAgICAgICAgICAgICAgbGF0ID0gdGhpcy5sYXRpdHVkZShjb29yZCkudG9SYWQoKTtcbiAgICAgICAgICAgICAgICBsb24gPSB0aGlzLmxvbmdpdHVkZShjb29yZCkudG9SYWQoKTtcblxuICAgICAgICAgICAgICAgIFggKz0gTWF0aC5jb3MobGF0KSAqIE1hdGguY29zKGxvbik7XG4gICAgICAgICAgICAgICAgWSArPSBNYXRoLmNvcyhsYXQpICogTWF0aC5zaW4obG9uKTtcbiAgICAgICAgICAgICAgICBaICs9IE1hdGguc2luKGxhdCk7XG5cbiAgICAgICAgICAgIH0sIHRoaXMpO1xuXG4gICAgICAgICAgICB2YXIgbmJfY29vcmRzID0gY29vcmRzQXJyYXkubGVuZ3RoO1xuICAgICAgICAgICAgWCA9IFggLyBuYl9jb29yZHM7XG4gICAgICAgICAgICBZID0gWSAvIG5iX2Nvb3JkcztcbiAgICAgICAgICAgIFogPSBaIC8gbmJfY29vcmRzO1xuXG4gICAgICAgICAgICBsb24gPSBNYXRoLmF0YW4yKFksIFgpO1xuICAgICAgICAgICAgaHlwID0gTWF0aC5zcXJ0KFggKiBYICsgWSAqIFkpO1xuICAgICAgICAgICAgbGF0ID0gTWF0aC5hdGFuMihaLCBoeXApO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGxhdGl0dWRlOiAobGF0ICogR2VvbGliLlRPX0RFRykudG9GaXhlZCg2KSxcbiAgICAgICAgICAgICAgICBsb25naXR1ZGU6IChsb24gKiBHZW9saWIuVE9fREVHKS50b0ZpeGVkKDYpXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgIH0sXG5cblxuICAgICAgICAvKipcbiAgICAgICAgKiBHZXRzIHRoZSBtYXggYW5kIG1pbiwgbGF0aXR1ZGUsIGxvbmdpdHVkZSwgYW5kIGVsZXZhdGlvbiAoaWYgcHJvdmlkZWQpLlxuICAgICAgICAqIEBwYXJhbSAgICAgICAgYXJyYXkgICAgICAgYXJyYXkgd2l0aCBjb29yZHMgZS5nLiBbe2xhdGl0dWRlOiA1MS41MTQzLCBsb25naXR1ZGU6IDcuNDEzOH0sIHtsYXRpdHVkZTogMTIzLCBsb25naXR1ZGU6IDEyM30sIC4uLl1cbiAgICAgICAgKiBAcmV0dXJuICAgb2JqZWN0ICAgICAge21heExhdDogbWF4TGF0LFxuICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgbWluTGF0OiBtaW5MYXRcbiAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgIG1heExuZzogbWF4TG5nLFxuICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgbWluTG5nOiBtaW5MbmcsXG4gICAgICAgICogICAgICAgICAgICAgICAgICAgICBtYXhFbGV2OiBtYXhFbGV2LFxuICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgbWluRWxldjogbWluRWxldn1cbiAgICAgICAgKi9cbiAgICAgICAgZ2V0Qm91bmRzOiBmdW5jdGlvbihjb29yZHMpIHtcblxuICAgICAgICAgICAgaWYgKCFjb29yZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdXNlRWxldmF0aW9uID0gdGhpcy5lbGV2YXRpb24oY29vcmRzWzBdKTtcblxuICAgICAgICAgICAgdmFyIHN0YXRzID0ge1xuICAgICAgICAgICAgICAgIG1heExhdDogLUluZmluaXR5LFxuICAgICAgICAgICAgICAgIG1pbkxhdDogSW5maW5pdHksXG4gICAgICAgICAgICAgICAgbWF4TG5nOiAtSW5maW5pdHksXG4gICAgICAgICAgICAgICAgbWluTG5nOiBJbmZpbml0eVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB1c2VFbGV2YXRpb24gIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBzdGF0cy5tYXhFbGV2ID0gMDtcbiAgICAgICAgICAgICAgICBzdGF0cy5taW5FbGV2ID0gSW5maW5pdHk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gY29vcmRzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuXG4gICAgICAgICAgICAgICAgc3RhdHMubWF4TGF0ID0gTWF0aC5tYXgodGhpcy5sYXRpdHVkZShjb29yZHNbaV0pLCBzdGF0cy5tYXhMYXQpO1xuICAgICAgICAgICAgICAgIHN0YXRzLm1pbkxhdCA9IE1hdGgubWluKHRoaXMubGF0aXR1ZGUoY29vcmRzW2ldKSwgc3RhdHMubWluTGF0KTtcbiAgICAgICAgICAgICAgICBzdGF0cy5tYXhMbmcgPSBNYXRoLm1heCh0aGlzLmxvbmdpdHVkZShjb29yZHNbaV0pLCBzdGF0cy5tYXhMbmcpO1xuICAgICAgICAgICAgICAgIHN0YXRzLm1pbkxuZyA9IE1hdGgubWluKHRoaXMubG9uZ2l0dWRlKGNvb3Jkc1tpXSksIHN0YXRzLm1pbkxuZyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodXNlRWxldmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRzLm1heEVsZXYgPSBNYXRoLm1heCh0aGlzLmVsZXZhdGlvbihjb29yZHNbaV0pLCBzdGF0cy5tYXhFbGV2KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHMubWluRWxldiA9IE1hdGgubWluKHRoaXMuZWxldmF0aW9uKGNvb3Jkc1tpXSksIHN0YXRzLm1pbkVsZXYpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gc3RhdHM7XG5cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgKiBDYWxjdWxhdGVzIHRoZSBjZW50ZXIgb2YgdGhlIGJvdW5kcyBvZiBnZW8gY29vcmRpbmF0ZXMuXG4gICAgICAgICpcbiAgICAgICAgKiBPbiBwb2x5Z29ucyBsaWtlIHBvbGl0aWNhbCBib3JkZXJzIChlZy4gc3RhdGVzKVxuICAgICAgICAqIHRoaXMgbWF5IGdpdmVzIGEgY2xvc2VyIHJlc3VsdCB0byBodW1hbiBleHBlY3RhdGlvbiwgdGhhbiBgZ2V0Q2VudGVyYCxcbiAgICAgICAgKiBiZWNhdXNlIHRoYXQgZnVuY3Rpb24gY2FuIGJlIGRpc3R1cmJlZCBieSB1bmV2ZW4gZGlzdHJpYnV0aW9uIG9mXG4gICAgICAgICogcG9pbnQgaW4gZGlmZmVyZW50IHNpZGVzLlxuICAgICAgICAqIEltYWdpbmUgdGhlIFVTIHN0YXRlIE9rbGFob21hOiBgZ2V0Q2VudGVyYCBvbiB0aGF0IGdpdmVzIGEgc291dGhlcm5cbiAgICAgICAgKiBwb2ludCwgYmVjYXVzZSB0aGUgc291dGhlcm4gYm9yZGVyIGNvbnRhaW5zIGEgbG90IG1vcmUgbm9kZXMsXG4gICAgICAgICogdGhhbiB0aGUgb3RoZXJzLlxuICAgICAgICAqXG4gICAgICAgICogQHBhcmFtICAgICAgICBhcnJheSAgICAgICBDb2xsZWN0aW9uIG9mIGNvb3JkcyBbe2xhdGl0dWRlOiA1MS41MTAsIGxvbmdpdHVkZTogNy4xMzIxfSwge2xhdGl0dWRlOiA0OS4xMjM4LCBsb25naXR1ZGU6IFwiOMKwIDMwJyBXXCJ9LCAuLi5dXG4gICAgICAgICogQHJldHVybiAgICAgICBvYmplY3QgICAgICB7bGF0aXR1ZGU6IGNlbnRlckxhdCwgbG9uZ2l0dWRlOiBjZW50ZXJMbmd9XG4gICAgICAgICovXG4gICAgICAgIGdldENlbnRlck9mQm91bmRzOiBmdW5jdGlvbihjb29yZHMpIHtcbiAgICAgICAgICAgIHZhciBiID0gdGhpcy5nZXRCb3VuZHMoY29vcmRzKTtcbiAgICAgICAgICAgIHZhciBsYXRpdHVkZSA9IGIubWluTGF0ICsgKChiLm1heExhdCAtIGIubWluTGF0KSAvIDIpO1xuICAgICAgICAgICAgdmFyIGxvbmdpdHVkZSA9IGIubWluTG5nICsgKChiLm1heExuZyAtIGIubWluTG5nKSAvIDIpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBsYXRpdHVkZTogcGFyc2VGbG9hdChsYXRpdHVkZS50b0ZpeGVkKDYpKSxcbiAgICAgICAgICAgICAgICBsb25naXR1ZGU6IHBhcnNlRmxvYXQobG9uZ2l0dWRlLnRvRml4ZWQoNikpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQ29tcHV0ZXMgdGhlIGJvdW5kaW5nIGNvb3JkaW5hdGVzIG9mIGFsbCBwb2ludHMgb24gdGhlIHN1cmZhY2VcbiAgICAgICAgKiBvZiB0aGUgZWFydGggbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgZ3JlYXQgY2lyY2xlXG4gICAgICAgICogZGlzdGFuY2UuXG4gICAgICAgICpcbiAgICAgICAgKiBAcGFyYW0gb2JqZWN0IFBvaW50IHBvc2l0aW9uIHtsYXRpdHVkZTogMTIzLCBsb25naXR1ZGU6IDEyM31cbiAgICAgICAgKiBAcGFyYW0gbnVtYmVyIERpc3RhbmNlIChpbiBtZXRlcnMpLlxuICAgICAgICAqIEByZXR1cm4gYXJyYXkgQ29sbGVjdGlvbiBvZiB0d28gcG9pbnRzIGRlZmluaW5nIHRoZSBTVyBhbmQgTkUgY29ybmVycy5cbiAgICAgICAgKi9cbiAgICAgICAgZ2V0Qm91bmRzT2ZEaXN0YW5jZTogZnVuY3Rpb24ocG9pbnQsIGRpc3RhbmNlKSB7XG5cbiAgICAgICAgICAgIHZhciBsYXRpdHVkZSA9IHRoaXMubGF0aXR1ZGUocG9pbnQpO1xuICAgICAgICAgICAgdmFyIGxvbmdpdHVkZSA9IHRoaXMubG9uZ2l0dWRlKHBvaW50KTtcblxuICAgICAgICAgICAgdmFyIHJhZExhdCA9IGxhdGl0dWRlLnRvUmFkKCk7XG4gICAgICAgICAgICB2YXIgcmFkTG9uID0gbG9uZ2l0dWRlLnRvUmFkKCk7XG5cbiAgICAgICAgICAgIHZhciByYWREaXN0ID0gZGlzdGFuY2UgLyB0aGlzLnJhZGl1cztcbiAgICAgICAgICAgIHZhciBtaW5MYXQgPSByYWRMYXQgLSByYWREaXN0O1xuICAgICAgICAgICAgdmFyIG1heExhdCA9IHJhZExhdCArIHJhZERpc3Q7XG5cbiAgICAgICAgICAgIHZhciBNQVhfTEFUX1JBRCA9IHRoaXMubWF4TGF0LnRvUmFkKCk7XG4gICAgICAgICAgICB2YXIgTUlOX0xBVF9SQUQgPSB0aGlzLm1pbkxhdC50b1JhZCgpO1xuICAgICAgICAgICAgdmFyIE1BWF9MT05fUkFEID0gdGhpcy5tYXhMb24udG9SYWQoKTtcbiAgICAgICAgICAgIHZhciBNSU5fTE9OX1JBRCA9IHRoaXMubWluTG9uLnRvUmFkKCk7XG5cbiAgICAgICAgICAgIHZhciBtaW5Mb247XG4gICAgICAgICAgICB2YXIgbWF4TG9uO1xuXG4gICAgICAgICAgICBpZiAobWluTGF0ID4gTUlOX0xBVF9SQUQgJiYgbWF4TGF0IDwgTUFYX0xBVF9SQUQpIHtcblxuICAgICAgICAgICAgICAgIHZhciBkZWx0YUxvbiA9IE1hdGguYXNpbihNYXRoLnNpbihyYWREaXN0KSAvIE1hdGguY29zKHJhZExhdCkpO1xuICAgICAgICAgICAgICAgIG1pbkxvbiA9IHJhZExvbiAtIGRlbHRhTG9uO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1pbkxvbiA8IE1JTl9MT05fUkFEKSB7XG4gICAgICAgICAgICAgICAgICAgIG1pbkxvbiArPSBHZW9saWIuUElfWDI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbWF4TG9uID0gcmFkTG9uICsgZGVsdGFMb247XG5cbiAgICAgICAgICAgICAgICBpZiAobWF4TG9uID4gTUFYX0xPTl9SQUQpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF4TG9uIC09IEdlb2xpYi5QSV9YMjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQSBwb2xlIGlzIHdpdGhpbiB0aGUgZGlzdGFuY2UuXG4gICAgICAgICAgICAgICAgbWluTGF0ID0gTWF0aC5tYXgobWluTGF0LCBNSU5fTEFUX1JBRCk7XG4gICAgICAgICAgICAgICAgbWF4TGF0ID0gTWF0aC5taW4obWF4TGF0LCBNQVhfTEFUX1JBRCk7XG4gICAgICAgICAgICAgICAgbWluTG9uID0gTUlOX0xPTl9SQUQ7XG4gICAgICAgICAgICAgICAgbWF4TG9uID0gTUFYX0xPTl9SQUQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgLy8gU291dGh3ZXN0XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZTogbWluTGF0LnRvRGVnKCksXG4gICAgICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogbWluTG9uLnRvRGVnKClcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIE5vcnRoZWFzdFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGU6IG1heExhdC50b0RlZygpLFxuICAgICAgICAgICAgICAgICAgICBsb25naXR1ZGU6IG1heExvbi50b0RlZygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXTtcblxuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQ2hlY2tzIHdoZXRoZXIgYSBwb2ludCBpcyBpbnNpZGUgb2YgYSBwb2x5Z29uIG9yIG5vdC5cbiAgICAgICAgKiBOb3RlIHRoYXQgdGhlIHBvbHlnb24gY29vcmRzIG11c3QgYmUgaW4gY29ycmVjdCBvcmRlciFcbiAgICAgICAgKlxuICAgICAgICAqIEBwYXJhbSAgICAgICAgb2JqZWN0ICAgICAgY29vcmRpbmF0ZSB0byBjaGVjayBlLmcuIHtsYXRpdHVkZTogNTEuNTAyMywgbG9uZ2l0dWRlOiA3LjM4MTV9XG4gICAgICAgICogQHBhcmFtICAgICAgICBhcnJheSAgICAgICBhcnJheSB3aXRoIGNvb3JkcyBlLmcuIFt7bGF0aXR1ZGU6IDUxLjUxNDMsIGxvbmdpdHVkZTogNy40MTM4fSwge2xhdGl0dWRlOiAxMjMsIGxvbmdpdHVkZTogMTIzfSwgLi4uXVxuICAgICAgICAqIEByZXR1cm4gICAgICAgYm9vbCAgICAgICAgdHJ1ZSBpZiB0aGUgY29vcmRpbmF0ZSBpcyBpbnNpZGUgdGhlIGdpdmVuIHBvbHlnb25cbiAgICAgICAgKi9cbiAgICAgICAgaXNQb2ludEluc2lkZTogZnVuY3Rpb24obGF0bG5nLCBjb29yZHMpIHtcblxuICAgICAgICAgICAgZm9yKHZhciBjID0gZmFsc2UsIGkgPSAtMSwgbCA9IGNvb3Jkcy5sZW5ndGgsIGogPSBsIC0gMTsgKytpIDwgbDsgaiA9IGkpIHtcblxuICAgICAgICAgICAgICAgIGlmKFxuICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5sb25naXR1ZGUoY29vcmRzW2ldKSA8PSB0aGlzLmxvbmdpdHVkZShsYXRsbmcpICYmIHRoaXMubG9uZ2l0dWRlKGxhdGxuZykgPCB0aGlzLmxvbmdpdHVkZShjb29yZHNbal0pKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMubG9uZ2l0dWRlKGNvb3Jkc1tqXSkgPD0gdGhpcy5sb25naXR1ZGUobGF0bG5nKSAmJiB0aGlzLmxvbmdpdHVkZShsYXRsbmcpIDwgdGhpcy5sb25naXR1ZGUoY29vcmRzW2ldKSlcbiAgICAgICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhdGl0dWRlKGxhdGxuZykgPCAodGhpcy5sYXRpdHVkZShjb29yZHNbal0pIC0gdGhpcy5sYXRpdHVkZShjb29yZHNbaV0pKSAqXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5sb25naXR1ZGUobGF0bG5nKSAtIHRoaXMubG9uZ2l0dWRlKGNvb3Jkc1tpXSkpIC9cbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmxvbmdpdHVkZShjb29yZHNbal0pIC0gdGhpcy5sb25naXR1ZGUoY29vcmRzW2ldKSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXRpdHVkZShjb29yZHNbaV0pXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9ICFjO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gYztcblxuICAgICAgICB9LFxuXG5cbiAgICAgICAvKipcbiAgICAgICAgKiBQcmUgY2FsY3VsYXRlIHRoZSBwb2x5Z29uIGNvb3JkcywgdG8gc3BlZWQgdXAgdGhlIHBvaW50IGluc2lkZSBjaGVjay5cbiAgICAgICAgKiBVc2UgdGhpcyBmdW5jdGlvbiBiZWZvcmUgY2FsbGluZyBpc1BvaW50SW5zaWRlV2l0aFByZXBhcmVkUG9seWdvbigpXG4gICAgICAgICogQHNlZSAgICAgICAgICBBbGdvcnl0aG0gZnJvbSBodHRwOi8vYWxpZW5yeWRlcmZsZXguY29tL3BvbHlnb24vXG4gICAgICAgICogQHBhcmFtICAgICAgICBhcnJheSAgICAgICBhcnJheSB3aXRoIGNvb3JkcyBlLmcuIFt7bGF0aXR1ZGU6IDUxLjUxNDMsIGxvbmdpdHVkZTogNy40MTM4fSwge2xhdGl0dWRlOiAxMjMsIGxvbmdpdHVkZTogMTIzfSwgLi4uXVxuICAgICAgICAqL1xuICAgICAgICBwcmVwYXJlUG9seWdvbkZvcklzUG9pbnRJbnNpZGVPcHRpbWl6ZWQ6IGZ1bmN0aW9uKGNvb3Jkcykge1xuXG4gICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBqID0gY29vcmRzLmxlbmd0aC0xOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgICAgIGlmKHRoaXMubG9uZ2l0dWRlKGNvb3Jkc1tqXSkgPT09IHRoaXMubG9uZ2l0dWRlKGNvb3Jkc1tpXSkpIHtcblxuICAgICAgICAgICAgICAgICAgICBjb29yZHNbaV0uY29uc3RhbnQgPSB0aGlzLmxhdGl0dWRlKGNvb3Jkc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIGNvb3Jkc1tpXS5tdWx0aXBsZSA9IDA7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgIGNvb3Jkc1tpXS5jb25zdGFudCA9IHRoaXMubGF0aXR1ZGUoY29vcmRzW2ldKSAtIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9uZ2l0dWRlKGNvb3Jkc1tpXSkgKiB0aGlzLmxhdGl0dWRlKGNvb3Jkc1tqXSlcbiAgICAgICAgICAgICAgICAgICAgKSAvIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9uZ2l0dWRlKGNvb3Jkc1tqXSkgLSB0aGlzLmxvbmdpdHVkZShjb29yZHNbaV0pXG4gICAgICAgICAgICAgICAgICAgICkgKyAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvbmdpdHVkZShjb29yZHNbaV0pKnRoaXMubGF0aXR1ZGUoY29vcmRzW2ldKVxuICAgICAgICAgICAgICAgICAgICApIC8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb25naXR1ZGUoY29vcmRzW2pdKS10aGlzLmxvbmdpdHVkZShjb29yZHNbaV0pXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29vcmRzW2ldLm11bHRpcGxlID0gKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXRpdHVkZShjb29yZHNbal0pLXRoaXMubGF0aXR1ZGUoY29vcmRzW2ldKVxuICAgICAgICAgICAgICAgICAgICApIC8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb25naXR1ZGUoY29vcmRzW2pdKS10aGlzLmxvbmdpdHVkZShjb29yZHNbaV0pXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBqPWk7XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENoZWNrcyB3aGV0aGVyIGEgcG9pbnQgaXMgaW5zaWRlIG9mIGEgcG9seWdvbiBvciBub3QuXG4gICAgICAgKiBcIlRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIG1hbnkgcG9pbnRzIHRoYXQgbmVlZCB0byBiZSB0ZXN0ZWQgYWdhaW5zdCB0aGUgc2FtZSAoc3RhdGljKSBwb2x5Z29uLlwiXG4gICAgICAgKiBQbGVhc2UgY2FsbCB0aGUgZnVuY3Rpb24gcHJlcGFyZVBvbHlnb25Gb3JJc1BvaW50SW5zaWRlT3B0aW1pemVkKCkgd2l0aCB0aGUgc2FtZSBjb29yZHMgb2JqZWN0IGJlZm9yZSB1c2luZyB0aGlzIGZ1bmN0aW9uLlxuICAgICAgICogTm90ZSB0aGF0IHRoZSBwb2x5Z29uIGNvb3JkcyBtdXN0IGJlIGluIGNvcnJlY3Qgb3JkZXIhXG4gICAgICAgKlxuICAgICAgICogQHNlZSAgICAgICAgICBBbGdvcnl0aG0gZnJvbSBodHRwOi8vYWxpZW5yeWRlcmZsZXguY29tL3BvbHlnb24vXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtICAgICBvYmplY3QgICAgICBjb29yZGluYXRlIHRvIGNoZWNrIGUuZy4ge2xhdGl0dWRlOiA1MS41MDIzLCBsb25naXR1ZGU6IDcuMzgxNX1cbiAgICAgICAqIEBwYXJhbSAgICAgYXJyYXkgICAgICAgYXJyYXkgd2l0aCBjb29yZHMgZS5nLiBbe2xhdGl0dWRlOiA1MS41MTQzLCBsb25naXR1ZGU6IDcuNDEzOH0sIHtsYXRpdHVkZTogMTIzLCBsb25naXR1ZGU6IDEyM30sIC4uLl1cbiAgICAgICAqIEByZXR1cm4gICAgICAgIGJvb2wgICAgICAgIHRydWUgaWYgdGhlIGNvb3JkaW5hdGUgaXMgaW5zaWRlIHRoZSBnaXZlbiBwb2x5Z29uXG4gICAgICAgKi9cbiAgICAgICAgaXNQb2ludEluc2lkZVdpdGhQcmVwYXJlZFBvbHlnb246IGZ1bmN0aW9uKHBvaW50LCBjb29yZHMpIHtcblxuICAgICAgICAgICAgdmFyIGZsZ1BvaW50SW5zaWRlID0gZmFsc2UsXG4gICAgICAgICAgICB5ID0gdGhpcy5sb25naXR1ZGUocG9pbnQpLFxuICAgICAgICAgICAgeCA9IHRoaXMubGF0aXR1ZGUocG9pbnQpO1xuXG4gICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBqID0gY29vcmRzLmxlbmd0aC0xOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMubG9uZ2l0dWRlKGNvb3Jkc1tpXSkgPCB5ICYmIHRoaXMubG9uZ2l0dWRlKGNvb3Jkc1tqXSkgPj15IHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9uZ2l0dWRlKGNvb3Jkc1tqXSkgPCB5ICYmIHRoaXMubG9uZ2l0dWRlKGNvb3Jkc1tpXSkgPj0geSkpIHtcblxuICAgICAgICAgICAgICAgICAgICBmbGdQb2ludEluc2lkZV49KHkqY29vcmRzW2ldLm11bHRpcGxlK2Nvb3Jkc1tpXS5jb25zdGFudCA8IHgpO1xuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaj1pO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmbGdQb2ludEluc2lkZTtcblxuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogU2hvcnRjdXQgZm9yIGdlb2xpYi5pc1BvaW50SW5zaWRlKClcbiAgICAgICAgKi9cbiAgICAgICAgaXNJbnNpZGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNQb2ludEluc2lkZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQ2hlY2tzIHdoZXRoZXIgYSBwb2ludCBpcyBpbnNpZGUgb2YgYSBjaXJjbGUgb3Igbm90LlxuICAgICAgICAqXG4gICAgICAgICogQHBhcmFtICAgICAgICBvYmplY3QgICAgICBjb29yZGluYXRlIHRvIGNoZWNrIChlLmcuIHtsYXRpdHVkZTogNTEuNTAyMywgbG9uZ2l0dWRlOiA3LjM4MTV9KVxuICAgICAgICAqIEBwYXJhbSAgICAgICAgb2JqZWN0ICAgICAgY29vcmRpbmF0ZSBvZiB0aGUgY2lyY2xlJ3MgY2VudGVyIChlLmcuIHtsYXRpdHVkZTogNTEuNDgxMiwgbG9uZ2l0dWRlOiA3LjQwMjV9KVxuICAgICAgICAqIEBwYXJhbSAgICAgICAgaW50ZWdlciAgICAgbWF4aW11bSByYWRpdXMgaW4gbWV0ZXJzXG4gICAgICAgICogQHJldHVybiAgICAgICBib29sICAgICAgICB0cnVlIGlmIHRoZSBjb29yZGluYXRlIGlzIHdpdGhpbiB0aGUgZ2l2ZW4gcmFkaXVzXG4gICAgICAgICovXG4gICAgICAgIGlzUG9pbnRJbkNpcmNsZTogZnVuY3Rpb24obGF0bG5nLCBjZW50ZXIsIHJhZGl1cykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGlzdGFuY2UobGF0bG5nLCBjZW50ZXIpIDwgcmFkaXVzO1xuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogU2hvcnRjdXQgZm9yIGdlb2xpYi5pc1BvaW50SW5DaXJjbGUoKVxuICAgICAgICAqL1xuICAgICAgICB3aXRoaW5SYWRpdXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNQb2ludEluQ2lyY2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH0sXG5cblxuICAgICAgICAvKipcbiAgICAgICAgKiBHZXRzIHJodW1iIGxpbmUgYmVhcmluZyBvZiB0d28gcG9pbnRzLiBGaW5kIG91dCBhYm91dCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHJodW1iIGxpbmUgYW5kXG4gICAgICAgICogZ3JlYXQgY2lyY2xlIGJlYXJpbmcgb24gV2lraXBlZGlhLiBJdCdzIHF1aXRlIGNvbXBsaWNhdGVkLiBSaHVtYiBsaW5lIHNob3VsZCBiZSBmaW5lIGluIG1vc3QgY2FzZXM6XG4gICAgICAgICpcbiAgICAgICAgKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1JodW1iX2xpbmUjR2VuZXJhbF9hbmRfbWF0aGVtYXRpY2FsX2Rlc2NyaXB0aW9uXG4gICAgICAgICpcbiAgICAgICAgKiBGdW5jdGlvbiBoZWF2aWx5IGJhc2VkIG9uIERvdWcgVmFuZGVyd2VpZGUncyBncmVhdCBQSFAgdmVyc2lvbiAobGljZW5zZWQgdW5kZXIgR1BMIDMuMClcbiAgICAgICAgKiBodHRwOi8vd3d3LmRvdWd2LmNvbS8yMDA5LzA3LzEzL2NhbGN1bGF0aW5nLXRoZS1iZWFyaW5nLWFuZC1jb21wYXNzLXJvc2UtZGlyZWN0aW9uLWJldHdlZW4tdHdvLWxhdGl0dWRlLWxvbmdpdHVkZS1jb29yZGluYXRlcy1pbi1waHAvXG4gICAgICAgICpcbiAgICAgICAgKiBAcGFyYW0gICAgICAgIG9iamVjdCAgICAgIG9yaWdpbiBjb29yZGluYXRlIChlLmcuIHtsYXRpdHVkZTogNTEuNTAyMywgbG9uZ2l0dWRlOiA3LjM4MTV9KVxuICAgICAgICAqIEBwYXJhbSAgICAgICAgb2JqZWN0ICAgICAgZGVzdGluYXRpb24gY29vcmRpbmF0ZVxuICAgICAgICAqIEByZXR1cm4gICAgICAgaW50ZWdlciAgICAgY2FsY3VsYXRlZCBiZWFyaW5nXG4gICAgICAgICovXG4gICAgICAgIGdldFJodW1iTGluZUJlYXJpbmc6IGZ1bmN0aW9uKG9yaWdpbkxMLCBkZXN0TEwpIHtcblxuICAgICAgICAgICAgLy8gZGlmZmVyZW5jZSBvZiBsb25naXR1ZGUgY29vcmRzXG4gICAgICAgICAgICB2YXIgZGlmZkxvbiA9IHRoaXMubG9uZ2l0dWRlKGRlc3RMTCkudG9SYWQoKSAtIHRoaXMubG9uZ2l0dWRlKG9yaWdpbkxMKS50b1JhZCgpO1xuXG4gICAgICAgICAgICAvLyBkaWZmZXJlbmNlIGxhdGl0dWRlIGNvb3JkcyBwaGlcbiAgICAgICAgICAgIHZhciBkaWZmUGhpID0gTWF0aC5sb2coXG4gICAgICAgICAgICAgICAgTWF0aC50YW4oXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGF0aXR1ZGUoZGVzdExMKS50b1JhZCgpIC8gMiArIEdlb2xpYi5QSV9ESVY0XG4gICAgICAgICAgICAgICAgKSAvXG4gICAgICAgICAgICAgICAgTWF0aC50YW4oXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGF0aXR1ZGUob3JpZ2luTEwpLnRvUmFkKCkgLyAyICsgR2VvbGliLlBJX0RJVjRcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyByZWNhbGN1bGF0ZSBkaWZmTG9uIGlmIGl0IGlzIGdyZWF0ZXIgdGhhbiBwaVxuICAgICAgICAgICAgaWYoTWF0aC5hYnMoZGlmZkxvbikgPiBNYXRoLlBJKSB7XG4gICAgICAgICAgICAgICAgaWYoZGlmZkxvbiA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZGlmZkxvbiA9IChHZW9saWIuUElfWDIgLSBkaWZmTG9uKSAqIC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGlmZkxvbiA9IEdlb2xpYi5QSV9YMiArIGRpZmZMb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL3JldHVybiB0aGUgYW5nbGUsIG5vcm1hbGl6ZWRcbiAgICAgICAgICAgIHJldHVybiAoTWF0aC5hdGFuMihkaWZmTG9uLCBkaWZmUGhpKS50b0RlZygpICsgMzYwKSAlIDM2MDtcblxuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogR2V0cyBncmVhdCBjaXJjbGUgYmVhcmluZyBvZiB0d28gcG9pbnRzLiBTZWUgZGVzY3JpcHRpb24gb2YgZ2V0Umh1bWJMaW5lQmVhcmluZyBmb3IgbW9yZSBpbmZvcm1hdGlvblxuICAgICAgICAqXG4gICAgICAgICogQHBhcmFtICAgICAgICBvYmplY3QgICAgICBvcmlnaW4gY29vcmRpbmF0ZSAoZS5nLiB7bGF0aXR1ZGU6IDUxLjUwMjMsIGxvbmdpdHVkZTogNy4zODE1fSlcbiAgICAgICAgKiBAcGFyYW0gICAgICAgIG9iamVjdCAgICAgIGRlc3RpbmF0aW9uIGNvb3JkaW5hdGVcbiAgICAgICAgKiBAcmV0dXJuICAgICAgIGludGVnZXIgICAgIGNhbGN1bGF0ZWQgYmVhcmluZ1xuICAgICAgICAqL1xuICAgICAgICBnZXRCZWFyaW5nOiBmdW5jdGlvbihvcmlnaW5MTCwgZGVzdExMKSB7XG5cbiAgICAgICAgICAgIGRlc3RMTFsnbGF0aXR1ZGUnXSA9IHRoaXMubGF0aXR1ZGUoZGVzdExMKTtcbiAgICAgICAgICAgIGRlc3RMTFsnbG9uZ2l0dWRlJ10gPSB0aGlzLmxvbmdpdHVkZShkZXN0TEwpO1xuICAgICAgICAgICAgb3JpZ2luTExbJ2xhdGl0dWRlJ10gPSB0aGlzLmxhdGl0dWRlKG9yaWdpbkxMKTtcbiAgICAgICAgICAgIG9yaWdpbkxMWydsb25naXR1ZGUnXSA9IHRoaXMubG9uZ2l0dWRlKG9yaWdpbkxMKTtcblxuICAgICAgICAgICAgdmFyIGJlYXJpbmcgPSAoXG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICBNYXRoLmF0YW4yKFxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5zaW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdExMWydsb25naXR1ZGUnXS50b1JhZCgpIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5MTFsnbG9uZ2l0dWRlJ10udG9SYWQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSAqXG4gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmNvcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0TExbJ2xhdGl0dWRlJ10udG9SYWQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguY29zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbkxMWydsYXRpdHVkZSddLnRvUmFkKClcbiAgICAgICAgICAgICAgICAgICAgICAgICkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5zaW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdExMWydsYXRpdHVkZSddLnRvUmFkKClcbiAgICAgICAgICAgICAgICAgICAgICAgICkgLVxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5zaW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luTExbJ2xhdGl0dWRlJ10udG9SYWQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSAqXG4gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmNvcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0TExbJ2xhdGl0dWRlJ10udG9SYWQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSAqXG4gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmNvcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0TExbJ2xvbmdpdHVkZSddLnRvUmFkKCkgLSBvcmlnaW5MTFsnbG9uZ2l0dWRlJ10udG9SYWQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKS50b0RlZygpICsgMzYwXG4gICAgICAgICAgICApICUgMzYwO1xuXG4gICAgICAgICAgICByZXR1cm4gYmVhcmluZztcblxuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogR2V0cyB0aGUgY29tcGFzcyBkaXJlY3Rpb24gZnJvbSBhbiBvcmlnaW4gY29vcmRpbmF0ZSB0byBhIGRlc3RpbmF0aW9uIGNvb3JkaW5hdGUuXG4gICAgICAgICpcbiAgICAgICAgKiBAcGFyYW0gICAgICAgIG9iamVjdCAgICAgIG9yaWdpbiBjb29yZGluYXRlIChlLmcuIHtsYXRpdHVkZTogNTEuNTAyMywgbG9uZ2l0dWRlOiA3LjM4MTV9KVxuICAgICAgICAqIEBwYXJhbSAgICAgICAgb2JqZWN0ICAgICAgZGVzdGluYXRpb24gY29vcmRpbmF0ZVxuICAgICAgICAqIEBwYXJhbSAgICAgICAgc3RyaW5nICAgICAgQmVhcmluZyBtb2RlLiBDYW4gYmUgZWl0aGVyIGNpcmNsZSBvciByaHVtYmxpbmVcbiAgICAgICAgKiBAcmV0dXJuICAgICAgIG9iamVjdCAgICAgIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSByb3VnaCAoTkVTVykgYW5kIGFuIGV4YWN0IGRpcmVjdGlvbiAoTk5FLCBORSwgRU5FLCBFLCBFU0UsIGV0YykuXG4gICAgICAgICovXG4gICAgICAgIGdldENvbXBhc3NEaXJlY3Rpb246IGZ1bmN0aW9uKG9yaWdpbkxMLCBkZXN0TEwsIGJlYXJpbmdNb2RlKSB7XG5cbiAgICAgICAgICAgIHZhciBkaXJlY3Rpb247XG4gICAgICAgICAgICB2YXIgYmVhcmluZztcblxuICAgICAgICAgICAgaWYoYmVhcmluZ01vZGUgPT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgICAgICAvLyB1c2UgZ3JlYXQgY2lyY2xlIGJlYXJpbmdcbiAgICAgICAgICAgICAgICBiZWFyaW5nID0gdGhpcy5nZXRCZWFyaW5nKG9yaWdpbkxMLCBkZXN0TEwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IGlzIHJodW1iIGxpbmUgYmVhcmluZ1xuICAgICAgICAgICAgICAgIGJlYXJpbmcgPSB0aGlzLmdldFJodW1iTGluZUJlYXJpbmcob3JpZ2luTEwsIGRlc3RMTCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaChNYXRoLnJvdW5kKGJlYXJpbmcvMjIuNSkpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IHtleGFjdDogXCJOTkVcIiwgcm91Z2g6IFwiTlwifTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSB7ZXhhY3Q6IFwiTkVcIiwgcm91Z2g6IFwiTlwifTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSB7ZXhhY3Q6IFwiRU5FXCIsIHJvdWdoOiBcIkVcIn07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0ge2V4YWN0OiBcIkVcIiwgcm91Z2g6IFwiRVwifTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSB7ZXhhY3Q6IFwiRVNFXCIsIHJvdWdoOiBcIkVcIn07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0ge2V4YWN0OiBcIlNFXCIsIHJvdWdoOiBcIkVcIn07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0ge2V4YWN0OiBcIlNTRVwiLCByb3VnaDogXCJTXCJ9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IHtleGFjdDogXCJTXCIsIHJvdWdoOiBcIlNcIn07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0ge2V4YWN0OiBcIlNTV1wiLCByb3VnaDogXCJTXCJ9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSB7ZXhhY3Q6IFwiU1dcIiwgcm91Z2g6IFwiU1wifTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0ge2V4YWN0OiBcIldTV1wiLCByb3VnaDogXCJXXCJ9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSB7ZXhhY3Q6IFwiV1wiLCByb3VnaDogXCJXXCJ9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSB7ZXhhY3Q6IFwiV05XXCIsIHJvdWdoOiBcIldcIn07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IHtleGFjdDogXCJOV1wiLCByb3VnaDogXCJXXCJ9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSB7ZXhhY3Q6IFwiTk5XXCIsIHJvdWdoOiBcIk5cIn07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IHtleGFjdDogXCJOXCIsIHJvdWdoOiBcIk5cIn07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRpcmVjdGlvblsnYmVhcmluZyddID0gYmVhcmluZztcbiAgICAgICAgICAgIHJldHVybiBkaXJlY3Rpb247XG5cbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFNob3J0Y3V0IGZvciBnZXRDb21wYXNzRGlyZWN0aW9uXG4gICAgICAgICovXG4gICAgICAgIGdldERpcmVjdGlvbjogZnVuY3Rpb24ob3JpZ2luTEwsIGRlc3RMTCwgYmVhcmluZ01vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENvbXBhc3NEaXJlY3Rpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFNvcnRzIGFuIGFycmF5IG9mIGNvb3JkcyBieSBkaXN0YW5jZSBmcm9tIGEgcmVmZXJlbmNlIGNvb3JkaW5hdGVcbiAgICAgICAgKlxuICAgICAgICAqIEBwYXJhbSAgICAgICAgb2JqZWN0ICAgICAgcmVmZXJlbmNlIGNvb3JkaW5hdGUgZS5nLiB7bGF0aXR1ZGU6IDUxLjUwMjMsIGxvbmdpdHVkZTogNy4zODE1fVxuICAgICAgICAqIEBwYXJhbSAgICAgICAgbWl4ZWQgICAgICAgYXJyYXkgb3Igb2JqZWN0IHdpdGggY29vcmRzIFt7bGF0aXR1ZGU6IDUxLjUxNDMsIGxvbmdpdHVkZTogNy40MTM4fSwge2xhdGl0dWRlOiAxMjMsIGxvbmdpdHVkZTogMTIzfSwgLi4uXVxuICAgICAgICAqIEByZXR1cm4gICAgICAgYXJyYXkgICAgICAgb3JkZXJlZCBhcnJheVxuICAgICAgICAqL1xuICAgICAgICBvcmRlckJ5RGlzdGFuY2U6IGZ1bmN0aW9uKGxhdGxuZywgY29vcmRzKSB7XG5cbiAgICAgICAgICAgIHZhciBjb29yZHNBcnJheSA9IE9iamVjdC5rZXlzKGNvb3JkcykubWFwKGZ1bmN0aW9uKGlkeCkge1xuICAgICAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9IHRoaXMuZ2V0RGlzdGFuY2UobGF0bG5nLCBjb29yZHNbaWR4XSk7XG4gICAgICAgICAgICAgICAgdmFyIGF1Z21lbnRlZENvb3JkID0gT2JqZWN0LmNyZWF0ZShjb29yZHNbaWR4XSk7XG4gICAgICAgICAgICAgICAgYXVnbWVudGVkQ29vcmQuZGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgICAgICBhdWdtZW50ZWRDb29yZC5rZXkgPSBpZHg7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF1Z21lbnRlZENvb3JkO1xuICAgICAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgICAgIHJldHVybiBjb29yZHNBcnJheS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5kaXN0YW5jZSAtIGIuZGlzdGFuY2U7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIENoZWNrIGlmIGEgcG9pbnQgbGllcyBpbiBsaW5lIGNyZWF0ZWQgYnkgdHdvIG90aGVyIHBvaW50c1xuICAgICAgICAqXG4gICAgICAgICogQHBhcmFtICAgIG9iamVjdCAgICBQb2ludCB0byBjaGVjazoge2xhdGl0dWRlOiAxMjMsIGxvbmdpdHVkZTogMTIzfVxuICAgICAgICAqIEBwYXJhbSAgICBvYmplY3QgICAgU3RhcnQgb2YgbGluZSB7bGF0aXR1ZGU6IDEyMywgbG9uZ2l0dWRlOiAxMjN9XG4gICAgICAgICogQHBhcmFtICAgIG9iamVjdCAgICBFbmQgb2YgbGluZSB7bGF0aXR1ZGU6IDEyMywgbG9uZ2l0dWRlOiAxMjN9XG4gICAgICAgICogQHJldHVybiAgIGJvb2xlYW5cbiAgICAgICAgKi9cbiAgICAgICAgaXNQb2ludEluTGluZTogZnVuY3Rpb24ocG9pbnQsIHN0YXJ0LCBlbmQpIHtcblxuICAgICAgICAgICAgcmV0dXJuICh0aGlzLmdldERpc3RhbmNlKHN0YXJ0LCBwb2ludCwgMSwgMykrdGhpcy5nZXREaXN0YW5jZShwb2ludCwgZW5kLCAxLCAzKSkudG9GaXhlZCgzKT09dGhpcy5nZXREaXN0YW5jZShzdGFydCwgZW5kLCAxLCAzKTtcbiAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAqIENoZWNrIGlmIGEgcG9pbnQgbGllcyB3aXRoaW4gYSBnaXZlbiBkaXN0YW5jZSBmcm9tIGEgbGluZSBjcmVhdGVkIGJ5IHR3byBvdGhlciBwb2ludHNcbiAgICAgICAgKlxuICAgICAgICAqIEBwYXJhbSAgICBvYmplY3QgICAgUG9pbnQgdG8gY2hlY2s6IHtsYXRpdHVkZTogMTIzLCBsb25naXR1ZGU6IDEyM31cbiAgICAgICAgKiBAcGFyYW0gICAgb2JqZWN0ICAgIFN0YXJ0IG9mIGxpbmUge2xhdGl0dWRlOiAxMjMsIGxvbmdpdHVkZTogMTIzfVxuICAgICAgICAqIEBwYXJhbSAgICBvYmplY3QgICAgRW5kIG9mIGxpbmUge2xhdGl0dWRlOiAxMjMsIGxvbmdpdHVkZTogMTIzfVxuICAgICAgICAqIEBwYXJhcm0gICBmbG9hdCAgICAgbWF4aW11bSBkaXN0YW5jZSBmcm9tIGxpbmVcbiAgICAgICAgKiBAcmV0dXJuICAgYm9vbGVhblxuICAgICAgICAqL1xuICAgICAgICBpc1BvaW50TmVhckxpbmU6IGZ1bmN0aW9uKHBvaW50LCBzdGFydCwgZW5kLCBkaXN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGlzdGFuY2VGcm9tTGluZShwb2ludCwgc3RhcnQsIGVuZCkgPCBkaXN0YW5jZTtcbiAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICogcmV0dXJuIHRoZSBtaW5pbXVtIGRpc3RhbmNlIGZyb20gYSBwb2ludCB0byBhIGxpbmVcbiAgICAgICAgKlxuICAgICAgICAqIEBwYXJhbSAgICBvYmplY3QgICAgUG9pbnQgYXdheSBmcm9tIGxpbmVcbiAgICAgICAgKiBAcGFyYW0gICAgb2JqZWN0ICAgIFN0YXJ0IG9mIGxpbmUge2xhdGl0dWRlOiAxMjMsIGxvbmdpdHVkZTogMTIzfVxuICAgICAgICAqIEBwYXJhbSAgICBvYmplY3QgICAgRW5kIG9mIGxpbmUge2xhdGl0dWRlOiAxMjMsIGxvbmdpdHVkZTogMTIzfVxuICAgICAgICAqIEByZXR1cm4gICBmbG9hdCAgICAgZGlzdGFuY2UgZnJvbSBwb2ludCB0byBsaW5lXG4gICAgICAgICovXG4gICAgICAgIGdldERpc3RhbmNlRnJvbUxpbmU6IGZ1bmN0aW9uKHBvaW50LCBzdGFydCwgZW5kKSB7XG4gICAgICAgICAgICB2YXIgZDEgPSB0aGlzLmdldERpc3RhbmNlKHN0YXJ0LCBwb2ludCwgMSwgMyk7XG4gICAgICAgICAgICB2YXIgZDIgPSB0aGlzLmdldERpc3RhbmNlKHBvaW50LCBlbmQsIDEsIDMpO1xuICAgICAgICAgICAgdmFyIGQzID0gdGhpcy5nZXREaXN0YW5jZShzdGFydCwgZW5kLCAxLCAzKTtcbiAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9IDA7XG5cbiAgICAgICAgICAgIC8vIGFscGhhIGlzIHRoZSBhbmdsZSBiZXR3ZWVuIHRoZSBsaW5lIGZyb20gc3RhcnQgdG8gcG9pbnQsIGFuZCBmcm9tIHN0YXJ0IHRvIGVuZCAvL1xuICAgICAgICAgICAgdmFyIGFscGhhID0gTWF0aC5hY29zKChkMSpkMSArIGQzKmQzIC0gZDIqZDIpLygyKmQxKmQzKSk7XG4gICAgICAgICAgICAvLyBiZXRhIGlzIHRoZSBhbmdsZSBiZXR3ZWVuIHRoZSBsaW5lIGZyb20gZW5kIHRvIHBvaW50IGFuZCBmcm9tIGVuZCB0byBzdGFydCAvL1xuICAgICAgICAgICAgdmFyIGJldGEgPSBNYXRoLmFjb3MoKGQyKmQyICsgZDMqZDMgLSBkMSpkMSkvKDIqZDIqZDMpKTtcblxuICAgICAgICAgICAgLy8gaWYgdGhlIGFuZ2xlIGlzIGdyZWF0ZXIgdGhhbiA5MCBkZWdyZWVzLCB0aGVuIHRoZSBtaW5pbXVtIGRpc3RhbmNlIGlzIHRoZVxuICAgICAgICAgICAgLy8gbGluZSBmcm9tIHRoZSBzdGFydCB0byB0aGUgcG9pbnQgLy9cbiAgICAgICAgICAgIGlmKGFscGhhPk1hdGguUEkvMikge1xuICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gZDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBzYW1lIGZvciB0aGUgYmV0YSAvL1xuICAgICAgICAgICAgZWxzZSBpZihiZXRhID4gTWF0aC5QSS8yKSB7XG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBkMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSB0aGUgbWluaW11bSBkaXN0YW5jZSBpcyBhY2hpZXZlZCB0aHJvdWdoIGEgbGluZSBwZXJwZW5kdWxhciB0byB0aGUgc3RhcnQtZW5kIGxpbmUsXG4gICAgICAgICAgICAvLyB3aGljaCBnb2VzIGZyb20gdGhlIHN0YXJ0LWVuZCBsaW5lIHRvIHRoZSBwb2ludCAvL1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBNYXRoLnNpbihhbHBoYSkgKiBkMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGRpc3RhbmNlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEZpbmRzIHRoZSBuZWFyZXN0IGNvb3JkaW5hdGUgdG8gYSByZWZlcmVuY2UgY29vcmRpbmF0ZVxuICAgICAgICAqXG4gICAgICAgICogQHBhcmFtICAgICAgICBvYmplY3QgICAgICByZWZlcmVuY2UgY29vcmRpbmF0ZSBlLmcuIHtsYXRpdHVkZTogNTEuNTAyMywgbG9uZ2l0dWRlOiA3LjM4MTV9XG4gICAgICAgICogQHBhcmFtICAgICAgICBtaXhlZCAgICAgICBhcnJheSBvciBvYmplY3Qgd2l0aCBjb29yZHMgW3tsYXRpdHVkZTogNTEuNTE0MywgbG9uZ2l0dWRlOiA3LjQxMzh9LCB7bGF0aXR1ZGU6IDEyMywgbG9uZ2l0dWRlOiAxMjN9LCAuLi5dXG4gICAgICAgICogQHJldHVybiAgICAgICBhcnJheSAgICAgICBvcmRlcmVkIGFycmF5XG4gICAgICAgICovXG4gICAgICAgIGZpbmROZWFyZXN0OiBmdW5jdGlvbihsYXRsbmcsIGNvb3Jkcywgb2Zmc2V0LCBsaW1pdCkge1xuXG4gICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcbiAgICAgICAgICAgIGxpbWl0ID0gbGltaXQgfHwgMTtcbiAgICAgICAgICAgIHZhciBvcmRlcmVkID0gdGhpcy5vcmRlckJ5RGlzdGFuY2UobGF0bG5nLCBjb29yZHMpO1xuXG4gICAgICAgICAgICBpZihsaW1pdCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmRlcmVkW29mZnNldF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmRlcmVkLnNwbGljZShvZmZzZXQsIGxpbWl0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgZ2l2ZW4gcGF0aFxuICAgICAgICAqXG4gICAgICAgICogQHBhcmFtICAgICAgICBtaXhlZCAgICAgICBhcnJheSBvciBvYmplY3Qgd2l0aCBjb29yZHMgW3tsYXRpdHVkZTogNTEuNTE0MywgbG9uZ2l0dWRlOiA3LjQxMzh9LCB7bGF0aXR1ZGU6IDEyMywgbG9uZ2l0dWRlOiAxMjN9LCAuLi5dXG4gICAgICAgICogQHJldHVybiAgICAgICBpbnRlZ2VyICAgICBsZW5ndGggb2YgdGhlIHBhdGggKGluIG1ldGVycylcbiAgICAgICAgKi9cbiAgICAgICAgZ2V0UGF0aExlbmd0aDogZnVuY3Rpb24oY29vcmRzKSB7XG5cbiAgICAgICAgICAgIHZhciBkaXN0ID0gMDtcbiAgICAgICAgICAgIHZhciBsYXN0O1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNvb3Jkcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgICAgICBpZihsYXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coY29vcmRzW2ldLCBsYXN0LCB0aGlzLmdldERpc3RhbmNlKGNvb3Jkc1tpXSwgbGFzdCkpO1xuICAgICAgICAgICAgICAgICAgICBkaXN0ICs9IHRoaXMuZ2V0RGlzdGFuY2UodGhpcy5jb29yZHMoY29vcmRzW2ldKSwgbGFzdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxhc3QgPSB0aGlzLmNvb3Jkcyhjb29yZHNbaV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZGlzdDtcblxuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQ2FsY3VsYXRlcyB0aGUgc3BlZWQgYmV0d2VlbiB0byBwb2ludHMgd2l0aGluIGEgZ2l2ZW4gdGltZSBzcGFuLlxuICAgICAgICAqXG4gICAgICAgICogQHBhcmFtICAgICAgICBvYmplY3QgICAgICBjb29yZHMgd2l0aCBqYXZhc2NyaXB0IHRpbWVzdGFtcCB7bGF0aXR1ZGU6IDUxLjUxNDMsIGxvbmdpdHVkZTogNy40MTM4LCB0aW1lOiAxMzYwMjMxMjAwODgwfVxuICAgICAgICAqIEBwYXJhbSAgICAgICAgb2JqZWN0ICAgICAgY29vcmRzIHdpdGggamF2YXNjcmlwdCB0aW1lc3RhbXAge2xhdGl0dWRlOiA1MS41NTAyLCBsb25naXR1ZGU6IDcuNDMyMywgdGltZTogMTM2MDI0NTYwMDQ2MH1cbiAgICAgICAgKiBAcGFyYW0gICAgICAgIG9iamVjdCAgICAgIG9wdGlvbnMgKGN1cnJlbnRseSBcInVuaXRcIiBpcyB0aGUgb25seSBvcHRpb24uIERlZmF1bHQ6IGttKGgpKTtcbiAgICAgICAgKiBAcmV0dXJuICAgICAgIGZsb2F0ICAgICAgIHNwZWVkIGluIHVuaXQgcGVyIGhvdXJcbiAgICAgICAgKi9cbiAgICAgICAgZ2V0U3BlZWQ6IGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIG9wdGlvbnMpIHtcblxuICAgICAgICAgICAgdmFyIHVuaXQgPSBvcHRpb25zICYmIG9wdGlvbnMudW5pdCB8fCAna20nO1xuXG4gICAgICAgICAgICBpZih1bml0ID09ICdtcGgnKSB7XG4gICAgICAgICAgICAgICAgdW5pdCA9ICdtaSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYodW5pdCA9PSAna21oJykge1xuICAgICAgICAgICAgICAgIHVuaXQgPSAna20nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZGlzdGFuY2UgPSBnZW9saWIuZ2V0RGlzdGFuY2Uoc3RhcnQsIGVuZCk7XG4gICAgICAgICAgICB2YXIgdGltZSA9ICgoZW5kLnRpbWUqMSkvMTAwMCkgLSAoKHN0YXJ0LnRpbWUqMSkvMTAwMCk7XG4gICAgICAgICAgICB2YXIgbVBlckhyID0gKGRpc3RhbmNlL3RpbWUpKjM2MDA7XG4gICAgICAgICAgICB2YXIgc3BlZWQgPSBNYXRoLnJvdW5kKG1QZXJIciAqIHRoaXMubWVhc3VyZXNbdW5pdF0gKiAxMDAwMCkvMTAwMDA7XG4gICAgICAgICAgICByZXR1cm4gc3BlZWQ7XG5cbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb21wdXRlcyB0aGUgZGVzdGluYXRpb24gcG9pbnQgZ2l2ZW4gYW4gaW5pdGlhbCBwb2ludCwgYSBkaXN0YW5jZVxuICAgICAgICAgKiBhbmQgYSBiZWFyaW5nXG4gICAgICAgICAqXG4gICAgICAgICAqIHNlZSBodHRwOi8vd3d3Lm1vdmFibGUtdHlwZS5jby51ay9zY3JpcHRzL2xhdGxvbmcuaHRtbCBmb3IgdGhlIG9yaWdpbmFsIGNvZGVcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtICAgICAgICBvYmplY3QgICAgIHN0YXJ0IGNvb3JkaW5hdGUgKGUuZy4ge2xhdGl0dWRlOiA1MS41MDIzLCBsb25naXR1ZGU6IDcuMzgxNX0pXG4gICAgICAgICAqIEBwYXJhbSAgICAgICAgZmxvYXQgICAgICBsb25naXR1ZGUgb2YgdGhlIGluaXRhbCBwb2ludCBpbiBkZWdyZWVcbiAgICAgICAgICogQHBhcmFtICAgICAgICBmbG9hdCAgICAgIGRpc3RhbmNlIHRvIGdvIGZyb20gdGhlIGluaXRhbCBwb2ludCBpbiBtZXRlclxuICAgICAgICAgKiBAcGFyYW0gICAgICAgIGZsb2F0ICAgICAgYmVhcmluZyBpbiBkZWdyZWUgb2YgdGhlIGRpcmVjdGlvbiB0byBnbywgZS5nLiAwID0gbm9ydGgsIDE4MCA9IHNvdXRoXG4gICAgICAgICAqIEBwYXJhbSAgICAgICAgZmxvYXQgICAgICBvcHRpb25hbCAoaW4gbWV0ZXIpLCBkZWZhdWx0cyB0byBtZWFuIHJhZGl1cyBvZiB0aGUgZWFydGhcbiAgICAgICAgICogQHJldHVybiAgICAgICBvYmplY3QgICAgIHtsYXRpdHVkZTogZGVzdExhdCAoaW4gZGVncmVlKSwgbG9uZ2l0dWRlOiBkZXN0TG5nIChpbiBkZWdyZWUpfVxuICAgICAgICAgKi9cbiAgICAgICAgY29tcHV0ZURlc3RpbmF0aW9uUG9pbnQ6IGZ1bmN0aW9uKHN0YXJ0LCBkaXN0YW5jZSwgYmVhcmluZywgcmFkaXVzKSB7XG5cbiAgICAgICAgICAgIHZhciBsYXQgPSB0aGlzLmxhdGl0dWRlKHN0YXJ0KTtcbiAgICAgICAgICAgIHZhciBsbmcgPSB0aGlzLmxvbmdpdHVkZShzdGFydCk7XG5cbiAgICAgICAgICAgIHJhZGl1cyA9ICh0eXBlb2YgcmFkaXVzID09PSAndW5kZWZpbmVkJykgPyB0aGlzLnJhZGl1cyA6IE51bWJlcihyYWRpdXMpO1xuXG4gICAgICAgICAgICB2YXIgzrQgPSBOdW1iZXIoZGlzdGFuY2UpIC8gcmFkaXVzOyAvLyBhbmd1bGFyIGRpc3RhbmNlIGluIHJhZGlhbnNcbiAgICAgICAgICAgIHZhciDOuCA9IE51bWJlcihiZWFyaW5nKS50b1JhZCgpO1xuXG4gICAgICAgICAgICB2YXIgz4YxID0gTnVtYmVyKGxhdCkudG9SYWQoKTtcbiAgICAgICAgICAgIHZhciDOuzEgPSBOdW1iZXIobG5nKS50b1JhZCgpO1xuXG4gICAgICAgICAgICB2YXIgz4YyID0gTWF0aC5hc2luKCBNYXRoLnNpbijPhjEpKk1hdGguY29zKM60KSArXG4gICAgICAgICAgICAgICAgTWF0aC5jb3Moz4YxKSpNYXRoLnNpbijOtCkqTWF0aC5jb3MozrgpICk7XG4gICAgICAgICAgICB2YXIgzrsyID0gzrsxICsgTWF0aC5hdGFuMihNYXRoLnNpbijOuCkqTWF0aC5zaW4ozrQpKk1hdGguY29zKM+GMSksXG4gICAgICAgICAgICAgICAgICAgIE1hdGguY29zKM60KS1NYXRoLnNpbijPhjEpKk1hdGguc2luKM+GMikpO1xuICAgICAgICAgICAgzrsyID0gKM67MiszKk1hdGguUEkpICUgKDIqTWF0aC5QSSkgLSBNYXRoLlBJOyAvLyBub3JtYWxpc2UgdG8gLTE4MC4uKzE4MMKwXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbGF0aXR1ZGU6IM+GMi50b0RlZygpLFxuICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogzrsyLnRvRGVnKClcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIENvbnZlcnRzIGEgZGlzdGFuY2UgZnJvbSBtZXRlcnMgdG8ga20sIG1tLCBjbSwgbWksIGZ0LCBpbiBvciB5ZFxuICAgICAgICAqXG4gICAgICAgICogQHBhcmFtICAgICAgICBzdHJpbmcgICAgICBGb3JtYXQgdG8gYmUgY29udmVydGVkIGluXG4gICAgICAgICogQHBhcmFtICAgICAgICBmbG9hdCAgICAgICBEaXN0YW5jZSBpbiBtZXRlcnNcbiAgICAgICAgKiBAcGFyYW0gICAgICAgIGZsb2F0ICAgICAgIERlY2ltYWwgcGxhY2VzIGZvciByb3VuZGluZyAoZGVmYXVsdDogNClcbiAgICAgICAgKiBAcmV0dXJuICAgICAgIGZsb2F0ICAgICAgIENvbnZlcnRlZCBkaXN0YW5jZVxuICAgICAgICAqL1xuICAgICAgICBjb252ZXJ0VW5pdDogZnVuY3Rpb24odW5pdCwgZGlzdGFuY2UsIHJvdW5kKSB7XG5cbiAgICAgICAgICAgIGlmKGRpc3RhbmNlID09PSAwKSB7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcblxuICAgICAgICAgICAgfSBlbHNlIGlmKHR5cGVvZiBkaXN0YW5jZSA9PT0gJ3VuZGVmaW5lZCcpIHtcblxuICAgICAgICAgICAgICAgIGlmKHRoaXMuZGlzdGFuY2UgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBkaXN0YW5jZSB3YXMgZ2l2ZW4nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYodGhpcy5kaXN0YW5jZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IHRoaXMuZGlzdGFuY2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHVuaXQgPSB1bml0IHx8ICdtJztcbiAgICAgICAgICAgIHJvdW5kID0gKG51bGwgPT0gcm91bmQgPyA0IDogcm91bmQpO1xuXG4gICAgICAgICAgICBpZih0eXBlb2YgdGhpcy5tZWFzdXJlc1t1bml0XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yb3VuZChkaXN0YW5jZSAqIHRoaXMubWVhc3VyZXNbdW5pdF0sIHJvdW5kKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHVuaXQgZm9yIGNvbnZlcnNpb24uJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIGluIGRlY2ltYWwgZm9ybWF0IG9yLCBpZiBuZWNjZXNzYXJ5LCBjb252ZXJ0cyB0byBkZWNpbWFsXG4gICAgICAgICpcbiAgICAgICAgKiBAcGFyYW0gICAgICAgIG1peGVkICAgICAgIFZhbHVlKHMpIHRvIGJlIGNoZWNrZWQvY29udmVydGVkIChhcnJheSBvZiBsYXRsbmcgb2JqZWN0cywgbGF0bG5nIG9iamVjdCwgc2V4YWdlc2ltYWwgc3RyaW5nLCBmbG9hdClcbiAgICAgICAgKiBAcmV0dXJuICAgICAgIGZsb2F0ICAgICAgIElucHV0IGRhdGEgaW4gZGVjaW1hbCBmb3JtYXRcbiAgICAgICAgKi9cbiAgICAgICAgdXNlRGVjaW1hbDogZnVuY3Rpb24odmFsdWUpIHtcblxuICAgICAgICAgICAgaWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgQXJyYXldJykge1xuXG4gICAgICAgICAgICAgICAgdmFyIGdlb2xpYiA9IHRoaXM7XG5cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLm1hcChmdW5jdGlvbih2YWwpIHtcblxuICAgICAgICAgICAgICAgICAgICAvL2lmKCFpc05hTihwYXJzZUZsb2F0KHZhbCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKGdlb2xpYi5pc0RlY2ltYWwodmFsKSkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2VvbGliLnVzZURlY2ltYWwodmFsKTtcblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYodHlwZW9mIHZhbCA9PSAnb2JqZWN0Jykge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihnZW9saWIudmFsaWRhdGUodmFsKSkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlb2xpYi5jb29yZHModmFsKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcih2YXIgcHJvcCBpbiB2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsW3Byb3BdID0gZ2VvbGliLnVzZURlY2ltYWwodmFsW3Byb3BdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKGdlb2xpYi5pc1NleGFnZXNpbWFsKHZhbCkpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlb2xpYi5zZXhhZ2VzaW1hbDJkZWNpbWFsKHZhbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDtcblxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdGhpcy52YWxpZGF0ZSh2YWx1ZSkpIHtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvb3Jkcyh2YWx1ZSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG5cbiAgICAgICAgICAgICAgICBmb3IodmFyIHByb3AgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVbcHJvcF0gPSB0aGlzLnVzZURlY2ltYWwodmFsdWVbcHJvcF0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzRGVjaW1hbCh2YWx1ZSkpIHtcblxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmKHRoaXMuaXNTZXhhZ2VzaW1hbCh2YWx1ZSkgPT09IHRydWUpIHtcblxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHRoaXMuc2V4YWdlc2ltYWwyZGVjaW1hbCh2YWx1ZSkpO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBmb3JtYXQuJyk7XG5cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgKiBDb252ZXJ0cyBhIGRlY2ltYWwgY29vcmRpbmF0ZSB2YWx1ZSB0byBzZXhhZ2VzaW1hbCBmb3JtYXRcbiAgICAgICAgKlxuICAgICAgICAqIEBwYXJhbSAgICAgICAgZmxvYXQgICAgICAgZGVjaW1hbFxuICAgICAgICAqIEByZXR1cm4gICAgICAgc3RyaW5nICAgICAgU2V4YWdlc2ltYWwgdmFsdWUgKFhYwrAgWVknIFpaXCIpXG4gICAgICAgICovXG4gICAgICAgIGRlY2ltYWwyc2V4YWdlc2ltYWw6IGZ1bmN0aW9uKGRlYykge1xuXG4gICAgICAgICAgICBpZiAoZGVjIGluIHRoaXMuc2V4YWdlc2ltYWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXhhZ2VzaW1hbFtkZWNdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdG1wID0gZGVjLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTtcblxuICAgICAgICAgICAgdmFyIGRlZyA9IE1hdGguYWJzKHRtcFswXSk7XG4gICAgICAgICAgICB2YXIgbWluID0gKCcwLicgKyAodG1wWzFdIHx8IDApKSo2MDtcbiAgICAgICAgICAgIHZhciBzZWMgPSBtaW4udG9TdHJpbmcoKS5zcGxpdCgnLicpO1xuXG4gICAgICAgICAgICBtaW4gPSBNYXRoLmZsb29yKG1pbik7XG4gICAgICAgICAgICBzZWMgPSAoKCcwLicgKyAoc2VjWzFdIHx8IDApKSAqIDYwKS50b0ZpeGVkKDIpO1xuXG4gICAgICAgICAgICB0aGlzLnNleGFnZXNpbWFsW2RlY10gPSAoZGVnICsgJ8KwICcgKyBtaW4gKyBcIicgXCIgKyBzZWMgKyAnXCInKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V4YWdlc2ltYWxbZGVjXTtcblxuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQ29udmVydHMgYSBzZXhhZ2VzaW1hbCBjb29yZGluYXRlIHRvIGRlY2ltYWwgZm9ybWF0XG4gICAgICAgICpcbiAgICAgICAgKiBAcGFyYW0gICAgICAgIGZsb2F0ICAgICAgIFNleGFnZXNpbWFsIGNvb3JkaW5hdGVcbiAgICAgICAgKiBAcmV0dXJuICAgICAgIHN0cmluZyAgICAgIERlY2ltYWwgdmFsdWUgKFhYLlhYWFhYWFhYKVxuICAgICAgICAqL1xuICAgICAgICBzZXhhZ2VzaW1hbDJkZWNpbWFsOiBmdW5jdGlvbihzZXhhZ2VzaW1hbCkge1xuXG4gICAgICAgICAgICBpZiAoc2V4YWdlc2ltYWwgaW4gdGhpcy5kZWNpbWFsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVjaW1hbFtzZXhhZ2VzaW1hbF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciByZWdFeCA9IG5ldyBSZWdFeHAodGhpcy5zZXhhZ2VzaW1hbFBhdHRlcm4pO1xuICAgICAgICAgICAgdmFyIGRhdGEgPSByZWdFeC5leGVjKHNleGFnZXNpbWFsKTtcbiAgICAgICAgICAgIHZhciBtaW4gPSAwLCBzZWMgPSAwO1xuXG4gICAgICAgICAgICBpZihkYXRhKSB7XG4gICAgICAgICAgICAgICAgbWluID0gcGFyc2VGbG9hdChkYXRhWzJdLzYwKTtcbiAgICAgICAgICAgICAgICBzZWMgPSBwYXJzZUZsb2F0KGRhdGFbNF0vMzYwMCkgfHwgMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGRlYyA9ICgocGFyc2VGbG9hdChkYXRhWzFdKSArIG1pbiArIHNlYykpLnRvRml4ZWQoOCk7XG4gICAgICAgICAgICAvL3ZhciAgIGRlYyA9ICgocGFyc2VGbG9hdChkYXRhWzFdKSArIG1pbiArIHNlYykpO1xuXG4gICAgICAgICAgICAgICAgLy8gU291dGggYW5kIFdlc3QgYXJlIG5lZ2F0aXZlIGRlY2ltYWxzXG4gICAgICAgICAgICAgICAgZGVjID0gKGRhdGFbN10gPT0gJ1MnIHx8IGRhdGFbN10gPT0gJ1cnKSA/IHBhcnNlRmxvYXQoLWRlYykgOiBwYXJzZUZsb2F0KGRlYyk7XG4gICAgICAgICAgICAgICAgLy9kZWMgPSAoZGF0YVs3XSA9PSAnUycgfHwgZGF0YVs3XSA9PSAnVycpID8gLWRlYyA6IGRlYztcblxuICAgICAgICAgICAgdGhpcy5kZWNpbWFsW3NleGFnZXNpbWFsXSA9IGRlYztcblxuICAgICAgICAgICAgcmV0dXJuIGRlYztcblxuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgaW4gZGVjaW1hbCBmb3JtYXRcbiAgICAgICAgKlxuICAgICAgICAqIEBwYXJhbSAgICAgICAgc3RyaW5nICAgICAgVmFsdWUgdG8gYmUgY2hlY2tlZFxuICAgICAgICAqIEByZXR1cm4gICAgICAgYm9vbCAgICAgICAgVHJ1ZSBpZiBpbiBzZXhhZ2VzaW1hbCBmb3JtYXRcbiAgICAgICAgKi9cbiAgICAgICAgaXNEZWNpbWFsOiBmdW5jdGlvbih2YWx1ZSkge1xuXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxzKi8sICcnKTtcblxuICAgICAgICAgICAgLy8gbG9va3Mgc2lsbHkgYnV0IHdvcmtzIGFzIGV4cGVjdGVkXG4gICAgICAgICAgICAvLyBjaGVja3MgaWYgdmFsdWUgaXMgaW4gZGVjaW1hbCBmb3JtYXRcbiAgICAgICAgICAgIHJldHVybiAoIWlzTmFOKHBhcnNlRmxvYXQodmFsdWUpKSAmJiBwYXJzZUZsb2F0KHZhbHVlKSA9PSB2YWx1ZSk7XG5cbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIGluIHNleGFnZXNpbWFsIGZvcm1hdFxuICAgICAgICAqXG4gICAgICAgICogQHBhcmFtICAgICAgICBzdHJpbmcgICAgICBWYWx1ZSB0byBiZSBjaGVja2VkXG4gICAgICAgICogQHJldHVybiAgICAgICBib29sICAgICAgICBUcnVlIGlmIGluIHNleGFnZXNpbWFsIGZvcm1hdFxuICAgICAgICAqL1xuICAgICAgICBpc1NleGFnZXNpbWFsOiBmdW5jdGlvbih2YWx1ZSkge1xuXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxzKi8sICcnKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V4YWdlc2ltYWxQYXR0ZXJuLnRlc3QodmFsdWUpO1xuXG4gICAgICAgIH0sXG5cbiAgICAgICAgcm91bmQ6IGZ1bmN0aW9uKHZhbHVlLCBuKSB7XG4gICAgICAgICAgICB2YXIgZGVjUGxhY2UgPSBNYXRoLnBvdygxMCwgbik7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSAqIGRlY1BsYWNlKS9kZWNQbGFjZTtcbiAgICAgICAgfVxuXG4gICAgfSk7XG5cbiAgICAvLyBOb2RlIG1vZHVsZVxuICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG5cbiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBnZW9saWI7XG5cbiAgICAgICAgLy8gcmVhY3QgbmF0aXZlXG4gICAgICAgIGlmICh0eXBlb2YgZ2xvYmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGdsb2JhbC5nZW9saWIgPSBnZW9saWI7XG4gICAgICAgIH1cblxuICAgIC8vIEFNRCBtb2R1bGVcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cbiAgICAgICAgZGVmaW5lKFwiZ2VvbGliXCIsIFtdLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2VvbGliO1xuICAgICAgICB9KTtcblxuICAgIC8vIHdlJ3JlIGluIGEgYnJvd3NlclxuICAgIH0gZWxzZSB7XG5cbiAgICAgICAgZ2xvYmFsLmdlb2xpYiA9IGdlb2xpYjtcblxuICAgIH1cblxufSh0aGlzKSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9nZW9saWIvZGlzdC9nZW9saWIuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL2dlb2xpYi9kaXN0L2dlb2xpYi5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/geolib/dist/geolib.js\n"); +eval("module.exports = __webpack_require__(\"./node_modules/babel-runtime/node_modules/regenerator-runtime/runtime-module.js\");\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvci9pbmRleC5qcz81ZjE2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQixtQkFBTyxDQUFDLGlGQUFxQiIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL3JlZ2VuZXJhdG9yL2luZGV4LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZVwiKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3IvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3IvaW5kZXguanNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/babel-runtime/regenerator/index.js\n"); /***/ }), @@ -313,20 +320,6 @@ eval("// shim for using process in browser\nvar process = module.exports = {};\n /***/ }), -/***/ "./node_modules/regenerator-runtime/runtime-module.js": -/***/ (function(module, exports, __webpack_require__) { - -eval("/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n// This method of obtaining a reference to the global object needs to be\n// kept identical to the way it is obtained in runtime.js\nvar g = (function() { return this })() || Function(\"return this\")();\n\n// Use `getOwnPropertyNames` because not all browsers support calling\n// `hasOwnProperty` on the global `self` object in a worker. See #183.\nvar hadRuntime = g.regeneratorRuntime &&\n Object.getOwnPropertyNames(g).indexOf(\"regeneratorRuntime\") >= 0;\n\n// Save the old regeneratorRuntime in case it needs to be restored later.\nvar oldRuntime = hadRuntime && g.regeneratorRuntime;\n\n// Force reevalutation of runtime.js.\ng.regeneratorRuntime = undefined;\n\nmodule.exports = __webpack_require__(\"./node_modules/regenerator-runtime/runtime.js\");\n\nif (hadRuntime) {\n // Restore the original runtime.\n g.regeneratorRuntime = oldRuntime;\n} else {\n // Remove the global property added by runtime.js.\n try {\n delete g.regeneratorRuntime;\n } catch(e) {\n g.regeneratorRuntime = undefined;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLW1vZHVsZS5qcz84ZjIxIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCLGNBQWM7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQywrQ0FBVzs7QUFFcEM7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLW1vZHVsZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuLy8gVGhpcyBtZXRob2Qgb2Ygb2J0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0IG5lZWRzIHRvIGJlXG4vLyBrZXB0IGlkZW50aWNhbCB0byB0aGUgd2F5IGl0IGlzIG9idGFpbmVkIGluIHJ1bnRpbWUuanNcbnZhciBnID0gKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcyB9KSgpIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcblxuLy8gVXNlIGBnZXRPd25Qcm9wZXJ0eU5hbWVzYCBiZWNhdXNlIG5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCBjYWxsaW5nXG4vLyBgaGFzT3duUHJvcGVydHlgIG9uIHRoZSBnbG9iYWwgYHNlbGZgIG9iamVjdCBpbiBhIHdvcmtlci4gU2VlICMxODMuXG52YXIgaGFkUnVudGltZSA9IGcucmVnZW5lcmF0b3JSdW50aW1lICYmXG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGcpLmluZGV4T2YoXCJyZWdlbmVyYXRvclJ1bnRpbWVcIikgPj0gMDtcblxuLy8gU2F2ZSB0aGUgb2xkIHJlZ2VuZXJhdG9yUnVudGltZSBpbiBjYXNlIGl0IG5lZWRzIHRvIGJlIHJlc3RvcmVkIGxhdGVyLlxudmFyIG9sZFJ1bnRpbWUgPSBoYWRSdW50aW1lICYmIGcucmVnZW5lcmF0b3JSdW50aW1lO1xuXG4vLyBGb3JjZSByZWV2YWx1dGF0aW9uIG9mIHJ1bnRpbWUuanMuXG5nLnJlZ2VuZXJhdG9yUnVudGltZSA9IHVuZGVmaW5lZDtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi9ydW50aW1lXCIpO1xuXG5pZiAoaGFkUnVudGltZSkge1xuICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBydW50aW1lLlxuICBnLnJlZ2VuZXJhdG9yUnVudGltZSA9IG9sZFJ1bnRpbWU7XG59IGVsc2Uge1xuICAvLyBSZW1vdmUgdGhlIGdsb2JhbCBwcm9wZXJ0eSBhZGRlZCBieSBydW50aW1lLmpzLlxuICB0cnkge1xuICAgIGRlbGV0ZSBnLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgfSBjYXRjaChlKSB7XG4gICAgZy5yZWdlbmVyYXRvclJ1bnRpbWUgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS1tb2R1bGUuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS1tb2R1bGUuanNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/regenerator-runtime/runtime-module.js\n"); - -/***/ }), - -/***/ "./node_modules/regenerator-runtime/runtime.js": -/***/ (function(module, exports) { - -eval("/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n!(function(global) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // In sloppy mode, unbound `this` refers to the global object, fallback to\n // Function constructor if we're in global strict mode. That is sadly a form\n // of indirect eval which violates Content Security Policy.\n (function() { return this })() || Function(\"return this\")()\n);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzPzRhNTciXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsS0FBSztBQUNMLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBLHdDQUF3QyxXQUFXO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW9DLGNBQWM7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlDQUFpQyxrQkFBa0I7QUFDbkQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGlCQUFpQjtBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsOENBQThDLFFBQVE7QUFDdEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUEsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsOENBQThDLFFBQVE7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxlQUFlLGNBQWM7QUFDN0IiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4hKGZ1bmN0aW9uKGdsb2JhbCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgT3AgPSBPYmplY3QucHJvdG90eXBlO1xuICB2YXIgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHk7XG4gIHZhciB1bmRlZmluZWQ7IC8vIE1vcmUgY29tcHJlc3NpYmxlIHRoYW4gdm9pZCAwLlxuICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbCA6IHt9O1xuICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiO1xuICB2YXIgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiO1xuICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuXG4gIHZhciBpbk1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCI7XG4gIHZhciBydW50aW1lID0gZ2xvYmFsLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgaWYgKHJ1bnRpbWUpIHtcbiAgICBpZiAoaW5Nb2R1bGUpIHtcbiAgICAgIC8vIElmIHJlZ2VuZXJhdG9yUnVudGltZSBpcyBkZWZpbmVkIGdsb2JhbGx5IGFuZCB3ZSdyZSBpbiBhIG1vZHVsZSxcbiAgICAgIC8vIG1ha2UgdGhlIGV4cG9ydHMgb2JqZWN0IGlkZW50aWNhbCB0byByZWdlbmVyYXRvclJ1bnRpbWUuXG4gICAgICBtb2R1bGUuZXhwb3J0cyA9IHJ1bnRpbWU7XG4gICAgfVxuICAgIC8vIERvbid0IGJvdGhlciBldmFsdWF0aW5nIHRoZSByZXN0IG9mIHRoaXMgZmlsZSBpZiB0aGUgcnVudGltZSB3YXNcbiAgICAvLyBhbHJlYWR5IGRlZmluZWQgZ2xvYmFsbHkuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRGVmaW5lIHRoZSBydW50aW1lIGdsb2JhbGx5IChhcyBleHBlY3RlZCBieSBnZW5lcmF0ZWQgY29kZSkgYXMgZWl0aGVyXG4gIC8vIG1vZHVsZS5leHBvcnRzIChpZiB3ZSdyZSBpbiBhIG1vZHVsZSkgb3IgYSBuZXcsIGVtcHR5IG9iamVjdC5cbiAgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWUgPSBpbk1vZHVsZSA/IG1vZHVsZS5leHBvcnRzIDoge307XG5cbiAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIC8vIElmIG91dGVyRm4gcHJvdmlkZWQgYW5kIG91dGVyRm4ucHJvdG90eXBlIGlzIGEgR2VuZXJhdG9yLCB0aGVuIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yLlxuICAgIHZhciBwcm90b0dlbmVyYXRvciA9IG91dGVyRm4gJiYgb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBvdXRlckZuIDogR2VuZXJhdG9yO1xuICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSk7XG4gICAgdmFyIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7XG5cbiAgICAvLyBUaGUgLl9pbnZva2UgbWV0aG9kIHVuaWZpZXMgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzLlxuICAgIGdlbmVyYXRvci5faW52b2tlID0gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH1cbiAgcnVudGltZS53cmFwID0gd3JhcDtcblxuICAvLyBUcnkvY2F0Y2ggaGVscGVyIHRvIG1pbmltaXplIGRlb3B0aW1pemF0aW9ucy4gUmV0dXJucyBhIGNvbXBsZXRpb25cbiAgLy8gcmVjb3JkIGxpa2UgY29udGV4dC50cnlFbnRyaWVzW2ldLmNvbXBsZXRpb24uIFRoaXMgaW50ZXJmYWNlIGNvdWxkXG4gIC8vIGhhdmUgYmVlbiAoYW5kIHdhcyBwcmV2aW91c2x5KSBkZXNpZ25lZCB0byB0YWtlIGEgY2xvc3VyZSB0byBiZVxuICAvLyBpbnZva2VkIHdpdGhvdXQgYXJndW1lbnRzLCBidXQgaW4gYWxsIHRoZSBjYXNlcyB3ZSBjYXJlIGFib3V0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBtZXRob2Qgd2Ugd2FudCB0byBjYWxsLCBzbyB0aGVyZSdzIG5vIG5lZWRcbiAgLy8gdG8gY3JlYXRlIGEgbmV3IGZ1bmN0aW9uIG9iamVjdC4gV2UgY2FuIGV2ZW4gZ2V0IGF3YXkgd2l0aCBhc3N1bWluZ1xuICAvLyB0aGUgbWV0aG9kIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50LCBzaW5jZSB0aGF0IGhhcHBlbnMgdG8gYmUgdHJ1ZVxuICAvLyBpbiBldmVyeSBjYXNlLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHRvdWNoIHRoZSBhcmd1bWVudHMgb2JqZWN0LiBUaGVcbiAgLy8gb25seSBhZGRpdGlvbmFsIGFsbG9jYXRpb24gcmVxdWlyZWQgaXMgdGhlIGNvbXBsZXRpb24gcmVjb3JkLCB3aGljaFxuICAvLyBoYXMgYSBzdGFibGUgc2hhcGUgYW5kIHNvIGhvcGVmdWxseSBzaG91bGQgYmUgY2hlYXAgdG8gYWxsb2NhdGUuXG4gIGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcIm5vcm1hbFwiLCBhcmc6IGZuLmNhbGwob2JqLCBhcmcpIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInRocm93XCIsIGFyZzogZXJyIH07XG4gICAgfVxuICB9XG5cbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkU3RhcnQgPSBcInN1c3BlbmRlZFN0YXJ0XCI7XG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkID0gXCJzdXNwZW5kZWRZaWVsZFwiO1xuICB2YXIgR2VuU3RhdGVFeGVjdXRpbmcgPSBcImV4ZWN1dGluZ1wiO1xuICB2YXIgR2VuU3RhdGVDb21wbGV0ZWQgPSBcImNvbXBsZXRlZFwiO1xuXG4gIC8vIFJldHVybmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBpbm5lckZuIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXNcbiAgLy8gYnJlYWtpbmcgb3V0IG9mIHRoZSBkaXNwYXRjaCBzd2l0Y2ggc3RhdGVtZW50LlxuICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9O1xuXG4gIC8vIER1bW15IGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyB0aGF0IHdlIHVzZSBhcyB0aGUgLmNvbnN0cnVjdG9yIGFuZFxuICAvLyAuY29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMgZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0cy4gRm9yIGZ1bGwgc3BlYyBjb21wbGlhbmNlLCB5b3UgbWF5IHdpc2ggdG8gY29uZmlndXJlIHlvdXJcbiAgLy8gbWluaWZpZXIgbm90IHRvIG1hbmdsZSB0aGUgbmFtZXMgb2YgdGhlc2UgdHdvIGZ1bmN0aW9ucy5cbiAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9XG5cbiAgLy8gVGhpcyBpcyBhIHBvbHlmaWxsIGZvciAlSXRlcmF0b3JQcm90b3R5cGUlIGZvciBlbnZpcm9ubWVudHMgdGhhdFxuICAvLyBkb24ndCBuYXRpdmVseSBzdXBwb3J0IGl0LlxuICB2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcbiAgSXRlcmF0b3JQcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiAgdmFyIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpO1xuICBpZiAoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiZcbiAgICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJlxuICAgICAgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSkge1xuICAgIC8vIFRoaXMgZW52aXJvbm1lbnQgaGFzIGEgbmF0aXZlICVJdGVyYXRvclByb3RvdHlwZSU7IHVzZSBpdCBpbnN0ZWFkXG4gICAgLy8gb2YgdGhlIHBvbHlmaWxsLlxuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cblxuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPVxuICAgIEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR3AuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvbjtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGVbdG9TdHJpbmdUYWdTeW1ib2xdID1cbiAgICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcblxuICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLlxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICBwcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKGFyZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBydW50aW1lLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGlmICghKHRvU3RyaW5nVGFnU3ltYm9sIGluIGdlbkZ1bikpIHtcbiAgICAgICAgZ2VuRnVuW3RvU3RyaW5nVGFnU3ltYm9sXSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgIHJldHVybiBnZW5GdW47XG4gIH07XG5cbiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvXG4gIC8vIGB5aWVsZCByZWdlbmVyYXRvclJ1bnRpbWUuYXdyYXAoeClgLCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiB0ZXN0XG4gIC8vIGBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpYCB0byBkZXRlcm1pbmUgaWYgdGhlIHlpZWxkZWQgdmFsdWUgaXNcbiAgLy8gbWVhbnQgdG8gYmUgYXdhaXRlZC5cbiAgcnVudGltZS5hd3JhcCA9IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB7IF9fYXdhaXQ6IGFyZyB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJ0aHJvd1wiLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uKHVud3JhcHBlZCkge1xuICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzXG4gICAgICAgICAgLy8gdGhlIC52YWx1ZSBvZiB0aGUgUHJvbWlzZTx7dmFsdWUsZG9uZX0+IHJlc3VsdCBmb3IgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCBpdGVyYXRpb24uIElmIHRoZSBQcm9taXNlIGlzIHJlamVjdGVkLCBob3dldmVyLCB0aGVcbiAgICAgICAgICAvLyByZXN1bHQgZm9yIHRoaXMgaXRlcmF0aW9uIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCB0aGUgc2FtZVxuICAgICAgICAgIC8vIHJlYXNvbi4gTm90ZSB0aGF0IHJlamVjdGlvbnMgb2YgeWllbGRlZCBQcm9taXNlcyBhcmUgbm90XG4gICAgICAgICAgLy8gdGhyb3duIGJhY2sgaW50byB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBhcyBpcyB0aGUgY2FzZVxuICAgICAgICAgIC8vIHdoZW4gYW4gYXdhaXRlZCBQcm9taXNlIGlzIHJlamVjdGVkLiBUaGlzIGRpZmZlcmVuY2UgaW5cbiAgICAgICAgICAvLyBiZWhhdmlvciBiZXR3ZWVuIHlpZWxkIGFuZCBhd2FpdCBpcyBpbXBvcnRhbnQsIGJlY2F1c2UgaXRcbiAgICAgICAgICAvLyBhbGxvd3MgdGhlIGNvbnN1bWVyIHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggdGhlIHlpZWxkZWRcbiAgICAgICAgICAvLyByZWplY3Rpb24gKHN3YWxsb3cgaXQgYW5kIGNvbnRpbnVlLCBtYW51YWxseSAudGhyb3cgaXQgYmFja1xuICAgICAgICAgIC8vIGludG8gdGhlIGdlbmVyYXRvciwgYWJhbmRvbiBpdGVyYXRpb24sIHdoYXRldmVyKS4gV2l0aFxuICAgICAgICAgIC8vIGF3YWl0LCBieSBjb250cmFzdCwgdGhlcmUgaXMgbm8gb3Bwb3J0dW5pdHkgdG8gZXhhbWluZSB0aGVcbiAgICAgICAgICAvLyByZWplY3Rpb24gcmVhc29uIG91dHNpZGUgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiwgc28gdGhlXG4gICAgICAgICAgLy8gb25seSBvcHRpb24gaXMgdG8gdGhyb3cgaXQgZnJvbSB0aGUgYXdhaXQgZXhwcmVzc2lvbiwgYW5kXG4gICAgICAgICAgLy8gbGV0IHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gaGFuZGxlIHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkO1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykge1xuICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID1cbiAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKFxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLFxuICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyXG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnXG4gICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiAoc2VlIGRlZmluZUl0ZXJhdG9yTWV0aG9kcykuXG4gICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTtcbiAgfVxuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7XG4gIEFzeW5jSXRlcmF0b3IucHJvdG90eXBlW2FzeW5jSXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBydW50aW1lLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBydW50aW1lLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKFxuICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdClcbiAgICApO1xuXG4gICAgcmV0dXJuIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXliZUludm9rZURlbGVnYXRlKGNvbnRleHQpIGNoYW5nZWQgY29udGV4dC5tZXRob2QgZnJvbVxuICAgICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCEgaW5mbykge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKTtcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgIC8vIHZhcmlhYmxlIHNwZWNpZmllZCBieSBkZWxlZ2F0ZS5yZXN1bHROYW1lIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcblxuICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcblxuICAgICAgLy8gSWYgY29udGV4dC5tZXRob2Qgd2FzIFwidGhyb3dcIiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlXG4gICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmXG4gICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgLy8gXCJjb25zdW1lZFwiIGJ5IHRoZSBkZWxlZ2F0ZSBpdGVyYXRvci4gSWYgY29udGV4dC5tZXRob2Qgd2FzXG4gICAgICAvLyBcInJldHVyblwiLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZVxuICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlLXlpZWxkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGRlbGVnYXRlIG1ldGhvZC5cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoXG4gICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci5cbiAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBHcFt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvclwiO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIHJ1bnRpbWUua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBydW50aW1lLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xufSkoXG4gIC8vIEluIHNsb3BweSBtb2RlLCB1bmJvdW5kIGB0aGlzYCByZWZlcnMgdG8gdGhlIGdsb2JhbCBvYmplY3QsIGZhbGxiYWNrIHRvXG4gIC8vIEZ1bmN0aW9uIGNvbnN0cnVjdG9yIGlmIHdlJ3JlIGluIGdsb2JhbCBzdHJpY3QgbW9kZS4gVGhhdCBpcyBzYWRseSBhIGZvcm1cbiAgLy8gb2YgaW5kaXJlY3QgZXZhbCB3aGljaCB2aW9sYXRlcyBDb250ZW50IFNlY3VyaXR5IFBvbGljeS5cbiAgKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcyB9KSgpIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKVxuKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/regenerator-runtime/runtime.js\n"); - -/***/ }), - /***/ "./node_modules/rivets/dist/rivets.js": /***/ (function(module, exports, __webpack_require__) { @@ -352,7 +345,7 @@ eval("module.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__ = __webpack_require__(\"./node_modules/babel-runtime/regenerator/index.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__);\n\n\n/**\n * Lookup an airport from the server\n *\n * @param {String} icao\n */\n\n\n\nvar _this = this;\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ((function () {\n var _ref = _asyncToGenerator( /*#__PURE__*/__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.mark(function _callee(icao) {\n var params, response;\n return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n params = {\n method: 'GET',\n url: '/api/airports/' + icao + '/lookup'\n };\n _context.next = 3;\n return axios(params);\n\n case 3:\n response = _context.sent;\n\n console.log('lookup raw response: ', response);\n return _context.abrupt('return', response.data);\n\n case 6:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, _this);\n }));\n\n return function (_x) {\n return _ref.apply(this, arguments);\n };\n})());//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYWRtaW4vYWlycG9ydF9sb29rdXAuanM/Y2VhZCJdLCJuYW1lcyI6WyJpY2FvIiwicGFyYW1zIiwibWV0aG9kIiwidXJsIiwiYXhpb3MiLCJyZXNwb25zZSIsImNvbnNvbGUiLCJsb2ciLCJkYXRhIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQWE7O0FBRWI7Ozs7Ozs7Ozs7OztBQUtlO0FBQWYsc0hBQWUsaUJBQU9BLElBQVA7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ1BDLDhCQURPLEdBQ0U7QUFDVEMsb0NBQVEsS0FEQztBQUVUQyxpQ0FBSyxtQkFBbUJILElBQW5CLEdBQTBCO0FBRnRCLHlCQURGO0FBQUE7QUFBQSwrQkFNWUksTUFBTUgsTUFBTixDQU5aOztBQUFBO0FBTUxJLGdDQU5LOztBQU9YQyxnQ0FBUUMsR0FBUixDQUFZLHVCQUFaLEVBQXFDRixRQUFyQztBQVBXLHlEQVFKQSxTQUFTRyxJQVJMOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEtBQWY7O0FBQUE7QUFBQTtBQUFBO0FBQUEiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYWRtaW4vYWlycG9ydF9sb29rdXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTG9va3VwIGFuIGFpcnBvcnQgZnJvbSB0aGUgc2VydmVyXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGljYW9cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgKGljYW8pID0+IHtcbiAgICBsZXQgcGFyYW1zID0ge1xuICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICB1cmw6ICcvYXBpL2FpcnBvcnRzLycgKyBpY2FvICsgJy9sb29rdXAnLFxuICAgIH07XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zKHBhcmFtcyk7XG4gICAgY29uc29sZS5sb2coJ2xvb2t1cCByYXcgcmVzcG9uc2U6ICcsIHJlc3BvbnNlKTtcbiAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvYWRtaW4vYWlycG9ydF9sb29rdXAuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/admin/airport_lookup.js\n"); +eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__ = __webpack_require__(\"./node_modules/babel-runtime/regenerator/index.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__request__ = __webpack_require__(\"./resources/js/request.js\");\n\n\nvar _this = this;\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\n\n\n/**\n * Lookup an airport from the server\n *\n * @param {String} icao\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = ((function () {\n var _ref = _asyncToGenerator( /*#__PURE__*/__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.mark(function _callee(icao) {\n var params, response;\n return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n params = {\n method: 'GET',\n url: '/api/airports/' + icao + '/lookup'\n };\n _context.next = 3;\n return Object(__WEBPACK_IMPORTED_MODULE_1__request__[\"a\" /* default */])(params);\n\n case 3:\n response = _context.sent;\n\n console.log('lookup raw response: ', response);\n return _context.abrupt('return', response.data);\n\n case 6:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, _this);\n }));\n\n return function (_x) {\n return _ref.apply(this, arguments);\n };\n})());//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYWRtaW4vYWlycG9ydF9sb29rdXAuanM/Y2VhZCJdLCJuYW1lcyI6WyJpY2FvIiwicGFyYW1zIiwibWV0aG9kIiwidXJsIiwicmVxdWVzdCIsInJlc3BvbnNlIiwiY29uc29sZSIsImxvZyIsImRhdGEiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUNBOztBQUVBOzs7OztBQUtlO0FBQWYsb0hBQWUsaUJBQU9BLElBQVA7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ1BDLGtCQURPLEdBQ0U7QUFDYkMsc0JBQVEsS0FESztBQUViQyxzQ0FBc0JILElBQXRCO0FBRmEsYUFERjtBQUFBO0FBQUEsbUJBTVVJLGlFQUFPQSxDQUFDSCxNQUFSLENBTlY7O0FBQUE7QUFNUEksb0JBTk87O0FBT2JDLG9CQUFRQyxHQUFSLENBQVksdUJBQVosRUFBcUNGLFFBQXJDO0FBUGEsNkNBUU5BLFNBQVNHLElBUkg7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0FBZjs7QUFBQTtBQUFBO0FBQUE7QUFBQSIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9hZG1pbi9haXJwb3J0X2xvb2t1cC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHJlcXVlc3QgZnJvbSAnLi4vcmVxdWVzdCc7XG5cbi8qKlxuICogTG9va3VwIGFuIGFpcnBvcnQgZnJvbSB0aGUgc2VydmVyXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGljYW9cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgKGljYW8pID0+IHtcbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgdXJsOiBgL2FwaS9haXJwb3J0cy8ke2ljYW99L2xvb2t1cGAsXG4gIH07XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCByZXF1ZXN0KHBhcmFtcyk7XG4gIGNvbnNvbGUubG9nKCdsb29rdXAgcmF3IHJlc3BvbnNlOiAnLCByZXNwb25zZSk7XG4gIHJldHVybiByZXNwb25zZS5kYXRhO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9hZG1pbi9haXJwb3J0X2xvb2t1cC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/admin/airport_lookup.js\n"); /***/ }), @@ -360,7 +353,7 @@ eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regener /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__airport_lookup__ = __webpack_require__(\"./resources/js/admin/airport_lookup.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__calculate_distance__ = __webpack_require__(\"./resources/js/admin/calculate_distance.js\");\n/**\n * Admin stuff needed\n */\n\n__webpack_require__(\"./resources/js/bootstrap.js\");\n\n\n\n\nwindow.phpvms.airport_lookup = __WEBPACK_IMPORTED_MODULE_0__airport_lookup__[\"a\" /* default */];\nwindow.phpvms.calculate_distance = __WEBPACK_IMPORTED_MODULE_1__calculate_distance__[\"a\" /* default */];\n\n// Import the mapping function\nwindow.phpvms.map = __webpack_require__(\"./resources/js/maps/index.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYWRtaW4vYXBwLmpzP2ExNzUiXSwibmFtZXMiOlsicmVxdWlyZSIsIndpbmRvdyIsInBocHZtcyIsImFpcnBvcnRfbG9va3VwIiwiY2FsY3VsYXRlX2Rpc3RhbmNlIiwibWFwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQUtBQSxtQkFBT0EsQ0FBQyw2QkFBUjs7QUFFQTtBQUNBOztBQUVBQyxPQUFPQyxNQUFQLENBQWNDLGNBQWQsR0FBK0JBLGdFQUEvQjtBQUNBRixPQUFPQyxNQUFQLENBQWNFLGtCQUFkLEdBQW1DQSxvRUFBbkM7O0FBRUE7QUFDQUgsT0FBT0MsTUFBUCxDQUFjRyxHQUFkLEdBQW9CTCxtQkFBT0EsQ0FBQyw4QkFBUixDQUFwQiIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9hZG1pbi9hcHAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFkbWluIHN0dWZmIG5lZWRlZFxuICovXG5cblxucmVxdWlyZSgnLi8uLi9ib290c3RyYXAnKTtcblxuaW1wb3J0IGFpcnBvcnRfbG9va3VwIGZyb20gXCIuL2FpcnBvcnRfbG9va3VwXCI7XG5pbXBvcnQgY2FsY3VsYXRlX2Rpc3RhbmNlIGZyb20gXCIuL2NhbGN1bGF0ZV9kaXN0YW5jZVwiO1xuXG53aW5kb3cucGhwdm1zLmFpcnBvcnRfbG9va3VwID0gYWlycG9ydF9sb29rdXA7XG53aW5kb3cucGhwdm1zLmNhbGN1bGF0ZV9kaXN0YW5jZSA9IGNhbGN1bGF0ZV9kaXN0YW5jZTtcblxuLy8gSW1wb3J0IHRoZSBtYXBwaW5nIGZ1bmN0aW9uXG53aW5kb3cucGhwdm1zLm1hcCA9IHJlcXVpcmUoJy4uL21hcHMvaW5kZXgnKTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9hZG1pbi9hcHAuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/admin/app.js\n"); +eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__airport_lookup__ = __webpack_require__(\"./resources/js/admin/airport_lookup.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__calculate_distance__ = __webpack_require__(\"./resources/js/admin/calculate_distance.js\");\n/**\n * Admin stuff needed\n */\n\n\n\n\n__webpack_require__(\"./resources/js/bootstrap.js\");\n\nwindow.phpvms.airport_lookup = __WEBPACK_IMPORTED_MODULE_0__airport_lookup__[\"a\" /* default */];\nwindow.phpvms.calculate_distance = __WEBPACK_IMPORTED_MODULE_1__calculate_distance__[\"a\" /* default */];\n\n// Import the mapping function\nwindow.phpvms.map = __webpack_require__(\"./resources/js/maps/index.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYWRtaW4vYXBwLmpzP2ExNzUiXSwibmFtZXMiOlsicmVxdWlyZSIsIndpbmRvdyIsInBocHZtcyIsImFpcnBvcnRfbG9va3VwIiwiY2FsY3VsYXRlX2Rpc3RhbmNlIiwibWFwIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTs7OztBQUtBO0FBQ0E7O0FBRUFBLG1CQUFPQSxDQUFDLDZCQUFSOztBQUVBQyxPQUFPQyxNQUFQLENBQWNDLGNBQWQsR0FBK0JBLGdFQUEvQjtBQUNBRixPQUFPQyxNQUFQLENBQWNFLGtCQUFkLEdBQW1DQSxvRUFBbkM7O0FBRUE7QUFDQUgsT0FBT0MsTUFBUCxDQUFjRyxHQUFkLEdBQW9CTCxtQkFBT0EsQ0FBQyw4QkFBUixDQUFwQiIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9hZG1pbi9hcHAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFkbWluIHN0dWZmIG5lZWRlZFxuICovXG5cblxuaW1wb3J0IGFpcnBvcnRfbG9va3VwIGZyb20gJy4vYWlycG9ydF9sb29rdXAnO1xuaW1wb3J0IGNhbGN1bGF0ZV9kaXN0YW5jZSBmcm9tICcuL2NhbGN1bGF0ZV9kaXN0YW5jZSc7XG5cbnJlcXVpcmUoJy4vLi4vYm9vdHN0cmFwJyk7XG5cbndpbmRvdy5waHB2bXMuYWlycG9ydF9sb29rdXAgPSBhaXJwb3J0X2xvb2t1cDtcbndpbmRvdy5waHB2bXMuY2FsY3VsYXRlX2Rpc3RhbmNlID0gY2FsY3VsYXRlX2Rpc3RhbmNlO1xuXG4vLyBJbXBvcnQgdGhlIG1hcHBpbmcgZnVuY3Rpb25cbndpbmRvdy5waHB2bXMubWFwID0gcmVxdWlyZSgnLi4vbWFwcy9pbmRleCcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL2FkbWluL2FwcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/admin/app.js\n"); /***/ }), @@ -368,7 +361,7 @@ eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true } /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__ = __webpack_require__(\"./node_modules/babel-runtime/regenerator/index.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__);\n\n\nvar _this = this;\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\n/**\n * Lookup an airport from the server\n *\n * @param {String} fromICAO\n * @param {String} toICAO\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = ((function () {\n var _ref = _asyncToGenerator( /*#__PURE__*/__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.mark(function _callee(fromICAO, toICAO) {\n var params, response;\n return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n params = {\n method: 'GET',\n url: '/api/airports/' + fromICAO + '/distance/' + toICAO\n };\n _context.next = 3;\n return axios(params);\n\n case 3:\n response = _context.sent;\n\n console.log('distance raw response: ', response);\n return _context.abrupt('return', response.data);\n\n case 6:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, _this);\n }));\n\n return function (_x, _x2) {\n return _ref.apply(this, arguments);\n };\n})());//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYWRtaW4vY2FsY3VsYXRlX2Rpc3RhbmNlLmpzP2ZmODAiXSwibmFtZXMiOlsiZnJvbUlDQU8iLCJ0b0lDQU8iLCJwYXJhbXMiLCJtZXRob2QiLCJ1cmwiLCJheGlvcyIsInJlc3BvbnNlIiwiY29uc29sZSIsImxvZyIsImRhdGEiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7Ozs7OztBQU1lO0FBQWYsc0hBQWUsaUJBQU9BLFFBQVAsRUFBaUJDLE1BQWpCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNQQyw4QkFETyxHQUNFO0FBQ1RDLG9DQUFRLEtBREM7QUFFVEMsaUNBQUssbUJBQW1CSixRQUFuQixHQUE4QixZQUE5QixHQUE2Q0M7QUFGekMseUJBREY7QUFBQTtBQUFBLCtCQU1ZSSxNQUFNSCxNQUFOLENBTlo7O0FBQUE7QUFNTEksZ0NBTks7O0FBT1hDLGdDQUFRQyxHQUFSLENBQVkseUJBQVosRUFBdUNGLFFBQXZDO0FBUFcseURBUUpBLFNBQVNHLElBUkw7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FBZjs7QUFBQTtBQUFBO0FBQUE7QUFBQSIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9hZG1pbi9jYWxjdWxhdGVfZGlzdGFuY2UuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIExvb2t1cCBhbiBhaXJwb3J0IGZyb20gdGhlIHNlcnZlclxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmcm9tSUNBT1xuICogQHBhcmFtIHtTdHJpbmd9IHRvSUNBT1xuICovXG5leHBvcnQgZGVmYXVsdCBhc3luYyAoZnJvbUlDQU8sIHRvSUNBTykgPT4ge1xuICAgIGxldCBwYXJhbXMgPSB7XG4gICAgICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgICAgIHVybDogJy9hcGkvYWlycG9ydHMvJyArIGZyb21JQ0FPICsgJy9kaXN0YW5jZS8nICsgdG9JQ0FPLFxuICAgIH07XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGF4aW9zKHBhcmFtcyk7XG4gICAgY29uc29sZS5sb2coJ2Rpc3RhbmNlIHJhdyByZXNwb25zZTogJywgcmVzcG9uc2UpO1xuICAgIHJldHVybiByZXNwb25zZS5kYXRhO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9hZG1pbi9jYWxjdWxhdGVfZGlzdGFuY2UuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/admin/calculate_distance.js\n"); +eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__ = __webpack_require__(\"./node_modules/babel-runtime/regenerator/index.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__request__ = __webpack_require__(\"./resources/js/request.js\");\n\n\nvar _this = this;\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\n\n\n/**\n * Lookup an airport from the server\n *\n * @param {String} fromICAO\n * @param {String} toICAO\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = ((function () {\n var _ref = _asyncToGenerator( /*#__PURE__*/__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.mark(function _callee(fromICAO, toICAO) {\n var params, response;\n return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n params = {\n method: 'GET',\n url: '/api/airports/' + fromICAO + '/distance/' + toICAO\n };\n _context.next = 3;\n return Object(__WEBPACK_IMPORTED_MODULE_1__request__[\"a\" /* default */])(params);\n\n case 3:\n response = _context.sent;\n\n console.log('distance raw response: ', response);\n return _context.abrupt('return', response.data);\n\n case 6:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, _this);\n }));\n\n return function (_x, _x2) {\n return _ref.apply(this, arguments);\n };\n})());//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYWRtaW4vY2FsY3VsYXRlX2Rpc3RhbmNlLmpzP2ZmODAiXSwibmFtZXMiOlsiZnJvbUlDQU8iLCJ0b0lDQU8iLCJwYXJhbXMiLCJtZXRob2QiLCJ1cmwiLCJyZXF1ZXN0IiwicmVzcG9uc2UiLCJjb25zb2xlIiwibG9nIiwiZGF0YSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQ0E7O0FBRUE7Ozs7OztBQU1lO0FBQWYsb0hBQWUsaUJBQU9BLFFBQVAsRUFBaUJDLE1BQWpCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNQQyxrQkFETyxHQUNFO0FBQ2JDLHNCQUFRLEtBREs7QUFFYkMsc0NBQXNCSixRQUF0QixrQkFBMkNDO0FBRjlCLGFBREY7QUFBQTtBQUFBLG1CQU1VSSxpRUFBT0EsQ0FBQ0gsTUFBUixDQU5WOztBQUFBO0FBTVBJLG9CQU5POztBQU9iQyxvQkFBUUMsR0FBUixDQUFZLHlCQUFaLEVBQXVDRixRQUF2QztBQVBhLDZDQVFOQSxTQUFTRyxJQVJIOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBQWY7O0FBQUE7QUFBQTtBQUFBO0FBQUEiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvYWRtaW4vY2FsY3VsYXRlX2Rpc3RhbmNlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgcmVxdWVzdCBmcm9tICcuLi9yZXF1ZXN0JztcblxuLyoqXG4gKiBMb29rdXAgYW4gYWlycG9ydCBmcm9tIHRoZSBzZXJ2ZXJcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZnJvbUlDQU9cbiAqIEBwYXJhbSB7U3RyaW5nfSB0b0lDQU9cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgKGZyb21JQ0FPLCB0b0lDQU8pID0+IHtcbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIG1ldGhvZDogJ0dFVCcsXG4gICAgdXJsOiBgL2FwaS9haXJwb3J0cy8ke2Zyb21JQ0FPfS9kaXN0YW5jZS8ke3RvSUNBT31gLFxuICB9O1xuXG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcmVxdWVzdChwYXJhbXMpO1xuICBjb25zb2xlLmxvZygnZGlzdGFuY2UgcmF3IHJlc3BvbnNlOiAnLCByZXNwb25zZSk7XG4gIHJldHVybiByZXNwb25zZS5kYXRhO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9hZG1pbi9jYWxjdWxhdGVfZGlzdGFuY2UuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/admin/calculate_distance.js\n"); /***/ }), @@ -376,14 +369,22 @@ eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regener /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__storage__ = __webpack_require__(\"./resources/js/storage.js\");\n/**\n * Bootstrap any Javascript libraries required\n */\n\nwindow.axios = __webpack_require__(\"./node_modules/axios/index.js\");\n\n\n\n/**\n * Container for phpVMS specific functions\n */\nwindow.phpvms = {\n config: {},\n Storage: __WEBPACK_IMPORTED_MODULE_0__storage__[\"a\" /* default */]\n};\n\n/**\n * Configure Axios with both the csrf token and the API key\n */\n\nvar base_url = document.head.querySelector('meta[name=\"base-url\"]');\nif (base_url) {\n console.log('baseURL=' + base_url.content);\n window.phpvms.config.base_url = base_url.content;\n window.axios.default.baseURL = base_url.content;\n}\n\nwindow.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';\nvar token = document.head.querySelector('meta[name=\"csrf-token\"]');\n\nif (token) {\n window.phpvms.config.csrf_token = token.content;\n window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;\n} else {\n console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');\n}\n\nvar api_key = document.head.querySelector('meta[name=\"api-key\"]');\nif (api_key) {\n window.axios.defaults.headers.common['x-api-key'] = api_key.content;\n window.phpvms.config.user_api_key = api_key.content;\n window.PHPVMS_USER_API_KEY = api_key.content;\n} else {\n window.phpvms.config.user_api_key = false;\n window.PHPVMS_USER_API_KEY = false;\n console.error('API Key not found!');\n}\n\n__webpack_require__(\"./resources/js/common.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzPzBlNTgiXSwibmFtZXMiOlsid2luZG93IiwiYXhpb3MiLCJyZXF1aXJlIiwicGhwdm1zIiwiY29uZmlnIiwiU3RvcmFnZSIsImJhc2VfdXJsIiwiZG9jdW1lbnQiLCJoZWFkIiwicXVlcnlTZWxlY3RvciIsImNvbnNvbGUiLCJsb2ciLCJjb250ZW50IiwiZGVmYXVsdCIsImJhc2VVUkwiLCJkZWZhdWx0cyIsImhlYWRlcnMiLCJjb21tb24iLCJ0b2tlbiIsImNzcmZfdG9rZW4iLCJlcnJvciIsImFwaV9rZXkiLCJ1c2VyX2FwaV9rZXkiLCJQSFBWTVNfVVNFUl9BUElfS0VZIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7Ozs7QUFLQUEsT0FBT0MsS0FBUCxHQUFlQyxtQkFBT0EsQ0FBQywrQkFBUixDQUFmOztBQUVBOztBQUVBOzs7QUFHQUYsT0FBT0csTUFBUCxHQUFnQjtBQUNkQyxVQUFRLEVBRE07QUFFZEMsb0VBQU9BO0FBRk8sQ0FBaEI7O0FBS0E7Ozs7QUFJQSxJQUFNQyxXQUFXQyxTQUFTQyxJQUFULENBQWNDLGFBQWQsQ0FBNEIsdUJBQTVCLENBQWpCO0FBQ0EsSUFBR0gsUUFBSCxFQUFhO0FBQ1hJLFVBQVFDLEdBQVIsY0FBdUJMLFNBQVNNLE9BQWhDO0FBQ0FaLFNBQU9HLE1BQVAsQ0FBY0MsTUFBZCxDQUFxQkUsUUFBckIsR0FBZ0NBLFNBQVNNLE9BQXpDO0FBQ0FaLFNBQU9DLEtBQVAsQ0FBYVksT0FBYixDQUFxQkMsT0FBckIsR0FBK0JSLFNBQVNNLE9BQXhDO0FBQ0Q7O0FBRURaLE9BQU9DLEtBQVAsQ0FBYWMsUUFBYixDQUFzQkMsT0FBdEIsQ0FBOEJDLE1BQTlCLENBQXFDLGtCQUFyQyxJQUEyRCxnQkFBM0Q7QUFDQSxJQUFNQyxRQUFRWCxTQUFTQyxJQUFULENBQWNDLGFBQWQsQ0FBNEIseUJBQTVCLENBQWQ7O0FBRUEsSUFBSVMsS0FBSixFQUFXO0FBQ1RsQixTQUFPRyxNQUFQLENBQWNDLE1BQWQsQ0FBcUJlLFVBQXJCLEdBQWtDRCxNQUFNTixPQUF4QztBQUNBWixTQUFPQyxLQUFQLENBQWFjLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxjQUFyQyxJQUF1REMsTUFBTU4sT0FBN0Q7QUFDRCxDQUhELE1BR087QUFDTEYsVUFBUVUsS0FBUixDQUFjLHVFQUFkO0FBQ0Q7O0FBRUQsSUFBTUMsVUFBVWQsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHNCQUE1QixDQUFoQjtBQUNBLElBQUlZLE9BQUosRUFBYTtBQUNYckIsU0FBT0MsS0FBUCxDQUFhYyxRQUFiLENBQXNCQyxPQUF0QixDQUE4QkMsTUFBOUIsQ0FBcUMsV0FBckMsSUFBb0RJLFFBQVFULE9BQTVEO0FBQ0FaLFNBQU9HLE1BQVAsQ0FBY0MsTUFBZCxDQUFxQmtCLFlBQXJCLEdBQW9DRCxRQUFRVCxPQUE1QztBQUNBWixTQUFPdUIsbUJBQVAsR0FBNkJGLFFBQVFULE9BQXJDO0FBQ0QsQ0FKRCxNQUlPO0FBQ0xaLFNBQU9HLE1BQVAsQ0FBY0MsTUFBZCxDQUFxQmtCLFlBQXJCLEdBQW9DLEtBQXBDO0FBQ0F0QixTQUFPdUIsbUJBQVAsR0FBNkIsS0FBN0I7QUFDQWIsVUFBUVUsS0FBUixDQUFjLG9CQUFkO0FBQ0Q7O0FBRURsQixtQkFBT0EsQ0FBQywwQkFBUiIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9ib290c3RyYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJvb3RzdHJhcCBhbnkgSmF2YXNjcmlwdCBsaWJyYXJpZXMgcmVxdWlyZWRcbiAqL1xuXG5cbndpbmRvdy5heGlvcyA9IHJlcXVpcmUoJ2F4aW9zJyk7XG5cbmltcG9ydCBTdG9yYWdlIGZyb20gXCIuL3N0b3JhZ2VcIjtcblxuLyoqXG4gKiBDb250YWluZXIgZm9yIHBocFZNUyBzcGVjaWZpYyBmdW5jdGlvbnNcbiAqL1xud2luZG93LnBocHZtcyA9IHtcbiAgY29uZmlnOiB7fSxcbiAgU3RvcmFnZSxcbn07XG5cbi8qKlxuICogQ29uZmlndXJlIEF4aW9zIHdpdGggYm90aCB0aGUgY3NyZiB0b2tlbiBhbmQgdGhlIEFQSSBrZXlcbiAqL1xuXG5jb25zdCBiYXNlX3VybCA9IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiYmFzZS11cmxcIl0nKTtcbmlmKGJhc2VfdXJsKSB7XG4gIGNvbnNvbGUubG9nKGBiYXNlVVJMPSR7YmFzZV91cmwuY29udGVudH1gKTtcbiAgd2luZG93LnBocHZtcy5jb25maWcuYmFzZV91cmwgPSBiYXNlX3VybC5jb250ZW50O1xuICB3aW5kb3cuYXhpb3MuZGVmYXVsdC5iYXNlVVJMID0gYmFzZV91cmwuY29udGVudDtcbn1cblxud2luZG93LmF4aW9zLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uWydYLVJlcXVlc3RlZC1XaXRoJ10gPSAnWE1MSHR0cFJlcXVlc3QnO1xuY29uc3QgdG9rZW4gPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImNzcmYtdG9rZW5cIl0nKTtcblxuaWYgKHRva2VuKSB7XG4gIHdpbmRvdy5waHB2bXMuY29uZmlnLmNzcmZfdG9rZW4gPSB0b2tlbi5jb250ZW50O1xuICB3aW5kb3cuYXhpb3MuZGVmYXVsdHMuaGVhZGVycy5jb21tb25bJ1gtQ1NSRi1UT0tFTiddID0gdG9rZW4uY29udGVudFxufSBlbHNlIHtcbiAgY29uc29sZS5lcnJvcignQ1NSRiB0b2tlbiBub3QgZm91bmQ6IGh0dHBzOi8vbGFyYXZlbC5jb20vZG9jcy9jc3JmI2NzcmYteC1jc3JmLXRva2VuJylcbn1cblxuY29uc3QgYXBpX2tleSA9IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiYXBpLWtleVwiXScpO1xuaWYgKGFwaV9rZXkpIHtcbiAgd2luZG93LmF4aW9zLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uWyd4LWFwaS1rZXknXSA9IGFwaV9rZXkuY29udGVudDtcbiAgd2luZG93LnBocHZtcy5jb25maWcudXNlcl9hcGlfa2V5ID0gYXBpX2tleS5jb250ZW50O1xuICB3aW5kb3cuUEhQVk1TX1VTRVJfQVBJX0tFWSA9IGFwaV9rZXkuY29udGVudFxufSBlbHNlIHtcbiAgd2luZG93LnBocHZtcy5jb25maWcudXNlcl9hcGlfa2V5ID0gZmFsc2U7XG4gIHdpbmRvdy5QSFBWTVNfVVNFUl9BUElfS0VZID0gZmFsc2U7XG4gIGNvbnNvbGUuZXJyb3IoJ0FQSSBLZXkgbm90IGZvdW5kIScpXG59XG5cbnJlcXVpcmUoJy4vY29tbW9uJyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/bootstrap.js\n"); +eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__storage__ = __webpack_require__(\"./resources/js/storage.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__config__ = __webpack_require__(\"./resources/js/config.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__request__ = __webpack_require__(\"./resources/js/request.js\");\n/**\n * Bootstrap any Javascript libraries required\n */\n\n\n\n\n\nwindow.axios = __webpack_require__(\"./node_modules/axios/index.js\");\n\n/**\n * Container for phpVMS specific functions\n */\nwindow.phpvms = {\n config: __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* default */],\n request: __WEBPACK_IMPORTED_MODULE_2__request__[\"a\" /* default */],\n Storage: __WEBPACK_IMPORTED_MODULE_0__storage__[\"a\" /* default */]\n};\n\n__webpack_require__(\"./resources/js/common.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzPzBlNTgiXSwibmFtZXMiOlsid2luZG93IiwiYXhpb3MiLCJyZXF1aXJlIiwicGhwdm1zIiwiY29uZmlnIiwicmVxdWVzdCIsIlN0b3JhZ2UiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUFJQTtBQUNBO0FBQ0E7O0FBRUFBLE9BQU9DLEtBQVAsR0FBZUMsbUJBQU9BLENBQUMsK0JBQVIsQ0FBZjs7QUFFQTs7O0FBR0FGLE9BQU9HLE1BQVAsR0FBZ0I7QUFDZEMsa0VBRGM7QUFFZEMsb0VBRmM7QUFHZEMsb0VBQU9BO0FBSE8sQ0FBaEI7O0FBTUFKLG1CQUFPQSxDQUFDLDBCQUFSIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL2Jvb3RzdHJhcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQm9vdHN0cmFwIGFueSBKYXZhc2NyaXB0IGxpYnJhcmllcyByZXF1aXJlZFxuICovXG5cbmltcG9ydCBTdG9yYWdlIGZyb20gJy4vc3RvcmFnZSc7XG5pbXBvcnQgY29uZmlnIGZyb20gJy4vY29uZmlnJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5cbndpbmRvdy5heGlvcyA9IHJlcXVpcmUoJ2F4aW9zJyk7XG5cbi8qKlxuICogQ29udGFpbmVyIGZvciBwaHBWTVMgc3BlY2lmaWMgZnVuY3Rpb25zXG4gKi9cbndpbmRvdy5waHB2bXMgPSB7XG4gIGNvbmZpZyxcbiAgcmVxdWVzdCxcbiAgU3RvcmFnZSxcbn07XG5cbnJlcXVpcmUoJy4vY29tbW9uJyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/bootstrap.js\n"); /***/ }), /***/ "./resources/js/common.js": /***/ (function(module, exports, __webpack_require__) { -eval("/**\n *\n */\n\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n/**\n * Generic formatter to prepend\n * @param value\n * @param prepend\n * @returns {*}\n */\nrivets.formatters.prepend = function (value, prepend) {\n return prepend + value;\n};\n\n/**\n * Format minutes into HHh MMm\n * @param value\n * @returns {string}\n */\nrivets.formatters.time_hm = function (value) {\n var hours = Math.floor(value / 60);\n var mins = value % 60;\n return hours + 'h ' + mins + 'm';\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.gt = function (value, len) {\n return value.length > len;\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.lt = function (value, len) {\n return value.length < len;\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.eq = function (value, len) {\n return value.length > len;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzPzVmZDUiXSwibmFtZXMiOlsicml2ZXRzIiwicmVxdWlyZSIsImZvcm1hdHRlcnMiLCJwcmVwZW5kIiwidmFsdWUiLCJ0aW1lX2htIiwiaG91cnMiLCJNYXRoIiwiZmxvb3IiLCJtaW5zIiwiZ3QiLCJsZW4iLCJsZW5ndGgiLCJsdCIsImVxIl0sIm1hcHBpbmdzIjoiQUFBQTs7OztBQUlBLElBQU1BLFNBQVNDLG1CQUFPQSxDQUFDLHNDQUFSLENBQWY7O0FBRUE7Ozs7OztBQU1BRCxPQUFPRSxVQUFQLENBQWtCQyxPQUFsQixHQUE0QixVQUFVQyxLQUFWLEVBQWlCRCxPQUFqQixFQUEwQjtBQUNsRCxTQUFPQSxVQUFVQyxLQUFqQjtBQUNILENBRkQ7O0FBSUE7Ozs7O0FBS0FKLE9BQU9FLFVBQVAsQ0FBa0JHLE9BQWxCLEdBQTRCLFVBQVNELEtBQVQsRUFBZ0I7QUFDeEMsTUFBTUUsUUFBUUMsS0FBS0MsS0FBTCxDQUFXSixRQUFRLEVBQW5CLENBQWQ7QUFDQSxNQUFNSyxPQUFPTCxRQUFRLEVBQXJCO0FBQ0EsU0FBT0UsUUFBUSxJQUFSLEdBQWVHLElBQWYsR0FBc0IsR0FBN0I7QUFDSCxDQUpEOztBQU1BOzs7Ozs7QUFNQVQsT0FBT0UsVUFBUCxDQUFrQlEsRUFBbEIsR0FBdUIsVUFBQ04sS0FBRCxFQUFRTyxHQUFSLEVBQWdCO0FBQ25DLFNBQU9QLE1BQU1RLE1BQU4sR0FBZUQsR0FBdEI7QUFDSCxDQUZEOztBQUlBOzs7Ozs7QUFNQVgsT0FBT0UsVUFBUCxDQUFrQlcsRUFBbEIsR0FBdUIsVUFBQ1QsS0FBRCxFQUFRTyxHQUFSLEVBQWdCO0FBQ25DLFNBQU9QLE1BQU1RLE1BQU4sR0FBZUQsR0FBdEI7QUFDSCxDQUZEOztBQUlBOzs7Ozs7QUFNQVgsT0FBT0UsVUFBUCxDQUFrQlksRUFBbEIsR0FBdUIsVUFBQ1YsS0FBRCxFQUFRTyxHQUFSLEVBQWdCO0FBQ25DLFNBQU9QLE1BQU1RLE1BQU4sR0FBZUQsR0FBdEI7QUFDSCxDQUZEIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL2NvbW1vbi5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICpcbiAqL1xuXG5jb25zdCByaXZldHMgPSByZXF1aXJlKCdyaXZldHMnKTtcblxuLyoqXG4gKiBHZW5lcmljIGZvcm1hdHRlciB0byBwcmVwZW5kXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBwcmVwZW5kXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMucHJlcGVuZCA9IGZ1bmN0aW9uICh2YWx1ZSwgcHJlcGVuZCkge1xuICAgIHJldHVybiBwcmVwZW5kICsgdmFsdWVcbn07XG5cbi8qKlxuICogRm9ybWF0IG1pbnV0ZXMgaW50byBISGggTU1tXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbnJpdmV0cy5mb3JtYXR0ZXJzLnRpbWVfaG0gPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcih2YWx1ZSAvIDYwKTtcbiAgICBjb25zdCBtaW5zID0gdmFsdWUgJSA2MDtcbiAgICByZXR1cm4gaG91cnMgKyAnaCAnICsgbWlucyArICdtJztcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIGxlblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbnJpdmV0cy5mb3JtYXR0ZXJzLmd0ID0gKHZhbHVlLCBsZW4pID0+IHtcbiAgICByZXR1cm4gdmFsdWUubGVuZ3RoID4gbGVuO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHZhbHVlXG4gKiBAcGFyYW0gbGVuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMubHQgPSAodmFsdWUsIGxlbikgPT4ge1xuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPCBsZW47XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBsZW5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5yaXZldHMuZm9ybWF0dGVycy5lcSA9ICh2YWx1ZSwgbGVuKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA+IGxlbjtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/common.js\n"); +eval("\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n/**\n * Generic formatter to prepend\n * @param value\n * @param prepend\n * @returns {*}\n */\nrivets.formatters.prepend = function (value, prepend) {\n return prepend + value;\n};\n\n/**\n * Format minutes into HHh MMm\n * @param value\n * @returns {string}\n */\nrivets.formatters.time_hm = function (value) {\n var hours = Math.floor(value / 60);\n var mins = value % 60;\n return hours + 'h ' + mins + 'm';\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.gt = function (value, len) {\n return value.length > len;\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.lt = function (value, len) {\n return value.length < len;\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.eq = function (value, len) {\n return value.length > len;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzPzVmZDUiXSwibmFtZXMiOlsicml2ZXRzIiwicmVxdWlyZSIsImZvcm1hdHRlcnMiLCJwcmVwZW5kIiwidmFsdWUiLCJ0aW1lX2htIiwiaG91cnMiLCJNYXRoIiwiZmxvb3IiLCJtaW5zIiwiZ3QiLCJsZW4iLCJsZW5ndGgiLCJsdCIsImVxIl0sIm1hcHBpbmdzIjoiO0FBQ0EsSUFBTUEsU0FBU0MsbUJBQU9BLENBQUMsc0NBQVIsQ0FBZjs7QUFFQTs7Ozs7O0FBTUFELE9BQU9FLFVBQVAsQ0FBa0JDLE9BQWxCLEdBQTRCLFVBQVVDLEtBQVYsRUFBaUJELE9BQWpCLEVBQTBCO0FBQ3BELFNBQU9BLFVBQVVDLEtBQWpCO0FBQ0QsQ0FGRDs7QUFJQTs7Ozs7QUFLQUosT0FBT0UsVUFBUCxDQUFrQkcsT0FBbEIsR0FBNEIsVUFBVUQsS0FBVixFQUFpQjtBQUMzQyxNQUFNRSxRQUFRQyxLQUFLQyxLQUFMLENBQVdKLFFBQVEsRUFBbkIsQ0FBZDtBQUNBLE1BQU1LLE9BQU9MLFFBQVEsRUFBckI7QUFDQSxTQUFVRSxLQUFWLFVBQW9CRyxJQUFwQjtBQUNELENBSkQ7O0FBTUE7Ozs7OztBQU1BVCxPQUFPRSxVQUFQLENBQWtCUSxFQUFsQixHQUF1QixVQUFDTixLQUFELEVBQVFPLEdBQVI7QUFBQSxTQUFnQlAsTUFBTVEsTUFBTixHQUFlRCxHQUEvQjtBQUFBLENBQXZCOztBQUVBOzs7Ozs7QUFNQVgsT0FBT0UsVUFBUCxDQUFrQlcsRUFBbEIsR0FBdUIsVUFBQ1QsS0FBRCxFQUFRTyxHQUFSO0FBQUEsU0FBZ0JQLE1BQU1RLE1BQU4sR0FBZUQsR0FBL0I7QUFBQSxDQUF2Qjs7QUFFQTs7Ozs7O0FBTUFYLE9BQU9FLFVBQVAsQ0FBa0JZLEVBQWxCLEdBQXVCLFVBQUNWLEtBQUQsRUFBUU8sR0FBUjtBQUFBLFNBQWdCUCxNQUFNUSxNQUFOLEdBQWVELEdBQS9CO0FBQUEsQ0FBdkIiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5jb25zdCByaXZldHMgPSByZXF1aXJlKCdyaXZldHMnKTtcblxuLyoqXG4gKiBHZW5lcmljIGZvcm1hdHRlciB0byBwcmVwZW5kXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBwcmVwZW5kXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMucHJlcGVuZCA9IGZ1bmN0aW9uICh2YWx1ZSwgcHJlcGVuZCkge1xuICByZXR1cm4gcHJlcGVuZCArIHZhbHVlO1xufTtcblxuLyoqXG4gKiBGb3JtYXQgbWludXRlcyBpbnRvIEhIaCBNTW1cbiAqIEBwYXJhbSB2YWx1ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMudGltZV9obSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IodmFsdWUgLyA2MCk7XG4gIGNvbnN0IG1pbnMgPSB2YWx1ZSAlIDYwO1xuICByZXR1cm4gYCR7aG91cnN9aCAke21pbnN9bWA7XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBsZW5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5yaXZldHMuZm9ybWF0dGVycy5ndCA9ICh2YWx1ZSwgbGVuKSA9PiB2YWx1ZS5sZW5ndGggPiBsZW47XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIGxlblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbnJpdmV0cy5mb3JtYXR0ZXJzLmx0ID0gKHZhbHVlLCBsZW4pID0+IHZhbHVlLmxlbmd0aCA8IGxlbjtcblxuLyoqXG4gKlxuICogQHBhcmFtIHZhbHVlXG4gKiBAcGFyYW0gbGVuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMuZXEgPSAodmFsdWUsIGxlbikgPT4gdmFsdWUubGVuZ3RoID4gbGVuO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL2NvbW1vbi5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/common.js\n"); + +/***/ }), + +/***/ "./resources/js/config.js": +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("\nvar base_url = document.head.querySelector('meta[name=\"base-url\"]');\nvar token = document.head.querySelector('meta[name=\"csrf-token\"]');\nvar api_key = document.head.querySelector('meta[name=\"api-key\"]');\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n api_key: api_key.content || '',\n base_url: base_url.content || '',\n csrf_token: token.content || ''\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29uZmlnLmpzPzdmNTciXSwibmFtZXMiOlsiYmFzZV91cmwiLCJkb2N1bWVudCIsImhlYWQiLCJxdWVyeVNlbGVjdG9yIiwidG9rZW4iLCJhcGlfa2V5IiwiY29udGVudCIsImNzcmZfdG9rZW4iXSwibWFwcGluZ3MiOiI7QUFDQSxJQUFNQSxXQUFXQyxTQUFTQyxJQUFULENBQWNDLGFBQWQsQ0FBNEIsdUJBQTVCLENBQWpCO0FBQ0EsSUFBTUMsUUFBUUgsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHlCQUE1QixDQUFkO0FBQ0EsSUFBTUUsVUFBVUosU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHNCQUE1QixDQUFoQjs7QUFFZTtBQUNiRSxXQUFTQSxRQUFRQyxPQUFSLElBQW1CLEVBRGY7QUFFYk4sWUFBVUEsU0FBU00sT0FBVCxJQUFvQixFQUZqQjtBQUdiQyxjQUFZSCxNQUFNRSxPQUFOLElBQWlCO0FBSGhCLENBQWYiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29uZmlnLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5jb25zdCBiYXNlX3VybCA9IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiYmFzZS11cmxcIl0nKTtcbmNvbnN0IHRva2VuID0gZG9jdW1lbnQuaGVhZC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJjc3JmLXRva2VuXCJdJyk7XG5jb25zdCBhcGlfa2V5ID0gZG9jdW1lbnQuaGVhZC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJhcGkta2V5XCJdJyk7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgYXBpX2tleTogYXBpX2tleS5jb250ZW50IHx8ICcnLFxuICBiYXNlX3VybDogYmFzZV91cmwuY29udGVudCB8fCAnJyxcbiAgY3NyZl90b2tlbjogdG9rZW4uY29udGVudCB8fCAnJyxcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvY29uZmlnLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/config.js\n"); /***/ }), @@ -391,7 +392,7 @@ eval("/**\n *\n */\n\nvar rivets = __webpack_require__(\"./node_modules/rivets/d /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(\"./resources/js/maps/helpers.js\");\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n\n\n\n/**\n * Render a map with the airspace, etc around a given set of coords\n * e.g, the airport map\n * @param opts\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n opts = Object.assign({\n render_elem: 'map',\n overlay_elem: '',\n lat: 0,\n lon: 0,\n zoom: 12,\n layers: [],\n set_marker: true,\n marker_popup: '',\n\n // Passed from the config/maps.php file\n metar_wms: {\n url: '',\n params: {}\n }\n }, opts);\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var coords = [opts.lat, opts.lon];\n console.log('Applying coords', coords);\n\n map.setView(coords, opts.zoom);\n if (opts.set_marker === true) {\n leaflet.marker(coords).addTo(map).bindPopup(opts.marker_popup);\n }\n\n if (opts.metar_wms.url !== '') {\n Object(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"a\" /* addWMSLayer */])(map, opts.metar_wms);\n }\n\n return map;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9haXJzcGFjZV9tYXAuanM/NGZiMCJdLCJuYW1lcyI6WyJsZWFmbGV0IiwicmVxdWlyZSIsIm9wdHMiLCJPYmplY3QiLCJhc3NpZ24iLCJyZW5kZXJfZWxlbSIsIm92ZXJsYXlfZWxlbSIsImxhdCIsImxvbiIsInpvb20iLCJsYXllcnMiLCJzZXRfbWFya2VyIiwibWFya2VyX3BvcHVwIiwibWV0YXJfd21zIiwidXJsIiwicGFyYW1zIiwibWFwIiwiZHJhd19iYXNlX21hcCIsImNvb3JkcyIsImNvbnNvbGUiLCJsb2ciLCJzZXRWaWV3IiwibWFya2VyIiwiYWRkVG8iLCJiaW5kUG9wdXAiLCJhZGRXTVNMYXllciJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsSUFBTUEsVUFBVUMsbUJBQU9BLENBQUMsNENBQVIsQ0FBaEI7O0FBRUE7QUFDQTs7QUFFQTs7Ozs7QUFLZSxtRUFBQ0MsSUFBRCxFQUFVO0FBQ3ZCQSxTQUFPQyxPQUFPQyxNQUFQLENBQWM7QUFDbkJDLGlCQUFhLEtBRE07QUFFbkJDLGtCQUFjLEVBRks7QUFHbkJDLFNBQUssQ0FIYztBQUluQkMsU0FBSyxDQUpjO0FBS25CQyxVQUFNLEVBTGE7QUFNbkJDLFlBQVEsRUFOVztBQU9uQkMsZ0JBQVksSUFQTztBQVFuQkMsa0JBQWMsRUFSSzs7QUFVbkI7QUFDQUMsZUFBVztBQUNQQyxXQUFLLEVBREU7QUFFUEMsY0FBUTtBQUZEO0FBWFEsR0FBZCxFQWVKYixJQWZJLENBQVA7O0FBaUJBLE1BQUljLE1BQU1DLGtFQUFhQSxDQUFDZixJQUFkLENBQVY7QUFDQSxNQUFNZ0IsU0FBUyxDQUFDaEIsS0FBS0ssR0FBTixFQUFXTCxLQUFLTSxHQUFoQixDQUFmO0FBQ0FXLFVBQVFDLEdBQVIsQ0FBWSxpQkFBWixFQUErQkYsTUFBL0I7O0FBRUFGLE1BQUlLLE9BQUosQ0FBWUgsTUFBWixFQUFvQmhCLEtBQUtPLElBQXpCO0FBQ0EsTUFBSVAsS0FBS1MsVUFBTCxLQUFvQixJQUF4QixFQUE4QjtBQUM1QlgsWUFBUXNCLE1BQVIsQ0FBZUosTUFBZixFQUF1QkssS0FBdkIsQ0FBNkJQLEdBQTdCLEVBQWtDUSxTQUFsQyxDQUE0Q3RCLEtBQUtVLFlBQWpEO0FBQ0Q7O0FBRUQsTUFBR1YsS0FBS1csU0FBTCxDQUFlQyxHQUFmLEtBQXVCLEVBQTFCLEVBQThCO0FBQzFCVyx5RUFBV0EsQ0FBQ1QsR0FBWixFQUFpQmQsS0FBS1csU0FBdEI7QUFDSDs7QUFFRCxTQUFPRyxHQUFQO0FBQ0QsQ0FoQ0QiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9haXJzcGFjZV9tYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmNvbnN0IGxlYWZsZXQgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XG5cbmltcG9ydCBkcmF3X2Jhc2VfbWFwIGZyb20gJy4vYmFzZV9tYXAnXG5pbXBvcnQgeyBhZGRXTVNMYXllciB9IGZyb20gJy4vaGVscGVycyc7XG5cbi8qKlxuICogUmVuZGVyIGEgbWFwIHdpdGggdGhlIGFpcnNwYWNlLCBldGMgYXJvdW5kIGEgZ2l2ZW4gc2V0IG9mIGNvb3Jkc1xuICogZS5nLCB0aGUgYWlycG9ydCBtYXBcbiAqIEBwYXJhbSBvcHRzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IChvcHRzKSA9PiB7XG4gIG9wdHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICByZW5kZXJfZWxlbTogJ21hcCcsXG4gICAgb3ZlcmxheV9lbGVtOiAnJyxcbiAgICBsYXQ6IDAsXG4gICAgbG9uOiAwLFxuICAgIHpvb206IDEyLFxuICAgIGxheWVyczogW10sXG4gICAgc2V0X21hcmtlcjogdHJ1ZSxcbiAgICBtYXJrZXJfcG9wdXA6ICcnLFxuXG4gICAgLy8gUGFzc2VkIGZyb20gdGhlIGNvbmZpZy9tYXBzLnBocCBmaWxlXG4gICAgbWV0YXJfd21zOiB7XG4gICAgICAgIHVybDogJycsXG4gICAgICAgIHBhcmFtczoge31cbiAgICB9LFxuICB9LCBvcHRzKTtcblxuICBsZXQgbWFwID0gZHJhd19iYXNlX21hcChvcHRzKTtcbiAgY29uc3QgY29vcmRzID0gW29wdHMubGF0LCBvcHRzLmxvbl07XG4gIGNvbnNvbGUubG9nKCdBcHBseWluZyBjb29yZHMnLCBjb29yZHMpO1xuXG4gIG1hcC5zZXRWaWV3KGNvb3Jkcywgb3B0cy56b29tKTtcbiAgaWYgKG9wdHMuc2V0X21hcmtlciA9PT0gdHJ1ZSkge1xuICAgIGxlYWZsZXQubWFya2VyKGNvb3JkcykuYWRkVG8obWFwKS5iaW5kUG9wdXAob3B0cy5tYXJrZXJfcG9wdXApO1xuICB9XG5cbiAgaWYob3B0cy5tZXRhcl93bXMudXJsICE9PSAnJykge1xuICAgICAgYWRkV01TTGF5ZXIobWFwLCBvcHRzLm1ldGFyX3dtcyk7XG4gIH1cblxuICByZXR1cm4gbWFwO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2FpcnNwYWNlX21hcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/maps/airspace_map.js\n"); +eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(\"./resources/js/maps/helpers.js\");\n\n\n\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n/**\n * Render a map with the airspace, etc around a given set of coords\n * e.g, the airport map\n * @param {Object} _opts\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (_opts) {\n var opts = Object.assign({\n render_elem: 'map',\n overlay_elem: '',\n lat: 0,\n lon: 0,\n zoom: 12,\n layers: [],\n set_marker: true,\n marker_popup: '',\n\n // Passed from the config/maps.php file\n metar_wms: {\n url: '',\n params: {}\n }\n }, _opts);\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var coords = [opts.lat, opts.lon];\n console.log('Applying coords', coords);\n\n map.setView(coords, opts.zoom);\n if (opts.set_marker === true) {\n leaflet.marker(coords).addTo(map).bindPopup(opts.marker_popup);\n }\n\n if (opts.metar_wms.url !== '') {\n Object(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"a\" /* addWMSLayer */])(map, opts.metar_wms);\n }\n\n return map;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9haXJzcGFjZV9tYXAuanM/NGZiMCJdLCJuYW1lcyI6WyJsZWFmbGV0IiwicmVxdWlyZSIsIl9vcHRzIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsInJlbmRlcl9lbGVtIiwib3ZlcmxheV9lbGVtIiwibGF0IiwibG9uIiwiem9vbSIsImxheWVycyIsInNldF9tYXJrZXIiLCJtYXJrZXJfcG9wdXAiLCJtZXRhcl93bXMiLCJ1cmwiLCJwYXJhbXMiLCJtYXAiLCJkcmF3X2Jhc2VfbWFwIiwiY29vcmRzIiwiY29uc29sZSIsImxvZyIsInNldFZpZXciLCJtYXJrZXIiLCJhZGRUbyIsImJpbmRQb3B1cCIsImFkZFdNU0xheWVyIl0sIm1hcHBpbmdzIjoiOzs7QUFDQTtBQUNBOztBQUVBLElBQU1BLFVBQVVDLG1CQUFPQSxDQUFDLDRDQUFSLENBQWhCOztBQUVBOzs7OztBQUtlLG1FQUFDQyxLQUFELEVBQVc7QUFDeEIsTUFBTUMsT0FBT0MsT0FBT0MsTUFBUCxDQUFjO0FBQ3pCQyxpQkFBYSxLQURZO0FBRXpCQyxrQkFBYyxFQUZXO0FBR3pCQyxTQUFLLENBSG9CO0FBSXpCQyxTQUFLLENBSm9CO0FBS3pCQyxVQUFNLEVBTG1CO0FBTXpCQyxZQUFRLEVBTmlCO0FBT3pCQyxnQkFBWSxJQVBhO0FBUXpCQyxrQkFBYyxFQVJXOztBQVV6QjtBQUNBQyxlQUFXO0FBQ1RDLFdBQUssRUFESTtBQUVUQyxjQUFRO0FBRkM7QUFYYyxHQUFkLEVBZVZkLEtBZlUsQ0FBYjs7QUFpQkEsTUFBTWUsTUFBTUMsa0VBQWFBLENBQUNmLElBQWQsQ0FBWjtBQUNBLE1BQU1nQixTQUFTLENBQUNoQixLQUFLSyxHQUFOLEVBQVdMLEtBQUtNLEdBQWhCLENBQWY7QUFDQVcsVUFBUUMsR0FBUixDQUFZLGlCQUFaLEVBQStCRixNQUEvQjs7QUFFQUYsTUFBSUssT0FBSixDQUFZSCxNQUFaLEVBQW9CaEIsS0FBS08sSUFBekI7QUFDQSxNQUFJUCxLQUFLUyxVQUFMLEtBQW9CLElBQXhCLEVBQThCO0FBQzVCWixZQUFRdUIsTUFBUixDQUFlSixNQUFmLEVBQXVCSyxLQUF2QixDQUE2QlAsR0FBN0IsRUFBa0NRLFNBQWxDLENBQTRDdEIsS0FBS1UsWUFBakQ7QUFDRDs7QUFFRCxNQUFJVixLQUFLVyxTQUFMLENBQWVDLEdBQWYsS0FBdUIsRUFBM0IsRUFBK0I7QUFDN0JXLHlFQUFXQSxDQUFDVCxHQUFaLEVBQWlCZCxLQUFLVyxTQUF0QjtBQUNEOztBQUVELFNBQU9HLEdBQVA7QUFDRCxDQWhDRCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2FpcnNwYWNlX21hcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IGRyYXdfYmFzZV9tYXAgZnJvbSAnLi9iYXNlX21hcCc7XG5pbXBvcnQgeyBhZGRXTVNMYXllciB9IGZyb20gJy4vaGVscGVycyc7XG5cbmNvbnN0IGxlYWZsZXQgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XG5cbi8qKlxuICogUmVuZGVyIGEgbWFwIHdpdGggdGhlIGFpcnNwYWNlLCBldGMgYXJvdW5kIGEgZ2l2ZW4gc2V0IG9mIGNvb3Jkc1xuICogZS5nLCB0aGUgYWlycG9ydCBtYXBcbiAqIEBwYXJhbSB7T2JqZWN0fSBfb3B0c1xuICovXG5leHBvcnQgZGVmYXVsdCAoX29wdHMpID0+IHtcbiAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHJlbmRlcl9lbGVtOiAnbWFwJyxcbiAgICBvdmVybGF5X2VsZW06ICcnLFxuICAgIGxhdDogMCxcbiAgICBsb246IDAsXG4gICAgem9vbTogMTIsXG4gICAgbGF5ZXJzOiBbXSxcbiAgICBzZXRfbWFya2VyOiB0cnVlLFxuICAgIG1hcmtlcl9wb3B1cDogJycsXG5cbiAgICAvLyBQYXNzZWQgZnJvbSB0aGUgY29uZmlnL21hcHMucGhwIGZpbGVcbiAgICBtZXRhcl93bXM6IHtcbiAgICAgIHVybDogJycsXG4gICAgICBwYXJhbXM6IHt9LFxuICAgIH0sXG4gIH0sIF9vcHRzKTtcblxuICBjb25zdCBtYXAgPSBkcmF3X2Jhc2VfbWFwKG9wdHMpO1xuICBjb25zdCBjb29yZHMgPSBbb3B0cy5sYXQsIG9wdHMubG9uXTtcbiAgY29uc29sZS5sb2coJ0FwcGx5aW5nIGNvb3JkcycsIGNvb3Jkcyk7XG5cbiAgbWFwLnNldFZpZXcoY29vcmRzLCBvcHRzLnpvb20pO1xuICBpZiAob3B0cy5zZXRfbWFya2VyID09PSB0cnVlKSB7XG4gICAgbGVhZmxldC5tYXJrZXIoY29vcmRzKS5hZGRUbyhtYXApLmJpbmRQb3B1cChvcHRzLm1hcmtlcl9wb3B1cCk7XG4gIH1cblxuICBpZiAob3B0cy5tZXRhcl93bXMudXJsICE9PSAnJykge1xuICAgIGFkZFdNU0xheWVyKG1hcCwgb3B0cy5tZXRhcl93bXMpO1xuICB9XG5cbiAgcmV0dXJuIG1hcDtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvbWFwcy9haXJzcGFjZV9tYXAuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/airspace_map.js\n"); /***/ }), @@ -399,7 +400,7 @@ eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpa /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("//\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n__webpack_require__(\"./node_modules/leaflet-providers/leaflet-providers.js\");\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n render_elem: 'map',\n center: [29.98139, -95.33374],\n zoom: 5,\n maxZoom: 10,\n layers: [],\n set_marker: false,\n providers: ['Esri.WorldStreetMap'],\n tile_layers: []\n }, opts);\n\n /*\n let feature_groups = [];\n const openaip_airspace_labels = new leaflet.TileLayer.WMS(\n \"http://{s}.tile.maps.openaip.net/geowebcache/service/wms\", {\n maxZoom: 14,\n minZoom: 12,\n layers: 'openaip_approved_airspaces_labels',\n tileSize: 1024,\n detectRetina: true,\n subdomains: '12',\n format: 'image/png',\n transparent: true\n });\n openaip_airspace_labels.addTo(map);*/\n\n /*const openaip_cached_basemap = new leaflet.TileLayer(\"http://{s}.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_basemap@EPSG%3A900913@png/{z}/{x}/{y}.png\", {\n maxZoom: 14,\n minZoom: 4,\n tms: true,\n detectRetina: true,\n subdomains: '12',\n format: 'image/png',\n transparent: true\n });\n feature_groups.push(openaip_cached_basemap);\n */\n\n var map = leaflet.map('map', {\n //layers: [openaip_basemap_phys_osm],\n center: opts.center,\n zoom: opts.zoom,\n scrollWheelZoom: false\n });\n\n for (var i in opts.providers) {\n leaflet.tileLayer.provider(opts.providers[i]).addTo(map);\n }\n\n return map;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9iYXNlX21hcC5qcz80MzA3Il0sIm5hbWVzIjpbImxlYWZsZXQiLCJyZXF1aXJlIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsInJlbmRlcl9lbGVtIiwiY2VudGVyIiwiem9vbSIsIm1heFpvb20iLCJsYXllcnMiLCJzZXRfbWFya2VyIiwicHJvdmlkZXJzIiwidGlsZV9sYXllcnMiLCJtYXAiLCJzY3JvbGxXaGVlbFpvb20iLCJpIiwidGlsZUxheWVyIiwicHJvdmlkZXIiLCJhZGRUbyJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUEsSUFBTUEsVUFBVUMsbUJBQU9BLENBQUMsNENBQVIsQ0FBaEI7QUFDQUEsbUJBQU9BLENBQUMsdURBQVI7O0FBRWUsbUVBQUNDLElBQUQsRUFBVTs7QUFFckJBLFdBQU9DLE9BQU9DLE1BQVAsQ0FBYztBQUNqQkMscUJBQWEsS0FESTtBQUVqQkMsZ0JBQVEsQ0FBQyxRQUFELEVBQVcsQ0FBQyxRQUFaLENBRlM7QUFHakJDLGNBQU0sQ0FIVztBQUlqQkMsaUJBQVMsRUFKUTtBQUtqQkMsZ0JBQVEsRUFMUztBQU1qQkMsb0JBQVksS0FOSztBQU9qQkMsbUJBQVcsQ0FDUCxxQkFETyxDQVBNO0FBVWpCQyxxQkFBYTtBQVZJLEtBQWQsRUFXSlYsSUFYSSxDQUFQOztBQWFBOzs7Ozs7Ozs7Ozs7Ozs7QUFnQkE7Ozs7Ozs7Ozs7OztBQWFBLFFBQUlXLE1BQU1iLFFBQVFhLEdBQVIsQ0FBWSxLQUFaLEVBQW1CO0FBQ3pCO0FBQ0FQLGdCQUFRSixLQUFLSSxNQUZZO0FBR3pCQyxjQUFNTCxLQUFLSyxJQUhjO0FBSXpCTyx5QkFBaUI7QUFKUSxLQUFuQixDQUFWOztBQU9BLFNBQUksSUFBTUMsQ0FBVixJQUFlYixLQUFLUyxTQUFwQixFQUErQjtBQUMzQlgsZ0JBQVFnQixTQUFSLENBQWtCQyxRQUFsQixDQUEyQmYsS0FBS1MsU0FBTCxDQUFlSSxDQUFmLENBQTNCLEVBQThDRyxLQUE5QyxDQUFvREwsR0FBcEQ7QUFDSDs7QUFFRCxXQUFPQSxHQUFQO0FBQ0gsQ0F4REQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9iYXNlX21hcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vXG5cbmNvbnN0IGxlYWZsZXQgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XG5yZXF1aXJlKCdsZWFmbGV0LXByb3ZpZGVycycpO1xuXG5leHBvcnQgZGVmYXVsdCAob3B0cykgPT4ge1xuXG4gICAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICByZW5kZXJfZWxlbTogJ21hcCcsXG4gICAgICAgIGNlbnRlcjogWzI5Ljk4MTM5LCAtOTUuMzMzNzRdLFxuICAgICAgICB6b29tOiA1LFxuICAgICAgICBtYXhab29tOiAxMCxcbiAgICAgICAgbGF5ZXJzOiBbXSxcbiAgICAgICAgc2V0X21hcmtlcjogZmFsc2UsXG4gICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgJ0VzcmkuV29ybGRTdHJlZXRNYXAnLFxuICAgICAgICBdLFxuICAgICAgICB0aWxlX2xheWVyczogW10sXG4gICAgfSwgb3B0cyk7XG5cbiAgICAvKlxuICAgIGxldCBmZWF0dXJlX2dyb3VwcyA9IFtdO1xuICAgIGNvbnN0IG9wZW5haXBfYWlyc3BhY2VfbGFiZWxzID0gbmV3IGxlYWZsZXQuVGlsZUxheWVyLldNUyhcbiAgICAgICAgXCJodHRwOi8ve3N9LnRpbGUubWFwcy5vcGVuYWlwLm5ldC9nZW93ZWJjYWNoZS9zZXJ2aWNlL3dtc1wiLCB7XG4gICAgICAgICAgICBtYXhab29tOiAxNCxcbiAgICAgICAgICAgIG1pblpvb206IDEyLFxuICAgICAgICAgICAgbGF5ZXJzOiAnb3BlbmFpcF9hcHByb3ZlZF9haXJzcGFjZXNfbGFiZWxzJyxcbiAgICAgICAgICAgIHRpbGVTaXplOiAxMDI0LFxuICAgICAgICAgICAgZGV0ZWN0UmV0aW5hOiB0cnVlLFxuICAgICAgICAgICAgc3ViZG9tYWluczogJzEyJyxcbiAgICAgICAgICAgIGZvcm1hdDogJ2ltYWdlL3BuZycsXG4gICAgICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgIG9wZW5haXBfYWlyc3BhY2VfbGFiZWxzLmFkZFRvKG1hcCk7Ki9cblxuICAgIC8qY29uc3Qgb3BlbmFpcF9jYWNoZWRfYmFzZW1hcCA9IG5ldyBsZWFmbGV0LlRpbGVMYXllcihcImh0dHA6Ly97c30udGlsZS5tYXBzLm9wZW5haXAubmV0L2dlb3dlYmNhY2hlL3NlcnZpY2UvdG1zLzEuMC4wL29wZW5haXBfYmFzZW1hcEBFUFNHJTNBOTAwOTEzQHBuZy97en0ve3h9L3t5fS5wbmdcIiwge1xuICAgICAgICBtYXhab29tOiAxNCxcbiAgICAgICAgbWluWm9vbTogNCxcbiAgICAgICAgdG1zOiB0cnVlLFxuICAgICAgICBkZXRlY3RSZXRpbmE6IHRydWUsXG4gICAgICAgIHN1YmRvbWFpbnM6ICcxMicsXG4gICAgICAgIGZvcm1hdDogJ2ltYWdlL3BuZycsXG4gICAgICAgIHRyYW5zcGFyZW50OiB0cnVlXG4gICAgfSk7XG5cbiAgICBmZWF0dXJlX2dyb3Vwcy5wdXNoKG9wZW5haXBfY2FjaGVkX2Jhc2VtYXApO1xuICAgICovXG5cbiAgICBsZXQgbWFwID0gbGVhZmxldC5tYXAoJ21hcCcsIHtcbiAgICAgICAgLy9sYXllcnM6IFtvcGVuYWlwX2Jhc2VtYXBfcGh5c19vc21dLFxuICAgICAgICBjZW50ZXI6IG9wdHMuY2VudGVyLFxuICAgICAgICB6b29tOiBvcHRzLnpvb20sXG4gICAgICAgIHNjcm9sbFdoZWVsWm9vbTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICBmb3IoY29uc3QgaSBpbiBvcHRzLnByb3ZpZGVycykge1xuICAgICAgICBsZWFmbGV0LnRpbGVMYXllci5wcm92aWRlcihvcHRzLnByb3ZpZGVyc1tpXSkuYWRkVG8obWFwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2Jhc2VfbWFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/base_map.js\n"); +eval("\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n__webpack_require__(\"./node_modules/leaflet-providers/leaflet-providers.js\");\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (_opts) {\n var opts = Object.assign({\n render_elem: 'map',\n center: [29.98139, -95.33374],\n zoom: 5,\n maxZoom: 10,\n layers: [],\n set_marker: false,\n providers: ['Esri.WorldStreetMap'],\n tile_layers: []\n }, _opts);\n\n /*\n let feature_groups = [];\n const openaip_airspace_labels = new leaflet.TileLayer.WMS(\n \"http://{s}.tile.maps.openaip.net/geowebcache/service/wms\", {\n maxZoom: 14,\n minZoom: 12,\n layers: 'openaip_approved_airspaces_labels',\n tileSize: 1024,\n detectRetina: true,\n subdomains: '12',\n format: 'image/png',\n transparent: true\n });\n openaip_airspace_labels.addTo(map); */\n\n /*\n const openaip_cached_basemap = new leaflet.TileLayer(\"http://{s}.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_basemap@EPSG%3A900913@png/{z}/{x}/{y}.png\", {\n maxZoom: 14,\n minZoom: 4,\n tms: true,\n detectRetina: true,\n subdomains: '12',\n format: 'image/png',\n transparent: true\n });\n feature_groups.push(openaip_cached_basemap);\n */\n\n var map = leaflet.map('map', {\n // layers: [openaip_basemap_phys_osm],\n center: opts.center,\n zoom: opts.zoom,\n scrollWheelZoom: false\n });\n\n // eslint-disable-next-line no-unused-vars\n opts.providers.forEach(function (p, idx) {\n leaflet.tileLayer.provider(p).addTo(map);\n });\n\n return map;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9iYXNlX21hcC5qcz80MzA3Il0sIm5hbWVzIjpbImxlYWZsZXQiLCJyZXF1aXJlIiwiX29wdHMiLCJvcHRzIiwiT2JqZWN0IiwiYXNzaWduIiwicmVuZGVyX2VsZW0iLCJjZW50ZXIiLCJ6b29tIiwibWF4Wm9vbSIsImxheWVycyIsInNldF9tYXJrZXIiLCJwcm92aWRlcnMiLCJ0aWxlX2xheWVycyIsIm1hcCIsInNjcm9sbFdoZWVsWm9vbSIsImZvckVhY2giLCJwIiwiaWR4IiwidGlsZUxheWVyIiwicHJvdmlkZXIiLCJhZGRUbyJdLCJtYXBwaW5ncyI6IjtBQUNBLElBQU1BLFVBQVVDLG1CQUFPQSxDQUFDLDRDQUFSLENBQWhCO0FBQ0FBLG1CQUFPQSxDQUFDLHVEQUFSOztBQUVlLG1FQUFDQyxLQUFELEVBQVc7QUFDeEIsTUFBTUMsT0FBT0MsT0FBT0MsTUFBUCxDQUFjO0FBQ3pCQyxpQkFBYSxLQURZO0FBRXpCQyxZQUFRLENBQUMsUUFBRCxFQUFXLENBQUMsUUFBWixDQUZpQjtBQUd6QkMsVUFBTSxDQUhtQjtBQUl6QkMsYUFBUyxFQUpnQjtBQUt6QkMsWUFBUSxFQUxpQjtBQU16QkMsZ0JBQVksS0FOYTtBQU96QkMsZUFBVyxDQUNULHFCQURTLENBUGM7QUFVekJDLGlCQUFhO0FBVlksR0FBZCxFQVdWWCxLQVhVLENBQWI7O0FBYUE7Ozs7Ozs7Ozs7Ozs7OztBQWdCQTs7Ozs7Ozs7Ozs7OztBQWNBLE1BQU1ZLE1BQU1kLFFBQVFjLEdBQVIsQ0FBWSxLQUFaLEVBQW1CO0FBQzdCO0FBQ0FQLFlBQVFKLEtBQUtJLE1BRmdCO0FBRzdCQyxVQUFNTCxLQUFLSyxJQUhrQjtBQUk3Qk8scUJBQWlCO0FBSlksR0FBbkIsQ0FBWjs7QUFPQTtBQUNBWixPQUFLUyxTQUFMLENBQWVJLE9BQWYsQ0FBdUIsVUFBQ0MsQ0FBRCxFQUFJQyxHQUFKLEVBQVk7QUFDakNsQixZQUFRbUIsU0FBUixDQUFrQkMsUUFBbEIsQ0FBMkJILENBQTNCLEVBQThCSSxLQUE5QixDQUFvQ1AsR0FBcEM7QUFDRCxHQUZEOztBQUlBLFNBQU9BLEdBQVA7QUFDRCxDQXpERCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2Jhc2VfbWFwLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5jb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xucmVxdWlyZSgnbGVhZmxldC1wcm92aWRlcnMnKTtcblxuZXhwb3J0IGRlZmF1bHQgKF9vcHRzKSA9PiB7XG4gIGNvbnN0IG9wdHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICByZW5kZXJfZWxlbTogJ21hcCcsXG4gICAgY2VudGVyOiBbMjkuOTgxMzksIC05NS4zMzM3NF0sXG4gICAgem9vbTogNSxcbiAgICBtYXhab29tOiAxMCxcbiAgICBsYXllcnM6IFtdLFxuICAgIHNldF9tYXJrZXI6IGZhbHNlLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgJ0VzcmkuV29ybGRTdHJlZXRNYXAnLFxuICAgIF0sXG4gICAgdGlsZV9sYXllcnM6IFtdLFxuICB9LCBfb3B0cyk7XG5cbiAgLypcbiAgbGV0IGZlYXR1cmVfZ3JvdXBzID0gW107XG4gIGNvbnN0IG9wZW5haXBfYWlyc3BhY2VfbGFiZWxzID0gbmV3IGxlYWZsZXQuVGlsZUxheWVyLldNUyhcbiAgICAgIFwiaHR0cDovL3tzfS50aWxlLm1hcHMub3BlbmFpcC5uZXQvZ2Vvd2ViY2FjaGUvc2VydmljZS93bXNcIiwge1xuICAgICAgICAgIG1heFpvb206IDE0LFxuICAgICAgICAgIG1pblpvb206IDEyLFxuICAgICAgICAgIGxheWVyczogJ29wZW5haXBfYXBwcm92ZWRfYWlyc3BhY2VzX2xhYmVscycsXG4gICAgICAgICAgdGlsZVNpemU6IDEwMjQsXG4gICAgICAgICAgZGV0ZWN0UmV0aW5hOiB0cnVlLFxuICAgICAgICAgIHN1YmRvbWFpbnM6ICcxMicsXG4gICAgICAgICAgZm9ybWF0OiAnaW1hZ2UvcG5nJyxcbiAgICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZVxuICAgICAgfSk7XG5cbiAgb3BlbmFpcF9haXJzcGFjZV9sYWJlbHMuYWRkVG8obWFwKTsgKi9cblxuICAvKlxuICBjb25zdCBvcGVuYWlwX2NhY2hlZF9iYXNlbWFwID0gbmV3IGxlYWZsZXQuVGlsZUxheWVyKFwiaHR0cDovL3tzfS50aWxlLm1hcHMub3BlbmFpcC5uZXQvZ2Vvd2ViY2FjaGUvc2VydmljZS90bXMvMS4wLjAvb3BlbmFpcF9iYXNlbWFwQEVQU0clM0E5MDA5MTNAcG5nL3t6fS97eH0ve3l9LnBuZ1wiLCB7XG4gICAgICBtYXhab29tOiAxNCxcbiAgICAgIG1pblpvb206IDQsXG4gICAgICB0bXM6IHRydWUsXG4gICAgICBkZXRlY3RSZXRpbmE6IHRydWUsXG4gICAgICBzdWJkb21haW5zOiAnMTInLFxuICAgICAgZm9ybWF0OiAnaW1hZ2UvcG5nJyxcbiAgICAgIHRyYW5zcGFyZW50OiB0cnVlXG4gIH0pO1xuXG4gIGZlYXR1cmVfZ3JvdXBzLnB1c2gob3BlbmFpcF9jYWNoZWRfYmFzZW1hcCk7XG4gICovXG5cbiAgY29uc3QgbWFwID0gbGVhZmxldC5tYXAoJ21hcCcsIHtcbiAgICAvLyBsYXllcnM6IFtvcGVuYWlwX2Jhc2VtYXBfcGh5c19vc21dLFxuICAgIGNlbnRlcjogb3B0cy5jZW50ZXIsXG4gICAgem9vbTogb3B0cy56b29tLFxuICAgIHNjcm9sbFdoZWVsWm9vbTogZmFsc2UsXG4gIH0pO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBvcHRzLnByb3ZpZGVycy5mb3JFYWNoKChwLCBpZHgpID0+IHtcbiAgICBsZWFmbGV0LnRpbGVMYXllci5wcm92aWRlcihwKS5hZGRUbyhtYXApO1xuICB9KTtcblxuICByZXR1cm4gbWFwO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2Jhc2VfbWFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/base_map.js\n"); /***/ }), @@ -407,7 +408,7 @@ eval("//\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaf /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return PLAN_ROUTE_COLOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return ACTUAL_ROUTE_COLOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return CIRCLE_COLOR; });\nvar PLAN_ROUTE_COLOR = '#043758',\n ACTUAL_ROUTE_COLOR = '#067ec1',\n CIRCLE_COLOR = '#056093';//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanM/NzdmNyJdLCJuYW1lcyI6WyJQTEFOX1JPVVRFX0NPTE9SIiwiQUNUVUFMX1JPVVRFX0NPTE9SIiwiQ0lSQ0xFX0NPTE9SIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBTyxJQUNIQSxtQkFBbUIsU0FEaEI7QUFBQSxJQUVIQyxxQkFBcUIsU0FGbEI7QUFBQSxJQUdIQyxlQUFlLFNBSFoiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgbGV0XG4gICAgUExBTl9ST1VURV9DT0xPUiA9ICcjMDQzNzU4JyxcbiAgICBBQ1RVQUxfUk9VVEVfQ09MT1IgPSAnIzA2N2VjMScsXG4gICAgQ0lSQ0xFX0NPTE9SID0gJyMwNTYwOTMnO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvY29uZmlnLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/config.js\n"); +eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return PLAN_ROUTE_COLOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return ACTUAL_ROUTE_COLOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return CIRCLE_COLOR; });\nvar PLAN_ROUTE_COLOR = '#043758';\nvar ACTUAL_ROUTE_COLOR = '#067ec1';\nvar CIRCLE_COLOR = '#056093';//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanM/NzdmNyJdLCJuYW1lcyI6WyJQTEFOX1JPVVRFX0NPTE9SIiwiQUNUVUFMX1JPVVRFX0NPTE9SIiwiQ0lSQ0xFX0NPTE9SIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBTyxJQUFNQSxtQkFBbUIsU0FBekI7QUFDQSxJQUFNQyxxQkFBcUIsU0FBM0I7QUFDQSxJQUFNQyxlQUFlLFNBQXJCIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL21hcHMvY29uZmlnLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IFBMQU5fUk9VVEVfQ09MT1IgPSAnIzA0Mzc1OCc7XG5leHBvcnQgY29uc3QgQUNUVUFMX1JPVVRFX0NPTE9SID0gJyMwNjdlYzEnO1xuZXhwb3J0IGNvbnN0IENJUkNMRV9DT0xPUiA9ICcjMDU2MDkzJztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2NvbmZpZy5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/maps/config.js\n"); /***/ }), @@ -415,7 +416,7 @@ eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony export (immutable) */ __webpack_exports__[\"a\"] = addWMSLayer;\n/* unused harmony export showFeaturePopup */\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n/**\n * Add a WMS layer to a map. opts must be:\n * {\n * url: '',\n * params: {}\n * }\n * @param map\n * @param opts\n */\nfunction addWMSLayer(map, opts) {\n\n if (opts.url === '') {\n return;\n }\n\n opts.params = Object.assign({\n format: 'image/png',\n transparent: true,\n maxZoom: 14,\n minZoom: 4\n }, opts.params);\n\n var mlayer = leaflet.tileLayer.wms(opts.url, opts.params);\n\n mlayer.addTo(map);\n\n return mlayer;\n}\n\n/**\n * Show a popup\n * @param feature\n * @param layer\n */\nfunction showFeaturePopup(feature, layer) {\n var popup_html = '';\n if (feature.properties && feature.properties.popup) {\n popup_html += feature.properties.popup;\n }\n\n layer.bindPopup(popup_html);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9oZWxwZXJzLmpzPzNjZDUiXSwibmFtZXMiOlsibGVhZmxldCIsInJlcXVpcmUiLCJhZGRXTVNMYXllciIsIm1hcCIsIm9wdHMiLCJ1cmwiLCJwYXJhbXMiLCJPYmplY3QiLCJhc3NpZ24iLCJmb3JtYXQiLCJ0cmFuc3BhcmVudCIsIm1heFpvb20iLCJtaW5ab29tIiwibWxheWVyIiwidGlsZUxheWVyIiwid21zIiwiYWRkVG8iLCJzaG93RmVhdHVyZVBvcHVwIiwiZmVhdHVyZSIsImxheWVyIiwicG9wdXBfaHRtbCIsInByb3BlcnRpZXMiLCJwb3B1cCIsImJpbmRQb3B1cCJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsSUFBTUEsVUFBVUMsbUJBQU9BLENBQUMsNENBQVIsQ0FBaEI7O0FBRUE7Ozs7Ozs7OztBQVNPLFNBQVNDLFdBQVQsQ0FBcUJDLEdBQXJCLEVBQTBCQyxJQUExQixFQUFnQzs7QUFFbkMsUUFBR0EsS0FBS0MsR0FBTCxLQUFhLEVBQWhCLEVBQW9CO0FBQ2hCO0FBQ0g7O0FBRURELFNBQUtFLE1BQUwsR0FBY0MsT0FBT0MsTUFBUCxDQUFjO0FBQ3hCQyxnQkFBUSxXQURnQjtBQUV4QkMscUJBQWEsSUFGVztBQUd4QkMsaUJBQVMsRUFIZTtBQUl4QkMsaUJBQVM7QUFKZSxLQUFkLEVBS1hSLEtBQUtFLE1BTE0sQ0FBZDs7QUFPQSxRQUFNTyxTQUFTYixRQUFRYyxTQUFSLENBQWtCQyxHQUFsQixDQUNYWCxLQUFLQyxHQURNLEVBQ0RELEtBQUtFLE1BREosQ0FBZjs7QUFJQU8sV0FBT0csS0FBUCxDQUFhYixHQUFiOztBQUVBLFdBQU9VLE1BQVA7QUFDSDs7QUFFRDs7Ozs7QUFLTyxTQUFTSSxnQkFBVCxDQUEwQkMsT0FBMUIsRUFBbUNDLEtBQW5DLEVBQTBDO0FBQzdDLFFBQUlDLGFBQWEsRUFBakI7QUFDQSxRQUFJRixRQUFRRyxVQUFSLElBQXNCSCxRQUFRRyxVQUFSLENBQW1CQyxLQUE3QyxFQUFvRDtBQUNoREYsc0JBQWNGLFFBQVFHLFVBQVIsQ0FBbUJDLEtBQWpDO0FBQ0g7O0FBRURILFVBQU1JLFNBQU4sQ0FBZ0JILFVBQWhCO0FBQ0giLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9oZWxwZXJzLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5jb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xuXG4vKipcbiAqIEFkZCBhIFdNUyBsYXllciB0byBhIG1hcC4gb3B0cyBtdXN0IGJlOlxuICoge1xuICogIHVybDogJycsXG4gKiAgcGFyYW1zOiB7fVxuICogIH1cbiAqIEBwYXJhbSBtYXBcbiAqIEBwYXJhbSBvcHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRXTVNMYXllcihtYXAsIG9wdHMpIHtcblxuICAgIGlmKG9wdHMudXJsID09PSAnJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3B0cy5wYXJhbXMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgZm9ybWF0OiAnaW1hZ2UvcG5nJyxcbiAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICAgIG1heFpvb206IDE0LFxuICAgICAgICBtaW5ab29tOiA0LFxuICAgIH0sIG9wdHMucGFyYW1zKTtcblxuICAgIGNvbnN0IG1sYXllciA9IGxlYWZsZXQudGlsZUxheWVyLndtcyhcbiAgICAgICAgb3B0cy51cmwsIG9wdHMucGFyYW1zXG4gICAgKTtcblxuICAgIG1sYXllci5hZGRUbyhtYXApO1xuXG4gICAgcmV0dXJuIG1sYXllcjtcbn1cblxuLyoqXG4gKiBTaG93IGEgcG9wdXBcbiAqIEBwYXJhbSBmZWF0dXJlXG4gKiBAcGFyYW0gbGF5ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3dGZWF0dXJlUG9wdXAoZmVhdHVyZSwgbGF5ZXIpIHtcbiAgICBsZXQgcG9wdXBfaHRtbCA9ICcnO1xuICAgIGlmIChmZWF0dXJlLnByb3BlcnRpZXMgJiYgZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwKSB7XG4gICAgICAgIHBvcHVwX2h0bWwgKz0gZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwXG4gICAgfVxuXG4gICAgbGF5ZXIuYmluZFBvcHVwKHBvcHVwX2h0bWwpXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvbWFwcy9oZWxwZXJzLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/helpers.js\n"); +eval("/* harmony export (immutable) */ __webpack_exports__[\"a\"] = addWMSLayer;\n/* unused harmony export showFeaturePopup */\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n/**\n * Add a WMS layer to a map. opts must be:\n * {\n * url: '',\n * params: {}\n * }\n * @param map\n * @param opts\n */\nfunction addWMSLayer(map, opts) {\n if (opts.url === '') {\n return null;\n }\n\n opts.params = Object.assign({\n format: 'image/png',\n transparent: true,\n maxZoom: 14,\n minZoom: 4\n }, opts.params);\n\n var mlayer = leaflet.tileLayer.wms(opts.url, opts.params);\n\n mlayer.addTo(map);\n\n return mlayer;\n}\n\n/**\n * Show a popup\n * @param feature\n * @param layer\n */\nfunction showFeaturePopup(feature, layer) {\n var popup_html = '';\n if (feature.properties && feature.properties.popup) {\n popup_html += feature.properties.popup;\n }\n\n layer.bindPopup(popup_html);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9oZWxwZXJzLmpzPzNjZDUiXSwibmFtZXMiOlsibGVhZmxldCIsInJlcXVpcmUiLCJhZGRXTVNMYXllciIsIm1hcCIsIm9wdHMiLCJ1cmwiLCJwYXJhbXMiLCJPYmplY3QiLCJhc3NpZ24iLCJmb3JtYXQiLCJ0cmFuc3BhcmVudCIsIm1heFpvb20iLCJtaW5ab29tIiwibWxheWVyIiwidGlsZUxheWVyIiwid21zIiwiYWRkVG8iLCJzaG93RmVhdHVyZVBvcHVwIiwiZmVhdHVyZSIsImxheWVyIiwicG9wdXBfaHRtbCIsInByb3BlcnRpZXMiLCJwb3B1cCIsImJpbmRQb3B1cCJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsSUFBTUEsVUFBVUMsbUJBQU9BLENBQUMsNENBQVIsQ0FBaEI7O0FBRUE7Ozs7Ozs7OztBQVNPLFNBQVNDLFdBQVQsQ0FBcUJDLEdBQXJCLEVBQTBCQyxJQUExQixFQUFnQztBQUNyQyxNQUFJQSxLQUFLQyxHQUFMLEtBQWEsRUFBakIsRUFBcUI7QUFDbkIsV0FBTyxJQUFQO0FBQ0Q7O0FBRURELE9BQUtFLE1BQUwsR0FBY0MsT0FBT0MsTUFBUCxDQUFjO0FBQzFCQyxZQUFRLFdBRGtCO0FBRTFCQyxpQkFBYSxJQUZhO0FBRzFCQyxhQUFTLEVBSGlCO0FBSTFCQyxhQUFTO0FBSmlCLEdBQWQsRUFLWFIsS0FBS0UsTUFMTSxDQUFkOztBQU9BLE1BQU1PLFNBQVNiLFFBQVFjLFNBQVIsQ0FBa0JDLEdBQWxCLENBQ2JYLEtBQUtDLEdBRFEsRUFDSEQsS0FBS0UsTUFERixDQUFmOztBQUlBTyxTQUFPRyxLQUFQLENBQWFiLEdBQWI7O0FBRUEsU0FBT1UsTUFBUDtBQUNEOztBQUVEOzs7OztBQUtPLFNBQVNJLGdCQUFULENBQTBCQyxPQUExQixFQUFtQ0MsS0FBbkMsRUFBMEM7QUFDL0MsTUFBSUMsYUFBYSxFQUFqQjtBQUNBLE1BQUlGLFFBQVFHLFVBQVIsSUFBc0JILFFBQVFHLFVBQVIsQ0FBbUJDLEtBQTdDLEVBQW9EO0FBQ2xERixrQkFBY0YsUUFBUUcsVUFBUixDQUFtQkMsS0FBakM7QUFDRDs7QUFFREgsUUFBTUksU0FBTixDQUFnQkgsVUFBaEI7QUFDRCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2hlbHBlcnMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmNvbnN0IGxlYWZsZXQgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XG5cbi8qKlxuICogQWRkIGEgV01TIGxheWVyIHRvIGEgbWFwLiBvcHRzIG11c3QgYmU6XG4gKiB7XG4gKiAgdXJsOiAnJyxcbiAqICBwYXJhbXM6IHt9XG4gKiAgfVxuICogQHBhcmFtIG1hcFxuICogQHBhcmFtIG9wdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFdNU0xheWVyKG1hcCwgb3B0cykge1xuICBpZiAob3B0cy51cmwgPT09ICcnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBvcHRzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIGZvcm1hdDogJ2ltYWdlL3BuZycsXG4gICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgbWF4Wm9vbTogMTQsXG4gICAgbWluWm9vbTogNCxcbiAgfSwgb3B0cy5wYXJhbXMpO1xuXG4gIGNvbnN0IG1sYXllciA9IGxlYWZsZXQudGlsZUxheWVyLndtcyhcbiAgICBvcHRzLnVybCwgb3B0cy5wYXJhbXMsXG4gICk7XG5cbiAgbWxheWVyLmFkZFRvKG1hcCk7XG5cbiAgcmV0dXJuIG1sYXllcjtcbn1cblxuLyoqXG4gKiBTaG93IGEgcG9wdXBcbiAqIEBwYXJhbSBmZWF0dXJlXG4gKiBAcGFyYW0gbGF5ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3dGZWF0dXJlUG9wdXAoZmVhdHVyZSwgbGF5ZXIpIHtcbiAgbGV0IHBvcHVwX2h0bWwgPSAnJztcbiAgaWYgKGZlYXR1cmUucHJvcGVydGllcyAmJiBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXApIHtcbiAgICBwb3B1cF9odG1sICs9IGZlYXR1cmUucHJvcGVydGllcy5wb3B1cDtcbiAgfVxuXG4gIGxheWVyLmJpbmRQb3B1cChwb3B1cF9odG1sKTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2hlbHBlcnMuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/helpers.js\n"); /***/ }), @@ -423,7 +424,7 @@ eval("/* harmony export (immutable) */ __webpack_exports__[\"a\"] = addWMSLayer; /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__airspace_map__ = __webpack_require__(\"./resources/js/maps/airspace_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__live_map__ = __webpack_require__(\"./resources/js/maps/live_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__route_map__ = __webpack_require__(\"./resources/js/maps/route_map.js\");\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_airspace_map\", function() { return __WEBPACK_IMPORTED_MODULE_0__airspace_map__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_live_map\", function() { return __WEBPACK_IMPORTED_MODULE_1__live_map__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_route_map\", function() { return __WEBPACK_IMPORTED_MODULE_2__route_map__[\"a\"]; });\n/**\n * All of the functionality required for maps\n */\n\nwindow.L = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n__webpack_require__(\"./node_modules/Leaflet.Geodesic/Leaflet.Geodesic.js\");\n__webpack_require__(\"./node_modules/leaflet-rotatedmarker/leaflet.rotatedMarker.js\");\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9pbmRleC5qcz85MmYwIl0sIm5hbWVzIjpbIndpbmRvdyIsIkwiLCJyZXF1aXJlIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FBSUFBLE9BQU9DLENBQVAsR0FBV0MsbUJBQU9BLENBQUMsNENBQVIsQ0FBWDtBQUNBQSxtQkFBT0EsQ0FBQyxxREFBUjtBQUNBQSxtQkFBT0EsQ0FBQywrREFBUjs7QUFFQTtBQUNBO0FBQ0EiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9pbmRleC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWxsIG9mIHRoZSBmdW5jdGlvbmFsaXR5IHJlcXVpcmVkIGZvciBtYXBzXG4gKi9cblxud2luZG93LkwgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XG5yZXF1aXJlKCdMZWFmbGV0Lkdlb2Rlc2ljJyk7XG5yZXF1aXJlKCdsZWFmbGV0LXJvdGF0ZWRtYXJrZXInKTtcblxuaW1wb3J0IHJlbmRlcl9haXJzcGFjZV9tYXAgZnJvbSAnLi9haXJzcGFjZV9tYXAnXG5pbXBvcnQgcmVuZGVyX2xpdmVfbWFwIGZyb20gJy4vbGl2ZV9tYXAnXG5pbXBvcnQgcmVuZGVyX3JvdXRlX21hcCBmcm9tICcuL3JvdXRlX21hcCdcblxuZXhwb3J0IHtcbiAgcmVuZGVyX2FpcnNwYWNlX21hcCxcbiAgcmVuZGVyX2xpdmVfbWFwLFxuICByZW5kZXJfcm91dGVfbWFwLFxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvaW5kZXguanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/index.js\n"); +eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__airspace_map__ = __webpack_require__(\"./resources/js/maps/airspace_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__live_map__ = __webpack_require__(\"./resources/js/maps/live_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__route_map__ = __webpack_require__(\"./resources/js/maps/route_map.js\");\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_airspace_map\", function() { return __WEBPACK_IMPORTED_MODULE_0__airspace_map__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_live_map\", function() { return __WEBPACK_IMPORTED_MODULE_1__live_map__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_route_map\", function() { return __WEBPACK_IMPORTED_MODULE_2__route_map__[\"a\"]; });\n/**\n * All of the functionality required for maps\n */\n\n\n\n\n\n__webpack_require__(\"./node_modules/Leaflet.Geodesic/Leaflet.Geodesic.js\");\n__webpack_require__(\"./node_modules/leaflet-rotatedmarker/leaflet.rotatedMarker.js\");\n\nwindow.L = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9pbmRleC5qcz85MmYwIl0sIm5hbWVzIjpbInJlcXVpcmUiLCJ3aW5kb3ciLCJMIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FBSUE7QUFDQTtBQUNBOztBQUVBQSxtQkFBT0EsQ0FBQyxxREFBUjtBQUNBQSxtQkFBT0EsQ0FBQywrREFBUjs7QUFFQUMsT0FBT0MsQ0FBUCxHQUFXRixtQkFBT0EsQ0FBQyw0Q0FBUixDQUFYIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL21hcHMvaW5kZXguanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFsbCBvZiB0aGUgZnVuY3Rpb25hbGl0eSByZXF1aXJlZCBmb3IgbWFwc1xuICovXG5cbmltcG9ydCByZW5kZXJfYWlyc3BhY2VfbWFwIGZyb20gJy4vYWlyc3BhY2VfbWFwJztcbmltcG9ydCByZW5kZXJfbGl2ZV9tYXAgZnJvbSAnLi9saXZlX21hcCc7XG5pbXBvcnQgcmVuZGVyX3JvdXRlX21hcCBmcm9tICcuL3JvdXRlX21hcCc7XG5cbnJlcXVpcmUoJ0xlYWZsZXQuR2VvZGVzaWMnKTtcbnJlcXVpcmUoJ2xlYWZsZXQtcm90YXRlZG1hcmtlcicpO1xuXG53aW5kb3cuTCA9IHJlcXVpcmUoJ2xlYWZsZXQnKTtcblxuZXhwb3J0IHtcbiAgcmVuZGVyX2FpcnNwYWNlX21hcCxcbiAgcmVuZGVyX2xpdmVfbWFwLFxuICByZW5kZXJfcm91dGVfbWFwLFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2luZGV4LmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/index.js\n"); /***/ }), @@ -431,7 +432,7 @@ eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true } /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__config__ = __webpack_require__(\"./resources/js/maps/config.js\");\n//\n\nvar geolib = __webpack_require__(\"./node_modules/geolib/dist/geolib.js\");\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n\n\n\n/**\n * Render the live map\n * @param opts\n * @private\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n center: [29.98139, -95.33374],\n zoom: 5,\n update_uri: '/api/acars',\n pirep_uri: '/api/pireps/{id}',\n pirep_link_uri: '/pireps/{id}',\n positions: null,\n render_elem: 'map',\n aircraft_icon: '/assets/img/acars/aircraft.png',\n units: 'nmi'\n }, opts);\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var aircraftIcon = leaflet.icon({\n iconUrl: opts.aircraft_icon,\n iconSize: [42, 42],\n iconAnchor: [21, 21]\n });\n\n /**\n * Hold the markers\n * @type {{}}\n */\n var markers_list = {};\n\n var pannedToCenter = false;\n\n var layerFlights = null;\n var layerSelFlight = null;\n var layerSelFlightFeature = null;\n var layerSelFlightLayer = null;\n var layerSelArr = null;\n var layerSelDep = null;\n\n /**\n * Controller for two-way bindings\n * @type {{focusMarker: focusMarker}}\n */\n var mapController = {\n /**\n * Focus on a specific marker\n * @param e\n * @param model\n */\n focusMarker: function focusMarker(e, model) {\n if (!(model.pirep.id in markers_list)) {\n console.log('marker not found in list');\n return;\n }\n\n var marker = markers_list[model.pirep.id];\n onFlightClick(marker[0], marker[1]);\n }\n };\n\n var r_map_view = rivets.bind($('#map-info-box'), { pirep: {}, controller: mapController });\n var r_table_view = rivets.bind($('#live_flights'), { pireps: [], controller: mapController });\n\n /**\n * When a flight is clicked on, show the path, etc for that flight\n * @param feature\n * @param layer\n */\n var onFlightClick = function onFlightClick(feature, layer) {\n\n var pirep_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id);\n var geojson_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id) + \"/acars/geojson\";\n\n var pirep_info = $.ajax({\n url: pirep_uri,\n dataType: 'json',\n error: console.log\n });\n\n var flight_route = $.ajax({\n url: geojson_uri,\n dataType: 'json',\n error: console.log\n });\n\n // Load up the PIREP info\n $.when(flight_route).done(function (rte) {\n if (layerSelFlight !== null) {\n map.removeLayer(layerSelFlight);\n //map.removeLayer(layerSelArr);\n //map.removeLayer(layerSelDep);\n }\n\n layerSelFlight = leaflet.geodesic([], {\n weight: 5,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n wrap: false\n }).addTo(map);\n\n layerSelFlight.geoJson(rte.line);\n layerSelFlightFeature = feature;\n layerSelFlightLayer = layer;\n\n /*const dptIcon = leaflet.divIcon({\n html: '
' + rte.airports.d.icao + '
'\n });\n layerSelDep = leaflet.marker([rte.airports.d.lat, rte.airports.d.lon], {icon:dptIcon}).addTo(map);\n */\n\n // Center on it, but only do it once, in case the map is moved\n if (!pannedToCenter) {\n // find center\n var c = geolib.getCenter([{ latitude: rte.airports.a.lat, longitude: rte.airports.a.lon }, { latitude: rte.airports.d.lat, longitude: rte.airports.d.lon }]);\n\n //map.panTo({lat: c.latitude, lng: c.longitude});\n map.panTo({ lat: rte.position.lat, lng: rte.position.lon });\n pannedToCenter = true;\n }\n });\n\n //\n // When the PIREP info is done loading, show the bottom bar\n //\n $.when(pirep_info).done(function (pirep) {\n r_map_view.update({ pirep: pirep.data });\n $('#map-info-box').show();\n });\n };\n\n var updateMap = function updateMap() {\n\n console.log('reloading flights from acars...');\n\n /**\n * AJAX UPDATE\n */\n var pirep_uri = opts.pirep_uri.replace('{id}', '');\n var pireps = $.ajax({\n url: pirep_uri,\n dataType: 'json',\n error: console.log\n });\n\n var flights = $.ajax({\n url: opts.update_uri,\n dataType: 'json',\n error: console.log\n });\n\n $.when(flights).done(function (flightGeoJson) {\n\n if (layerFlights !== null) {\n layerFlights.clearLayers();\n }\n\n layerFlights = leaflet.geoJSON(flightGeoJson, {\n onEachFeature: function onEachFeature(feature, layer) {\n layer.on({\n click: function click(e) {\n pannedToCenter = false;\n onFlightClick(feature, layer);\n }\n });\n\n var popup_html = '';\n if (feature.properties && feature.properties.popup !== '' && feature.properties.popup !== undefined) {\n popup_html += feature.properties.popup;\n layer.bindPopup(popup_html);\n }\n\n // add to the list\n markers_list[feature.properties.pirep_id] = [feature, layer];\n },\n pointToLayer: function pointToLayer(feature, latlon) {\n return leaflet.marker(latlon, {\n icon: aircraftIcon,\n rotationAngle: feature.properties.heading\n });\n }\n });\n\n layerFlights.addTo(map);\n\n // Reload the clicked-flight information\n if (layerSelFlight !== null) {\n onFlightClick(layerSelFlightFeature, layerSelFlightLayer);\n }\n });\n\n $.when(pireps).done(function (pireps) {\n r_table_view.update({\n pireps: pireps.data,\n has_data: pireps.data.length > 0\n });\n });\n };\n\n updateMap();\n setInterval(updateMap, 10000);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9saXZlX21hcC5qcz9lN2Y2Il0sIm5hbWVzIjpbImdlb2xpYiIsInJlcXVpcmUiLCJsZWFmbGV0Iiwicml2ZXRzIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsImNlbnRlciIsInpvb20iLCJ1cGRhdGVfdXJpIiwicGlyZXBfdXJpIiwicGlyZXBfbGlua191cmkiLCJwb3NpdGlvbnMiLCJyZW5kZXJfZWxlbSIsImFpcmNyYWZ0X2ljb24iLCJ1bml0cyIsIm1hcCIsImRyYXdfYmFzZV9tYXAiLCJhaXJjcmFmdEljb24iLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsIm1hcmtlcnNfbGlzdCIsInBhbm5lZFRvQ2VudGVyIiwibGF5ZXJGbGlnaHRzIiwibGF5ZXJTZWxGbGlnaHQiLCJsYXllclNlbEZsaWdodEZlYXR1cmUiLCJsYXllclNlbEZsaWdodExheWVyIiwibGF5ZXJTZWxBcnIiLCJsYXllclNlbERlcCIsIm1hcENvbnRyb2xsZXIiLCJmb2N1c01hcmtlciIsImUiLCJtb2RlbCIsInBpcmVwIiwiaWQiLCJjb25zb2xlIiwibG9nIiwibWFya2VyIiwib25GbGlnaHRDbGljayIsInJfbWFwX3ZpZXciLCJiaW5kIiwiJCIsImNvbnRyb2xsZXIiLCJyX3RhYmxlX3ZpZXciLCJwaXJlcHMiLCJmZWF0dXJlIiwibGF5ZXIiLCJyZXBsYWNlIiwicHJvcGVydGllcyIsInBpcmVwX2lkIiwiZ2VvanNvbl91cmkiLCJwaXJlcF9pbmZvIiwiYWpheCIsInVybCIsImRhdGFUeXBlIiwiZXJyb3IiLCJmbGlnaHRfcm91dGUiLCJ3aGVuIiwiZG9uZSIsInJ0ZSIsInJlbW92ZUxheWVyIiwiZ2VvZGVzaWMiLCJ3ZWlnaHQiLCJvcGFjaXR5IiwiY29sb3IiLCJBQ1RVQUxfUk9VVEVfQ09MT1IiLCJ3cmFwIiwiYWRkVG8iLCJnZW9Kc29uIiwibGluZSIsImMiLCJnZXRDZW50ZXIiLCJsYXRpdHVkZSIsImFpcnBvcnRzIiwiYSIsImxhdCIsImxvbmdpdHVkZSIsImxvbiIsImQiLCJwYW5UbyIsInBvc2l0aW9uIiwibG5nIiwidXBkYXRlIiwiZGF0YSIsInNob3ciLCJ1cGRhdGVNYXAiLCJmbGlnaHRzIiwiY2xlYXJMYXllcnMiLCJnZW9KU09OIiwiZmxpZ2h0R2VvSnNvbiIsIm9uRWFjaEZlYXR1cmUiLCJvbiIsImNsaWNrIiwicG9wdXBfaHRtbCIsInBvcHVwIiwidW5kZWZpbmVkIiwiYmluZFBvcHVwIiwicG9pbnRUb0xheWVyIiwibGF0bG9uIiwicm90YXRpb25BbmdsZSIsImhlYWRpbmciLCJoYXNfZGF0YSIsImxlbmd0aCIsInNldEludGVydmFsIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7O0FBRUEsSUFBTUEsU0FBU0MsbUJBQU9BLENBQUMsc0NBQVIsQ0FBZjtBQUNBLElBQU1DLFVBQVVELG1CQUFPQSxDQUFDLDRDQUFSLENBQWhCO0FBQ0EsSUFBTUUsU0FBU0YsbUJBQU9BLENBQUMsc0NBQVIsQ0FBZjs7QUFFQTtBQUNBOztBQUVBOzs7OztBQUtlLG1FQUFDRyxJQUFELEVBQVU7O0FBRXJCQSxXQUFPQyxPQUFPQyxNQUFQLENBQWM7QUFDakJDLGdCQUFRLENBQUMsUUFBRCxFQUFXLENBQUMsUUFBWixDQURTO0FBRWpCQyxjQUFNLENBRlc7QUFHakJDLG9CQUFZLFlBSEs7QUFJakJDLG1CQUFXLGtCQUpNO0FBS2pCQyx3QkFBZ0IsY0FMQztBQU1qQkMsbUJBQVcsSUFOTTtBQU9qQkMscUJBQWEsS0FQSTtBQVFqQkMsdUJBQWUsZ0NBUkU7QUFTakJDLGVBQU87QUFUVSxLQUFkLEVBVUpYLElBVkksQ0FBUDs7QUFZQSxRQUFNWSxNQUFNQyxrRUFBYUEsQ0FBQ2IsSUFBZCxDQUFaO0FBQ0EsUUFBTWMsZUFBZWhCLFFBQVFpQixJQUFSLENBQWE7QUFDOUJDLGlCQUFTaEIsS0FBS1UsYUFEZ0I7QUFFOUJPLGtCQUFVLENBQUMsRUFBRCxFQUFLLEVBQUwsQ0FGb0I7QUFHOUJDLG9C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SUFBRixDQUFPYixNQUFQLEVBQWVjLElBQWYsQ0FBb0Isa0JBQVU7QUFDMUJmLHlCQUFhdUMsTUFBYixDQUFvQjtBQUNoQnRDLHdCQUFRQSxPQUFPdUMsSUFEQztBQUVoQmtCLDBCQUFXekQsT0FBT3VDLElBQVAsQ0FBWW1CLE1BQVosR0FBcUI7QUFGaEIsYUFBcEI7QUFJSCxTQUxEO0FBTUgsS0FsRUQ7O0FBb0VBakI7QUFDQWtCLGdCQUFZbEIsU0FBWixFQUF1QixLQUF2QjtBQUNILENBek1EIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL21hcHMvbGl2ZV9tYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvL1xuXG5jb25zdCBnZW9saWIgPSByZXF1aXJlKCdnZW9saWInKTtcbmNvbnN0IGxlYWZsZXQgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XG5jb25zdCByaXZldHMgPSByZXF1aXJlKCdyaXZldHMnKTtcblxuaW1wb3J0IGRyYXdfYmFzZV9tYXAgZnJvbSAnLi9iYXNlX21hcCdcbmltcG9ydCB7IEFDVFVBTF9ST1VURV9DT0xPUiB9IGZyb20gJy4vY29uZmlnJ1xuXG4vKipcbiAqIFJlbmRlciB0aGUgbGl2ZSBtYXBcbiAqIEBwYXJhbSBvcHRzXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZGVmYXVsdCAob3B0cykgPT4ge1xuXG4gICAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBjZW50ZXI6IFsyOS45ODEzOSwgLTk1LjMzMzc0XSxcbiAgICAgICAgem9vbTogNSxcbiAgICAgICAgdXBkYXRlX3VyaTogJy9hcGkvYWNhcnMnLFxuICAgICAgICBwaXJlcF91cmk6ICcvYXBpL3BpcmVwcy97aWR9JyxcbiAgICAgICAgcGlyZXBfbGlua191cmk6ICcvcGlyZXBzL3tpZH0nLFxuICAgICAgICBwb3NpdGlvbnM6IG51bGwsXG4gICAgICAgIHJlbmRlcl9lbGVtOiAnbWFwJyxcbiAgICAgICAgYWlyY3JhZnRfaWNvbjogJy9hc3NldHMvaW1nL2FjYXJzL2FpcmNyYWZ0LnBuZycsXG4gICAgICAgIHVuaXRzOiAnbm1pJyxcbiAgICB9LCBvcHRzKTtcblxuICAgIGNvbnN0IG1hcCA9IGRyYXdfYmFzZV9tYXAob3B0cyk7XG4gICAgY29uc3QgYWlyY3JhZnRJY29uID0gbGVhZmxldC5pY29uKHtcbiAgICAgICAgaWNvblVybDogb3B0cy5haXJjcmFmdF9pY29uLFxuICAgICAgICBpY29uU2l6ZTogWzQyLCA0Ml0sXG4gICAgICAgIGljb25BbmNob3I6IFsyMSwgMjFdLFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogSG9sZCB0aGUgbWFya2Vyc1xuICAgICAqIEB0eXBlIHt7fX1cbiAgICAgKi9cbiAgICBsZXQgbWFya2Vyc19saXN0ID0ge307XG5cbiAgICBsZXQgcGFubmVkVG9DZW50ZXIgPSBmYWxzZTtcblxuICAgIGxldCBsYXllckZsaWdodHMgPSBudWxsO1xuICAgIGxldCBsYXllclNlbEZsaWdodCA9IG51bGw7XG4gICAgbGV0IGxheWVyU2VsRmxpZ2h0RmVhdHVyZSA9IG51bGw7XG4gICAgbGV0IGxheWVyU2VsRmxpZ2h0TGF5ZXIgPSBudWxsO1xuICAgIGxldCBsYXllclNlbEFyciA9IG51bGw7XG4gICAgbGV0IGxheWVyU2VsRGVwID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xsZXIgZm9yIHR3by13YXkgYmluZGluZ3NcbiAgICAgKiBAdHlwZSB7e2ZvY3VzTWFya2VyOiBmb2N1c01hcmtlcn19XG4gICAgICovXG4gICAgY29uc3QgbWFwQ29udHJvbGxlciA9IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZvY3VzIG9uIGEgc3BlY2lmaWMgbWFya2VyXG4gICAgICAgICAqIEBwYXJhbSBlXG4gICAgICAgICAqIEBwYXJhbSBtb2RlbFxuICAgICAgICAgKi9cbiAgICAgICAgZm9jdXNNYXJrZXI6IChlLCBtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYoIShtb2RlbC5waXJlcC5pZCBpbiBtYXJrZXJzX2xpc3QpKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ21hcmtlciBub3QgZm91bmQgaW4gbGlzdCcpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbWFya2VyID0gbWFya2Vyc19saXN0W21vZGVsLnBpcmVwLmlkXTtcbiAgICAgICAgICAgIG9uRmxpZ2h0Q2xpY2sobWFya2VyWzBdLCBtYXJrZXJbMV0pO1xuICAgICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCByX21hcF92aWV3ID0gcml2ZXRzLmJpbmQoJCgnI21hcC1pbmZvLWJveCcpLCB7cGlyZXA6IHt9LCBjb250cm9sbGVyOiBtYXBDb250cm9sbGVyfSk7XG4gICAgY29uc3Qgcl90YWJsZV92aWV3ID0gcml2ZXRzLmJpbmQoJCgnI2xpdmVfZmxpZ2h0cycpLCB7cGlyZXBzOiBbXSwgY29udHJvbGxlcjogbWFwQ29udHJvbGxlcn0pO1xuXG4gICAgLyoqXG4gICAgICogV2hlbiBhIGZsaWdodCBpcyBjbGlja2VkIG9uLCBzaG93IHRoZSBwYXRoLCBldGMgZm9yIHRoYXQgZmxpZ2h0XG4gICAgICogQHBhcmFtIGZlYXR1cmVcbiAgICAgKiBAcGFyYW0gbGF5ZXJcbiAgICAgKi9cbiAgICBjb25zdCBvbkZsaWdodENsaWNrID0gKGZlYXR1cmUsIGxheWVyKSA9PiB7XG5cbiAgICAgICAgY29uc3QgcGlyZXBfdXJpID0gb3B0cy5waXJlcF91cmkucmVwbGFjZSgne2lkfScsIGZlYXR1cmUucHJvcGVydGllcy5waXJlcF9pZCk7XG4gICAgICAgIGNvbnN0IGdlb2pzb25fdXJpID0gb3B0cy5waXJlcF91cmkucmVwbGFjZSgne2lkfScsIGZlYXR1cmUucHJvcGVydGllcy5waXJlcF9pZCkgKyBcIi9hY2Fycy9nZW9qc29uXCI7XG5cbiAgICAgICAgY29uc3QgcGlyZXBfaW5mbyA9ICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6IHBpcmVwX3VyaSxcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXG4gICAgICAgICAgICBlcnJvcjogY29uc29sZS5sb2dcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZmxpZ2h0X3JvdXRlID0gJC5hamF4KHtcbiAgICAgICAgICAgIHVybDogZ2VvanNvbl91cmksXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgICAgICAgZXJyb3I6IGNvbnNvbGUubG9nXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIExvYWQgdXAgdGhlIFBJUkVQIGluZm9cbiAgICAgICAgJC53aGVuKGZsaWdodF9yb3V0ZSkuZG9uZSgocnRlKSA9PiB7XG4gICAgICAgICAgICBpZiAobGF5ZXJTZWxGbGlnaHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBtYXAucmVtb3ZlTGF5ZXIobGF5ZXJTZWxGbGlnaHQpO1xuICAgICAgICAgICAgICAgIC8vbWFwLnJlbW92ZUxheWVyKGxheWVyU2VsQXJyKTtcbiAgICAgICAgICAgICAgICAvL21hcC5yZW1vdmVMYXllcihsYXllclNlbERlcCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxheWVyU2VsRmxpZ2h0ID0gbGVhZmxldC5nZW9kZXNpYyhbXSwge1xuICAgICAgICAgICAgICAgIHdlaWdodDogNSxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjksXG4gICAgICAgICAgICAgICAgY29sb3I6IEFDVFVBTF9ST1VURV9DT0xPUixcbiAgICAgICAgICAgICAgICB3cmFwOiBmYWxzZSxcbiAgICAgICAgICAgIH0pLmFkZFRvKG1hcCk7XG5cbiAgICAgICAgICAgIGxheWVyU2VsRmxpZ2h0Lmdlb0pzb24ocnRlLmxpbmUpO1xuICAgICAgICAgICAgbGF5ZXJTZWxGbGlnaHRGZWF0dXJlID0gZmVhdHVyZTtcbiAgICAgICAgICAgIGxheWVyU2VsRmxpZ2h0TGF5ZXIgPSBsYXllcjtcblxuICAgICAgICAgICAgLypjb25zdCBkcHRJY29uID0gbGVhZmxldC5kaXZJY29uKHtcbiAgICAgICAgICAgICAgICBodG1sOiAnPGRpdiBjbGFzcz1cIm1hcC1pbmZvLWxhYmVsXCI+PGg1PicgKyBydGUuYWlycG9ydHMuZC5pY2FvICsgJzwvaDU+PC9kaXY+J1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxheWVyU2VsRGVwID0gbGVhZmxldC5tYXJrZXIoW3J0ZS5haXJwb3J0cy5kLmxhdCwgcnRlLmFpcnBvcnRzLmQubG9uXSwge2ljb246ZHB0SWNvbn0pLmFkZFRvKG1hcCk7XG4gICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAvLyBDZW50ZXIgb24gaXQsIGJ1dCBvbmx5IGRvIGl0IG9uY2UsIGluIGNhc2UgdGhlIG1hcCBpcyBtb3ZlZFxuICAgICAgICAgICAgaWYoIXBhbm5lZFRvQ2VudGVyKSB7XG4gICAgICAgICAgICAgICAgLy8gZmluZCBjZW50ZXJcbiAgICAgICAgICAgICAgICBjb25zdCBjID0gZ2VvbGliLmdldENlbnRlcihbXG4gICAgICAgICAgICAgICAgICAgIHtsYXRpdHVkZTogcnRlLmFpcnBvcnRzLmEubGF0LCBsb25naXR1ZGU6IHJ0ZS5haXJwb3J0cy5hLmxvbn0sXG4gICAgICAgICAgICAgICAgICAgIHtsYXRpdHVkZTogcnRlLmFpcnBvcnRzLmQubGF0LCBsb25naXR1ZGU6IHJ0ZS5haXJwb3J0cy5kLmxvbn0sXG4gICAgICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgICAgICAvL21hcC5wYW5Ubyh7bGF0OiBjLmxhdGl0dWRlLCBsbmc6IGMubG9uZ2l0dWRlfSk7XG4gICAgICAgICAgICAgICAgbWFwLnBhblRvKHtsYXQ6IHJ0ZS5wb3NpdGlvbi5sYXQsIGxuZzogcnRlLnBvc2l0aW9uLmxvbn0pO1xuICAgICAgICAgICAgICAgIHBhbm5lZFRvQ2VudGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2hlbiB0aGUgUElSRVAgaW5mbyBpcyBkb25lIGxvYWRpbmcsIHNob3cgdGhlIGJvdHRvbSBiYXJcbiAgICAgICAgLy9cbiAgICAgICAgJC53aGVuKHBpcmVwX2luZm8pLmRvbmUocGlyZXAgPT4ge1xuICAgICAgICAgICAgcl9tYXBfdmlldy51cGRhdGUoe3BpcmVwOnBpcmVwLmRhdGF9KTtcbiAgICAgICAgICAgICQoJyNtYXAtaW5mby1ib3gnKS5zaG93KCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVNYXAgPSAoKSA9PiB7XG5cbiAgICAgICAgY29uc29sZS5sb2coJ3JlbG9hZGluZyBmbGlnaHRzIGZyb20gYWNhcnMuLi4nKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQUpBWCBVUERBVEVcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHBpcmVwX3VyaSA9IG9wdHMucGlyZXBfdXJpLnJlcGxhY2UoJ3tpZH0nLCAnJyk7XG4gICAgICAgIGxldCBwaXJlcHMgPSAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiBwaXJlcF91cmksXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgICAgICAgZXJyb3I6IGNvbnNvbGUubG9nXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBmbGlnaHRzID0gJC5hamF4KHtcbiAgICAgICAgICAgIHVybDogb3B0cy51cGRhdGVfdXJpLFxuICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgIGVycm9yOiBjb25zb2xlLmxvZ1xuICAgICAgICB9KTtcblxuICAgICAgICAkLndoZW4oZmxpZ2h0cykuZG9uZShmbGlnaHRHZW9Kc29uID0+IHtcblxuICAgICAgICAgICAgaWYgKGxheWVyRmxpZ2h0cyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxheWVyRmxpZ2h0cy5jbGVhckxheWVycygpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxheWVyRmxpZ2h0cyA9IGxlYWZsZXQuZ2VvSlNPTihmbGlnaHRHZW9Kc29uLCB7XG4gICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogKGZlYXR1cmUsIGxheWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyLm9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbm5lZFRvQ2VudGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25GbGlnaHRDbGljayhmZWF0dXJlLCBsYXllcilcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvcHVwX2h0bWwgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUucHJvcGVydGllcyAmJiAoZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwICE9PSAnJyAmJiBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXAgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVwX2h0bWwgKz0gZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIuYmluZFBvcHVwKHBvcHVwX2h0bWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRvIHRoZSBsaXN0XG4gICAgICAgICAgICAgICAgICAgIG1hcmtlcnNfbGlzdFtmZWF0dXJlLnByb3BlcnRpZXMucGlyZXBfaWRdID0gW2ZlYXR1cmUsIGxheWVyXTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBvaW50VG9MYXllcjogZnVuY3Rpb24gKGZlYXR1cmUsIGxhdGxvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVhZmxldC5tYXJrZXIobGF0bG9uLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uOiBhaXJjcmFmdEljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbkFuZ2xlOiBmZWF0dXJlLnByb3BlcnRpZXMuaGVhZGluZ1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsYXllckZsaWdodHMuYWRkVG8obWFwKTtcblxuICAgICAgICAgICAgLy8gUmVsb2FkIHRoZSBjbGlja2VkLWZsaWdodCBpbmZvcm1hdGlvblxuICAgICAgICAgICAgaWYgKGxheWVyU2VsRmxpZ2h0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb25GbGlnaHRDbGljayhsYXllclNlbEZsaWdodEZlYXR1cmUsIGxheWVyU2VsRmxpZ2h0TGF5ZXIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQud2hlbihwaXJlcHMpLmRvbmUocGlyZXBzID0+IHtcbiAgICAgICAgICAgIHJfdGFibGVfdmlldy51cGRhdGUoe1xuICAgICAgICAgICAgICAgIHBpcmVwczogcGlyZXBzLmRhdGEsXG4gICAgICAgICAgICAgICAgaGFzX2RhdGE6IChwaXJlcHMuZGF0YS5sZW5ndGggPiAwKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgdXBkYXRlTWFwKCk7XG4gICAgc2V0SW50ZXJ2YWwodXBkYXRlTWFwLCAxMDAwMClcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvbWFwcy9saXZlX21hcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/maps/live_map.js\n"); +eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__config__ = __webpack_require__(\"./resources/js/maps/config.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__request__ = __webpack_require__(\"./resources/js/request.js\");\n\n\n\n\n\n\n\n// const geolib = require('geolib');\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n/**\n * Render the live map\n * @param _opts\n * @private\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (_opts) {\n var opts = Object.assign({\n center: [29.98139, -95.33374],\n refresh_interval: 10, // seconds\n zoom: 5,\n update_uri: '/api/acars',\n pirep_uri: '/api/pireps/{id}',\n pirep_link_uri: '/pireps/{id}',\n positions: null,\n render_elem: 'map',\n aircraft_icon: '/assets/img/acars/aircraft.png',\n units: 'nmi'\n }, _opts);\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var aircraftIcon = leaflet.icon({\n iconUrl: opts.aircraft_icon,\n iconSize: [42, 42],\n iconAnchor: [21, 21]\n });\n\n /**\n * Hold the markers\n * @type {{}}\n */\n var markers_list = {};\n var pannedToCenter = false;\n var layerFlights = null;\n var layerSelFlight = null;\n var layerSelFlightFeature = null;\n var layerSelFlightLayer = null;\n\n var liveMapController = {\n pirep: {},\n pireps: [],\n has_data: false,\n controller: {\n /**\n * Focus on a specific marker\n * @param e\n * @param model\n */\n focusMarker: function focusMarker(e, model) {\n if (!(model.pirep.id in markers_list)) {\n console.log('marker not found in list');\n return;\n }\n\n var marker = markers_list[model.pirep.id];\n onFlightClick(marker[0], marker[1]);\n }\n }\n };\n\n rivets.bind($('#map-info-box'), liveMapController);\n rivets.bind($('#live_flights'), liveMapController);\n\n var drawRoute = function drawRoute(feature, layer, route) {\n console.log('drawRoute');\n if (layerSelFlight !== null) {\n map.removeLayer(layerSelFlight);\n }\n\n layerSelFlight = leaflet.geodesic([], {\n weight: 5,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n wrap: false\n }).addTo(map);\n\n layerSelFlight.geoJson(route.line);\n layerSelFlightFeature = feature;\n layerSelFlightLayer = layer;\n\n // Center on it, but only do it once, in case the map is moved\n if (!pannedToCenter) {\n map.panTo({\n lat: route.position.lat,\n lng: route.position.lon\n });\n\n pannedToCenter = true;\n }\n };\n\n /**\n * When a flight is clicked on, show the path, etc for that flight\n * @param feature\n * @param layer\n */\n var onFlightClick = function onFlightClick(feature, layer) {\n var pirep_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id);\n var geojson_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id) + '/acars/geojson';\n\n /*\n * Run these in parallel:\n * 1. Get information about the PIREP and populate the bottom box/container\n * 2. Draw out the flight route\n */\n Object(__WEBPACK_IMPORTED_MODULE_2__request__[\"a\" /* default */])(pirep_uri).then(function (response) {\n var pirep = response.data.data;\n console.log(pirep);\n\n liveMapController.pirep = pirep;\n });\n\n Object(__WEBPACK_IMPORTED_MODULE_2__request__[\"a\" /* default */])(geojson_uri).then(function (response) {\n var route = response.data.data;\n console.log(route);\n\n drawRoute(feature, layer, route);\n });\n };\n\n var updateMap = function updateMap() {\n var pirep_uri = opts.pirep_uri.replace('{id}', '');\n\n Object(__WEBPACK_IMPORTED_MODULE_2__request__[\"a\" /* default */])(pirep_uri).then(function (response) {\n var pireps = response.data.data;\n liveMapController.pireps = pireps;\n liveMapController.has_data = pireps.length > 0;\n });\n\n Object(__WEBPACK_IMPORTED_MODULE_2__request__[\"a\" /* default */])({ url: opts.update_uri }).then(function (response) {\n var flightGeoJson = response.data.data;\n\n if (layerFlights !== null) {\n layerFlights.clearLayers();\n }\n\n layerFlights = leaflet.geoJSON(flightGeoJson, {\n onEachFeature: function onEachFeature(feature, layer) {\n layer.on({\n // eslint-disable-next-line no-unused-vars\n click: function click(e) {\n pannedToCenter = false;\n liveMapController.controller.onFlightClick(feature, layer);\n }\n });\n\n var popup_html = '';\n if (feature.properties && feature.properties.popup !== '' && feature.properties.popup !== undefined) {\n popup_html += feature.properties.popup;\n layer.bindPopup(popup_html);\n }\n\n // add to the list\n markers_list[feature.properties.pirep_id] = [feature, layer];\n },\n pointToLayer: function pointToLayer(feature, latlon) {\n return leaflet.marker(latlon, {\n icon: aircraftIcon,\n rotationAngle: feature.properties.heading\n });\n }\n });\n\n layerFlights.addTo(map);\n\n // Reload the clicked-flight information\n if (layerSelFlight !== null) {\n liveMapController.controller.onFlightClick(layerSelFlightFeature, layerSelFlightLayer);\n }\n });\n };\n\n updateMap();\n setInterval(updateMap, opts.refresh_interval * 1000);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9saXZlX21hcC5qcz9lN2Y2Il0sIm5hbWVzIjpbImxlYWZsZXQiLCJyZXF1aXJlIiwicml2ZXRzIiwiX29wdHMiLCJvcHRzIiwiT2JqZWN0IiwiYXNzaWduIiwiY2VudGVyIiwicmVmcmVzaF9pbnRlcnZhbCIsInpvb20iLCJ1cGRhdGVfdXJpIiwicGlyZXBfdXJpIiwicGlyZXBfbGlua191cmkiLCJwb3NpdGlvbnMiLCJyZW5kZXJfZWxlbSIsImFpcmNyYWZ0X2ljb24iLCJ1bml0cyIsIm1hcCIsImRyYXdfYmFzZV9tYXAiLCJhaXJjcmFmdEljb24iLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsIm1hcmtlcnNfbGlzdCIsInBhbm5lZFRvQ2VudGVyIiwibGF5ZXJGbGlnaHRzIiwibGF5ZXJTZWxGbGlnaHQiLCJsYXllclNlbEZsaWdodEZlYXR1cmUiLCJsYXllclNlbEZsaWdodExheWVyIiwibGl2ZU1hcENvbnRyb2xsZXIiLCJwaXJlcCIsInBpcmVwcyIsImhhc19kYXRhIiwiY29udHJvbGxlciIsImZvY3VzTWFya2VyIiwiZSIsIm1vZGVsIiwiaWQiLCJjb25zb2xlIiwibG9nIiwibWFya2VyIiwib25GbGlnaHRDbGljayIsImJpbmQiLCIkIiwiZHJhd1JvdXRlIiwiZmVhdHVyZSIsImxheWVyIiwicm91dGUiLCJyZW1vdmVMYXllciIsImdlb2Rlc2ljIiwid2VpZ2h0Iiwib3BhY2l0eSIsImNvbG9yIiwiQUNUVUFMX1JPVVRFX0NPTE9SIiwid3JhcCIsImFkZFRvIiwiZ2VvSnNvbiIsImxpbmUiLCJwYW5UbyIsImxhdCIsInBvc2l0aW9uIiwibG5nIiwibG9uIiwicmVwbGFjZSIsInByb3BlcnRpZXMiLCJwaXJlcF9pZCIsImdlb2pzb25fdXJpIiwicmVxdWVzdCIsInRoZW4iLCJyZXNwb25zZSIsImRhdGEiLCJ1cGRhdGVNYXAiLCJsZW5ndGgiLCJ1cmwiLCJmbGlnaHRHZW9Kc29uIiwiY2xlYXJMYXllcnMiLCJnZW9KU09OIiwib25FYWNoRmVhdHVyZSIsIm9uIiwiY2xpY2siLCJwb3B1cF9odG1sIiwicG9wdXAiLCJ1bmRlZmluZWQiLCJiaW5kUG9wdXAiLCJwb2ludFRvTGF5ZXIiLCJsYXRsb24iLCJyb3RhdGlvbkFuZ2xlIiwiaGVhZGluZyIsInNldEludGVydmFsIl0sIm1hcHBpbmdzIjoiOzs7O0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSxJQUFNQSxVQUFVQyxtQkFBT0EsQ0FBQyw0Q0FBUixDQUFoQjtBQUNBLElBQU1DLFNBQVNELG1CQUFPQSxDQUFDLHNDQUFSLENBQWY7O0FBRUE7Ozs7O0FBS2UsbUVBQUNFLEtBQUQsRUFBVztBQUN4QixNQUFNQyxPQUFPQyxPQUFPQyxNQUFQLENBQWM7QUFDekJDLFlBQVEsQ0FBQyxRQUFELEVBQVcsQ0FBQyxRQUFaLENBRGlCO0FBRXpCQyxzQkFBa0IsRUFGTyxFQUVIO0FBQ3RCQyxVQUFNLENBSG1CO0FBSXpCQyxnQkFBWSxZQUphO0FBS3pCQyxlQUFXLGtCQUxjO0FBTXpCQyxvQkFBZ0IsY0FOUztBQU96QkMsZUFBVyxJQVBjO0FBUXpCQyxpQkFBYSxLQVJZO0FBU3pCQyxtQkFBZSxnQ0FUVTtBQVV6QkMsV0FBTztBQVZrQixHQUFkLEVBV1ZiLEtBWFUsQ0FBYjs7QUFhQSxNQUFNYyxNQUFNQyxrRUFBYUEsQ0FBQ2QsSUFBZCxDQUFaO0FBQ0EsTUFBTWUsZUFBZW5CLFFBQVFvQixJQUFSLENBQWE7QUFDaENDLGFBQVNqQixLQUFLVyxhQURrQjtBQUVoQ08sY0FBVSxDQUFDLEVBQUQsRUFBSyxFQUFMLENBRnNCO0FBR2hDQyxnQkFBWSxDQUFDLEVBQUQsRUFBSyxFQUFMO0FBSG9CLEdBQWIsQ0FBckI7O0FBTUE7Ozs7QUFJQSxNQUFNQyxlQUFlLEVBQXJCO0FBQ0EsTUFBSUMsaUJBQWlCLEtBQXJCO0FBQ0EsTUFBSUMsZUFBZSxJQUFuQjtBQUNBLE1BQUlDLGlCQUFpQixJQUFyQjtBQUNBLE1BQUlDLHdCQUF3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YXNCLFFBQVFtQixVQUFSLENBQW1CQyxRQUFoQyxJQUE0QyxDQUFDcEIsT0FBRCxFQUFVQyxLQUFWLENBQTVDO0FBQ0QsU0FsQjJDO0FBbUI1Q3NDLG9CQW5CNEMsd0JBbUIvQnZDLE9BbkIrQixFQW1CdEJ3QyxNQW5Cc0IsRUFtQmQ7QUFDNUIsaUJBQU90RixRQUFReUMsTUFBUixDQUFlNkMsTUFBZixFQUF1QjtBQUM1QmxFLGtCQUFNRCxZQURzQjtBQUU1Qm9FLDJCQUFlekMsUUFBUW1CLFVBQVIsQ0FBbUJ1QjtBQUZOLFdBQXZCLENBQVA7QUFJRDtBQXhCMkMsT0FBL0IsQ0FBZjs7QUEyQkE5RCxtQkFBYThCLEtBQWIsQ0FBbUJ2QyxHQUFuQjs7QUFFQTtBQUNBLFVBQUlVLG1CQUFtQixJQUF2QixFQUE2QjtBQUMzQkcsMEJBQWtCSSxVQUFsQixDQUE2QlEsYUFBN0IsQ0FBMkNkLHFCQUEzQyxFQUFrRUMsbUJBQWxFO0FBQ0Q7QUFDRixLQXhDRDtBQXlDRCxHQWxERDs7QUFvREEyQztBQUNBaUIsY0FBWWpCLFNBQVosRUFBdUJwRSxLQUFLSSxnQkFBTCxHQUF3QixJQUEvQztBQUNELENBeEtEIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL21hcHMvbGl2ZV9tYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBkcmF3X2Jhc2VfbWFwIGZyb20gJy4vYmFzZV9tYXAnO1xuXG5pbXBvcnQgeyBBQ1RVQUxfUk9VVEVfQ09MT1IgfSBmcm9tICcuL2NvbmZpZyc7XG5cbmltcG9ydCByZXF1ZXN0IGZyb20gJy4uL3JlcXVlc3QnO1xuXG4vLyBjb25zdCBnZW9saWIgPSByZXF1aXJlKCdnZW9saWInKTtcbmNvbnN0IGxlYWZsZXQgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XG5jb25zdCByaXZldHMgPSByZXF1aXJlKCdyaXZldHMnKTtcblxuLyoqXG4gKiBSZW5kZXIgdGhlIGxpdmUgbWFwXG4gKiBAcGFyYW0gX29wdHNcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IChfb3B0cykgPT4ge1xuICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgY2VudGVyOiBbMjkuOTgxMzksIC05NS4zMzM3NF0sXG4gICAgcmVmcmVzaF9pbnRlcnZhbDogMTAsIC8vIHNlY29uZHNcbiAgICB6b29tOiA1LFxuICAgIHVwZGF0ZV91cmk6ICcvYXBpL2FjYXJzJyxcbiAgICBwaXJlcF91cmk6ICcvYXBpL3BpcmVwcy97aWR9JyxcbiAgICBwaXJlcF9saW5rX3VyaTogJy9waXJlcHMve2lkfScsXG4gICAgcG9zaXRpb25zOiBudWxsLFxuICAgIHJlbmRlcl9lbGVtOiAnbWFwJyxcbiAgICBhaXJjcmFmdF9pY29uOiAnL2Fzc2V0cy9pbWcvYWNhcnMvYWlyY3JhZnQucG5nJyxcbiAgICB1bml0czogJ25taScsXG4gIH0sIF9vcHRzKTtcblxuICBjb25zdCBtYXAgPSBkcmF3X2Jhc2VfbWFwKG9wdHMpO1xuICBjb25zdCBhaXJjcmFmdEljb24gPSBsZWFmbGV0Lmljb24oe1xuICAgIGljb25Vcmw6IG9wdHMuYWlyY3JhZnRfaWNvbixcbiAgICBpY29uU2l6ZTogWzQyLCA0Ml0sXG4gICAgaWNvbkFuY2hvcjogWzIxLCAyMV0sXG4gIH0pO1xuXG4gIC8qKlxuICAgKiBIb2xkIHRoZSBtYXJrZXJzXG4gICAqIEB0eXBlIHt7fX1cbiAgICovXG4gIGNvbnN0IG1hcmtlcnNfbGlzdCA9IHt9O1xuICBsZXQgcGFubmVkVG9DZW50ZXIgPSBmYWxzZTtcbiAgbGV0IGxheWVyRmxpZ2h0cyA9IG51bGw7XG4gIGxldCBsYXllclNlbEZsaWdodCA9IG51bGw7XG4gIGxldCBsYXllclNlbEZsaWdodEZlYXR1cmUgPSBudWxsO1xuICBsZXQgbGF5ZXJTZWxGbGlnaHRMYXllciA9IG51bGw7XG5cbiAgY29uc3QgbGl2ZU1hcENvbnRyb2xsZXIgPSB7XG4gICAgcGlyZXA6IHt9LFxuICAgIHBpcmVwczogW10sXG4gICAgaGFzX2RhdGE6IGZhbHNlLFxuICAgIGNvbnRyb2xsZXI6IHtcbiAgICAgIC8qKlxuICAgICAgICogRm9jdXMgb24gYSBzcGVjaWZpYyBtYXJrZXJcbiAgICAgICAqIEBwYXJhbSBlXG4gICAgICAgKiBAcGFyYW0gbW9kZWxcbiAgICAgICAqL1xuICAgICAgZm9jdXNNYXJrZXI6IChlLCBtb2RlbCkgPT4ge1xuICAgICAgICBpZiAoIShtb2RlbC5waXJlcC5pZCBpbiBtYXJrZXJzX2xpc3QpKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ21hcmtlciBub3QgZm91bmQgaW4gbGlzdCcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1hcmtlciA9IG1hcmtlcnNfbGlzdFttb2RlbC5waXJlcC5pZF07XG4gICAgICAgIG9uRmxpZ2h0Q2xpY2sobWFya2VyWzBdLCBtYXJrZXJbMV0pO1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIHJpdmV0cy5iaW5kKCQoJyNtYXAtaW5mby1ib3gnKSwgbGl2ZU1hcENvbnRyb2xsZXIpO1xuICByaXZldHMuYmluZCgkKCcjbGl2ZV9mbGlnaHRzJyksIGxpdmVNYXBDb250cm9sbGVyKTtcblxuICBjb25zdCBkcmF3Um91dGUgPSAoZmVhdHVyZSwgbGF5ZXIsIHJvdXRlKSA9PiB7XG4gICAgY29uc29sZS5sb2coJ2RyYXdSb3V0ZScpO1xuICAgIGlmIChsYXllclNlbEZsaWdodCAhPT0gbnVsbCkge1xuICAgICAgbWFwLnJlbW92ZUxheWVyKGxheWVyU2VsRmxpZ2h0KTtcbiAgICB9XG5cbiAgICBsYXllclNlbEZsaWdodCA9IGxlYWZsZXQuZ2VvZGVzaWMoW10sIHtcbiAgICAgIHdlaWdodDogNSxcbiAgICAgIG9wYWNpdHk6IDAuOSxcbiAgICAgIGNvbG9yOiBBQ1RVQUxfUk9VVEVfQ09MT1IsXG4gICAgICB3cmFwOiBmYWxzZSxcbiAgICB9KS5hZGRUbyhtYXApO1xuXG4gICAgbGF5ZXJTZWxGbGlnaHQuZ2VvSnNvbihyb3V0ZS5saW5lKTtcbiAgICBsYXllclNlbEZsaWdodEZlYXR1cmUgPSBmZWF0dXJlO1xuICAgIGxheWVyU2VsRmxpZ2h0TGF5ZXIgPSBsYXllcjtcblxuICAgIC8vIENlbnRlciBvbiBpdCwgYnV0IG9ubHkgZG8gaXQgb25jZSwgaW4gY2FzZSB0aGUgbWFwIGlzIG1vdmVkXG4gICAgaWYgKCFwYW5uZWRUb0NlbnRlcikge1xuICAgICAgbWFwLnBhblRvKHtcbiAgICAgICAgbGF0OiByb3V0ZS5wb3NpdGlvbi5sYXQsXG4gICAgICAgIGxuZzogcm91dGUucG9zaXRpb24ubG9uLFxuICAgICAgfSk7XG5cbiAgICAgIHBhbm5lZFRvQ2VudGVyID0gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFdoZW4gYSBmbGlnaHQgaXMgY2xpY2tlZCBvbiwgc2hvdyB0aGUgcGF0aCwgZXRjIGZvciB0aGF0IGZsaWdodFxuICAgKiBAcGFyYW0gZmVhdHVyZVxuICAgKiBAcGFyYW0gbGF5ZXJcbiAgICovXG4gIGNvbnN0IG9uRmxpZ2h0Q2xpY2sgPSAoZmVhdHVyZSwgbGF5ZXIpID0+IHtcbiAgICBjb25zdCBwaXJlcF91cmkgPSBvcHRzLnBpcmVwX3VyaS5yZXBsYWNlKCd7aWR9JywgZmVhdHVyZS5wcm9wZXJ0aWVzLnBpcmVwX2lkKTtcbiAgICBjb25zdCBnZW9qc29uX3VyaSA9IGAke29wdHMucGlyZXBfdXJpLnJlcGxhY2UoJ3tpZH0nLCBmZWF0dXJlLnByb3BlcnRpZXMucGlyZXBfaWQpfS9hY2Fycy9nZW9qc29uYDtcblxuICAgIC8qXG4gICAgICogUnVuIHRoZXNlIGluIHBhcmFsbGVsOlxuICAgICAqIDEuIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgUElSRVAgYW5kIHBvcHVsYXRlIHRoZSBib3R0b20gYm94L2NvbnRhaW5lclxuICAgICAqIDIuIERyYXcgb3V0IHRoZSBmbGlnaHQgcm91dGVcbiAgICAgKi9cbiAgICByZXF1ZXN0KHBpcmVwX3VyaSkudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHBpcmVwID0gcmVzcG9uc2UuZGF0YS5kYXRhO1xuICAgICAgY29uc29sZS5sb2cocGlyZXApO1xuXG4gICAgICBsaXZlTWFwQ29udHJvbGxlci5waXJlcCA9IHBpcmVwO1xuICAgIH0pO1xuXG4gICAgcmVxdWVzdChnZW9qc29uX3VyaSkudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJvdXRlID0gcmVzcG9uc2UuZGF0YS5kYXRhO1xuICAgICAgY29uc29sZS5sb2cocm91dGUpO1xuXG4gICAgICBkcmF3Um91dGUoZmVhdHVyZSwgbGF5ZXIsIHJvdXRlKTtcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCB1cGRhdGVNYXAgPSAoKSA9PiB7XG4gICAgY29uc3QgcGlyZXBfdXJpID0gb3B0cy5waXJlcF91cmkucmVwbGFjZSgne2lkfScsICcnKTtcblxuICAgIHJlcXVlc3QocGlyZXBfdXJpKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcGlyZXBzID0gcmVzcG9uc2UuZGF0YS5kYXRhO1xuICAgICAgbGl2ZU1hcENvbnRyb2xsZXIucGlyZXBzID0gcGlyZXBzO1xuICAgICAgbGl2ZU1hcENvbnRyb2xsZXIuaGFzX2RhdGEgPSBwaXJlcHMubGVuZ3RoID4gMDtcbiAgICB9KTtcblxuICAgIHJlcXVlc3QoeyB1cmw6IG9wdHMudXBkYXRlX3VyaSB9KS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZmxpZ2h0R2VvSnNvbiA9IHJlc3BvbnNlLmRhdGEuZGF0YTtcblxuICAgICAgaWYgKGxheWVyRmxpZ2h0cyAhPT0gbnVsbCkge1xuICAgICAgICBsYXllckZsaWdodHMuY2xlYXJMYXllcnMoKTtcbiAgICAgIH1cblxuICAgICAgbGF5ZXJGbGlnaHRzID0gbGVhZmxldC5nZW9KU09OKGZsaWdodEdlb0pzb24sIHtcbiAgICAgICAgb25FYWNoRmVhdHVyZTogKGZlYXR1cmUsIGxheWVyKSA9PiB7XG4gICAgICAgICAgbGF5ZXIub24oe1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICAgICAgICBjbGljazogKGUpID0+IHtcbiAgICAgICAgICAgICAgcGFubmVkVG9DZW50ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgbGl2ZU1hcENvbnRyb2xsZXIuY29udHJvbGxlci5vbkZsaWdodENsaWNrKGZlYXR1cmUsIGxheWVyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBsZXQgcG9wdXBfaHRtbCA9ICcnO1xuICAgICAgICAgIGlmIChmZWF0dXJlLnByb3BlcnRpZXMgJiYgKGZlYXR1cmUucHJvcGVydGllcy5wb3B1cCAhPT0gJycgJiYgZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICBwb3B1cF9odG1sICs9IGZlYXR1cmUucHJvcGVydGllcy5wb3B1cDtcbiAgICAgICAgICAgIGxheWVyLmJpbmRQb3B1cChwb3B1cF9odG1sKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBhZGQgdG8gdGhlIGxpc3RcbiAgICAgICAgICBtYXJrZXJzX2xpc3RbZmVhdHVyZS5wcm9wZXJ0aWVzLnBpcmVwX2lkXSA9IFtmZWF0dXJlLCBsYXllcl07XG4gICAgICAgIH0sXG4gICAgICAgIHBvaW50VG9MYXllcihmZWF0dXJlLCBsYXRsb24pIHtcbiAgICAgICAgICByZXR1cm4gbGVhZmxldC5tYXJrZXIobGF0bG9uLCB7XG4gICAgICAgICAgICBpY29uOiBhaXJjcmFmdEljb24sXG4gICAgICAgICAgICByb3RhdGlvbkFuZ2xlOiBmZWF0dXJlLnByb3BlcnRpZXMuaGVhZGluZyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBsYXllckZsaWdodHMuYWRkVG8obWFwKTtcblxuICAgICAgLy8gUmVsb2FkIHRoZSBjbGlja2VkLWZsaWdodCBpbmZvcm1hdGlvblxuICAgICAgaWYgKGxheWVyU2VsRmxpZ2h0ICE9PSBudWxsKSB7XG4gICAgICAgIGxpdmVNYXBDb250cm9sbGVyLmNvbnRyb2xsZXIub25GbGlnaHRDbGljayhsYXllclNlbEZsaWdodEZlYXR1cmUsIGxheWVyU2VsRmxpZ2h0TGF5ZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHVwZGF0ZU1hcCgpO1xuICBzZXRJbnRlcnZhbCh1cGRhdGVNYXAsIG9wdHMucmVmcmVzaF9pbnRlcnZhbCAqIDEwMDApO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2xpdmVfbWFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/live_map.js\n"); /***/ }), @@ -439,7 +440,15 @@ eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpa /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* unused harmony export onFeaturePointClick */\n/* unused harmony export pointToLayer */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(\"./resources/js/maps/helpers.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__config__ = __webpack_require__(\"./resources/js/maps/config.js\");\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n\n\n\n\n\n/**\n * Show some popup text when a feature is clicked on\n * @param feature\n * @param layer\n */\nvar onFeaturePointClick = function onFeaturePointClick(feature, layer) {\n var popup_html = '';\n if (feature.properties && feature.properties.popup) {\n popup_html += feature.properties.popup;\n }\n\n layer.bindPopup(popup_html);\n};\n\n/**\n * Show each point as a marker\n * @param feature\n * @param latlng\n * @returns {*}\n */\nvar pointToLayer = function pointToLayer(feature, latlng) {\n return leaflet.circleMarker(latlng, {\n radius: 5,\n fillColor: __WEBPACK_IMPORTED_MODULE_2__config__[\"b\" /* CIRCLE_COLOR */],\n color: '#000',\n weight: 1,\n opacity: 1,\n fillOpacity: 0.8\n });\n};\n\n/**\n *\n * @param opts\n * @private\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n\n route_points: null,\n planned_route_line: null,\n actual_route_points: null,\n actual_route_line: null,\n render_elem: 'map',\n live_map: false,\n aircraft_icon: '/assets/img/acars/aircraft.png',\n metar_wms: {\n url: '',\n params: {}\n }\n }, opts);\n\n var aircraftIcon = leaflet.icon({\n iconUrl: opts.aircraft_icon,\n iconSize: [42, 42],\n iconAnchor: [21, 21]\n });\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var layerLiveFlight = void 0;\n\n if (opts.metar_wms.url !== '') {\n Object(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"a\" /* addWMSLayer */])(map, opts.metar_wms);\n }\n\n var geodesicLayer = leaflet.geodesic([], {\n weight: 4,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_2__config__[\"c\" /* PLAN_ROUTE_COLOR */],\n steps: 50,\n wrap: false\n }).addTo(map);\n\n geodesicLayer.geoJson(opts.planned_route_line);\n\n try {\n map.fitBounds(geodesicLayer.getBounds());\n } catch (e) {\n console.log(e);\n }\n\n // Draw the route points after\n if (opts.route_points !== null) {\n var route_points = leaflet.geoJSON(opts.route_points, {\n onEachFeature: onFeaturePointClick,\n pointToLayer: pointToLayer,\n style: {\n 'color': __WEBPACK_IMPORTED_MODULE_2__config__[\"c\" /* PLAN_ROUTE_COLOR */],\n 'weight': 3,\n 'opacity': 0.65\n }\n });\n\n route_points.addTo(map);\n }\n\n /**\n * draw the actual route\n */\n\n if (opts.actual_route_line !== null && opts.actual_route_line.features.length > 0) {\n var _geodesicLayer = leaflet.geodesic([], {\n weight: 3,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_2__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n steps: 50,\n wrap: false\n }).addTo(map);\n\n _geodesicLayer.geoJson(opts.actual_route_line);\n\n try {\n map.fitBounds(_geodesicLayer.getBounds());\n } catch (e) {\n console.log(e);\n }\n }\n\n if (opts.actual_route_points !== null && opts.actual_route_points.features.length > 0) {\n var _route_points = leaflet.geoJSON(opts.actual_route_points, {\n onEachFeature: onFeaturePointClick,\n pointToLayer: pointToLayer,\n style: {\n 'color': __WEBPACK_IMPORTED_MODULE_2__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n 'weight': 3,\n 'opacity': 0.65\n }\n });\n\n _route_points.addTo(map);\n }\n\n /**\n *\n */\n var liveFlight = function liveFlight() {\n var uri = opts.pirep_uri;\n var live_route = $.ajax({\n url: uri,\n dataType: 'json',\n error: console.log\n });\n\n $.when(live_route).done(function (routeJson) {\n layerLiveFlight = leaflet.geoJSON(routeJson, {\n pointToLayer: function pointToLayer(feature, latlon) {\n return leaflet.marker(latlon, {\n icon: aircraftIcon,\n rotationAngle: feature.properties.heading\n });\n }\n });\n\n layerLiveFlight.addTo(map);\n });\n };\n\n setInterval(liveFlight, 10000);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanM/YTc0NSJdLCJuYW1lcyI6WyJsZWFmbGV0IiwicmVxdWlyZSIsIm9uRmVhdHVyZVBvaW50Q2xpY2siLCJmZWF0dXJlIiwibGF5ZXIiLCJwb3B1cF9odG1sIiwicHJvcGVydGllcyIsInBvcHVwIiwiYmluZFBvcHVwIiwicG9pbnRUb0xheWVyIiwibGF0bG5nIiwiY2lyY2xlTWFya2VyIiwicmFkaXVzIiwiZmlsbENvbG9yIiwiQ0lSQ0xFX0NPTE9SIiwiY29sb3IiLCJ3ZWlnaHQiLCJvcGFjaXR5IiwiZmlsbE9wYWNpdHkiLCJvcHRzIiwiT2JqZWN0IiwiYXNzaWduIiwicm91dGVfcG9pbnRzIiwicGxhbm5lZF9yb3V0ZV9saW5lIiwiYWN0dWFsX3JvdXRlX3BvaW50cyIsImFjdHVhbF9yb3V0ZV9saW5lIiwicmVuZGVyX2VsZW0iLCJsaXZlX21hcCIsImFpcmNyYWZ0X2ljb24iLCJtZXRhcl93bXMiLCJ1cmwiLCJwYXJhbXMiLCJhaXJjcmFmdEljb24iLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsIm1hcCIsImRyYXdfYmFzZV9tYXAiLCJsYXllckxpdmVGbGlnaHQiLCJhZGRXTVNMYXllciIsImdlb2Rlc2ljTGF5ZXIiLCJnZW9kZXNpYyIsIlBMQU5fUk9VVEVfQ09MT1IiLCJzdGVwcyIsIndyYXAiLCJhZGRUbyIsImdlb0pzb24iLCJmaXRCb3VuZHMiLCJnZXRCb3VuZHMiLCJlIiwiY29uc29sZSIsImxvZyIsImdlb0pTT04iLCJvbkVhY2hGZWF0dXJlIiwic3R5bGUiLCJmZWF0dXJlcyIsImxlbmd0aCIsIkFDVFVBTF9ST1VURV9DT0xPUiIsImxpdmVGbGlnaHQiLCJ1cmkiLCJwaXJlcF91cmkiLCJsaXZlX3JvdXRlIiwiJCIsImFqYXgiLCJkYXRhVHlwZSIsImVycm9yIiwid2hlbiIsImRvbmUiLCJyb3V0ZUpzb24iLCJsYXRsb24iLCJtYXJr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QyxpQkFBSzhCLEdBRGlCO0FBRXRCSyxzQkFBVSxNQUZZO0FBR3RCQyxtQkFBT2YsUUFBUUM7QUFITyxTQUFQLENBQW5COztBQU1BVyxVQUFFSSxJQUFGLENBQU9MLFVBQVAsRUFBbUJNLElBQW5CLENBQXdCLFVBQUNDLFNBQUQsRUFBZTtBQUNuQzlCLDhCQUFrQnZDLFFBQVFxRCxPQUFSLENBQWdCZ0IsU0FBaEIsRUFBMkI7QUFDekM1RCw4QkFBYyxzQkFBVU4sT0FBVixFQUFtQm1FLE1BQW5CLEVBQTJCO0FBQ3JDLDJCQUFPdEUsUUFBUXVFLE1BQVIsQ0FBZUQsTUFBZixFQUF1QjtBQUMxQnJDLDhCQUFNRCxZQURvQjtBQUUxQndDLHVDQUFlckUsUUFBUUcsVUFBUixDQUFtQm1FO0FBRlIscUJBQXZCLENBQVA7QUFJSDtBQU53QyxhQUEzQixDQUFsQjs7QUFTQWxDLDRCQUFnQk8sS0FBaEIsQ0FBc0JULEdBQXRCO0FBQ0gsU0FYRDtBQVlILEtBcEJEOztBQXNCQXFDLGdCQUFZZixVQUFaLEVBQXdCLEtBQXhCO0FBQ0gsQ0EzSEQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xuXG5pbXBvcnQgZHJhd19iYXNlX21hcCBmcm9tICcuL2Jhc2VfbWFwJ1xuaW1wb3J0IHthZGRXTVNMYXllcn0gZnJvbSAnLi9oZWxwZXJzJztcblxuaW1wb3J0IHtBQ1RVQUxfUk9VVEVfQ09MT1IsIENJUkNMRV9DT0xPUiwgUExBTl9ST1VURV9DT0xPUn0gZnJvbSAnLi9jb25maWcnXG5cbi8qKlxuICogU2hvdyBzb21lIHBvcHVwIHRleHQgd2hlbiBhIGZlYXR1cmUgaXMgY2xpY2tlZCBvblxuICogQHBhcmFtIGZlYXR1cmVcbiAqIEBwYXJhbSBsYXllclxuICovXG5leHBvcnQgY29uc3Qgb25GZWF0dXJlUG9pbnRDbGljayA9IChmZWF0dXJlLCBsYXllcikgPT4ge1xuICAgIGxldCBwb3B1cF9odG1sID0gJyc7XG4gICAgaWYgKGZlYXR1cmUucHJvcGVydGllcyAmJiBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXApIHtcbiAgICAgICAgcG9wdXBfaHRtbCArPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXBcbiAgICB9XG5cbiAgICBsYXllci5iaW5kUG9wdXAocG9wdXBfaHRtbClcbn07XG5cbi8qKlxuICogU2hvdyBlYWNoIHBvaW50IGFzIGEgbWFya2VyXG4gKiBAcGFyYW0gZmVhdHVyZVxuICogQHBhcmFtIGxhdGxuZ1xuICogQHJldHVybnMgeyp9XG4gKi9cbmV4cG9ydCBjb25zdCBwb2ludFRvTGF5ZXIgPSAoZmVhdHVyZSwgbGF0bG5nKSA9PiB7XG4gICAgcmV0dXJuIGxlYWZsZXQuY2lyY2xlTWFya2VyKGxhdGxuZywge1xuICAgICAgICByYWRpdXM6IDUsXG4gICAgICAgIGZpbGxDb2xvcjogQ0lSQ0xFX0NPTE9SLFxuICAgICAgICBjb2xvcjogJyMwMDAnLFxuICAgICAgICB3ZWlnaHQ6IDEsXG4gICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgIGZpbGxPcGFjaXR5OiAwLjhcbiAgICB9KVxufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gb3B0c1xuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgKG9wdHMpID0+IHtcblxuICAgIG9wdHMgPSBPYmplY3QuYXNzaWduKHtcblxuICAgICAgICByb3V0ZV9wb2ludHM6IG51bGwsXG4gICAgICAgIHBsYW5uZWRfcm91dGVfbGluZTogbnVsbCxcbiAgICAgICAgYWN0dWFsX3JvdXRlX3BvaW50czogbnVsbCxcbiAgICAgICAgYWN0dWFsX3JvdXRlX2xpbmU6IG51bGwsXG4gICAgICAgIHJlbmRlcl9lbGVtOiAnbWFwJyxcbiAgICAgICAgbGl2ZV9tYXA6IGZhbHNlLFxuICAgICAgICBhaXJjcmFmdF9pY29uOiAnL2Fzc2V0cy9pbWcvYWNhcnMvYWlyY3JhZnQucG5nJyxcbiAgICAgICAgbWV0YXJfd21zOiB7XG4gICAgICAgICAgICB1cmw6ICcnLFxuICAgICAgICAgICAgcGFyYW1zOiB7fVxuICAgICAgICB9LFxuICAgIH0sIG9wdHMpO1xuXG4gICAgY29uc3QgYWlyY3JhZnRJY29uID0gbGVhZmxldC5pY29uKHtcbiAgICAgICAgaWNvblVybDogb3B0cy5haXJjcmFmdF9pY29uLFxuICAgICAgICBpY29uU2l6ZTogWzQyLCA0Ml0sXG4gICAgICAgIGljb25BbmNob3I6IFsyMSwgMjFdLFxuICAgIH0pO1xuXG4gICAgbGV0IG1hcCA9IGRyYXdfYmFzZV9tYXAob3B0cyk7XG4gICAgbGV0IGxheWVyTGl2ZUZsaWdodDtcblxuICAgIGlmIChvcHRzLm1ldGFyX3dtcy51cmwgIT09ICcnKSB7XG4gICAgICAgIGFkZFdNU0xheWVyKG1hcCwgb3B0cy5tZXRhcl93bXMpO1xuICAgIH1cblxuICAgIGxldCBnZW9kZXNpY0xheWVyID0gbGVhZmxldC5nZW9kZXNpYyhbXSwge1xuICAgICAgICB3ZWlnaHQ6IDQsXG4gICAgICAgIG9wYWNpdHk6IDAuOSxcbiAgICAgICAgY29sb3I6IFBMQU5fUk9VVEVfQ09MT1IsXG4gICAgICAgIHN0ZXBzOiA1MCxcbiAgICAgICAgd3JhcDogZmFsc2UsXG4gICAgfSkuYWRkVG8obWFwKTtcblxuICAgIGdlb2Rlc2ljTGF5ZXIuZ2VvSnNvbihvcHRzLnBsYW5uZWRfcm91dGVfbGluZSk7XG5cbiAgICB0cnkge1xuICAgICAgICBtYXAuZml0Qm91bmRzKGdlb2Rlc2ljTGF5ZXIuZ2V0Qm91bmRzKCkpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhlKVxuICAgIH1cblxuICAgIC8vIERyYXcgdGhlIHJvdXRlIHBvaW50cyBhZnRlclxuICAgIGlmIChvcHRzLnJvdXRlX3BvaW50cyAhPT0gbnVsbCkge1xuICAgICAgICBsZXQgcm91dGVfcG9pbnRzID0gbGVhZmxldC5nZW9KU09OKG9wdHMucm91dGVfcG9pbnRzLCB7XG4gICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBvbkZlYXR1cmVQb2ludENsaWNrLFxuICAgICAgICAgICAgcG9pbnRUb0xheWVyOiBwb2ludFRvTGF5ZXIsXG4gICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICdjb2xvcic6IFBMQU5fUk9VVEVfQ09MT1IsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMsXG4gICAgICAgICAgICAgICAgJ29wYWNpdHknOiAwLjY1LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcm91dGVfcG9pbnRzLmFkZFRvKG1hcCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZHJhdyB0aGUgYWN0dWFsIHJvdXRlXG4gICAgICovXG5cbiAgICBpZiAob3B0cy5hY3R1YWxfcm91dGVfbGluZSAhPT0gbnVsbCAmJiBvcHRzLmFjdHVhbF9yb3V0ZV9saW5lLmZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGdlb2Rlc2ljTGF5ZXIgPSBsZWFmbGV0Lmdlb2Rlc2ljKFtdLCB7XG4gICAgICAgICAgICB3ZWlnaHQ6IDMsXG4gICAgICAgICAgICBvcGFjaXR5OiAwLjksXG4gICAgICAgICAgICBjb2xvcjogQUNUVUFMX1JPVVRFX0NPTE9SLFxuICAgICAgICAgICAgc3RlcHM6IDUwLFxuICAgICAgICAgICAgd3JhcDogZmFsc2UsXG4gICAgICAgIH0pLmFkZFRvKG1hcCk7XG5cbiAgICAgICAgZ2VvZGVzaWNMYXllci5nZW9Kc29uKG9wdHMuYWN0dWFsX3JvdXRlX2xpbmUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBtYXAuZml0Qm91bmRzKGdlb2Rlc2ljTGF5ZXIuZ2V0Qm91bmRzKCkpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0cy5hY3R1YWxfcm91dGVfcG9pbnRzICE9PSBudWxsICYmIG9wdHMuYWN0dWFsX3JvdXRlX3BvaW50cy5mZWF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCByb3V0ZV9wb2ludHMgPSBsZWFmbGV0Lmdlb0pTT04ob3B0cy5hY3R1YWxfcm91dGVfcG9pbnRzLCB7XG4gICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBvbkZlYXR1cmVQb2ludENsaWNrLFxuICAgICAgICAgICAgcG9pbnRUb0xheWVyOiBwb2ludFRvTGF5ZXIsXG4gICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICdjb2xvcic6IEFDVFVBTF9ST1VURV9DT0xPUixcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMyxcbiAgICAgICAgICAgICAgICAnb3BhY2l0eSc6IDAuNjUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICByb3V0ZV9wb2ludHMuYWRkVG8obWFwKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICovXG4gICAgY29uc3QgbGl2ZUZsaWdodCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdXJpID0gb3B0cy5waXJlcF91cmk7XG4gICAgICAgIGNvbnN0IGxpdmVfcm91dGUgPSAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiB1cmksXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgICAgICAgZXJyb3I6IGNvbnNvbGUubG9nXG4gICAgICAgIH0pO1xuXG4gICAgICAgICQud2hlbihsaXZlX3JvdXRlKS5kb25lKChyb3V0ZUpzb24pID0+IHtcbiAgICAgICAgICAgIGxheWVyTGl2ZUZsaWdodCA9IGxlYWZsZXQuZ2VvSlNPTihyb3V0ZUpzb24sIHtcbiAgICAgICAgICAgICAgICBwb2ludFRvTGF5ZXI6IGZ1bmN0aW9uIChmZWF0dXJlLCBsYXRsb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlYWZsZXQubWFya2VyKGxhdGxvbiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogYWlyY3JhZnRJY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb25BbmdsZTogZmVhdHVyZS5wcm9wZXJ0aWVzLmhlYWRpbmdcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGF5ZXJMaXZlRmxpZ2h0LmFkZFRvKG1hcClcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHNldEludGVydmFsKGxpdmVGbGlnaHQsIDEwMDAwKTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/route_map.js\n"); +eval("/* unused harmony export onFeaturePointClick */\n/* unused harmony export pointToLayer */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(\"./resources/js/maps/helpers.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__request__ = __webpack_require__(\"./resources/js/request.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__config__ = __webpack_require__(\"./resources/js/maps/config.js\");\n\n\n\n\n\n\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n/**\n * Show some popup text when a feature is clicked on\n * @param feature\n * @param layer\n */\nvar onFeaturePointClick = function onFeaturePointClick(feature, layer) {\n var popup_html = '';\n if (feature.properties && feature.properties.popup) {\n popup_html += feature.properties.popup;\n }\n\n layer.bindPopup(popup_html);\n};\n\n/**\n * Show each point as a marker\n * @param feature\n * @param latlng\n * @returns {*}\n */\nvar pointToLayer = function pointToLayer(feature, latlng) {\n return leaflet.circleMarker(latlng, {\n radius: 5,\n fillColor: __WEBPACK_IMPORTED_MODULE_3__config__[\"b\" /* CIRCLE_COLOR */],\n color: '#000',\n weight: 1,\n opacity: 1,\n fillOpacity: 0.8\n });\n};\n\n/**\n *\n * @param _opts\n * @private\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (_opts) {\n var opts = Object.assign({\n route_points: null,\n planned_route_line: null,\n actual_route_points: null,\n actual_route_line: null,\n render_elem: 'map',\n live_map: false,\n aircraft_icon: '/assets/img/acars/aircraft.png',\n refresh_interval: 10,\n metar_wms: {\n url: '',\n params: {}\n }\n }, _opts);\n\n var aircraftIcon = leaflet.icon({\n iconUrl: opts.aircraft_icon,\n iconSize: [42, 42],\n iconAnchor: [21, 21]\n });\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var layerLiveFlight = void 0;\n\n if (opts.metar_wms.url !== '') {\n Object(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"a\" /* addWMSLayer */])(map, opts.metar_wms);\n }\n\n var plannedRouteLayer = leaflet.geodesic([], {\n weight: 4,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_3__config__[\"c\" /* PLAN_ROUTE_COLOR */],\n steps: 50,\n wrap: false\n }).addTo(map);\n\n plannedRouteLayer.geoJson(opts.planned_route_line);\n\n try {\n map.fitBounds(plannedRouteLayer.getBounds());\n } catch (e) {\n console.log(e);\n }\n\n // Draw the route points after\n if (opts.route_points !== null) {\n var route_points = leaflet.geoJSON(opts.route_points, {\n onEachFeature: onFeaturePointClick,\n pointToLayer: pointToLayer,\n style: {\n color: __WEBPACK_IMPORTED_MODULE_3__config__[\"c\" /* PLAN_ROUTE_COLOR */],\n weight: 3,\n opacity: 0.65\n }\n });\n\n route_points.addTo(map);\n }\n\n /**\n * draw the actual route\n */\n\n if (opts.actual_route_line !== null && opts.actual_route_line.features.length > 0) {\n var actualRouteLayer = leaflet.geodesic([], {\n weight: 3,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_3__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n steps: 50,\n wrap: false\n }).addTo(map);\n\n actualRouteLayer.geoJson(opts.actual_route_line);\n\n try {\n map.fitBounds(actualRouteLayer.getBounds());\n } catch (e) {\n console.log(e);\n }\n }\n\n if (opts.actual_route_points !== null && opts.actual_route_points.features.length > 0) {\n var _route_points = leaflet.geoJSON(opts.actual_route_points, {\n onEachFeature: onFeaturePointClick,\n pointToLayer: pointToLayer,\n style: {\n color: __WEBPACK_IMPORTED_MODULE_3__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n weight: 3,\n opacity: 0.65\n }\n });\n\n _route_points.addTo(map);\n }\n\n /**\n *\n */\n var liveFlight = function liveFlight() {\n Object(__WEBPACK_IMPORTED_MODULE_2__request__[\"a\" /* default */])({ url: opts.pirep_uri }).then(function (response) {\n var routeJson = response.data.data;\n layerLiveFlight = leaflet.geoJSON(routeJson, {\n pointToLayer: function pointToLayer(feature, latlon) {\n return leaflet.marker(latlon, {\n icon: aircraftIcon,\n rotationAngle: feature.properties.heading\n });\n }\n });\n\n layerLiveFlight.addTo(map);\n });\n };\n\n setInterval(liveFlight, opts.refresh_interval * 1000);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanM/YTc0NSJdLCJuYW1lcyI6WyJsZWFmbGV0IiwicmVxdWlyZSIsIm9uRmVhdHVyZVBvaW50Q2xpY2siLCJmZWF0dXJlIiwibGF5ZXIiLCJwb3B1cF9odG1sIiwicHJvcGVydGllcyIsInBvcHVwIiwiYmluZFBvcHVwIiwicG9pbnRUb0xheWVyIiwibGF0bG5nIiwiY2lyY2xlTWFya2VyIiwicmFkaXVzIiwiZmlsbENvbG9yIiwiQ0lSQ0xFX0NPTE9SIiwiY29sb3IiLCJ3ZWlnaHQiLCJvcGFjaXR5IiwiZmlsbE9wYWNpdHkiLCJfb3B0cyIsIm9wdHMiLCJPYmplY3QiLCJhc3NpZ24iLCJyb3V0ZV9wb2ludHMiLCJwbGFubmVkX3JvdXRlX2xpbmUiLCJhY3R1YWxfcm91dGVfcG9pbnRzIiwiYWN0dWFsX3JvdXRlX2xpbmUiLCJyZW5kZXJfZWxlbSIsImxpdmVfbWFwIiwiYWlyY3JhZnRfaWNvbiIsInJlZnJlc2hfaW50ZXJ2YWwiLCJtZXRhcl93bXMiLCJ1cmwiLCJwYXJhbXMiLCJhaXJjcmFmdEljb24iLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsIm1hcCIsImRyYXdfYmFzZV9tYXAiLCJsYXllckxpdmVGbGlnaHQiLCJhZGRXTVNMYXllciIsInBsYW5uZWRSb3V0ZUxheWVyIiwiZ2VvZGVzaWMiLCJQTEFOX1JPVVRFX0NPTE9SIiwic3RlcHMiLCJ3cmFwIiwiYWRkVG8iLCJnZW9Kc29uIiwiZml0Qm91bmRzIiwiZ2V0Qm91bmRzIiwiZSIsImNvbnNvbGUiLCJsb2ciLCJnZW9KU09OIiwib25FYWNoRmVhdHVyZSIsInN0eWxlIiwiZmVhdHVyZXMiLCJsZW5ndGgiLCJhY3R1YWxSb3V0ZUxheWVyIiwiQUNUVUFMX1JPVVRFX0NPTE9SIiwibGl2ZUZsaWdodCIsInJlcXVlc3QiLCJwaXJlcF91cmkiLCJ0aGVuIiwicmVzcG9uc2UiLCJyb3V0ZUpzb24i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LElBQWpDLENBQXNDLFVBQUNDLFFBQUQsRUFBYztBQUNsRCxVQUFNQyxZQUFZRCxTQUFTRSxJQUFULENBQWNBLElBQWhDO0FBQ0EzQix3QkFBa0J6QyxRQUFRdUQsT0FBUixDQUFnQlksU0FBaEIsRUFBMkI7QUFDM0MxRCxvQkFEMkMsd0JBQzlCTixPQUQ4QixFQUNyQmtFLE1BRHFCLEVBQ2I7QUFDNUIsaUJBQU9yRSxRQUFRc0UsTUFBUixDQUFlRCxNQUFmLEVBQXVCO0FBQzVCbEMsa0JBQU1ELFlBRHNCO0FBRTVCcUMsMkJBQWVwRSxRQUFRRyxVQUFSLENBQW1Ca0U7QUFGTixXQUF2QixDQUFQO0FBSUQ7QUFOMEMsT0FBM0IsQ0FBbEI7O0FBU0EvQixzQkFBZ0JPLEtBQWhCLENBQXNCVCxHQUF0QjtBQUNELEtBWkQ7QUFhRCxHQWREOztBQWdCQWtDLGNBQVlYLFVBQVosRUFBd0IxQyxLQUFLVSxnQkFBTCxHQUF3QixJQUFoRDtBQUNELENBcEhEIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL21hcHMvcm91dGVfbWFwLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgZHJhd19iYXNlX21hcCBmcm9tICcuL2Jhc2VfbWFwJztcbmltcG9ydCB7IGFkZFdNU0xheWVyIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJy4uL3JlcXVlc3QnO1xuXG5pbXBvcnQgeyBBQ1RVQUxfUk9VVEVfQ09MT1IsIENJUkNMRV9DT0xPUiwgUExBTl9ST1VURV9DT0xPUiB9IGZyb20gJy4vY29uZmlnJztcblxuY29uc3QgbGVhZmxldCA9IHJlcXVpcmUoJ2xlYWZsZXQnKTtcblxuLyoqXG4gKiBTaG93IHNvbWUgcG9wdXAgdGV4dCB3aGVuIGEgZmVhdHVyZSBpcyBjbGlja2VkIG9uXG4gKiBAcGFyYW0gZmVhdHVyZVxuICogQHBhcmFtIGxheWVyXG4gKi9cbmV4cG9ydCBjb25zdCBvbkZlYXR1cmVQb2ludENsaWNrID0gKGZlYXR1cmUsIGxheWVyKSA9PiB7XG4gIGxldCBwb3B1cF9odG1sID0gJyc7XG4gIGlmIChmZWF0dXJlLnByb3BlcnRpZXMgJiYgZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwKSB7XG4gICAgcG9wdXBfaHRtbCArPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXA7XG4gIH1cblxuICBsYXllci5iaW5kUG9wdXAocG9wdXBfaHRtbCk7XG59O1xuXG4vKipcbiAqIFNob3cgZWFjaCBwb2ludCBhcyBhIG1hcmtlclxuICogQHBhcmFtIGZlYXR1cmVcbiAqIEBwYXJhbSBsYXRsbmdcbiAqIEByZXR1cm5zIHsqfVxuICovXG5leHBvcnQgY29uc3QgcG9pbnRUb0xheWVyID0gKGZlYXR1cmUsIGxhdGxuZykgPT4gbGVhZmxldC5jaXJjbGVNYXJrZXIobGF0bG5nLCB7XG4gIHJhZGl1czogNSxcbiAgZmlsbENvbG9yOiBDSVJDTEVfQ09MT1IsXG4gIGNvbG9yOiAnIzAwMCcsXG4gIHdlaWdodDogMSxcbiAgb3BhY2l0eTogMSxcbiAgZmlsbE9wYWNpdHk6IDAuOCxcbn0pO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gX29wdHNcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IChfb3B0cykgPT4ge1xuICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgcm91dGVfcG9pbnRzOiBudWxsLFxuICAgIHBsYW5uZWRfcm91dGVfbGluZTogbnVsbCxcbiAgICBhY3R1YWxfcm91dGVfcG9pbnRzOiBudWxsLFxuICAgIGFjdHVhbF9yb3V0ZV9saW5lOiBudWxsLFxuICAgIHJlbmRlcl9lbGVtOiAnbWFwJyxcbiAgICBsaXZlX21hcDogZmFsc2UsXG4gICAgYWlyY3JhZnRfaWNvbjogJy9hc3NldHMvaW1nL2FjYXJzL2FpcmNyYWZ0LnBuZycsXG4gICAgcmVmcmVzaF9pbnRlcnZhbDogMTAsXG4gICAgbWV0YXJfd21zOiB7XG4gICAgICB1cmw6ICcnLFxuICAgICAgcGFyYW1zOiB7fSxcbiAgICB9LFxuICB9LCBfb3B0cyk7XG5cbiAgY29uc3QgYWlyY3JhZnRJY29uID0gbGVhZmxldC5pY29uKHtcbiAgICBpY29uVXJsOiBvcHRzLmFpcmNyYWZ0X2ljb24sXG4gICAgaWNvblNpemU6IFs0MiwgNDJdLFxuICAgIGljb25BbmNob3I6IFsyMSwgMjFdLFxuICB9KTtcblxuICBjb25zdCBtYXAgPSBkcmF3X2Jhc2VfbWFwKG9wdHMpO1xuICBsZXQgbGF5ZXJMaXZlRmxpZ2h0O1xuXG4gIGlmIChvcHRzLm1ldGFyX3dtcy51cmwgIT09ICcnKSB7XG4gICAgYWRkV01TTGF5ZXIobWFwLCBvcHRzLm1ldGFyX3dtcyk7XG4gIH1cblxuICBjb25zdCBwbGFubmVkUm91dGVMYXllciA9IGxlYWZsZXQuZ2VvZGVzaWMoW10sIHtcbiAgICB3ZWlnaHQ6IDQsXG4gICAgb3BhY2l0eTogMC45LFxuICAgIGNvbG9yOiBQTEFOX1JPVVRFX0NPTE9SLFxuICAgIHN0ZXBzOiA1MCxcbiAgICB3cmFwOiBmYWxzZSxcbiAgfSkuYWRkVG8obWFwKTtcblxuICBwbGFubmVkUm91dGVMYXllci5nZW9Kc29uKG9wdHMucGxhbm5lZF9yb3V0ZV9saW5lKTtcblxuICB0cnkge1xuICAgIG1hcC5maXRCb3VuZHMocGxhbm5lZFJvdXRlTGF5ZXIuZ2V0Qm91bmRzKCkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5sb2coZSk7XG4gIH1cblxuICAvLyBEcmF3IHRoZSByb3V0ZSBwb2ludHMgYWZ0ZXJcbiAgaWYgKG9wdHMucm91dGVfcG9pbnRzICE9PSBudWxsKSB7XG4gICAgY29uc3Qgcm91dGVfcG9pbnRzID0gbGVhZmxldC5nZW9KU09OKG9wdHMucm91dGVfcG9pbnRzLCB7XG4gICAgICBvbkVhY2hGZWF0dXJlOiBvbkZlYXR1cmVQb2ludENsaWNrLFxuICAgICAgcG9pbnRUb0xheWVyLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY29sb3I6IFBMQU5fUk9VVEVfQ09MT1IsXG4gICAgICAgIHdlaWdodDogMyxcbiAgICAgICAgb3BhY2l0eTogMC42NSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByb3V0ZV9wb2ludHMuYWRkVG8obWFwKTtcbiAgfVxuXG4gIC8qKlxuICAgICAqIGRyYXcgdGhlIGFjdHVhbCByb3V0ZVxuICAgICAqL1xuXG4gIGlmIChvcHRzLmFjdHVhbF9yb3V0ZV9saW5lICE9PSBudWxsICYmIG9wdHMuYWN0dWFsX3JvdXRlX2xpbmUuZmVhdHVyZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGFjdHVhbFJvdXRlTGF5ZXIgPSBsZWFmbGV0Lmdlb2Rlc2ljKFtdLCB7XG4gICAgICB3ZWlnaHQ6IDMsXG4gICAgICBvcGFjaXR5OiAwLjksXG4gICAgICBjb2xvcjogQUNUVUFMX1JPVVRFX0NPTE9SLFxuICAgICAgc3RlcHM6IDUwLFxuICAgICAgd3JhcDogZmFsc2UsXG4gICAgfSkuYWRkVG8obWFwKTtcblxuICAgIGFjdHVhbFJvdXRlTGF5ZXIuZ2VvSnNvbihvcHRzLmFjdHVhbF9yb3V0ZV9saW5lKTtcblxuICAgIHRyeSB7XG4gICAgICBtYXAuZml0Qm91bmRzKGFjdHVhbFJvdXRlTGF5ZXIuZ2V0Qm91bmRzKCkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRzLmFjdHVhbF9yb3V0ZV9wb2ludHMgIT09IG51bGwgJiYgb3B0cy5hY3R1YWxfcm91dGVfcG9pbnRzLmZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCByb3V0ZV9wb2ludHMgPSBsZWFmbGV0Lmdlb0pTT04ob3B0cy5hY3R1YWxfcm91dGVfcG9pbnRzLCB7XG4gICAgICBvbkVhY2hGZWF0dXJlOiBvbkZlYXR1cmVQb2ludENsaWNrLFxuICAgICAgcG9pbnRUb0xheWVyLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY29sb3I6IEFDVFVBTF9ST1VURV9DT0xPUixcbiAgICAgICAgd2VpZ2h0OiAzLFxuICAgICAgICBvcGFjaXR5OiAwLjY1LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJvdXRlX3BvaW50cy5hZGRUbyhtYXApO1xuICB9XG5cbiAgLyoqXG4gICAgICpcbiAgICAgKi9cbiAgY29uc3QgbGl2ZUZsaWdodCA9ICgpID0+IHtcbiAgICByZXF1ZXN0KHsgdXJsOiBvcHRzLnBpcmVwX3VyaSB9KS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3Qgcm91dGVKc29uID0gcmVzcG9uc2UuZGF0YS5kYXRhO1xuICAgICAgbGF5ZXJMaXZlRmxpZ2h0ID0gbGVhZmxldC5nZW9KU09OKHJvdXRlSnNvbiwge1xuICAgICAgICBwb2ludFRvTGF5ZXIoZmVhdHVyZSwgbGF0bG9uKSB7XG4gICAgICAgICAgcmV0dXJuIGxlYWZsZXQubWFya2VyKGxhdGxvbiwge1xuICAgICAgICAgICAgaWNvbjogYWlyY3JhZnRJY29uLFxuICAgICAgICAgICAgcm90YXRpb25BbmdsZTogZmVhdHVyZS5wcm9wZXJ0aWVzLmhlYWRpbmcsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgbGF5ZXJMaXZlRmxpZ2h0LmFkZFRvKG1hcCk7XG4gICAgfSk7XG4gIH07XG5cbiAgc2V0SW50ZXJ2YWwobGl2ZUZsaWdodCwgb3B0cy5yZWZyZXNoX2ludGVydmFsICogMTAwMCk7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvcm91dGVfbWFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/route_map.js\n"); + +/***/ }), + +/***/ "./resources/js/request.js": +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__ = __webpack_require__(\"./node_modules/babel-runtime/regenerator/index.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__config__ = __webpack_require__(\"./resources/js/config.js\");\n\n\nvar _this = this;\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\n\n\nvar axios = __webpack_require__(\"./node_modules/axios/index.js\");\n\n/**\n * Run an API request, with some common options\n *\n * @param {Object|String} _opts Axios request options, or pass a URL\n * @param {String} _opts.url\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = ((function () {\n var _ref = _asyncToGenerator( /*#__PURE__*/__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.mark(function _callee(_opts) {\n var opts;\n return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n if (typeof _opts === 'string' || _opts instanceof String) {\n // eslint-disable-next-line no-param-reassign\n _opts = {\n url: _opts\n };\n }\n\n opts = Object.assign({}, {\n baseURL: __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* default */].base_url,\n headers: {\n 'X-API-KEY': __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* default */].api_key,\n 'X-CSRF-TOKEN': __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* default */].csrf_token\n }\n }, _opts);\n return _context.abrupt('return', axios.request(opts));\n\n case 3:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, _this);\n }));\n\n return function (_x) {\n return _ref.apply(this, arguments);\n };\n})());//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvcmVxdWVzdC5qcz84MjVlIl0sIm5hbWVzIjpbImF4aW9zIiwicmVxdWlyZSIsIl9vcHRzIiwiU3RyaW5nIiwidXJsIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsImJhc2VVUkwiLCJjb25maWciLCJiYXNlX3VybCIsImhlYWRlcnMiLCJhcGlfa2V5IiwiY3NyZl90b2tlbiIsInJlcXVlc3QiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUNBOztBQUVBLElBQU1BLFFBQVFDLG1CQUFPQSxDQUFDLCtCQUFSLENBQWQ7O0FBRUE7Ozs7OztBQU1lO0FBQWYsb0hBQWUsaUJBQU9DLEtBQVA7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ2IsZ0JBQUksT0FBT0EsS0FBUCxLQUFpQixRQUFqQixJQUE2QkEsaUJBQWlCQyxNQUFsRCxFQUEwRDtBQUN4RDtBQUNBRCxzQkFBUTtBQUNORSxxQkFBS0Y7QUFEQyxlQUFSO0FBR0Q7O0FBRUtHLGdCQVJPLEdBUUFDLE9BQU9DLE1BQVAsQ0FBYyxFQUFkLEVBQWtCO0FBQzdCQyx1QkFBU0Msd0RBQU1BLENBQUNDLFFBRGE7QUFFN0JDLHVCQUFTO0FBQ1AsNkJBQWFGLHdEQUFNQSxDQUFDRyxPQURiO0FBRVAsZ0NBQWdCSCx3REFBTUEsQ0FBQ0k7QUFGaEI7QUFGb0IsYUFBbEIsRUFNVlgsS0FOVSxDQVJBO0FBQUEsNkNBZ0JORixNQUFNYyxPQUFOLENBQWNULElBQWQsQ0FoQk07O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0FBZjs7QUFBQTtBQUFBO0FBQUE7QUFBQSIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9yZXF1ZXN0LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgY29uZmlnIGZyb20gJy4vY29uZmlnJztcblxuY29uc3QgYXhpb3MgPSByZXF1aXJlKCdheGlvcycpO1xuXG4vKipcbiAqIFJ1biBhbiBBUEkgcmVxdWVzdCwgd2l0aCBzb21lIGNvbW1vbiBvcHRpb25zXG4gKlxuICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBfb3B0cyBBeGlvcyByZXF1ZXN0IG9wdGlvbnMsIG9yIHBhc3MgYSBVUkxcbiAqIEBwYXJhbSB7U3RyaW5nfSBfb3B0cy51cmxcbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgKF9vcHRzKSA9PiB7XG4gIGlmICh0eXBlb2YgX29wdHMgPT09ICdzdHJpbmcnIHx8IF9vcHRzIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgX29wdHMgPSB7XG4gICAgICB1cmw6IF9vcHRzLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbih7fSwge1xuICAgIGJhc2VVUkw6IGNvbmZpZy5iYXNlX3VybCxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnWC1BUEktS0VZJzogY29uZmlnLmFwaV9rZXksXG4gICAgICAnWC1DU1JGLVRPS0VOJzogY29uZmlnLmNzcmZfdG9rZW4sXG4gICAgfSxcbiAgfSwgX29wdHMpO1xuXG4gIHJldHVybiBheGlvcy5yZXF1ZXN0KG9wdHMpO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9yZXF1ZXN0LmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/request.js\n"); /***/ }), @@ -447,7 +456,7 @@ eval("/* unused harmony export onFeaturePointClick */\n/* unused harmony export /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("\n\n/**\n * Simple browser storage interface\n */\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Storage = function () {\n function Storage(name, default_value) {\n _classCallCheck(this, Storage);\n\n this.name = name;\n\n // Read the object from storage; if it doesn't exist, set\n // it to the default value\n var st = window.localStorage.getItem(this.name);\n if (!st) {\n console.log('Nothing found in storage, starting from default');\n this.data = default_value;\n } else {\n console.log('Found in storage: ', st);\n this.data = JSON.parse(st);\n }\n }\n\n /**\n * Save to local storage\n */\n\n\n _createClass(Storage, [{\n key: 'save',\n value: function save() {\n window.localStorage.setItem(this.name, JSON.stringify(this.data));\n }\n\n /**\n * Return a list from a given key\n *\n * @param {String} key\n *\n * @returns {Array|*}\n */\n\n }, {\n key: 'getList',\n value: function getList(key) {\n if (!(key in this.data)) {\n return [];\n }\n\n return this.data[key];\n }\n\n /**\n * Add `value` to a given `key`\n *\n * @param {string} key\n * @param {*} value\n */\n\n }, {\n key: 'addToList',\n value: function addToList(key, value) {\n if (!(key in this.data)) {\n this.data[key] = [];\n }\n\n var index = this.data[key].indexOf(value);\n if (index === -1) {\n this.data[key].push(value);\n }\n }\n\n /**\n * Remove `value` from the given `key`\n *\n * @param {String} key\n * @param {*} value\n */\n\n }, {\n key: 'removeFromList',\n value: function removeFromList(key, value) {\n if (!(key in this.data)) {\n return;\n }\n\n var index = this.data[key].indexOf(value);\n if (index !== -1) {\n this.data[key].splice(index, 1);\n }\n }\n }]);\n\n return Storage;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Storage);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc3RvcmFnZS5qcz83YjRhIl0sIm5hbWVzIjpbIlN0b3JhZ2UiLCJuYW1lIiwiZGVmYXVsdF92YWx1ZSIsInN0Iiwid2luZG93IiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsImNvbnNvbGUiLCJsb2ciLCJkYXRhIiwiSlNPTiIsInBhcnNlIiwic2V0SXRlbSIsInN0cmluZ2lmeSIsImtleSIsInZhbHVlIiwiaW5kZXgiLCJpbmRleE9mIiwicHVzaCIsInNwbGljZSJdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7Ozs7Ozs7O0lBR3FCQSxPO0FBQ2pCLHFCQUFZQyxJQUFaLEVBQWtCQyxhQUFsQixFQUFpQztBQUFBOztBQUM3QixhQUFLRCxJQUFMLEdBQVlBLElBQVo7O0FBRUE7QUFDQTtBQUNBLFlBQU1FLEtBQUtDLE9BQU9DLFlBQVAsQ0FBb0JDLE9BQXBCLENBQTRCLEtBQUtMLElBQWpDLENBQVg7QUFDQSxZQUFJLENBQUNFLEVBQUwsRUFBUztBQUNMSSxvQkFBUUMsR0FBUixDQUFZLGlEQUFaO0FBQ0EsaUJBQUtDLElBQUwsR0FBWVAsYUFBWjtBQUNILFNBSEQsTUFHTztBQUNISyxvQkFBUUMsR0FBUixDQUFZLG9CQUFaLEVBQWtDTCxFQUFsQztBQUNBLGlCQUFLTSxJQUFMLEdBQVlDLEtBQUtDLEtBQUwsQ0FBV1IsRUFBWCxDQUFaO0FBQ0g7QUFDSjs7QUFFRDs7Ozs7OzsrQkFHTztBQUNIQyxtQkFBT0MsWUFBUCxDQUFvQk8sT0FBcEIsQ0FBNEIsS0FBS1gsSUFBakMsRUFBdUNTLEtBQUtHLFNBQUwsQ0FBZSxLQUFLSixJQUFwQixDQUF2QztBQUNIOztBQUVEOzs7Ozs7Ozs7O2dDQU9RSyxHLEVBQUs7QUFDVCxnQkFBSSxFQUFFQSxPQUFPLEtBQUtMLElBQWQsQ0FBSixFQUF5QjtBQUNyQix1QkFBTyxFQUFQO0FBQ0g7O0FBRUQsbUJBQU8sS0FBS0EsSUFBTCxDQUFVSyxHQUFWLENBQVA7QUFDSDs7QUFFRDs7Ozs7Ozs7O2tDQU1VQSxHLEVBQUtDLEssRUFBTztBQUNsQixnQkFBSSxFQUFFRCxPQUFPLEtBQUtMLElBQWQsQ0FBSixFQUF5QjtBQUNyQixxQkFBS0EsSUFBTCxDQUFVSyxHQUFWLElBQWlCLEVBQWpCO0FBQ0g7O0FBRUQsZ0JBQU1FLFFBQVEsS0FBS1AsSUFBTCxDQUFVSyxHQUFWLEVBQWVHLE9BQWYsQ0FBdUJGLEtBQXZCLENBQWQ7QUFDQSxnQkFBSUMsVUFBVSxDQUFDLENBQWYsRUFBa0I7QUFDZCxxQkFBS1AsSUFBTCxDQUFVSyxHQUFWLEVBQWVJLElBQWYsQ0FBb0JILEtBQXBCO0FBQ0g7QUFDSjs7QUFFRDs7Ozs7Ozs7O3VDQU1lRCxHLEVBQUtDLEssRUFBTztBQUN2QixnQkFBSSxFQUFFRCxPQUFPLEtBQUtMLElBQWQsQ0FBSixFQUF5QjtBQUNyQjtBQUNIOztBQUVELGdCQUFNTyxRQUFRLEtBQUtQLElBQUwsQ0FBVUssR0FBVixFQUFlRyxPQUFmLENBQXVCRixLQUF2QixDQUFkO0FBQ0EsZ0JBQUlDLFVBQVUsQ0FBQyxDQUFmLEVBQWtCO0FBQ2QscUJBQUtQLElBQUwsQ0FBVUssR0FBVixFQUFlSyxNQUFmLENBQXNCSCxLQUF0QixFQUE2QixDQUE3QjtBQUNIO0FBQ0o7Ozs7OztBQXRFZ0JoQixnRSIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9zdG9yYWdlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFNpbXBsZSBicm93c2VyIHN0b3JhZ2UgaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0b3JhZ2Uge1xuICAgIGNvbnN0cnVjdG9yKG5hbWUsIGRlZmF1bHRfdmFsdWUpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBvYmplY3QgZnJvbSBzdG9yYWdlOyBpZiBpdCBkb2Vzbid0IGV4aXN0LCBzZXRcbiAgICAgICAgLy8gaXQgdG8gdGhlIGRlZmF1bHQgdmFsdWVcbiAgICAgICAgY29uc3Qgc3QgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5uYW1lKTtcbiAgICAgICAgaWYgKCFzdCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ05vdGhpbmcgZm91bmQgaW4gc3RvcmFnZSwgc3RhcnRpbmcgZnJvbSBkZWZhdWx0Jyk7XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBkZWZhdWx0X3ZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZvdW5kIGluIHN0b3JhZ2U6ICcsIHN0KTtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IEpTT04ucGFyc2Uoc3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2F2ZSB0byBsb2NhbCBzdG9yYWdlXG4gICAgICovXG4gICAgc2F2ZSgpIHtcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubmFtZSwgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgbGlzdCBmcm9tIGEgZ2l2ZW4ga2V5XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8Kn1cbiAgICAgKi9cbiAgICBnZXRMaXN0KGtleSkge1xuICAgICAgICBpZiAoIShrZXkgaW4gdGhpcy5kYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVtrZXldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBgdmFsdWVgIHRvIGEgZ2l2ZW4gYGtleWBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAgICovXG4gICAgYWRkVG9MaXN0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluIHRoaXMuZGF0YSkpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVtrZXldID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZGF0YVtrZXldLmluZGV4T2YodmFsdWUpO1xuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFba2V5XS5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBgdmFsdWVgIGZyb20gdGhlIGdpdmVuIGBrZXlgXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgICAqL1xuICAgIHJlbW92ZUZyb21MaXN0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluIHRoaXMuZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5kYXRhW2tleV0uaW5kZXhPZih2YWx1ZSk7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVtrZXldLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvc3RvcmFnZS5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/storage.js\n"); +eval("var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Simple browser storage interface\n */\nvar Storage = function () {\n function Storage(name, default_value) {\n _classCallCheck(this, Storage);\n\n this.name = name;\n\n // Read the object from storage; if it doesn't exist, set\n // it to the default value\n var st = window.localStorage.getItem(this.name);\n if (!st) {\n console.log('Nothing found in storage, starting from default');\n this.data = default_value;\n } else {\n console.log('Found in storage: ', st);\n this.data = JSON.parse(st);\n }\n }\n\n /**\n * Save to local storage\n */\n\n\n _createClass(Storage, [{\n key: 'save',\n value: function save() {\n window.localStorage.setItem(this.name, JSON.stringify(this.data));\n }\n\n /**\n * Return a list from a given key\n *\n * @param {String} key\n *\n * @returns {Array|*}\n */\n\n }, {\n key: 'getList',\n value: function getList(key) {\n if (!(key in this.data)) {\n return [];\n }\n\n return this.data[key];\n }\n\n /**\n * Add `value` to a given `key`\n *\n * @param {string} key\n * @param {*} value\n */\n\n }, {\n key: 'addToList',\n value: function addToList(key, value) {\n if (!(key in this.data)) {\n this.data[key] = [];\n }\n\n var index = this.data[key].indexOf(value);\n if (index === -1) {\n this.data[key].push(value);\n }\n }\n\n /**\n * Remove `value` from the given `key`\n *\n * @param {String} key\n * @param {*} value\n */\n\n }, {\n key: 'removeFromList',\n value: function removeFromList(key, value) {\n if (!(key in this.data)) {\n return;\n }\n\n var index = this.data[key].indexOf(value);\n if (index !== -1) {\n this.data[key].splice(index, 1);\n }\n }\n }]);\n\n return Storage;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Storage);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc3RvcmFnZS5qcz83YjRhIl0sIm5hbWVzIjpbIlN0b3JhZ2UiLCJuYW1lIiwiZGVmYXVsdF92YWx1ZSIsInN0Iiwid2luZG93IiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsImNvbnNvbGUiLCJsb2ciLCJkYXRhIiwiSlNPTiIsInBhcnNlIiwic2V0SXRlbSIsInN0cmluZ2lmeSIsImtleSIsInZhbHVlIiwiaW5kZXgiLCJpbmRleE9mIiwicHVzaCIsInNwbGljZSJdLCJtYXBwaW5ncyI6Ijs7OztBQUNBOzs7SUFHcUJBLE87QUFDbkIsbUJBQVlDLElBQVosRUFBa0JDLGFBQWxCLEVBQWlDO0FBQUE7O0FBQy9CLFNBQUtELElBQUwsR0FBWUEsSUFBWjs7QUFFQTtBQUNBO0FBQ0EsUUFBTUUsS0FBS0MsT0FBT0MsWUFBUCxDQUFvQkMsT0FBcEIsQ0FBNEIsS0FBS0wsSUFBakMsQ0FBWDtBQUNBLFFBQUksQ0FBQ0UsRUFBTCxFQUFTO0FBQ1BJLGNBQVFDLEdBQVIsQ0FBWSxpREFBWjtBQUNBLFdBQUtDLElBQUwsR0FBWVAsYUFBWjtBQUNELEtBSEQsTUFHTztBQUNMSyxjQUFRQyxHQUFSLENBQVksb0JBQVosRUFBa0NMLEVBQWxDO0FBQ0EsV0FBS00sSUFBTCxHQUFZQyxLQUFLQyxLQUFMLENBQVdSLEVBQVgsQ0FBWjtBQUNEO0FBQ0Y7O0FBRUQ7Ozs7Ozs7MkJBR087QUFDTEMsYUFBT0MsWUFBUCxDQUFvQk8sT0FBcEIsQ0FBNEIsS0FBS1gsSUFBakMsRUFBdUNTLEtBQUtHLFNBQUwsQ0FBZSxLQUFLSixJQUFwQixDQUF2QztBQUNEOztBQUVEOzs7Ozs7Ozs7OzRCQU9RSyxHLEVBQUs7QUFDWCxVQUFJLEVBQUVBLE9BQU8sS0FBS0wsSUFBZCxDQUFKLEVBQXlCO0FBQ3ZCLGVBQU8sRUFBUDtBQUNEOztBQUVELGFBQU8sS0FBS0EsSUFBTCxDQUFVSyxHQUFWLENBQVA7QUFDRDs7QUFFRDs7Ozs7Ozs7OzhCQU1VQSxHLEVBQUtDLEssRUFBTztBQUNwQixVQUFJLEVBQUVELE9BQU8sS0FBS0wsSUFBZCxDQUFKLEVBQXlCO0FBQ3ZCLGFBQUtBLElBQUwsQ0FBVUssR0FBVixJQUFpQixFQUFqQjtBQUNEOztBQUVELFVBQU1FLFFBQVEsS0FBS1AsSUFBTCxDQUFVSyxHQUFWLEVBQWVHLE9BQWYsQ0FBdUJGLEtBQXZCLENBQWQ7QUFDQSxVQUFJQyxVQUFVLENBQUMsQ0FBZixFQUFrQjtBQUNoQixhQUFLUCxJQUFMLENBQVVLLEdBQVYsRUFBZUksSUFBZixDQUFvQkgsS0FBcEI7QUFDRDtBQUNGOztBQUVEOzs7Ozs7Ozs7bUNBTWVELEcsRUFBS0MsSyxFQUFPO0FBQ3pCLFVBQUksRUFBRUQsT0FBTyxLQUFLTCxJQUFkLENBQUosRUFBeUI7QUFDdkI7QUFDRDs7QUFFRCxVQUFNTyxRQUFRLEtBQUtQLElBQUwsQ0FBVUssR0FBVixFQUFlRyxPQUFmLENBQXVCRixLQUF2QixDQUFkO0FBQ0EsVUFBSUMsVUFBVSxDQUFDLENBQWYsRUFBa0I7QUFDaEIsYUFBS1AsSUFBTCxDQUFVSyxHQUFWLEVBQWVLLE1BQWYsQ0FBc0JILEtBQXRCLEVBQTZCLENBQTdCO0FBQ0Q7QUFDRjs7Ozs7O0FBdEVrQmhCLGdFIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL3N0b3JhZ2UuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogU2ltcGxlIGJyb3dzZXIgc3RvcmFnZSBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RvcmFnZSB7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGRlZmF1bHRfdmFsdWUpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXG4gICAgLy8gUmVhZCB0aGUgb2JqZWN0IGZyb20gc3RvcmFnZTsgaWYgaXQgZG9lc24ndCBleGlzdCwgc2V0XG4gICAgLy8gaXQgdG8gdGhlIGRlZmF1bHQgdmFsdWVcbiAgICBjb25zdCBzdCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLm5hbWUpO1xuICAgIGlmICghc3QpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdOb3RoaW5nIGZvdW5kIGluIHN0b3JhZ2UsIHN0YXJ0aW5nIGZyb20gZGVmYXVsdCcpO1xuICAgICAgdGhpcy5kYXRhID0gZGVmYXVsdF92YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coJ0ZvdW5kIGluIHN0b3JhZ2U6ICcsIHN0KTtcbiAgICAgIHRoaXMuZGF0YSA9IEpTT04ucGFyc2Uoc3QpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgICAqIFNhdmUgdG8gbG9jYWwgc3RvcmFnZVxuICAgICAqL1xuICBzYXZlKCkge1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLm5hbWUsIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSkpO1xuICB9XG5cbiAgLyoqXG4gICAgICogUmV0dXJuIGEgbGlzdCBmcm9tIGEgZ2l2ZW4ga2V5XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8Kn1cbiAgICAgKi9cbiAgZ2V0TGlzdChrZXkpIHtcbiAgICBpZiAoIShrZXkgaW4gdGhpcy5kYXRhKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRhdGFba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgICAqIEFkZCBgdmFsdWVgIHRvIGEgZ2l2ZW4gYGtleWBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAgICovXG4gIGFkZFRvTGlzdChrZXksIHZhbHVlKSB7XG4gICAgaWYgKCEoa2V5IGluIHRoaXMuZGF0YSkpIHtcbiAgICAgIHRoaXMuZGF0YVtrZXldID0gW107XG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmRhdGFba2V5XS5pbmRleE9mKHZhbHVlKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICB0aGlzLmRhdGFba2V5XS5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICAgKiBSZW1vdmUgYHZhbHVlYCBmcm9tIHRoZSBnaXZlbiBga2V5YFxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICAgKi9cbiAgcmVtb3ZlRnJvbUxpc3Qoa2V5LCB2YWx1ZSkge1xuICAgIGlmICghKGtleSBpbiB0aGlzLmRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmRhdGFba2V5XS5pbmRleE9mKHZhbHVlKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmRhdGFba2V5XS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL3N0b3JhZ2UuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/storage.js\n"); /***/ }), diff --git a/public/assets/frontend/js/app.js b/public/assets/frontend/js/app.js index a63608b5..ed8bb7cf 100644 --- a/public/assets/frontend/js/app.js +++ b/public/assets/frontend/js/app.js @@ -271,17 +271,24 @@ eval("/*!\n * Determine if an object is a Buffer\n *\n * @author Feross Aboukh /***/ }), -/***/ "./node_modules/babel-runtime/regenerator/index.js": +/***/ "./node_modules/babel-runtime/node_modules/regenerator-runtime/runtime-module.js": /***/ (function(module, exports, __webpack_require__) { -eval("module.exports = __webpack_require__(\"./node_modules/regenerator-runtime/runtime-module.js\");\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvci9pbmRleC5qcz81ZjE2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQixtQkFBTyxDQUFDLHNEQUFxQiIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL3JlZ2VuZXJhdG9yL2luZGV4LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZVwiKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3IvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3IvaW5kZXguanNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/babel-runtime/regenerator/index.js\n"); +eval("/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n// This method of obtaining a reference to the global object needs to be\n// kept identical to the way it is obtained in runtime.js\nvar g = (function() { return this })() || Function(\"return this\")();\n\n// Use `getOwnPropertyNames` because not all browsers support calling\n// `hasOwnProperty` on the global `self` object in a worker. See #183.\nvar hadRuntime = g.regeneratorRuntime &&\n Object.getOwnPropertyNames(g).indexOf(\"regeneratorRuntime\") >= 0;\n\n// Save the old regeneratorRuntime in case it needs to be restored later.\nvar oldRuntime = hadRuntime && g.regeneratorRuntime;\n\n// Force reevalutation of runtime.js.\ng.regeneratorRuntime = undefined;\n\nmodule.exports = __webpack_require__(\"./node_modules/babel-runtime/node_modules/regenerator-runtime/runtime.js\");\n\nif (hadRuntime) {\n // Restore the original runtime.\n g.regeneratorRuntime = oldRuntime;\n} else {\n // Remove the global property added by runtime.js.\n try {\n delete g.regeneratorRuntime;\n } catch(e) {\n g.regeneratorRuntime = undefined;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLW1vZHVsZS5qcz9kNDdlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCLGNBQWM7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQywwRUFBVzs7QUFFcEM7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLW1vZHVsZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuLy8gVGhpcyBtZXRob2Qgb2Ygb2J0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0IG5lZWRzIHRvIGJlXG4vLyBrZXB0IGlkZW50aWNhbCB0byB0aGUgd2F5IGl0IGlzIG9idGFpbmVkIGluIHJ1bnRpbWUuanNcbnZhciBnID0gKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcyB9KSgpIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcblxuLy8gVXNlIGBnZXRPd25Qcm9wZXJ0eU5hbWVzYCBiZWNhdXNlIG5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCBjYWxsaW5nXG4vLyBgaGFzT3duUHJvcGVydHlgIG9uIHRoZSBnbG9iYWwgYHNlbGZgIG9iamVjdCBpbiBhIHdvcmtlci4gU2VlICMxODMuXG52YXIgaGFkUnVudGltZSA9IGcucmVnZW5lcmF0b3JSdW50aW1lICYmXG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGcpLmluZGV4T2YoXCJyZWdlbmVyYXRvclJ1bnRpbWVcIikgPj0gMDtcblxuLy8gU2F2ZSB0aGUgb2xkIHJlZ2VuZXJhdG9yUnVudGltZSBpbiBjYXNlIGl0IG5lZWRzIHRvIGJlIHJlc3RvcmVkIGxhdGVyLlxudmFyIG9sZFJ1bnRpbWUgPSBoYWRSdW50aW1lICYmIGcucmVnZW5lcmF0b3JSdW50aW1lO1xuXG4vLyBGb3JjZSByZWV2YWx1dGF0aW9uIG9mIHJ1bnRpbWUuanMuXG5nLnJlZ2VuZXJhdG9yUnVudGltZSA9IHVuZGVmaW5lZDtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi9ydW50aW1lXCIpO1xuXG5pZiAoaGFkUnVudGltZSkge1xuICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBydW50aW1lLlxuICBnLnJlZ2VuZXJhdG9yUnVudGltZSA9IG9sZFJ1bnRpbWU7XG59IGVsc2Uge1xuICAvLyBSZW1vdmUgdGhlIGdsb2JhbCBwcm9wZXJ0eSBhZGRlZCBieSBydW50aW1lLmpzLlxuICB0cnkge1xuICAgIGRlbGV0ZSBnLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgfSBjYXRjaChlKSB7XG4gICAgZy5yZWdlbmVyYXRvclJ1bnRpbWUgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS1tb2R1bGUuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS1tb2R1bGUuanNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/babel-runtime/node_modules/regenerator-runtime/runtime-module.js\n"); /***/ }), -/***/ "./node_modules/geolib/dist/geolib.js": +/***/ "./node_modules/babel-runtime/node_modules/regenerator-runtime/runtime.js": +/***/ (function(module, exports) { + +eval("/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n!(function(global) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // In sloppy mode, unbound `this` refers to the global object, fallback to\n // Function constructor if we're in global strict mode. That is sadly a form\n // of indirect eval which violates Content Security Policy.\n (function() { return this })() || Function(\"return this\")()\n);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzPzFlMTMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsS0FBSztBQUNMLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBLHdDQUF3QyxXQUFXO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW9DLGNBQWM7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlDQUFpQyxrQkFBa0I7QUFDbkQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGlCQUFpQjtBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsOENBQThDLFFBQVE7QUFDdEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUEsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsOENBQThDLFFBQVE7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxlQUFlLGNBQWM7QUFDN0IiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4hKGZ1bmN0aW9uKGdsb2JhbCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgT3AgPSBPYmplY3QucHJvdG90eXBlO1xuICB2YXIgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHk7XG4gIHZhciB1bmRlZmluZWQ7IC8vIE1vcmUgY29tcHJlc3NpYmxlIHRoYW4gdm9pZCAwLlxuICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbCA6IHt9O1xuICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiO1xuICB2YXIgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiO1xuICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuXG4gIHZhciBpbk1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCI7XG4gIHZhciBydW50aW1lID0gZ2xvYmFsLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgaWYgKHJ1bnRpbWUpIHtcbiAgICBpZiAoaW5Nb2R1bGUpIHtcbiAgICAgIC8vIElmIHJlZ2VuZXJhdG9yUnVudGltZSBpcyBkZWZpbmVkIGdsb2JhbGx5IGFuZCB3ZSdyZSBpbiBhIG1vZHVsZSxcbiAgICAgIC8vIG1ha2UgdGhlIGV4cG9ydHMgb2JqZWN0IGlkZW50aWNhbCB0byByZWdlbmVyYXRvclJ1bnRpbWUuXG4gICAgICBtb2R1bGUuZXhwb3J0cyA9IHJ1bnRpbWU7XG4gICAgfVxuICAgIC8vIERvbid0IGJvdGhlciBldmFsdWF0aW5nIHRoZSByZXN0IG9mIHRoaXMgZmlsZSBpZiB0aGUgcnVudGltZSB3YXNcbiAgICAvLyBhbHJlYWR5IGRlZmluZWQgZ2xvYmFsbHkuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRGVmaW5lIHRoZSBydW50aW1lIGdsb2JhbGx5IChhcyBleHBlY3RlZCBieSBnZW5lcmF0ZWQgY29kZSkgYXMgZWl0aGVyXG4gIC8vIG1vZHVsZS5leHBvcnRzIChpZiB3ZSdyZSBpbiBhIG1vZHVsZSkgb3IgYSBuZXcsIGVtcHR5IG9iamVjdC5cbiAgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWUgPSBpbk1vZHVsZSA/IG1vZHVsZS5leHBvcnRzIDoge307XG5cbiAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIC8vIElmIG91dGVyRm4gcHJvdmlkZWQgYW5kIG91dGVyRm4ucHJvdG90eXBlIGlzIGEgR2VuZXJhdG9yLCB0aGVuIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yLlxuICAgIHZhciBwcm90b0dlbmVyYXRvciA9IG91dGVyRm4gJiYgb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBvdXRlckZuIDogR2VuZXJhdG9yO1xuICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSk7XG4gICAgdmFyIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7XG5cbiAgICAvLyBUaGUgLl9pbnZva2UgbWV0aG9kIHVuaWZpZXMgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzLlxuICAgIGdlbmVyYXRvci5faW52b2tlID0gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH1cbiAgcnVudGltZS53cmFwID0gd3JhcDtcblxuICAvLyBUcnkvY2F0Y2ggaGVscGVyIHRvIG1pbmltaXplIGRlb3B0aW1pemF0aW9ucy4gUmV0dXJucyBhIGNvbXBsZXRpb25cbiAgLy8gcmVjb3JkIGxpa2UgY29udGV4dC50cnlFbnRyaWVzW2ldLmNvbXBsZXRpb24uIFRoaXMgaW50ZXJmYWNlIGNvdWxkXG4gIC8vIGhhdmUgYmVlbiAoYW5kIHdhcyBwcmV2aW91c2x5KSBkZXNpZ25lZCB0byB0YWtlIGEgY2xvc3VyZSB0byBiZVxuICAvLyBpbnZva2VkIHdpdGhvdXQgYXJndW1lbnRzLCBidXQgaW4gYWxsIHRoZSBjYXNlcyB3ZSBjYXJlIGFib3V0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBtZXRob2Qgd2Ugd2FudCB0byBjYWxsLCBzbyB0aGVyZSdzIG5vIG5lZWRcbiAgLy8gdG8gY3JlYXRlIGEgbmV3IGZ1bmN0aW9uIG9iamVjdC4gV2UgY2FuIGV2ZW4gZ2V0IGF3YXkgd2l0aCBhc3N1bWluZ1xuICAvLyB0aGUgbWV0aG9kIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50LCBzaW5jZSB0aGF0IGhhcHBlbnMgdG8gYmUgdHJ1ZVxuICAvLyBpbiBldmVyeSBjYXNlLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHRvdWNoIHRoZSBhcmd1bWVudHMgb2JqZWN0LiBUaGVcbiAgLy8gb25seSBhZGRpdGlvbmFsIGFsbG9jYXRpb24gcmVxdWlyZWQgaXMgdGhlIGNvbXBsZXRpb24gcmVjb3JkLCB3aGljaFxuICAvLyBoYXMgYSBzdGFibGUgc2hhcGUgYW5kIHNvIGhvcGVmdWxseSBzaG91bGQgYmUgY2hlYXAgdG8gYWxsb2NhdGUuXG4gIGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcIm5vcm1hbFwiLCBhcmc6IGZuLmNhbGwob2JqLCBhcmcpIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInRocm93XCIsIGFyZzogZXJyIH07XG4gICAgfVxuICB9XG5cbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkU3RhcnQgPSBcInN1c3BlbmRlZFN0YXJ0XCI7XG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkID0gXCJzdXNwZW5kZWRZaWVsZFwiO1xuICB2YXIgR2VuU3RhdGVFeGVjdXRpbmcgPSBcImV4ZWN1dGluZ1wiO1xuICB2YXIgR2VuU3RhdGVDb21wbGV0ZWQgPSBcImNvbXBsZXRlZFwiO1xuXG4gIC8vIFJldHVybmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBpbm5lckZuIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXNcbiAgLy8gYnJlYWtpbmcgb3V0IG9mIHRoZSBkaXNwYXRjaCBzd2l0Y2ggc3RhdGVtZW50LlxuICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9O1xuXG4gIC8vIER1bW15IGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyB0aGF0IHdlIHVzZSBhcyB0aGUgLmNvbnN0cnVjdG9yIGFuZFxuICAvLyAuY29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMgZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0cy4gRm9yIGZ1bGwgc3BlYyBjb21wbGlhbmNlLCB5b3UgbWF5IHdpc2ggdG8gY29uZmlndXJlIHlvdXJcbiAgLy8gbWluaWZpZXIgbm90IHRvIG1hbmdsZSB0aGUgbmFtZXMgb2YgdGhlc2UgdHdvIGZ1bmN0aW9ucy5cbiAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9XG5cbiAgLy8gVGhpcyBpcyBhIHBvbHlmaWxsIGZvciAlSXRlcmF0b3JQcm90b3R5cGUlIGZvciBlbnZpcm9ubWVudHMgdGhhdFxuICAvLyBkb24ndCBuYXRpdmVseSBzdXBwb3J0IGl0LlxuICB2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcbiAgSXRlcmF0b3JQcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiAgdmFyIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpO1xuICBpZiAoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiZcbiAgICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJlxuICAgICAgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSkge1xuICAgIC8vIFRoaXMgZW52aXJvbm1lbnQgaGFzIGEgbmF0aXZlICVJdGVyYXRvclByb3RvdHlwZSU7IHVzZSBpdCBpbnN0ZWFkXG4gICAgLy8gb2YgdGhlIHBvbHlmaWxsLlxuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cblxuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPVxuICAgIEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR3AuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvbjtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGVbdG9TdHJpbmdUYWdTeW1ib2xdID1cbiAgICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcblxuICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLlxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICBwcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKGFyZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBydW50aW1lLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGlmICghKHRvU3RyaW5nVGFnU3ltYm9sIGluIGdlbkZ1bikpIHtcbiAgICAgICAgZ2VuRnVuW3RvU3RyaW5nVGFnU3ltYm9sXSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgIHJldHVybiBnZW5GdW47XG4gIH07XG5cbiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvXG4gIC8vIGB5aWVsZCByZWdlbmVyYXRvclJ1bnRpbWUuYXdyYXAoeClgLCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiB0ZXN0XG4gIC8vIGBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpYCB0byBkZXRlcm1pbmUgaWYgdGhlIHlpZWxkZWQgdmFsdWUgaXNcbiAgLy8gbWVhbnQgdG8gYmUgYXdhaXRlZC5cbiAgcnVudGltZS5hd3JhcCA9IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB7IF9fYXdhaXQ6IGFyZyB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJ0aHJvd1wiLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uKHVud3JhcHBlZCkge1xuICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzXG4gICAgICAgICAgLy8gdGhlIC52YWx1ZSBvZiB0aGUgUHJvbWlzZTx7dmFsdWUsZG9uZX0+IHJlc3VsdCBmb3IgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCBpdGVyYXRpb24uIElmIHRoZSBQcm9taXNlIGlzIHJlamVjdGVkLCBob3dldmVyLCB0aGVcbiAgICAgICAgICAvLyByZXN1bHQgZm9yIHRoaXMgaXRlcmF0aW9uIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCB0aGUgc2FtZVxuICAgICAgICAgIC8vIHJlYXNvbi4gTm90ZSB0aGF0IHJlamVjdGlvbnMgb2YgeWllbGRlZCBQcm9taXNlcyBhcmUgbm90XG4gICAgICAgICAgLy8gdGhyb3duIGJhY2sgaW50byB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBhcyBpcyB0aGUgY2FzZVxuICAgICAgICAgIC8vIHdoZW4gYW4gYXdhaXRlZCBQcm9taXNlIGlzIHJlamVjdGVkLiBUaGlzIGRpZmZlcmVuY2UgaW5cbiAgICAgICAgICAvLyBiZWhhdmlvciBiZXR3ZWVuIHlpZWxkIGFuZCBhd2FpdCBpcyBpbXBvcnRhbnQsIGJlY2F1c2UgaXRcbiAgICAgICAgICAvLyBhbGxvd3MgdGhlIGNvbnN1bWVyIHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggdGhlIHlpZWxkZWRcbiAgICAgICAgICAvLyByZWplY3Rpb24gKHN3YWxsb3cgaXQgYW5kIGNvbnRpbnVlLCBtYW51YWxseSAudGhyb3cgaXQgYmFja1xuICAgICAgICAgIC8vIGludG8gdGhlIGdlbmVyYXRvciwgYWJhbmRvbiBpdGVyYXRpb24sIHdoYXRldmVyKS4gV2l0aFxuICAgICAgICAgIC8vIGF3YWl0LCBieSBjb250cmFzdCwgdGhlcmUgaXMgbm8gb3Bwb3J0dW5pdHkgdG8gZXhhbWluZSB0aGVcbiAgICAgICAgICAvLyByZWplY3Rpb24gcmVhc29uIG91dHNpZGUgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiwgc28gdGhlXG4gICAgICAgICAgLy8gb25seSBvcHRpb24gaXMgdG8gdGhyb3cgaXQgZnJvbSB0aGUgYXdhaXQgZXhwcmVzc2lvbiwgYW5kXG4gICAgICAgICAgLy8gbGV0IHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gaGFuZGxlIHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkO1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykge1xuICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID1cbiAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKFxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLFxuICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyXG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnXG4gICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiAoc2VlIGRlZmluZUl0ZXJhdG9yTWV0aG9kcykuXG4gICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTtcbiAgfVxuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7XG4gIEFzeW5jSXRlcmF0b3IucHJvdG90eXBlW2FzeW5jSXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBydW50aW1lLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBydW50aW1lLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKFxuICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdClcbiAgICApO1xuXG4gICAgcmV0dXJuIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXliZUludm9rZURlbGVnYXRlKGNvbnRleHQpIGNoYW5nZWQgY29udGV4dC5tZXRob2QgZnJvbVxuICAgICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCEgaW5mbykge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKTtcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgIC8vIHZhcmlhYmxlIHNwZWNpZmllZCBieSBkZWxlZ2F0ZS5yZXN1bHROYW1lIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcblxuICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcblxuICAgICAgLy8gSWYgY29udGV4dC5tZXRob2Qgd2FzIFwidGhyb3dcIiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlXG4gICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmXG4gICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgLy8gXCJjb25zdW1lZFwiIGJ5IHRoZSBkZWxlZ2F0ZSBpdGVyYXRvci4gSWYgY29udGV4dC5tZXRob2Qgd2FzXG4gICAgICAvLyBcInJldHVyblwiLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZVxuICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlLXlpZWxkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGRlbGVnYXRlIG1ldGhvZC5cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoXG4gICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci5cbiAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBHcFt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvclwiO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIHJ1bnRpbWUua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBydW50aW1lLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xufSkoXG4gIC8vIEluIHNsb3BweSBtb2RlLCB1bmJvdW5kIGB0aGlzYCByZWZlcnMgdG8gdGhlIGdsb2JhbCBvYmplY3QsIGZhbGxiYWNrIHRvXG4gIC8vIEZ1bmN0aW9uIGNvbnN0cnVjdG9yIGlmIHdlJ3JlIGluIGdsb2JhbCBzdHJpY3QgbW9kZS4gVGhhdCBpcyBzYWRseSBhIGZvcm1cbiAgLy8gb2YgaW5kaXJlY3QgZXZhbCB3aGljaCB2aW9sYXRlcyBDb250ZW50IFNlY3VyaXR5IFBvbGljeS5cbiAgKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcyB9KSgpIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKVxuKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/babel-runtime/node_modules/regenerator-runtime/runtime.js\n"); + +/***/ }), + +/***/ "./node_modules/babel-runtime/regenerator/index.js": /***/ (function(module, exports, __webpack_require__) { -eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! geolib 2.0.23 by Manuel Bieh\r\n* Library to provide geo functions like distance calculation,\r\n* conversion of decimal coordinates to sexagesimal and vice versa, etc.\r\n* WGS 84 (World Geodetic System 1984)\r\n* \r\n* @author Manuel Bieh\r\n* @url http://www.manuelbieh.com/\r\n* @version 2.0.23\r\n* @license MIT \r\n**/;(function(global, undefined) {\n\n \"use strict\";\n\n function Geolib() {}\n\n // Constants\n Geolib.TO_RAD = Math.PI / 180;\n Geolib.TO_DEG = 180 / Math.PI;\n Geolib.PI_X2 = Math.PI * 2;\n Geolib.PI_DIV4 = Math.PI / 4;\n\n // Setting readonly defaults\n var geolib = Object.create(Geolib.prototype, {\n version: {\n value: \"2.0.23\"\n },\n radius: {\n value: 6378137\n },\n minLat: {\n value: -90\n },\n maxLat: {\n value: 90\n },\n minLon: {\n value: -180\n },\n maxLon: {\n value: 180\n },\n sexagesimalPattern: {\n value: /^([0-9]{1,3})°\\s*([0-9]{1,3}(?:\\.(?:[0-9]{1,2}))?)'\\s*(([0-9]{1,3}(\\.([0-9]{1,4}))?)\"\\s*)?([NEOSW]?)$/\n },\n measures: {\n value: Object.create(Object.prototype, {\n \"m\" : {value: 1},\n \"km\": {value: 0.001},\n \"cm\": {value: 100},\n \"mm\": {value: 1000},\n \"mi\": {value: (1 / 1609.344)},\n \"sm\": {value: (1 / 1852.216)},\n \"ft\": {value: (100 / 30.48)},\n \"in\": {value: (100 / 2.54)},\n \"yd\": {value: (1 / 0.9144)}\n })\n },\n prototype: {\n value: Geolib.prototype\n },\n extend: {\n value: function(methods, overwrite) {\n for(var prop in methods) {\n if(typeof geolib.prototype[prop] === 'undefined' || overwrite === true) {\n if(typeof methods[prop] === 'function' && typeof methods[prop].bind === 'function') {\n geolib.prototype[prop] = methods[prop].bind(geolib);\n } else {\n geolib.prototype[prop] = methods[prop];\n }\n }\n }\n }\n }\n });\n\n if (typeof(Number.prototype.toRad) === 'undefined') {\n Number.prototype.toRad = function() {\n return this * Geolib.TO_RAD;\n };\n }\n\n if (typeof(Number.prototype.toDeg) === 'undefined') {\n Number.prototype.toDeg = function() {\n return this * Geolib.TO_DEG;\n };\n }\n\n // Here comes the magic\n geolib.extend({\n\n decimal: {},\n\n sexagesimal: {},\n\n distance: null,\n\n getKeys: function(point) {\n\n // GeoJSON Array [longitude, latitude(, elevation)]\n if(Object.prototype.toString.call(point) == '[object Array]') {\n\n return {\n longitude: point.length >= 1 ? 0 : undefined,\n latitude: point.length >= 2 ? 1 : undefined,\n elevation: point.length >= 3 ? 2 : undefined\n };\n\n }\n\n var getKey = function(possibleValues) {\n\n var key;\n\n possibleValues.every(function(val) {\n // TODO: check if point is an object\n if(typeof point != 'object') {\n return true;\n }\n return point.hasOwnProperty(val) ? (function() { key = val; return false; }()) : true;\n });\n\n return key;\n\n };\n\n var longitude = getKey(['lng', 'lon', 'longitude']);\n var latitude = getKey(['lat', 'latitude']);\n var elevation = getKey(['alt', 'altitude', 'elevation', 'elev']);\n\n // return undefined if not at least one valid property was found\n if(typeof latitude == 'undefined' &&\n typeof longitude == 'undefined' &&\n typeof elevation == 'undefined') {\n return undefined;\n }\n\n return {\n latitude: latitude,\n longitude: longitude,\n elevation: elevation\n };\n\n },\n\n // returns latitude of a given point, converted to decimal\n // set raw to true to avoid conversion\n getLat: function(point, raw) {\n return raw === true ? point[this.getKeys(point).latitude] : this.useDecimal(point[this.getKeys(point).latitude]);\n },\n\n // Alias for getLat\n latitude: function(point) {\n return this.getLat.call(this, point);\n },\n\n // returns longitude of a given point, converted to decimal\n // set raw to true to avoid conversion\n getLon: function(point, raw) {\n return raw === true ? point[this.getKeys(point).longitude] : this.useDecimal(point[this.getKeys(point).longitude]);\n },\n\n // Alias for getLon\n longitude: function(point) {\n return this.getLon.call(this, point);\n },\n\n getElev: function(point) {\n return point[this.getKeys(point).elevation];\n },\n\n // Alias for getElev\n elevation: function(point) {\n return this.getElev.call(this, point);\n },\n\n coords: function(point, raw) {\n\n var retval = {\n latitude: raw === true ? point[this.getKeys(point).latitude] : this.useDecimal(point[this.getKeys(point).latitude]),\n longitude: raw === true ? point[this.getKeys(point).longitude] : this.useDecimal(point[this.getKeys(point).longitude])\n };\n\n var elev = point[this.getKeys(point).elevation];\n\n if(typeof elev !== 'undefined') {\n retval['elevation'] = elev;\n }\n\n return retval;\n\n },\n\n // Alias for coords\n ll: function(point, raw) {\n return this.coords.call(this, point, raw);\n },\n\n\n // checks if a variable contains a valid latlong object\n validate: function(point) {\n\n var keys = this.getKeys(point);\n\n if(typeof keys === 'undefined' || typeof keys.latitude === 'undefined' || keys.longitude === 'undefined') {\n return false;\n }\n\n var lat = point[keys.latitude];\n var lng = point[keys.longitude];\n\n if(typeof lat === 'undefined' || !this.isDecimal(lat) && !this.isSexagesimal(lat)) {\n return false;\n }\n\n if(typeof lng === 'undefined' || !this.isDecimal(lng) && !this.isSexagesimal(lng)) {\n return false;\n }\n\n lat = this.useDecimal(lat);\n lng = this.useDecimal(lng);\n\n if(lat < this.minLat || lat > this.maxLat || lng < this.minLon || lng > this.maxLon) {\n return false;\n }\n\n return true;\n\n },\n\n /**\n * Calculates geodetic distance between two points specified by latitude/longitude using\n * Vincenty inverse formula for ellipsoids\n * Vincenty Inverse Solution of Geodesics on the Ellipsoid (c) Chris Veness 2002-2010\n * (Licensed under CC BY 3.0)\n *\n * @param object Start position {latitude: 123, longitude: 123}\n * @param object End position {latitude: 123, longitude: 123}\n * @param integer Accuracy (in meters)\n * @param integer Precision (in decimal cases)\n * @return integer Distance (in meters)\n */\n getDistance: function(start, end, accuracy, precision) {\n\n accuracy = Math.floor(accuracy) || 1;\n precision = Math.floor(precision) || 0;\n\n var s = this.coords(start);\n var e = this.coords(end);\n\n var a = 6378137, b = 6356752.314245, f = 1/298.257223563; // WGS-84 ellipsoid params\n var L = (e['longitude']-s['longitude']).toRad();\n\n var cosSigma, sigma, sinAlpha, cosSqAlpha, cos2SigmaM, sinSigma;\n\n var U1 = Math.atan((1-f) * Math.tan(parseFloat(s['latitude']).toRad()));\n var U2 = Math.atan((1-f) * Math.tan(parseFloat(e['latitude']).toRad()));\n var sinU1 = Math.sin(U1), cosU1 = Math.cos(U1);\n var sinU2 = Math.sin(U2), cosU2 = Math.cos(U2);\n\n var lambda = L, lambdaP, iterLimit = 100;\n do {\n var sinLambda = Math.sin(lambda), cosLambda = Math.cos(lambda);\n sinSigma = (\n Math.sqrt(\n (\n cosU2 * sinLambda\n ) * (\n cosU2 * sinLambda\n ) + (\n cosU1 * sinU2 - sinU1 * cosU2 * cosLambda\n ) * (\n cosU1 * sinU2 - sinU1 * cosU2 * cosLambda\n )\n )\n );\n if (sinSigma === 0) {\n return geolib.distance = 0; // co-incident points\n }\n\n cosSigma = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda;\n sigma = Math.atan2(sinSigma, cosSigma);\n sinAlpha = cosU1 * cosU2 * sinLambda / sinSigma;\n cosSqAlpha = 1 - sinAlpha * sinAlpha;\n cos2SigmaM = cosSigma - 2 * sinU1 * sinU2 / cosSqAlpha;\n\n if (isNaN(cos2SigmaM)) {\n cos2SigmaM = 0; // equatorial line: cosSqAlpha=0 (§6)\n }\n var C = (\n f / 16 * cosSqAlpha * (\n 4 + f * (\n 4 - 3 * cosSqAlpha\n )\n )\n );\n lambdaP = lambda;\n lambda = (\n L + (\n 1 - C\n ) * f * sinAlpha * (\n sigma + C * sinSigma * (\n cos2SigmaM + C * cosSigma * (\n -1 + 2 * cos2SigmaM * cos2SigmaM\n )\n )\n )\n );\n\n } while (Math.abs(lambda-lambdaP) > 1e-12 && --iterLimit>0);\n\n if (iterLimit === 0) {\n return NaN; // formula failed to converge\n }\n\n var uSq = (\n cosSqAlpha * (\n a * a - b * b\n ) / (\n b*b\n )\n );\n\n var A = (\n 1 + uSq / 16384 * (\n 4096 + uSq * (\n -768 + uSq * (\n 320 - 175 * uSq\n )\n )\n )\n );\n\n var B = (\n uSq / 1024 * (\n 256 + uSq * (\n -128 + uSq * (\n 74-47 * uSq\n )\n )\n )\n );\n\n var deltaSigma = (\n B * sinSigma * (\n cos2SigmaM + B / 4 * (\n cosSigma * (\n -1 + 2 * cos2SigmaM * cos2SigmaM\n ) -B / 6 * cos2SigmaM * (\n -3 + 4 * sinSigma * sinSigma\n ) * (\n -3 + 4 * cos2SigmaM * cos2SigmaM\n )\n )\n )\n );\n\n var distance = b * A * (sigma - deltaSigma);\n\n distance = distance.toFixed(precision); // round to 1mm precision\n\n //if (start.hasOwnProperty(elevation) && end.hasOwnProperty(elevation)) {\n if (typeof this.elevation(start) !== 'undefined' && typeof this.elevation(end) !== 'undefined') {\n var climb = Math.abs(this.elevation(start) - this.elevation(end));\n distance = Math.sqrt(distance * distance + climb * climb);\n }\n\n return this.distance = Math.round(distance * Math.pow(10, precision) / accuracy) * accuracy / Math.pow(10, precision);\n\n /*\n // note: to return initial/final bearings in addition to distance, use something like:\n var fwdAz = Math.atan2(cosU2*sinLambda, cosU1*sinU2-sinU1*cosU2*cosLambda);\n var revAz = Math.atan2(cosU1*sinLambda, -sinU1*cosU2+cosU1*sinU2*cosLambda);\n\n return { distance: s, initialBearing: fwdAz.toDeg(), finalBearing: revAz.toDeg() };\n */\n\n },\n\n\n /**\n * Calculates the distance between two spots.\n * This method is more simple but also far more inaccurate\n *\n * @param object Start position {latitude: 123, longitude: 123}\n * @param object End position {latitude: 123, longitude: 123}\n * @param integer Accuracy (in meters)\n * @return integer Distance (in meters)\n */\n getDistanceSimple: function(start, end, accuracy) {\n\n accuracy = Math.floor(accuracy) || 1;\n\n var distance =\n Math.round(\n Math.acos(\n Math.sin(\n this.latitude(end).toRad()\n ) *\n Math.sin(\n this.latitude(start).toRad()\n ) +\n Math.cos(\n this.latitude(end).toRad()\n ) *\n Math.cos(\n this.latitude(start).toRad()\n ) *\n Math.cos(\n this.longitude(start).toRad() - this.longitude(end).toRad()\n )\n ) * this.radius\n );\n\n return geolib.distance = Math.floor(Math.round(distance/accuracy)*accuracy);\n\n },\n\n\n /**\n * Calculates the center of a collection of geo coordinates\n *\n * @param array Collection of coords [{latitude: 51.510, longitude: 7.1321}, {latitude: 49.1238, longitude: \"8° 30' W\"}, ...]\n * @return object {latitude: centerLat, longitude: centerLng}\n */\n getCenter: function(coords) {\n\n var coordsArray = coords;\n if(typeof coords === 'object' && !(coords instanceof Array)) {\n\n coordsArray = [];\n\n for(var key in coords) {\n coordsArray.push(\n this.coords(coords[key])\n );\n }\n\n }\n\n if(!coordsArray.length) {\n return false;\n }\n\n var X = 0.0;\n var Y = 0.0;\n var Z = 0.0;\n var lat, lon, hyp;\n\n coordsArray.forEach(function(coord) {\n\n lat = this.latitude(coord).toRad();\n lon = this.longitude(coord).toRad();\n\n X += Math.cos(lat) * Math.cos(lon);\n Y += Math.cos(lat) * Math.sin(lon);\n Z += Math.sin(lat);\n\n }, this);\n\n var nb_coords = coordsArray.length;\n X = X / nb_coords;\n Y = Y / nb_coords;\n Z = Z / nb_coords;\n\n lon = Math.atan2(Y, X);\n hyp = Math.sqrt(X * X + Y * Y);\n lat = Math.atan2(Z, hyp);\n\n return {\n latitude: (lat * Geolib.TO_DEG).toFixed(6),\n longitude: (lon * Geolib.TO_DEG).toFixed(6)\n };\n\n },\n\n\n /**\n * Gets the max and min, latitude, longitude, and elevation (if provided).\n * @param array array with coords e.g. [{latitude: 51.5143, longitude: 7.4138}, {latitude: 123, longitude: 123}, ...]\n * @return object {maxLat: maxLat,\n * minLat: minLat\n * maxLng: maxLng,\n * minLng: minLng,\n * maxElev: maxElev,\n * minElev: minElev}\n */\n getBounds: function(coords) {\n\n if (!coords.length) {\n return false;\n }\n\n var useElevation = this.elevation(coords[0]);\n\n var stats = {\n maxLat: -Infinity,\n minLat: Infinity,\n maxLng: -Infinity,\n minLng: Infinity\n };\n\n if (typeof useElevation != 'undefined') {\n stats.maxElev = 0;\n stats.minElev = Infinity;\n }\n\n for (var i = 0, l = coords.length; i < l; ++i) {\n\n stats.maxLat = Math.max(this.latitude(coords[i]), stats.maxLat);\n stats.minLat = Math.min(this.latitude(coords[i]), stats.minLat);\n stats.maxLng = Math.max(this.longitude(coords[i]), stats.maxLng);\n stats.minLng = Math.min(this.longitude(coords[i]), stats.minLng);\n\n if (useElevation) {\n stats.maxElev = Math.max(this.elevation(coords[i]), stats.maxElev);\n stats.minElev = Math.min(this.elevation(coords[i]), stats.minElev);\n }\n\n }\n\n return stats;\n\n },\n\n /**\n * Calculates the center of the bounds of geo coordinates.\n *\n * On polygons like political borders (eg. states)\n * this may gives a closer result to human expectation, than `getCenter`,\n * because that function can be disturbed by uneven distribution of\n * point in different sides.\n * Imagine the US state Oklahoma: `getCenter` on that gives a southern\n * point, because the southern border contains a lot more nodes,\n * than the others.\n *\n * @param array Collection of coords [{latitude: 51.510, longitude: 7.1321}, {latitude: 49.1238, longitude: \"8° 30' W\"}, ...]\n * @return object {latitude: centerLat, longitude: centerLng}\n */\n getCenterOfBounds: function(coords) {\n var b = this.getBounds(coords);\n var latitude = b.minLat + ((b.maxLat - b.minLat) / 2);\n var longitude = b.minLng + ((b.maxLng - b.minLng) / 2);\n return {\n latitude: parseFloat(latitude.toFixed(6)),\n longitude: parseFloat(longitude.toFixed(6))\n };\n },\n\n\n /**\n * Computes the bounding coordinates of all points on the surface\n * of the earth less than or equal to the specified great circle\n * distance.\n *\n * @param object Point position {latitude: 123, longitude: 123}\n * @param number Distance (in meters).\n * @return array Collection of two points defining the SW and NE corners.\n */\n getBoundsOfDistance: function(point, distance) {\n\n var latitude = this.latitude(point);\n var longitude = this.longitude(point);\n\n var radLat = latitude.toRad();\n var radLon = longitude.toRad();\n\n var radDist = distance / this.radius;\n var minLat = radLat - radDist;\n var maxLat = radLat + radDist;\n\n var MAX_LAT_RAD = this.maxLat.toRad();\n var MIN_LAT_RAD = this.minLat.toRad();\n var MAX_LON_RAD = this.maxLon.toRad();\n var MIN_LON_RAD = this.minLon.toRad();\n\n var minLon;\n var maxLon;\n\n if (minLat > MIN_LAT_RAD && maxLat < MAX_LAT_RAD) {\n\n var deltaLon = Math.asin(Math.sin(radDist) / Math.cos(radLat));\n minLon = radLon - deltaLon;\n\n if (minLon < MIN_LON_RAD) {\n minLon += Geolib.PI_X2;\n }\n\n maxLon = radLon + deltaLon;\n\n if (maxLon > MAX_LON_RAD) {\n maxLon -= Geolib.PI_X2;\n }\n\n } else {\n // A pole is within the distance.\n minLat = Math.max(minLat, MIN_LAT_RAD);\n maxLat = Math.min(maxLat, MAX_LAT_RAD);\n minLon = MIN_LON_RAD;\n maxLon = MAX_LON_RAD;\n }\n\n return [\n // Southwest\n {\n latitude: minLat.toDeg(),\n longitude: minLon.toDeg()\n },\n // Northeast\n {\n latitude: maxLat.toDeg(),\n longitude: maxLon.toDeg()\n }\n ];\n\n },\n\n\n /**\n * Checks whether a point is inside of a polygon or not.\n * Note that the polygon coords must be in correct order!\n *\n * @param object coordinate to check e.g. {latitude: 51.5023, longitude: 7.3815}\n * @param array array with coords e.g. [{latitude: 51.5143, longitude: 7.4138}, {latitude: 123, longitude: 123}, ...]\n * @return bool true if the coordinate is inside the given polygon\n */\n isPointInside: function(latlng, coords) {\n\n for(var c = false, i = -1, l = coords.length, j = l - 1; ++i < l; j = i) {\n\n if(\n (\n (this.longitude(coords[i]) <= this.longitude(latlng) && this.longitude(latlng) < this.longitude(coords[j])) ||\n (this.longitude(coords[j]) <= this.longitude(latlng) && this.longitude(latlng) < this.longitude(coords[i]))\n ) &&\n (\n this.latitude(latlng) < (this.latitude(coords[j]) - this.latitude(coords[i])) *\n (this.longitude(latlng) - this.longitude(coords[i])) /\n (this.longitude(coords[j]) - this.longitude(coords[i])) +\n this.latitude(coords[i])\n )\n ) {\n c = !c;\n }\n\n }\n\n return c;\n\n },\n\n\n /**\n * Pre calculate the polygon coords, to speed up the point inside check.\n * Use this function before calling isPointInsideWithPreparedPolygon()\n * @see Algorythm from http://alienryderflex.com/polygon/\n * @param array array with coords e.g. [{latitude: 51.5143, longitude: 7.4138}, {latitude: 123, longitude: 123}, ...]\n */\n preparePolygonForIsPointInsideOptimized: function(coords) {\n\n for(var i = 0, j = coords.length-1; i < coords.length; i++) {\n\n if(this.longitude(coords[j]) === this.longitude(coords[i])) {\n\n coords[i].constant = this.latitude(coords[i]);\n coords[i].multiple = 0;\n\n } else {\n\n coords[i].constant = this.latitude(coords[i]) - (\n this.longitude(coords[i]) * this.latitude(coords[j])\n ) / (\n this.longitude(coords[j]) - this.longitude(coords[i])\n ) + (\n this.longitude(coords[i])*this.latitude(coords[i])\n ) / (\n this.longitude(coords[j])-this.longitude(coords[i])\n );\n\n coords[i].multiple = (\n this.latitude(coords[j])-this.latitude(coords[i])\n ) / (\n this.longitude(coords[j])-this.longitude(coords[i])\n );\n\n }\n\n j=i;\n\n }\n\n },\n\n /**\n * Checks whether a point is inside of a polygon or not.\n * \"This is useful if you have many points that need to be tested against the same (static) polygon.\"\n * Please call the function preparePolygonForIsPointInsideOptimized() with the same coords object before using this function.\n * Note that the polygon coords must be in correct order!\n *\n * @see Algorythm from http://alienryderflex.com/polygon/\n *\n * @param object coordinate to check e.g. {latitude: 51.5023, longitude: 7.3815}\n * @param array array with coords e.g. [{latitude: 51.5143, longitude: 7.4138}, {latitude: 123, longitude: 123}, ...]\n * @return bool true if the coordinate is inside the given polygon\n */\n isPointInsideWithPreparedPolygon: function(point, coords) {\n\n var flgPointInside = false,\n y = this.longitude(point),\n x = this.latitude(point);\n\n for(var i = 0, j = coords.length-1; i < coords.length; i++) {\n\n if ((this.longitude(coords[i]) < y && this.longitude(coords[j]) >=y ||\n this.longitude(coords[j]) < y && this.longitude(coords[i]) >= y)) {\n\n flgPointInside^=(y*coords[i].multiple+coords[i].constant < x);\n\n }\n\n j=i;\n\n }\n\n return flgPointInside;\n\n },\n\n\n /**\n * Shortcut for geolib.isPointInside()\n */\n isInside: function() {\n return this.isPointInside.apply(this, arguments);\n },\n\n\n /**\n * Checks whether a point is inside of a circle or not.\n *\n * @param object coordinate to check (e.g. {latitude: 51.5023, longitude: 7.3815})\n * @param object coordinate of the circle's center (e.g. {latitude: 51.4812, longitude: 7.4025})\n * @param integer maximum radius in meters\n * @return bool true if the coordinate is within the given radius\n */\n isPointInCircle: function(latlng, center, radius) {\n return this.getDistance(latlng, center) < radius;\n },\n\n\n /**\n * Shortcut for geolib.isPointInCircle()\n */\n withinRadius: function() {\n return this.isPointInCircle.apply(this, arguments);\n },\n\n\n /**\n * Gets rhumb line bearing of two points. Find out about the difference between rhumb line and\n * great circle bearing on Wikipedia. It's quite complicated. Rhumb line should be fine in most cases:\n *\n * http://en.wikipedia.org/wiki/Rhumb_line#General_and_mathematical_description\n *\n * Function heavily based on Doug Vanderweide's great PHP version (licensed under GPL 3.0)\n * http://www.dougv.com/2009/07/13/calculating-the-bearing-and-compass-rose-direction-between-two-latitude-longitude-coordinates-in-php/\n *\n * @param object origin coordinate (e.g. {latitude: 51.5023, longitude: 7.3815})\n * @param object destination coordinate\n * @return integer calculated bearing\n */\n getRhumbLineBearing: function(originLL, destLL) {\n\n // difference of longitude coords\n var diffLon = this.longitude(destLL).toRad() - this.longitude(originLL).toRad();\n\n // difference latitude coords phi\n var diffPhi = Math.log(\n Math.tan(\n this.latitude(destLL).toRad() / 2 + Geolib.PI_DIV4\n ) /\n Math.tan(\n this.latitude(originLL).toRad() / 2 + Geolib.PI_DIV4\n )\n );\n\n // recalculate diffLon if it is greater than pi\n if(Math.abs(diffLon) > Math.PI) {\n if(diffLon > 0) {\n diffLon = (Geolib.PI_X2 - diffLon) * -1;\n }\n else {\n diffLon = Geolib.PI_X2 + diffLon;\n }\n }\n\n //return the angle, normalized\n return (Math.atan2(diffLon, diffPhi).toDeg() + 360) % 360;\n\n },\n\n\n /**\n * Gets great circle bearing of two points. See description of getRhumbLineBearing for more information\n *\n * @param object origin coordinate (e.g. {latitude: 51.5023, longitude: 7.3815})\n * @param object destination coordinate\n * @return integer calculated bearing\n */\n getBearing: function(originLL, destLL) {\n\n destLL['latitude'] = this.latitude(destLL);\n destLL['longitude'] = this.longitude(destLL);\n originLL['latitude'] = this.latitude(originLL);\n originLL['longitude'] = this.longitude(originLL);\n\n var bearing = (\n (\n Math.atan2(\n Math.sin(\n destLL['longitude'].toRad() -\n originLL['longitude'].toRad()\n ) *\n Math.cos(\n destLL['latitude'].toRad()\n ),\n Math.cos(\n originLL['latitude'].toRad()\n ) *\n Math.sin(\n destLL['latitude'].toRad()\n ) -\n Math.sin(\n originLL['latitude'].toRad()\n ) *\n Math.cos(\n destLL['latitude'].toRad()\n ) *\n Math.cos(\n destLL['longitude'].toRad() - originLL['longitude'].toRad()\n )\n )\n ).toDeg() + 360\n ) % 360;\n\n return bearing;\n\n },\n\n\n /**\n * Gets the compass direction from an origin coordinate to a destination coordinate.\n *\n * @param object origin coordinate (e.g. {latitude: 51.5023, longitude: 7.3815})\n * @param object destination coordinate\n * @param string Bearing mode. Can be either circle or rhumbline\n * @return object Returns an object with a rough (NESW) and an exact direction (NNE, NE, ENE, E, ESE, etc).\n */\n getCompassDirection: function(originLL, destLL, bearingMode) {\n\n var direction;\n var bearing;\n\n if(bearingMode == 'circle') {\n // use great circle bearing\n bearing = this.getBearing(originLL, destLL);\n } else {\n // default is rhumb line bearing\n bearing = this.getRhumbLineBearing(originLL, destLL);\n }\n\n switch(Math.round(bearing/22.5)) {\n case 1:\n direction = {exact: \"NNE\", rough: \"N\"};\n break;\n case 2:\n direction = {exact: \"NE\", rough: \"N\"};\n break;\n case 3:\n direction = {exact: \"ENE\", rough: \"E\"};\n break;\n case 4:\n direction = {exact: \"E\", rough: \"E\"};\n break;\n case 5:\n direction = {exact: \"ESE\", rough: \"E\"};\n break;\n case 6:\n direction = {exact: \"SE\", rough: \"E\"};\n break;\n case 7:\n direction = {exact: \"SSE\", rough: \"S\"};\n break;\n case 8:\n direction = {exact: \"S\", rough: \"S\"};\n break;\n case 9:\n direction = {exact: \"SSW\", rough: \"S\"};\n break;\n case 10:\n direction = {exact: \"SW\", rough: \"S\"};\n break;\n case 11:\n direction = {exact: \"WSW\", rough: \"W\"};\n break;\n case 12:\n direction = {exact: \"W\", rough: \"W\"};\n break;\n case 13:\n direction = {exact: \"WNW\", rough: \"W\"};\n break;\n case 14:\n direction = {exact: \"NW\", rough: \"W\"};\n break;\n case 15:\n direction = {exact: \"NNW\", rough: \"N\"};\n break;\n default:\n direction = {exact: \"N\", rough: \"N\"};\n }\n\n direction['bearing'] = bearing;\n return direction;\n\n },\n\n\n /**\n * Shortcut for getCompassDirection\n */\n getDirection: function(originLL, destLL, bearingMode) {\n return this.getCompassDirection.apply(this, arguments);\n },\n\n\n /**\n * Sorts an array of coords by distance from a reference coordinate\n *\n * @param object reference coordinate e.g. {latitude: 51.5023, longitude: 7.3815}\n * @param mixed array or object with coords [{latitude: 51.5143, longitude: 7.4138}, {latitude: 123, longitude: 123}, ...]\n * @return array ordered array\n */\n orderByDistance: function(latlng, coords) {\n\n var coordsArray = Object.keys(coords).map(function(idx) {\n var distance = this.getDistance(latlng, coords[idx]);\n var augmentedCoord = Object.create(coords[idx]);\n augmentedCoord.distance = distance;\n augmentedCoord.key = idx;\n return augmentedCoord;\n }, this);\n\n return coordsArray.sort(function(a, b) {\n return a.distance - b.distance;\n });\n\n },\n\n /**\n * Check if a point lies in line created by two other points\n *\n * @param object Point to check: {latitude: 123, longitude: 123}\n * @param object Start of line {latitude: 123, longitude: 123}\n * @param object End of line {latitude: 123, longitude: 123}\n * @return boolean\n */\n isPointInLine: function(point, start, end) {\n\n return (this.getDistance(start, point, 1, 3)+this.getDistance(point, end, 1, 3)).toFixed(3)==this.getDistance(start, end, 1, 3);\n },\n\n /**\n * Check if a point lies within a given distance from a line created by two other points\n *\n * @param object Point to check: {latitude: 123, longitude: 123}\n * @param object Start of line {latitude: 123, longitude: 123}\n * @param object End of line {latitude: 123, longitude: 123}\n * @pararm float maximum distance from line\n * @return boolean\n */\n isPointNearLine: function(point, start, end, distance) {\n return this.getDistanceFromLine(point, start, end) < distance;\n },\n\n /**\n * return the minimum distance from a point to a line\n *\n * @param object Point away from line\n * @param object Start of line {latitude: 123, longitude: 123}\n * @param object End of line {latitude: 123, longitude: 123}\n * @return float distance from point to line\n */\n getDistanceFromLine: function(point, start, end) {\n var d1 = this.getDistance(start, point, 1, 3);\n var d2 = this.getDistance(point, end, 1, 3);\n var d3 = this.getDistance(start, end, 1, 3);\n var distance = 0;\n\n // alpha is the angle between the line from start to point, and from start to end //\n var alpha = Math.acos((d1*d1 + d3*d3 - d2*d2)/(2*d1*d3));\n // beta is the angle between the line from end to point and from end to start //\n var beta = Math.acos((d2*d2 + d3*d3 - d1*d1)/(2*d2*d3));\n\n // if the angle is greater than 90 degrees, then the minimum distance is the\n // line from the start to the point //\n if(alpha>Math.PI/2) {\n distance = d1;\n }\n // same for the beta //\n else if(beta > Math.PI/2) {\n distance = d2;\n }\n // otherwise the minimum distance is achieved through a line perpendular to the start-end line,\n // which goes from the start-end line to the point //\n else {\n distance = Math.sin(alpha) * d1;\n }\n\n return distance;\n },\n\n /**\n * Finds the nearest coordinate to a reference coordinate\n *\n * @param object reference coordinate e.g. {latitude: 51.5023, longitude: 7.3815}\n * @param mixed array or object with coords [{latitude: 51.5143, longitude: 7.4138}, {latitude: 123, longitude: 123}, ...]\n * @return array ordered array\n */\n findNearest: function(latlng, coords, offset, limit) {\n\n offset = offset || 0;\n limit = limit || 1;\n var ordered = this.orderByDistance(latlng, coords);\n\n if(limit === 1) {\n return ordered[offset];\n } else {\n return ordered.splice(offset, limit);\n }\n\n },\n\n\n /**\n * Calculates the length of a given path\n *\n * @param mixed array or object with coords [{latitude: 51.5143, longitude: 7.4138}, {latitude: 123, longitude: 123}, ...]\n * @return integer length of the path (in meters)\n */\n getPathLength: function(coords) {\n\n var dist = 0;\n var last;\n\n for (var i = 0, l = coords.length; i < l; ++i) {\n if(last) {\n //console.log(coords[i], last, this.getDistance(coords[i], last));\n dist += this.getDistance(this.coords(coords[i]), last);\n }\n last = this.coords(coords[i]);\n }\n\n return dist;\n\n },\n\n\n /**\n * Calculates the speed between to points within a given time span.\n *\n * @param object coords with javascript timestamp {latitude: 51.5143, longitude: 7.4138, time: 1360231200880}\n * @param object coords with javascript timestamp {latitude: 51.5502, longitude: 7.4323, time: 1360245600460}\n * @param object options (currently \"unit\" is the only option. Default: km(h));\n * @return float speed in unit per hour\n */\n getSpeed: function(start, end, options) {\n\n var unit = options && options.unit || 'km';\n\n if(unit == 'mph') {\n unit = 'mi';\n } else if(unit == 'kmh') {\n unit = 'km';\n }\n\n var distance = geolib.getDistance(start, end);\n var time = ((end.time*1)/1000) - ((start.time*1)/1000);\n var mPerHr = (distance/time)*3600;\n var speed = Math.round(mPerHr * this.measures[unit] * 10000)/10000;\n return speed;\n\n },\n\n\n /**\n * Computes the destination point given an initial point, a distance\n * and a bearing\n *\n * see http://www.movable-type.co.uk/scripts/latlong.html for the original code\n *\n * @param object start coordinate (e.g. {latitude: 51.5023, longitude: 7.3815})\n * @param float longitude of the inital point in degree\n * @param float distance to go from the inital point in meter\n * @param float bearing in degree of the direction to go, e.g. 0 = north, 180 = south\n * @param float optional (in meter), defaults to mean radius of the earth\n * @return object {latitude: destLat (in degree), longitude: destLng (in degree)}\n */\n computeDestinationPoint: function(start, distance, bearing, radius) {\n\n var lat = this.latitude(start);\n var lng = this.longitude(start);\n\n radius = (typeof radius === 'undefined') ? this.radius : Number(radius);\n\n var δ = Number(distance) / radius; // angular distance in radians\n var θ = Number(bearing).toRad();\n\n var φ1 = Number(lat).toRad();\n var λ1 = Number(lng).toRad();\n\n var φ2 = Math.asin( Math.sin(φ1)*Math.cos(δ) +\n Math.cos(φ1)*Math.sin(δ)*Math.cos(θ) );\n var λ2 = λ1 + Math.atan2(Math.sin(θ)*Math.sin(δ)*Math.cos(φ1),\n Math.cos(δ)-Math.sin(φ1)*Math.sin(φ2));\n λ2 = (λ2+3*Math.PI) % (2*Math.PI) - Math.PI; // normalise to -180..+180°\n\n return {\n latitude: φ2.toDeg(),\n longitude: λ2.toDeg()\n };\n\n },\n\n\n /**\n * Converts a distance from meters to km, mm, cm, mi, ft, in or yd\n *\n * @param string Format to be converted in\n * @param float Distance in meters\n * @param float Decimal places for rounding (default: 4)\n * @return float Converted distance\n */\n convertUnit: function(unit, distance, round) {\n\n if(distance === 0) {\n\n return 0;\n\n } else if(typeof distance === 'undefined') {\n\n if(this.distance === null) {\n throw new Error('No distance was given');\n } else if(this.distance === 0) {\n return 0;\n } else {\n distance = this.distance;\n }\n\n }\n\n unit = unit || 'm';\n round = (null == round ? 4 : round);\n\n if(typeof this.measures[unit] !== 'undefined') {\n return this.round(distance * this.measures[unit], round);\n } else {\n throw new Error('Unknown unit for conversion.');\n }\n\n },\n\n\n /**\n * Checks if a value is in decimal format or, if neccessary, converts to decimal\n *\n * @param mixed Value(s) to be checked/converted (array of latlng objects, latlng object, sexagesimal string, float)\n * @return float Input data in decimal format\n */\n useDecimal: function(value) {\n\n if(Object.prototype.toString.call(value) === '[object Array]') {\n\n var geolib = this;\n\n value = value.map(function(val) {\n\n //if(!isNaN(parseFloat(val))) {\n if(geolib.isDecimal(val)) {\n\n return geolib.useDecimal(val);\n\n } else if(typeof val == 'object') {\n\n if(geolib.validate(val)) {\n\n return geolib.coords(val);\n\n } else {\n\n for(var prop in val) {\n val[prop] = geolib.useDecimal(val[prop]);\n }\n\n return val;\n\n }\n\n } else if(geolib.isSexagesimal(val)) {\n\n return geolib.sexagesimal2decimal(val);\n\n } else {\n\n return val;\n\n }\n\n });\n\n return value;\n\n } else if(typeof value === 'object' && this.validate(value)) {\n\n return this.coords(value);\n\n } else if(typeof value === 'object') {\n\n for(var prop in value) {\n value[prop] = this.useDecimal(value[prop]);\n }\n\n return value;\n\n }\n\n\n if (this.isDecimal(value)) {\n\n return parseFloat(value);\n\n } else if(this.isSexagesimal(value) === true) {\n\n return parseFloat(this.sexagesimal2decimal(value));\n\n }\n\n throw new Error('Unknown format.');\n\n },\n\n /**\n * Converts a decimal coordinate value to sexagesimal format\n *\n * @param float decimal\n * @return string Sexagesimal value (XX° YY' ZZ\")\n */\n decimal2sexagesimal: function(dec) {\n\n if (dec in this.sexagesimal) {\n return this.sexagesimal[dec];\n }\n\n var tmp = dec.toString().split('.');\n\n var deg = Math.abs(tmp[0]);\n var min = ('0.' + (tmp[1] || 0))*60;\n var sec = min.toString().split('.');\n\n min = Math.floor(min);\n sec = (('0.' + (sec[1] || 0)) * 60).toFixed(2);\n\n this.sexagesimal[dec] = (deg + '° ' + min + \"' \" + sec + '\"');\n\n return this.sexagesimal[dec];\n\n },\n\n\n /**\n * Converts a sexagesimal coordinate to decimal format\n *\n * @param float Sexagesimal coordinate\n * @return string Decimal value (XX.XXXXXXXX)\n */\n sexagesimal2decimal: function(sexagesimal) {\n\n if (sexagesimal in this.decimal) {\n return this.decimal[sexagesimal];\n }\n\n var regEx = new RegExp(this.sexagesimalPattern);\n var data = regEx.exec(sexagesimal);\n var min = 0, sec = 0;\n\n if(data) {\n min = parseFloat(data[2]/60);\n sec = parseFloat(data[4]/3600) || 0;\n }\n\n var dec = ((parseFloat(data[1]) + min + sec)).toFixed(8);\n //var dec = ((parseFloat(data[1]) + min + sec));\n\n // South and West are negative decimals\n dec = (data[7] == 'S' || data[7] == 'W') ? parseFloat(-dec) : parseFloat(dec);\n //dec = (data[7] == 'S' || data[7] == 'W') ? -dec : dec;\n\n this.decimal[sexagesimal] = dec;\n\n return dec;\n\n },\n\n\n /**\n * Checks if a value is in decimal format\n *\n * @param string Value to be checked\n * @return bool True if in sexagesimal format\n */\n isDecimal: function(value) {\n\n value = value.toString().replace(/\\s*/, '');\n\n // looks silly but works as expected\n // checks if value is in decimal format\n return (!isNaN(parseFloat(value)) && parseFloat(value) == value);\n\n },\n\n\n /**\n * Checks if a value is in sexagesimal format\n *\n * @param string Value to be checked\n * @return bool True if in sexagesimal format\n */\n isSexagesimal: function(value) {\n\n value = value.toString().replace(/\\s*/, '');\n\n return this.sexagesimalPattern.test(value);\n\n },\n\n round: function(value, n) {\n var decPlace = Math.pow(10, n);\n return Math.round(value * decPlace)/decPlace;\n }\n\n });\n\n // Node module\n if (typeof module !== 'undefined' && typeof module.exports !== 'undefined') {\n\n module.exports = geolib;\n\n // react native\n if (typeof global === 'object') {\n global.geolib = geolib;\n }\n\n // AMD module\n } else if (true) {\n\n !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = (function () {\n return geolib;\n }).apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\n // we're in a browser\n } else {\n\n global.geolib = geolib;\n\n }\n\n}(this));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvZ2VvbGliL2Rpc3QvZ2VvbGliLmpzPzcwNmYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLDRCQUE0QixJQUFJLFlBQVksSUFBSSxjQUFjLElBQUksZ0JBQWdCLElBQUksVUFBVSxJQUFJO0FBQ3BHLFNBQVM7QUFDVDtBQUNBO0FBQ0EsdUJBQXVCLFNBQVM7QUFDaEMsdUJBQXVCLGFBQWE7QUFDcEMsdUJBQXVCLFdBQVc7QUFDbEMsdUJBQXVCLFlBQVk7QUFDbkMsdUJBQXVCLHNCQUFzQjtBQUM3Qyx1QkFBdUIsc0JBQXNCO0FBQzdDLHVCQUF1QixxQkFBcUI7QUFDNUMsdUJBQXVCLG9CQUFvQjtBQUMzQyx1QkFBdUI7QUFDdkIsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLG1CQUFtQjs7QUFFbkIsdUJBQXVCOztBQUV2Qjs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9FQUFvRSxXQUFXLGNBQWMsRUFBRTtBQUMvRixpQkFBaUI7O0FBRWpCOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7O0FBRVQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7O0FBR1Q7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDO0FBQzlDLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxzRUFBc0U7QUFDdEU7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsYUFBYTs7QUFFYjtBQUNBLDJCQUEyQjtBQUMzQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLG1EQUFtRDs7QUFFbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxvQkFBb0I7QUFDcEI7O0FBRUEsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUMsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBO0FBQ0EsMkRBQTJELG9DQUFvQyxHQUFHLHlDQUF5QztBQUMzSSxxQ0FBcUM7QUFDckM7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQSw2REFBNkQscUNBQXFDLEdBQUcsOEJBQThCO0FBQ25JLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDhDQUE4QyxPQUFPOztBQUVyRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQSxTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQsb0NBQW9DLEdBQUcseUNBQXlDO0FBQzNJLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhEQUE4RDtBQUM5RCw2REFBNkQscUNBQXFDLEdBQUcsOEJBQThCO0FBQ25JO0FBQ0E7QUFDQTs7QUFFQSxvRUFBb0UsU0FBUzs7QUFFN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RCxxQ0FBcUMsR0FBRyw4QkFBOEI7QUFDbkk7QUFDQTs7QUFFQSwrQ0FBK0MsbUJBQW1COztBQUVsRTs7QUFFQTtBQUNBOztBQUVBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUEsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBEO0FBQzFELHlEQUF5RCxxQ0FBcUMsR0FBRyw4QkFBOEI7QUFDL0g7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSwrQ0FBK0MsbUJBQW1COztBQUVsRTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7QUFDQSwrREFBK0QscUNBQXFDO0FBQ3BHLDZFQUE2RSxxQ0FBcUM7QUFDbEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2REFBNkQscUNBQXFDO0FBQ2xHO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RCxxQ0FBcUM7QUFDbEc7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBO0FBQ0EsNkRBQTZELHFDQUFxQztBQUNsRztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDOztBQUVBO0FBQ0E7O0FBRUEsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTtBQUNBLCtEQUErRDtBQUMvRCxrRUFBa0UscUNBQXFDLEdBQUcsOEJBQThCO0FBQ3hJO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhOztBQUViO0FBQ0E7QUFDQSxhQUFhOztBQUViLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DLDZDQUE2QztBQUM3QywyQ0FBMkM7QUFDM0M7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQSwrQ0FBK0M7QUFDL0MsNkNBQTZDO0FBQzdDLDJDQUEyQztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUzs7QUFFVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3QywyQ0FBMkM7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0EsK0RBQStEO0FBQy9ELGtFQUFrRSxxQ0FBcUMsR0FBRyw4QkFBOEI7QUFDeEk7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUEsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFLHFDQUFxQyxHQUFHLDhCQUE4QjtBQUN4STtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSw4Q0FBOEMsT0FBTztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBO0FBQ0Esc0VBQXNFO0FBQ3RFLHNFQUFzRTtBQUN0RTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTOzs7QUFHVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQscUNBQXFDO0FBQ2pHO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQSw4Q0FBOEM7QUFDOUM7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDs7QUFFeEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBLGFBQWE7O0FBRWI7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUEscUJBQXFCOztBQUVyQjs7QUFFQTs7QUFFQSx5QkFBeUI7O0FBRXpCO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQSxxQkFBcUI7O0FBRXJCOztBQUVBLHFCQUFxQjs7QUFFckI7O0FBRUE7O0FBRUEsaUJBQWlCOztBQUVqQjs7QUFFQSxhQUFhOztBQUViOztBQUVBLGFBQWE7O0FBRWI7QUFDQTtBQUNBOztBQUVBOztBQUVBOzs7QUFHQTs7QUFFQTs7QUFFQSxhQUFhOztBQUViOztBQUVBOztBQUVBOztBQUVBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBOztBQUVBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUEsU0FBUzs7O0FBR1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBLFNBQVM7OztBQUdUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBLFNBQVM7O0FBRVQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSzs7QUFFTDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsS0FBSyxVQUFVLElBQTBDOztBQUV6RCxRQUFRLGlDQUFpQixFQUFFLG1DQUFFO0FBQzdCO0FBQ0EsU0FBUztBQUFBLG9HQUFDOztBQUVWO0FBQ0EsS0FBSzs7QUFFTDs7QUFFQTs7QUFFQSxDQUFDIiwiZmlsZSI6Ii4vbm9kZV9tb2R1bGVzL2dlb2xpYi9kaXN0L2dlb2xpYi5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qISBnZW9saWIgMi4wLjIzIGJ5IE1hbnVlbCBCaWVoXHJcbiogTGlicmFyeSB0byBwcm92aWRlIGdlbyBmdW5jdGlvbnMgbGlrZSBkaXN0YW5jZSBjYWxjdWxhdGlvbixcclxuKiBjb252ZXJzaW9uIG9mIGRlY2ltYWwgY29vcmRpbmF0ZXMgdG8gc2V4YWdlc2ltYWwgYW5kIHZpY2UgdmVyc2EsIGV0Yy5cclxuKiBXR1MgODQgKFdvcmxkIEdlb2RldGljIFN5c3RlbSAxOTg0KVxyXG4qIFxyXG4qIEBhdXRob3IgTWFudWVsIEJpZWhcclxuKiBAdXJsIGh0dHA6Ly93d3cubWFudWVsYmllaC5jb20vXHJcbiogQHZlcnNpb24gMi4wLjIzXHJcbiogQGxpY2Vuc2UgTUlUIFxyXG4qKi87KGZ1bmN0aW9uKGdsb2JhbCwgdW5kZWZpbmVkKSB7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIGZ1bmN0aW9uIEdlb2xpYigpIHt9XG5cbiAgICAvLyBDb25zdGFudHNcbiAgICBHZW9saWIuVE9fUkFEID0gTWF0aC5QSSAvIDE4MDtcbiAgICBHZW9saWIuVE9fREVHID0gMTgwIC8gTWF0aC5QSTtcbiAgICBHZW9saWIuUElfWDIgPSBNYXRoLlBJICogMjtcbiAgICBHZW9saWIuUElfRElWNCA9IE1hdGguUEkgLyA0O1xuXG4gICAgLy8gU2V0dGluZyByZWFkb25seSBkZWZhdWx0c1xuICAgIHZhciBnZW9saWIgPSBPYmplY3QuY3JlYXRlKEdlb2xpYi5wcm90b3R5cGUsIHtcbiAgICAgICAgdmVyc2lvbjoge1xuICAgICAgICAgICAgdmFsdWU6IFwiMi4wLjIzXCJcbiAgICAgICAgfSxcbiAgICAgICAgcmFkaXVzOiB7XG4gICAgICAgICAgICB2YWx1ZTogNjM3ODEzN1xuICAgICAgICB9LFxuICAgICAgICBtaW5MYXQ6IHtcbiAgICAgICAgICAgIHZhbHVlOiAtOTBcbiAgICAgICAgfSxcbiAgICAgICAgbWF4TGF0OiB7XG4gICAgICAgICAgICB2YWx1ZTogOTBcbiAgICAgICAgfSxcbiAgICAgICAgbWluTG9uOiB7XG4gICAgICAgICAgICB2YWx1ZTogLTE4MFxuICAgICAgICB9LFxuICAgICAgICBtYXhMb246IHtcbiAgICAgICAgICAgIHZhbHVlOiAxODBcbiAgICAgICAgfSxcbiAgICAgICAgc2V4YWdlc2ltYWxQYXR0ZXJuOiB7XG4gICAgICAgICAgICB2YWx1ZTogL14oWzAtOV17MSwzfSnCsFxccyooWzAtOV17MSwzfSg/OlxcLig/OlswLTldezEsMn0pKT8pJ1xccyooKFswLTldezEsM30oXFwuKFswLTldezEsNH0pKT8pXCJcXHMqKT8oW05FT1NXXT8pJC9cbiAgICAgICAgfSxcbiAgICAgICAgbWVhc3VyZXM6IHtcbiAgICAgICAgICAgIHZhbHVlOiBPYmplY3QuY3JlYXRlKE9iamVjdC5wcm90b3R5cGUsIHtcbiAgICAgICAgICAgICAgICBcIm1cIiA6IHt2YWx1ZTogMX0sXG4gICAgICAgICAgICAgICAgXCJrbVwiOiB7dmFsdWU6IDAuMDAxfSxcbiAgICAgICAgICAgICAgICBcImNtXCI6IHt2YWx1ZTogMTAwfSxcbiAgICAgICAgICAgICAgICBcIm1tXCI6IHt2YWx1ZTogMTAwMH0sXG4gICAgICAgICAgICAgICAgXCJtaVwiOiB7dmFsdWU6ICgxIC8gMTYwOS4zNDQpfSxcbiAgICAgICAgICAgICAgICBcInNtXCI6IHt2YWx1ZTogKDEgLyAxODUyLjIxNil9LFxuICAgICAgICAgICAgICAgIFwiZnRcIjoge3ZhbHVlOiAoMTAwIC8gMzAuNDgpfSxcbiAgICAgICAgICAgICAgICBcImluXCI6IHt2YWx1ZTogKDEwMCAvIDIuNTQpfSxcbiAgICAgICAgICAgICAgICBcInlkXCI6IHt2YWx1ZTogKDEgLyAwLjkxNDQpfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAgcHJvdG90eXBlOiB7XG4gICAgICAgICAgICB2YWx1ZTogR2VvbGliLnByb3RvdHlwZVxuICAgICAgICB9LFxuICAgICAgICBleHRlbmQ6IHtcbiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbihtZXRob2RzLCBvdmVyd3JpdGUpIHtcbiAgICAgICAgICAgICAgICBmb3IodmFyIHByb3AgaW4gbWV0aG9kcykge1xuICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgZ2VvbGliLnByb3RvdHlwZVtwcm9wXSA9PT0gJ3VuZGVmaW5lZCcgfHwgb3ZlcndyaXRlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgbWV0aG9kc1twcm9wXSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgbWV0aG9kc1twcm9wXS5iaW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbGliLnByb3RvdHlwZVtwcm9wXSA9IG1ldGhvZHNbcHJvcF0uYmluZChnZW9saWIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9saWIucHJvdG90eXBlW3Byb3BdID0gbWV0aG9kc1twcm9wXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHR5cGVvZihOdW1iZXIucHJvdG90eXBlLnRvUmFkKSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgTnVtYmVyLnByb3RvdHlwZS50b1JhZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMgKiBHZW9saWIuVE9fUkFEO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YoTnVtYmVyLnByb3RvdHlwZS50b0RlZykgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIE51bWJlci5wcm90b3R5cGUudG9EZWcgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzICogR2VvbGliLlRPX0RFRztcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBIZXJlIGNvbWVzIHRoZSBtYWdpY1xuICAgIGdlb2xpYi5leHRlbmQoe1xuXG4gICAgICAgIGRlY2ltYWw6IHt9LFxuXG4gICAgICAgIHNleGFnZXNpbWFsOiB7fSxcblxuICAgICAgICBkaXN0YW5jZTogbnVsbCxcblxuICAgICAgICBnZXRLZXlzOiBmdW5jdGlvbihwb2ludCkge1xuXG4gICAgICAgICAgICAvLyBHZW9KU09OIEFycmF5IFtsb25naXR1ZGUsIGxhdGl0dWRlKCwgZWxldmF0aW9uKV1cbiAgICAgICAgICAgIGlmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChwb2ludCkgPT0gJ1tvYmplY3QgQXJyYXldJykge1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbG9uZ2l0dWRlOiBwb2ludC5sZW5ndGggPj0gMSA/IDAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGxhdGl0dWRlOiBwb2ludC5sZW5ndGggPj0gMiA/IDEgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGVsZXZhdGlvbjogcG9pbnQubGVuZ3RoID49IDMgPyAyIDogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZ2V0S2V5ID0gZnVuY3Rpb24ocG9zc2libGVWYWx1ZXMpIHtcblxuICAgICAgICAgICAgICAgIHZhciBrZXk7XG5cbiAgICAgICAgICAgICAgICBwb3NzaWJsZVZhbHVlcy5ldmVyeShmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgaWYgcG9pbnQgaXMgYW4gb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBwb2ludCAhPSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvaW50Lmhhc093blByb3BlcnR5KHZhbCkgPyAoZnVuY3Rpb24oKSB7IGtleSA9IHZhbDsgcmV0dXJuIGZhbHNlOyB9KCkpIDogdHJ1ZTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG5cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHZhciBsb25naXR1ZGUgPSBnZXRLZXkoWydsbmcnLCAnbG9uJywgJ2xvbmdpdHVkZSddKTtcbiAgICAgICAgICAgIHZhciBsYXRpdHVkZSA9IGdldEtleShbJ2xhdCcsICdsYXRpdHVkZSddKTtcbiAgICAgICAgICAgIHZhciBlbGV2YXRpb24gPSBnZXRLZXkoWydhbHQnLCAnYWx0aXR1ZGUnLCAnZWxldmF0aW9uJywgJ2VsZXYnXSk7XG5cbiAgICAgICAgICAgIC8vIHJldHVybiB1bmRlZmluZWQgaWYgbm90IGF0IGxlYXN0IG9uZSB2YWxpZCBwcm9wZXJ0eSB3YXMgZm91bmRcbiAgICAgICAgICAgIGlmKHR5cGVvZiBsYXRpdHVkZSA9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBsb25naXR1ZGUgPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICB0eXBlb2YgZWxldmF0aW9uID09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBsYXRpdHVkZTogbGF0aXR1ZGUsXG4gICAgICAgICAgICAgICAgbG9uZ2l0dWRlOiBsb25naXR1ZGUsXG4gICAgICAgICAgICAgICAgZWxldmF0aW9uOiBlbGV2YXRpb25cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgfSxcblxuICAgICAgICAvLyByZXR1cm5zIGxhdGl0dWRlIG9mIGEgZ2l2ZW4gcG9pbnQsIGNvbnZlcnRlZCB0byBkZWNpbWFsXG4gICAgICAgIC8vIHNldCByYXcgdG8gdHJ1ZSB0byBhdm9pZCBjb252ZXJzaW9uXG4gICAgICAgIGdldExhdDogZnVuY3Rpb24ocG9pbnQsIHJhdykge1xuICAgICAgICAgICAgcmV0dXJuIHJhdyA9PT0gdHJ1ZSA/IHBvaW50W3RoaXMuZ2V0S2V5cyhwb2ludCkubGF0aXR1ZGVdIDogdGhpcy51c2VEZWNpbWFsKHBvaW50W3RoaXMuZ2V0S2V5cyhwb2ludCkubGF0aXR1ZGVdKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBBbGlhcyBmb3IgZ2V0TGF0XG4gICAgICAgIGxhdGl0dWRlOiBmdW5jdGlvbihwb2ludCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGF0LmNhbGwodGhpcywgcG9pbnQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIHJldHVybnMgbG9uZ2l0dWRlIG9mIGEgZ2l2ZW4gcG9pbnQsIGNvbnZlcnRlZCB0byBkZWNpbWFsXG4gICAgICAgIC8vIHNldCByYXcgdG8gdHJ1ZSB0byBhdm9pZCBjb252ZXJzaW9uXG4gICAgICAgIGdldExvbjogZnVuY3Rpb24ocG9pbnQsIHJhdykge1xuICAgICAgICAgICAgcmV0dXJuIHJhdyA9PT0gdHJ1ZSA/IHBvaW50W3RoaXMuZ2V0S2V5cyhwb2ludCkubG9uZ2l0dWRlXSA6IHRoaXMudXNlRGVjaW1hbChwb2ludFt0aGlzLmdldEtleXMocG9pbnQpLmxvbmdpdHVkZV0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIEFsaWFzIGZvciBnZXRMb25cbiAgICAgICAgbG9uZ2l0dWRlOiBmdW5jdGlvbihwb2ludCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TG9uLmNhbGwodGhpcywgcG9pbnQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldEVsZXY6IGZ1bmN0aW9uKHBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gcG9pbnRbdGhpcy5nZXRLZXlzKHBvaW50KS5lbGV2YXRpb25dO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIEFsaWFzIGZvciBnZXRFbGV2XG4gICAgICAgIGVsZXZhdGlvbjogZnVuY3Rpb24ocG9pbnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEVsZXYuY2FsbCh0aGlzLCBwb2ludCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY29vcmRzOiBmdW5jdGlvbihwb2ludCwgcmF3KSB7XG5cbiAgICAgICAgICAgIHZhciByZXR2YWwgPSB7XG4gICAgICAgICAgICAgICAgbGF0aXR1ZGU6IHJhdyA9PT0gdHJ1ZSA/IHBvaW50W3RoaXMuZ2V0S2V5cyhwb2ludCkubGF0aXR1ZGVdIDogdGhpcy51c2VEZWNpbWFsKHBvaW50W3RoaXMuZ2V0S2V5cyhwb2ludCkubGF0aXR1ZGVdKSxcbiAgICAgICAgICAgICAgICBsb25naXR1ZGU6IHJhdyA9PT0gdHJ1ZSA/IHBvaW50W3RoaXMuZ2V0S2V5cyhwb2ludCkubG9uZ2l0dWRlXSA6IHRoaXMudXNlRGVjaW1hbChwb2ludFt0aGlzLmdldEtleXMocG9pbnQpLmxvbmdpdHVkZV0pXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB2YXIgZWxldiA9IHBvaW50W3RoaXMuZ2V0S2V5cyhwb2ludCkuZWxldmF0aW9uXTtcblxuICAgICAgICAgICAgaWYodHlwZW9mIGVsZXYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dmFsWydlbGV2YXRpb24nXSA9IGVsZXY7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXR2YWw7XG5cbiAgICAgICAgfSxcblxuICAgICAgICAvLyBBbGlhcyBmb3IgY29vcmRzXG4gICAgICAgIGxsOiBmdW5jdGlvbihwb2ludCwgcmF3KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb29yZHMuY2FsbCh0aGlzLCBwb2ludCwgcmF3KTtcbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8vIGNoZWNrcyBpZiBhIHZhcmlhYmxlIGNvbnRhaW5zIGEgdmFsaWQgbGF0bG9uZyBvYmplY3RcbiAgICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKHBvaW50KSB7XG5cbiAgICAgICAgICAgIHZhciBrZXlzID0gdGhpcy5nZXRLZXlzKHBvaW50KTtcblxuICAgICAgICAgICAgaWYodHlwZW9mIGtleXMgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBrZXlzLmxhdGl0dWRlID09PSAndW5kZWZpbmVkJyB8fCBrZXlzLmxvbmdpdHVkZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBsYXQgPSBwb2ludFtrZXlzLmxhdGl0dWRlXTtcbiAgICAgICAgICAgIHZhciBsbmcgPSBwb2ludFtrZXlzLmxvbmdpdHVkZV07XG5cbiAgICAgICAgICAgIGlmKHR5cGVvZiBsYXQgPT09ICd1bmRlZmluZWQnIHx8ICF0aGlzLmlzRGVjaW1hbChsYXQpICYmICF0aGlzLmlzU2V4YWdlc2ltYWwobGF0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYodHlwZW9mIGxuZyA9PT0gJ3VuZGVmaW5lZCcgfHwgIXRoaXMuaXNEZWNpbWFsKGxuZykgJiYgIXRoaXMuaXNTZXhhZ2VzaW1hbChsbmcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsYXQgPSB0aGlzLnVzZURlY2ltYWwobGF0KTtcbiAgICAgICAgICAgIGxuZyA9IHRoaXMudXNlRGVjaW1hbChsbmcpO1xuXG4gICAgICAgICAgICBpZihsYXQgPCB0aGlzLm1pbkxhdCB8fCBsYXQgPiB0aGlzLm1heExhdCB8fCBsbmcgPCB0aGlzLm1pbkxvbiB8fCBsbmcgPiB0aGlzLm1heExvbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgKiBDYWxjdWxhdGVzIGdlb2RldGljIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50cyBzcGVjaWZpZWQgYnkgbGF0aXR1ZGUvbG9uZ2l0dWRlIHVzaW5nXG4gICAgICAgICogVmluY2VudHkgaW52ZXJzZSBmb3JtdWxhIGZvciBlbGxpcHNvaWRzXG4gICAgICAgICogVmluY2VudHkgSW52ZXJzZSBTb2x1dGlvbiBvZiBHZW9kZXNpY3Mgb24gdGhlIEVsbGlwc29pZCAoYykgQ2hyaXMgVmVuZXNzIDIwMDItMjAxMFxuICAgICAgICAqIChMaWNlbnNlZCB1bmRlciBDQyBCWSAzLjApXG4gICAgICAgICpcbiAgICAgICAgKiBAcGFyYW0gICAgb2JqZWN0ICAgIFN0YXJ0IHBvc2l0aW9uIHtsYXRpdHVkZTogMTIzLCBsb25naXR1ZGU6IDEyM31cbiAgICAgICAgKiBAcGFyYW0gICAgb2JqZWN0ICAgIEVuZCBwb3NpdGlvbiB7bGF0aXR1ZGU6IDEyMywgbG9uZ2l0dWRlOiAxMjN9XG4gICAgICAgICogQHBhcmFtICAgIGludGVnZXIgICBBY2N1cmFjeSAoaW4gbWV0ZXJzKVxuICAgICAgICAqIEBwYXJhbSAgICBpbnRlZ2VyICAgUHJlY2lzaW9uIChpbiBkZWNpbWFsIGNhc2VzKVxuICAgICAgICAqIEByZXR1cm4gICBpbnRlZ2VyICAgRGlzdGFuY2UgKGluIG1ldGVycylcbiAgICAgICAgKi9cbiAgICAgICAgZ2V0RGlzdGFuY2U6IGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIGFjY3VyYWN5LCBwcmVjaXNpb24pIHtcblxuICAgICAgICAgICAgYWNjdXJhY3kgPSBNYXRoLmZsb29yKGFjY3VyYWN5KSB8fCAxO1xuICAgICAgICAgICAgcHJlY2lzaW9uID0gTWF0aC5mbG9vcihwcmVjaXNpb24pIHx8IDA7XG5cbiAgICAgICAgICAgIHZhciBzID0gdGhpcy5jb29yZHMoc3RhcnQpO1xuICAgICAgICAgICAgdmFyIGUgPSB0aGlzLmNvb3JkcyhlbmQpO1xuXG4gICAgICAgICAgICB2YXIgYSA9IDYzNzgxMzcsIGIgPSA2MzU2NzUyLjMxNDI0NSwgIGYgPSAxLzI5OC4yNTcyMjM1NjM7ICAvLyBXR1MtODQgZWxsaXBzb2lkIHBhcmFtc1xuICAgICAgICAgICAgdmFyIEwgPSAoZVsnbG9uZ2l0dWRlJ10tc1snbG9uZ2l0dWRlJ10pLnRvUmFkKCk7XG5cbiAgICAgICAgICAgIHZhciBjb3NTaWdtYSwgc2lnbWEsIHNpbkFscGhhLCBjb3NTcUFscGhhLCBjb3MyU2lnbWFNLCBzaW5TaWdtYTtcblxuICAgICAgICAgICAgdmFyIFUxID0gTWF0aC5hdGFuKCgxLWYpICogTWF0aC50YW4ocGFyc2VGbG9hdChzWydsYXRpdHVkZSddKS50b1JhZCgpKSk7XG4gICAgICAgICAgICB2YXIgVTIgPSBNYXRoLmF0YW4oKDEtZikgKiBNYXRoLnRhbihwYXJzZUZsb2F0KGVbJ2xhdGl0dWRlJ10pLnRvUmFkKCkpKTtcbiAgICAgICAgICAgIHZhciBzaW5VMSA9IE1hdGguc2luKFUxKSwgY29zVTEgPSBNYXRoLmNvcyhVMSk7XG4gICAgICAgICAgICB2YXIgc2luVTIgPSBNYXRoLnNpbihVMiksIGNvc1UyID0gTWF0aC5jb3MoVTIpO1xuXG4gICAgICAgICAgICB2YXIgbGFtYmRhID0gTCwgbGFtYmRhUCwgaXRlckxpbWl0ID0gMTAwO1xuICAgICAgICAgICAgZG8ge1xuICAgICAgICAgICAgICAgIHZhciBzaW5MYW1iZGEgPSBNYXRoLnNpbihsYW1iZGEpLCBjb3NMYW1iZGEgPSBNYXRoLmNvcyhsYW1iZGEpO1xuICAgICAgICAgICAgICAgIHNpblNpZ21hID0gKFxuICAgICAgICAgICAgICAgICAgICBNYXRoLnNxcnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zVTIgKiBzaW5MYW1iZGFcbiAgICAgICAgICAgICAgICAgICAgICAgICkgKiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zVTIgKiBzaW5MYW1iZGFcbiAgICAgICAgICAgICAgICAgICAgICAgICkgKyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zVTEgKiBzaW5VMiAtIHNpblUxICogY29zVTIgKiBjb3NMYW1iZGFcbiAgICAgICAgICAgICAgICAgICAgICAgICkgKiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zVTEgKiBzaW5VMiAtIHNpblUxICogY29zVTIgKiBjb3NMYW1iZGFcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKHNpblNpZ21hID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZW9saWIuZGlzdGFuY2UgPSAwOyAgLy8gY28taW5jaWRlbnQgcG9pbnRzXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29zU2lnbWEgPSBzaW5VMSAqIHNpblUyICsgY29zVTEgKiBjb3NVMiAqIGNvc0xhbWJkYTtcbiAgICAgICAgICAgICAgICBzaWdtYSA9IE1hdGguYXRhbjIoc2luU2lnbWEsIGNvc1NpZ21hKTtcbiAgICAgICAgICAgICAgICBzaW5BbHBoYSA9IGNvc1UxICogY29zVTIgKiBzaW5MYW1iZGEgLyBzaW5TaWdtYTtcbiAgICAgICAgICAgICAgICBjb3NTcUFscGhhID0gMSAtIHNpbkFscGhhICogc2luQWxwaGE7XG4gICAgICAgICAgICAgICAgY29zMlNpZ21hTSA9IGNvc1NpZ21hIC0gMiAqIHNpblUxICogc2luVTIgLyBjb3NTcUFscGhhO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzTmFOKGNvczJTaWdtYU0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvczJTaWdtYU0gPSAwOyAgLy8gZXF1YXRvcmlhbCBsaW5lOiBjb3NTcUFscGhhPTAgKMKnNilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIEMgPSAoXG4gICAgICAgICAgICAgICAgICAgIGYgLyAxNiAqIGNvc1NxQWxwaGEgKiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA0ICsgZiAqIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0IC0gMyAqIGNvc1NxQWxwaGFcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgbGFtYmRhUCA9IGxhbWJkYTtcbiAgICAgICAgICAgICAgICBsYW1iZGEgPSAoXG4gICAgICAgICAgICAgICAgICAgIEwgKyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAxIC0gQ1xuICAgICAgICAgICAgICAgICAgICApICogZiAqIHNpbkFscGhhICogKFxuICAgICAgICAgICAgICAgICAgICAgICAgc2lnbWEgKyBDICogc2luU2lnbWEgKiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29zMlNpZ21hTSArIEMgKiBjb3NTaWdtYSAqIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgKyAyICogY29zMlNpZ21hTSAqIGNvczJTaWdtYU1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB9IHdoaWxlIChNYXRoLmFicyhsYW1iZGEtbGFtYmRhUCkgPiAxZS0xMiAmJiAtLWl0ZXJMaW1pdD4wKTtcblxuICAgICAgICAgICAgaWYgKGl0ZXJMaW1pdCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBOYU47ICAvLyBmb3JtdWxhIGZhaWxlZCB0byBjb252ZXJnZVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdVNxID0gKFxuICAgICAgICAgICAgICAgIGNvc1NxQWxwaGEgKiAoXG4gICAgICAgICAgICAgICAgICAgIGEgKiBhIC0gYiAqIGJcbiAgICAgICAgICAgICAgICApIC8gKFxuICAgICAgICAgICAgICAgICAgICBiKmJcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB2YXIgQSA9IChcbiAgICAgICAgICAgICAgICAxICsgdVNxIC8gMTYzODQgKiAoXG4gICAgICAgICAgICAgICAgICAgIDQwOTYgKyB1U3EgKiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAtNzY4ICsgdVNxICogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMCAtIDE3NSAqIHVTcVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdmFyIEIgPSAoXG4gICAgICAgICAgICAgICAgdVNxIC8gMTAyNCAqIChcbiAgICAgICAgICAgICAgICAgICAgMjU2ICsgdVNxICogKFxuICAgICAgICAgICAgICAgICAgICAgICAgLTEyOCArIHVTcSAqIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NC00NyAqIHVTcVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdmFyIGRlbHRhU2lnbWEgPSAoXG4gICAgICAgICAgICAgICAgQiAqIHNpblNpZ21hICogKFxuICAgICAgICAgICAgICAgICAgICBjb3MyU2lnbWFNICsgQiAvIDQgKiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3NTaWdtYSAqIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSArIDIgKiBjb3MyU2lnbWFNICogY29zMlNpZ21hTVxuICAgICAgICAgICAgICAgICAgICAgICAgKSAtQiAvIDYgKiBjb3MyU2lnbWFNICogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zICsgNCAqIHNpblNpZ21hICogc2luU2lnbWFcbiAgICAgICAgICAgICAgICAgICAgICAgICkgKiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLTMgKyA0ICogY29zMlNpZ21hTSAqIGNvczJTaWdtYU1cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9IGIgKiBBICogKHNpZ21hIC0gZGVsdGFTaWdtYSk7XG5cbiAgICAgICAgICAgIGRpc3RhbmNlID0gZGlzdGFuY2UudG9GaXhlZChwcmVjaXNpb24pOyAvLyByb3VuZCB0byAxbW0gcHJlY2lzaW9uXG5cbiAgICAgICAgICAgIC8vaWYgKHN0YXJ0Lmhhc093blByb3BlcnR5KGVsZXZhdGlvbikgJiYgZW5kLmhhc093blByb3BlcnR5KGVsZXZhdGlvbikpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5lbGV2YXRpb24oc3RhcnQpICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgdGhpcy5lbGV2YXRpb24oZW5kKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICB2YXIgY2xpbWIgPSBNYXRoLmFicyh0aGlzLmVsZXZhdGlvbihzdGFydCkgLSB0aGlzLmVsZXZhdGlvbihlbmQpKTtcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IE1hdGguc3FydChkaXN0YW5jZSAqIGRpc3RhbmNlICsgY2xpbWIgKiBjbGltYik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRpc3RhbmNlID0gTWF0aC5yb3VuZChkaXN0YW5jZSAqIE1hdGgucG93KDEwLCBwcmVjaXNpb24pIC8gYWNjdXJhY3kpICogYWNjdXJhY3kgLyBNYXRoLnBvdygxMCwgcHJlY2lzaW9uKTtcblxuICAgICAgICAgICAgLypcbiAgICAgICAgICAgIC8vIG5vdGU6IHRvIHJldHVybiBpbml0aWFsL2ZpbmFsIGJlYXJpbmdzIGluIGFkZGl0aW9uIHRvIGRpc3RhbmNlLCB1c2Ugc29tZXRoaW5nIGxpa2U6XG4gICAgICAgICAgICB2YXIgZndkQXogPSBNYXRoLmF0YW4yKGNvc1UyKnNpbkxhbWJkYSwgIGNvc1UxKnNpblUyLXNpblUxKmNvc1UyKmNvc0xhbWJkYSk7XG4gICAgICAgICAgICB2YXIgcmV2QXogPSBNYXRoLmF0YW4yKGNvc1UxKnNpbkxhbWJkYSwgLXNpblUxKmNvc1UyK2Nvc1UxKnNpblUyKmNvc0xhbWJkYSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7IGRpc3RhbmNlOiBzLCBpbml0aWFsQmVhcmluZzogZndkQXoudG9EZWcoKSwgZmluYWxCZWFyaW5nOiByZXZBei50b0RlZygpIH07XG4gICAgICAgICAgICAqL1xuXG4gICAgICAgIH0sXG5cblxuICAgICAgICAvKipcbiAgICAgICAgKiBDYWxjdWxhdGVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBzcG90cy5cbiAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBtb3JlIHNpbXBsZSBidXQgYWxzbyBmYXIgbW9yZSBpbmFjY3VyYXRlXG4gICAgICAgICpcbiAgICAgICAgKiBAcGFyYW0gICAgb2JqZWN0ICAgIFN0YXJ0IHBvc2l0aW9uIHtsYXRpdHVkZTogMTIzLCBsb25naXR1ZGU6IDEyM31cbiAgICAgICAgKiBAcGFyYW0gICAgb2JqZWN0ICAgIEVuZCBwb3NpdGlvbiB7bGF0aXR1ZGU6IDEyMywgbG9uZ2l0dWRlOiAxMjN9XG4gICAgICAgICogQHBhcmFtICAgIGludGVnZXIgICBBY2N1cmFjeSAoaW4gbWV0ZXJzKVxuICAgICAgICAqIEByZXR1cm4gICBpbnRlZ2VyICAgRGlzdGFuY2UgKGluIG1ldGVycylcbiAgICAgICAgKi9cbiAgICAgICAgZ2V0RGlzdGFuY2VTaW1wbGU6IGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIGFjY3VyYWN5KSB7XG5cbiAgICAgICAgICAgIGFjY3VyYWN5ID0gTWF0aC5mbG9vcihhY2N1cmFjeSkgfHwgMTtcblxuICAgICAgICAgICAgdmFyIGRpc3RhbmNlID1cbiAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKFxuICAgICAgICAgICAgICAgICAgICBNYXRoLmFjb3MoXG4gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnNpbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhdGl0dWRlKGVuZCkudG9SYWQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSAqXG4gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnNpbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhdGl0dWRlKHN0YXJ0KS50b1JhZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICApICtcbiAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguY29zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF0aXR1ZGUoZW5kKS50b1JhZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICApICpcbiAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguY29zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF0aXR1ZGUoc3RhcnQpLnRvUmFkKClcbiAgICAgICAgICAgICAgICAgICAgICAgICkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5jb3MoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb25naXR1ZGUoc3RhcnQpLnRvUmFkKCkgLSB0aGlzLmxvbmdpdHVkZShlbmQpLnRvUmFkKClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKSAqIHRoaXMucmFkaXVzXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgcmV0dXJuIGdlb2xpYi5kaXN0YW5jZSA9IE1hdGguZmxvb3IoTWF0aC5yb3VuZChkaXN0YW5jZS9hY2N1cmFjeSkqYWNjdXJhY3kpO1xuXG4gICAgICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAgICAqIENhbGN1bGF0ZXMgdGhlIGNlbnRlciBvZiBhIGNvbGxlY3Rpb24gb2YgZ2VvIGNvb3JkaW5hdGVzXG4gICAgICAgICpcbiAgICAgICAgKiBAcGFyYW0gICAgICAgIGFycmF5ICAgICAgIENvbGxlY3Rpb24gb2YgY29vcmRzIFt7bGF0aXR1ZGU6IDUxLjUxMCwgbG9uZ2l0dWRlOiA3LjEzMjF9LCB7bGF0aXR1ZGU6IDQ5LjEyMzgsIGxvbmdpdHVkZTogXCI4wrAgMzAnIFdcIn0sIC4uLl1cbiAgICAgICAgKiBAcmV0dXJuICAgICAgIG9iamVjdCAgICAgIHtsYXRpdHVkZTogY2VudGVyTGF0LCBsb25naXR1ZGU6IGNlbnRlckxuZ31cbiAgICAgICAgKi9cbiAgICAgICAgZ2V0Q2VudGVyOiBmdW5jdGlvbihjb29yZHMpIHtcblxuICAgICAgICAgICAgdmFyIGNvb3Jkc0FycmF5ID0gY29vcmRzO1xuICAgICAgICAgICAgaWYodHlwZW9mIGNvb3JkcyA9PT0gJ29iamVjdCcgJiYgIShjb29yZHMgaW5zdGFuY2VvZiBBcnJheSkpIHtcblxuICAgICAgICAgICAgICAgIGNvb3Jkc0FycmF5ID0gW107XG5cbiAgICAgICAgICAgICAgICBmb3IodmFyIGtleSBpbiBjb29yZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29vcmRzQXJyYXkucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29vcmRzKGNvb3Jkc1trZXldKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZighY29vcmRzQXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgWCA9IDAuMDtcbiAgICAgICAgICAgIHZhciBZID0gMC4wO1xuICAgICAgICAgICAgdmFyIFogPSAwLjA7XG4gICAgICAgICAgICB2YXIgbGF0LCBsb24sIGh5cDtcblxuICAgICAgICAgICAgY29vcmRzQXJyYXkuZm9yRWFjaChmdW5jdGlvbihjb29yZCkge1xuXG4gICAgICAgICAgICAgICAgbGF0ID0gdGhpcy5sYXRpdHVkZShjb29yZCkudG9SYWQoKTtcbiAgICAgICAgICAgICAgICBsb24gPSB0aGlzLmxvbmdpdHVkZShjb29yZCkudG9SYWQoKTtcblxuICAgICAgICAgICAgICAgIFggKz0gTWF0aC5jb3MobGF0KSAqIE1hdGguY29zKGxvbik7XG4gICAgICAgICAgICAgICAgWSArPSBNYXRoLmNvcyhsYXQpICogTWF0aC5zaW4obG9uKTtcbiAgICAgICAgICAgICAgICBaICs9IE1hdGguc2luKGxhdCk7XG5cbiAgICAgICAgICAgIH0sIHRoaXMpO1xuXG4gICAgICAgICAgICB2YXIgbmJfY29vcmRzID0gY29vcmRzQXJyYXkubGVuZ3RoO1xuICAgICAgICAgICAgWCA9IFggLyBuYl9jb29yZHM7XG4gICAgICAgICAgICBZID0gWSAvIG5iX2Nvb3JkcztcbiAgICAgICAgICAgIFogPSBaIC8gbmJfY29vcmRzO1xuXG4gICAgICAgICAgICBsb24gPSBNYXRoLmF0YW4yKFksIFgpO1xuICAgICAgICAgICAgaHlwID0gTWF0aC5zcXJ0KFggKiBYICsgWSAqIFkpO1xuICAgICAgICAgICAgbGF0ID0gTWF0aC5hdGFuMihaLCBoeXApO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGxhdGl0dWRlOiAobGF0ICogR2VvbGliLlRPX0RFRykudG9GaXhlZCg2KSxcbiAgICAgICAgICAgICAgICBsb25naXR1ZGU6IChsb24gKiBHZW9saWIuVE9fREVHKS50b0ZpeGVkKDYpXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgIH0sXG5cblxuICAgICAgICAvKipcbiAgICAgICAgKiBHZXRzIHRoZSBtYXggYW5kIG1pbiwgbGF0aXR1ZGUsIGxvbmdpdHVkZSwgYW5kIGVsZXZhdGlvbiAoaWYgcHJvdmlkZWQpLlxuICAgICAgICAqIEBwYXJhbSAgICAgICAgYXJyYXkgICAgICAgYXJyYXkgd2l0aCBjb29yZHMgZS5nLiBbe2xhdGl0dWRlOiA1MS41MTQzLCBsb25naXR1ZGU6IDcuNDEzOH0sIHtsYXRpdHVkZTogMTIzLCBsb25naXR1ZGU6IDEyM30sIC4uLl1cbiAgICAgICAgKiBAcmV0dXJuICAgb2JqZWN0ICAgICAge21heExhdDogbWF4TGF0LFxuICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgbWluTGF0OiBtaW5MYXRcbiAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgIG1heExuZzogbWF4TG5nLFxuICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgbWluTG5nOiBtaW5MbmcsXG4gICAgICAgICogICAgICAgICAgICAgICAgICAgICBtYXhFbGV2OiBtYXhFbGV2LFxuICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgbWluRWxldjogbWluRWxldn1cbiAgICAgICAgKi9cbiAgICAgICAgZ2V0Qm91bmRzOiBmdW5jdGlvbihjb29yZHMpIHtcblxuICAgICAgICAgICAgaWYgKCFjb29yZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdXNlRWxldmF0aW9uID0gdGhpcy5lbGV2YXRpb24oY29vcmRzWzBdKTtcblxuICAgICAgICAgICAgdmFyIHN0YXRzID0ge1xuICAgICAgICAgICAgICAgIG1heExhdDogLUluZmluaXR5LFxuICAgICAgICAgICAgICAgIG1pbkxhdDogSW5maW5pdHksXG4gICAgICAgICAgICAgICAgbWF4TG5nOiAtSW5maW5pdHksXG4gICAgICAgICAgICAgICAgbWluTG5nOiBJbmZpbml0eVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB1c2VFbGV2YXRpb24gIT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBzdGF0cy5tYXhFbGV2ID0gMDtcbiAgICAgICAgICAgICAgICBzdGF0cy5taW5FbGV2ID0gSW5maW5pdHk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsID0gY29vcmRzLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuXG4gICAgICAgICAgICAgICAgc3RhdHMubWF4TGF0ID0gTWF0aC5tYXgodGhpcy5sYXRpdHVkZShjb29yZHNbaV0pLCBzdGF0cy5tYXhMYXQpO1xuICAgICAgICAgICAgICAgIHN0YXRzLm1pbkxhdCA9IE1hdGgubWluKHRoaXMubGF0aXR1ZGUoY29vcmRzW2ldKSwgc3RhdHMubWluTGF0KTtcbiAgICAgICAgICAgICAgICBzdGF0cy5tYXhMbmcgPSBNYXRoLm1heCh0aGlzLmxvbmdpdHVkZShjb29yZHNbaV0pLCBzdGF0cy5tYXhMbmcpO1xuICAgICAgICAgICAgICAgIHN0YXRzLm1pbkxuZyA9IE1hdGgubWluKHRoaXMubG9uZ2l0dWRlKGNvb3Jkc1tpXSksIHN0YXRzLm1pbkxuZyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodXNlRWxldmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRzLm1heEVsZXYgPSBNYXRoLm1heCh0aGlzLmVsZXZhdGlvbihjb29yZHNbaV0pLCBzdGF0cy5tYXhFbGV2KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHMubWluRWxldiA9IE1hdGgubWluKHRoaXMuZWxldmF0aW9uKGNvb3Jkc1tpXSksIHN0YXRzLm1pbkVsZXYpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gc3RhdHM7XG5cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgKiBDYWxjdWxhdGVzIHRoZSBjZW50ZXIgb2YgdGhlIGJvdW5kcyBvZiBnZW8gY29vcmRpbmF0ZXMuXG4gICAgICAgICpcbiAgICAgICAgKiBPbiBwb2x5Z29ucyBsaWtlIHBvbGl0aWNhbCBib3JkZXJzIChlZy4gc3RhdGVzKVxuICAgICAgICAqIHRoaXMgbWF5IGdpdmVzIGEgY2xvc2VyIHJlc3VsdCB0byBodW1hbiBleHBlY3RhdGlvbiwgdGhhbiBgZ2V0Q2VudGVyYCxcbiAgICAgICAgKiBiZWNhdXNlIHRoYXQgZnVuY3Rpb24gY2FuIGJlIGRpc3R1cmJlZCBieSB1bmV2ZW4gZGlzdHJpYnV0aW9uIG9mXG4gICAgICAgICogcG9pbnQgaW4gZGlmZmVyZW50IHNpZGVzLlxuICAgICAgICAqIEltYWdpbmUgdGhlIFVTIHN0YXRlIE9rbGFob21hOiBgZ2V0Q2VudGVyYCBvbiB0aGF0IGdpdmVzIGEgc291dGhlcm5cbiAgICAgICAgKiBwb2ludCwgYmVjYXVzZSB0aGUgc291dGhlcm4gYm9yZGVyIGNvbnRhaW5zIGEgbG90IG1vcmUgbm9kZXMsXG4gICAgICAgICogdGhhbiB0aGUgb3RoZXJzLlxuICAgICAgICAqXG4gICAgICAgICogQHBhcmFtICAgICAgICBhcnJheSAgICAgICBDb2xsZWN0aW9uIG9mIGNvb3JkcyBbe2xhdGl0dWRlOiA1MS41MTAsIGxvbmdpdHVkZTogNy4xMzIxfSwge2xhdGl0dWRlOiA0OS4xMjM4LCBsb25naXR1ZGU6IFwiOMKwIDMwJyBXXCJ9LCAuLi5dXG4gICAgICAgICogQHJldHVybiAgICAgICBvYmplY3QgICAgICB7bGF0aXR1ZGU6IGNlbnRlckxhdCwgbG9uZ2l0dWRlOiBjZW50ZXJMbmd9XG4gICAgICAgICovXG4gICAgICAgIGdldENlbnRlck9mQm91bmRzOiBmdW5jdGlvbihjb29yZHMpIHtcbiAgICAgICAgICAgIHZhciBiID0gdGhpcy5nZXRCb3VuZHMoY29vcmRzKTtcbiAgICAgICAgICAgIHZhciBsYXRpdHVkZSA9IGIubWluTGF0ICsgKChiLm1heExhdCAtIGIubWluTGF0KSAvIDIpO1xuICAgICAgICAgICAgdmFyIGxvbmdpdHVkZSA9IGIubWluTG5nICsgKChiLm1heExuZyAtIGIubWluTG5nKSAvIDIpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBsYXRpdHVkZTogcGFyc2VGbG9hdChsYXRpdHVkZS50b0ZpeGVkKDYpKSxcbiAgICAgICAgICAgICAgICBsb25naXR1ZGU6IHBhcnNlRmxvYXQobG9uZ2l0dWRlLnRvRml4ZWQoNikpXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQ29tcHV0ZXMgdGhlIGJvdW5kaW5nIGNvb3JkaW5hdGVzIG9mIGFsbCBwb2ludHMgb24gdGhlIHN1cmZhY2VcbiAgICAgICAgKiBvZiB0aGUgZWFydGggbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgZ3JlYXQgY2lyY2xlXG4gICAgICAgICogZGlzdGFuY2UuXG4gICAgICAgICpcbiAgICAgICAgKiBAcGFyYW0gb2JqZWN0IFBvaW50IHBvc2l0aW9uIHtsYXRpdHVkZTogMTIzLCBsb25naXR1ZGU6IDEyM31cbiAgICAgICAgKiBAcGFyYW0gbnVtYmVyIERpc3RhbmNlIChpbiBtZXRlcnMpLlxuICAgICAgICAqIEByZXR1cm4gYXJyYXkgQ29sbGVjdGlvbiBvZiB0d28gcG9pbnRzIGRlZmluaW5nIHRoZSBTVyBhbmQgTkUgY29ybmVycy5cbiAgICAgICAgKi9cbiAgICAgICAgZ2V0Qm91bmRzT2ZEaXN0YW5jZTogZnVuY3Rpb24ocG9pbnQsIGRpc3RhbmNlKSB7XG5cbiAgICAgICAgICAgIHZhciBsYXRpdHVkZSA9IHRoaXMubGF0aXR1ZGUocG9pbnQpO1xuICAgICAgICAgICAgdmFyIGxvbmdpdHVkZSA9IHRoaXMubG9uZ2l0dWRlKHBvaW50KTtcblxuICAgICAgICAgICAgdmFyIHJhZExhdCA9IGxhdGl0dWRlLnRvUmFkKCk7XG4gICAgICAgICAgICB2YXIgcmFkTG9uID0gbG9uZ2l0dWRlLnRvUmFkKCk7XG5cbiAgICAgICAgICAgIHZhciByYWREaXN0ID0gZGlzdGFuY2UgLyB0aGlzLnJhZGl1cztcbiAgICAgICAgICAgIHZhciBtaW5MYXQgPSByYWRMYXQgLSByYWREaXN0O1xuICAgICAgICAgICAgdmFyIG1heExhdCA9IHJhZExhdCArIHJhZERpc3Q7XG5cbiAgICAgICAgICAgIHZhciBNQVhfTEFUX1JBRCA9IHRoaXMubWF4TGF0LnRvUmFkKCk7XG4gICAgICAgICAgICB2YXIgTUlOX0xBVF9SQUQgPSB0aGlzLm1pbkxhdC50b1JhZCgpO1xuICAgICAgICAgICAgdmFyIE1BWF9MT05fUkFEID0gdGhpcy5tYXhMb24udG9SYWQoKTtcbiAgICAgICAgICAgIHZhciBNSU5fTE9OX1JBRCA9IHRoaXMubWluTG9uLnRvUmFkKCk7XG5cbiAgICAgICAgICAgIHZhciBtaW5Mb247XG4gICAgICAgICAgICB2YXIgbWF4TG9uO1xuXG4gICAgICAgICAgICBpZiAobWluTGF0ID4gTUlOX0xBVF9SQUQgJiYgbWF4TGF0IDwgTUFYX0xBVF9SQUQpIHtcblxuICAgICAgICAgICAgICAgIHZhciBkZWx0YUxvbiA9IE1hdGguYXNpbihNYXRoLnNpbihyYWREaXN0KSAvIE1hdGguY29zKHJhZExhdCkpO1xuICAgICAgICAgICAgICAgIG1pbkxvbiA9IHJhZExvbiAtIGRlbHRhTG9uO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1pbkxvbiA8IE1JTl9MT05fUkFEKSB7XG4gICAgICAgICAgICAgICAgICAgIG1pbkxvbiArPSBHZW9saWIuUElfWDI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbWF4TG9uID0gcmFkTG9uICsgZGVsdGFMb247XG5cbiAgICAgICAgICAgICAgICBpZiAobWF4TG9uID4gTUFYX0xPTl9SQUQpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF4TG9uIC09IEdlb2xpYi5QSV9YMjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQSBwb2xlIGlzIHdpdGhpbiB0aGUgZGlzdGFuY2UuXG4gICAgICAgICAgICAgICAgbWluTGF0ID0gTWF0aC5tYXgobWluTGF0LCBNSU5fTEFUX1JBRCk7XG4gICAgICAgICAgICAgICAgbWF4TGF0ID0gTWF0aC5taW4obWF4TGF0LCBNQVhfTEFUX1JBRCk7XG4gICAgICAgICAgICAgICAgbWluTG9uID0gTUlOX0xPTl9SQUQ7XG4gICAgICAgICAgICAgICAgbWF4TG9uID0gTUFYX0xPTl9SQUQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgLy8gU291dGh3ZXN0XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYXRpdHVkZTogbWluTGF0LnRvRGVnKCksXG4gICAgICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogbWluTG9uLnRvRGVnKClcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIE5vcnRoZWFzdFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGF0aXR1ZGU6IG1heExhdC50b0RlZygpLFxuICAgICAgICAgICAgICAgICAgICBsb25naXR1ZGU6IG1heExvbi50b0RlZygpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXTtcblxuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQ2hlY2tzIHdoZXRoZXIgYSBwb2ludCBpcyBpbnNpZGUgb2YgYSBwb2x5Z29uIG9yIG5vdC5cbiAgICAgICAgKiBOb3RlIHRoYXQgdGhlIHBvbHlnb24gY29vcmRzIG11c3QgYmUgaW4gY29ycmVjdCBvcmRlciFcbiAgICAgICAgKlxuICAgICAgICAqIEBwYXJhbSAgICAgICAgb2JqZWN0ICAgICAgY29vcmRpbmF0ZSB0byBjaGVjayBlLmcuIHtsYXRpdHVkZTogNTEuNTAyMywgbG9uZ2l0dWRlOiA3LjM4MTV9XG4gICAgICAgICogQHBhcmFtICAgICAgICBhcnJheSAgICAgICBhcnJheSB3aXRoIGNvb3JkcyBlLmcuIFt7bGF0aXR1ZGU6IDUxLjUxNDMsIGxvbmdpdHVkZTogNy40MTM4fSwge2xhdGl0dWRlOiAxMjMsIGxvbmdpdHVkZTogMTIzfSwgLi4uXVxuICAgICAgICAqIEByZXR1cm4gICAgICAgYm9vbCAgICAgICAgdHJ1ZSBpZiB0aGUgY29vcmRpbmF0ZSBpcyBpbnNpZGUgdGhlIGdpdmVuIHBvbHlnb25cbiAgICAgICAgKi9cbiAgICAgICAgaXNQb2ludEluc2lkZTogZnVuY3Rpb24obGF0bG5nLCBjb29yZHMpIHtcblxuICAgICAgICAgICAgZm9yKHZhciBjID0gZmFsc2UsIGkgPSAtMSwgbCA9IGNvb3Jkcy5sZW5ndGgsIGogPSBsIC0gMTsgKytpIDwgbDsgaiA9IGkpIHtcblxuICAgICAgICAgICAgICAgIGlmKFxuICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5sb25naXR1ZGUoY29vcmRzW2ldKSA8PSB0aGlzLmxvbmdpdHVkZShsYXRsbmcpICYmIHRoaXMubG9uZ2l0dWRlKGxhdGxuZykgPCB0aGlzLmxvbmdpdHVkZShjb29yZHNbal0pKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMubG9uZ2l0dWRlKGNvb3Jkc1tqXSkgPD0gdGhpcy5sb25naXR1ZGUobGF0bG5nKSAmJiB0aGlzLmxvbmdpdHVkZShsYXRsbmcpIDwgdGhpcy5sb25naXR1ZGUoY29vcmRzW2ldKSlcbiAgICAgICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhdGl0dWRlKGxhdGxuZykgPCAodGhpcy5sYXRpdHVkZShjb29yZHNbal0pIC0gdGhpcy5sYXRpdHVkZShjb29yZHNbaV0pKSAqXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5sb25naXR1ZGUobGF0bG5nKSAtIHRoaXMubG9uZ2l0dWRlKGNvb3Jkc1tpXSkpIC9cbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLmxvbmdpdHVkZShjb29yZHNbal0pIC0gdGhpcy5sb25naXR1ZGUoY29vcmRzW2ldKSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXRpdHVkZShjb29yZHNbaV0pXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9ICFjO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gYztcblxuICAgICAgICB9LFxuXG5cbiAgICAgICAvKipcbiAgICAgICAgKiBQcmUgY2FsY3VsYXRlIHRoZSBwb2x5Z29uIGNvb3JkcywgdG8gc3BlZWQgdXAgdGhlIHBvaW50IGluc2lkZSBjaGVjay5cbiAgICAgICAgKiBVc2UgdGhpcyBmdW5jdGlvbiBiZWZvcmUgY2FsbGluZyBpc1BvaW50SW5zaWRlV2l0aFByZXBhcmVkUG9seWdvbigpXG4gICAgICAgICogQHNlZSAgICAgICAgICBBbGdvcnl0aG0gZnJvbSBodHRwOi8vYWxpZW5yeWRlcmZsZXguY29tL3BvbHlnb24vXG4gICAgICAgICogQHBhcmFtICAgICAgICBhcnJheSAgICAgICBhcnJheSB3aXRoIGNvb3JkcyBlLmcuIFt7bGF0aXR1ZGU6IDUxLjUxNDMsIGxvbmdpdHVkZTogNy40MTM4fSwge2xhdGl0dWRlOiAxMjMsIGxvbmdpdHVkZTogMTIzfSwgLi4uXVxuICAgICAgICAqL1xuICAgICAgICBwcmVwYXJlUG9seWdvbkZvcklzUG9pbnRJbnNpZGVPcHRpbWl6ZWQ6IGZ1bmN0aW9uKGNvb3Jkcykge1xuXG4gICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBqID0gY29vcmRzLmxlbmd0aC0xOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgICAgIGlmKHRoaXMubG9uZ2l0dWRlKGNvb3Jkc1tqXSkgPT09IHRoaXMubG9uZ2l0dWRlKGNvb3Jkc1tpXSkpIHtcblxuICAgICAgICAgICAgICAgICAgICBjb29yZHNbaV0uY29uc3RhbnQgPSB0aGlzLmxhdGl0dWRlKGNvb3Jkc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIGNvb3Jkc1tpXS5tdWx0aXBsZSA9IDA7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgIGNvb3Jkc1tpXS5jb25zdGFudCA9IHRoaXMubGF0aXR1ZGUoY29vcmRzW2ldKSAtIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9uZ2l0dWRlKGNvb3Jkc1tpXSkgKiB0aGlzLmxhdGl0dWRlKGNvb3Jkc1tqXSlcbiAgICAgICAgICAgICAgICAgICAgKSAvIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9uZ2l0dWRlKGNvb3Jkc1tqXSkgLSB0aGlzLmxvbmdpdHVkZShjb29yZHNbaV0pXG4gICAgICAgICAgICAgICAgICAgICkgKyAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvbmdpdHVkZShjb29yZHNbaV0pKnRoaXMubGF0aXR1ZGUoY29vcmRzW2ldKVxuICAgICAgICAgICAgICAgICAgICApIC8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb25naXR1ZGUoY29vcmRzW2pdKS10aGlzLmxvbmdpdHVkZShjb29yZHNbaV0pXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29vcmRzW2ldLm11bHRpcGxlID0gKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXRpdHVkZShjb29yZHNbal0pLXRoaXMubGF0aXR1ZGUoY29vcmRzW2ldKVxuICAgICAgICAgICAgICAgICAgICApIC8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb25naXR1ZGUoY29vcmRzW2pdKS10aGlzLmxvbmdpdHVkZShjb29yZHNbaV0pXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBqPWk7XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENoZWNrcyB3aGV0aGVyIGEgcG9pbnQgaXMgaW5zaWRlIG9mIGEgcG9seWdvbiBvciBub3QuXG4gICAgICAgKiBcIlRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIG1hbnkgcG9pbnRzIHRoYXQgbmVlZCB0byBiZSB0ZXN0ZWQgYWdhaW5zdCB0aGUgc2FtZSAoc3RhdGljKSBwb2x5Z29uLlwiXG4gICAgICAgKiBQbGVhc2UgY2FsbCB0aGUgZnVuY3Rpb24gcHJlcGFyZVBvbHlnb25Gb3JJc1BvaW50SW5zaWRlT3B0aW1pemVkKCkgd2l0aCB0aGUgc2FtZSBjb29yZHMgb2JqZWN0IGJlZm9yZSB1c2luZyB0aGlzIGZ1bmN0aW9uLlxuICAgICAgICogTm90ZSB0aGF0IHRoZSBwb2x5Z29uIGNvb3JkcyBtdXN0IGJlIGluIGNvcnJlY3Qgb3JkZXIhXG4gICAgICAgKlxuICAgICAgICogQHNlZSAgICAgICAgICBBbGdvcnl0aG0gZnJvbSBodHRwOi8vYWxpZW5yeWRlcmZsZXguY29tL3BvbHlnb24vXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtICAgICBvYmplY3QgICAgICBjb29yZGluYXRlIHRvIGNoZWNrIGUuZy4ge2xhdGl0dWRlOiA1MS41MDIzLCBsb25naXR1ZGU6IDcuMzgxNX1cbiAgICAgICAqIEBwYXJhbSAgICAgYXJyYXkgICAgICAgYXJyYXkgd2l0aCBjb29yZHMgZS5nLiBbe2xhdGl0dWRlOiA1MS41MTQzLCBsb25naXR1ZGU6IDcuNDEzOH0sIHtsYXRpdHVkZTogMTIzLCBsb25naXR1ZGU6IDEyM30sIC4uLl1cbiAgICAgICAqIEByZXR1cm4gICAgICAgIGJvb2wgICAgICAgIHRydWUgaWYgdGhlIGNvb3JkaW5hdGUgaXMgaW5zaWRlIHRoZSBnaXZlbiBwb2x5Z29uXG4gICAgICAgKi9cbiAgICAgICAgaXNQb2ludEluc2lkZVdpdGhQcmVwYXJlZFBvbHlnb246IGZ1bmN0aW9uKHBvaW50LCBjb29yZHMpIHtcblxuICAgICAgICAgICAgdmFyIGZsZ1BvaW50SW5zaWRlID0gZmFsc2UsXG4gICAgICAgICAgICB5ID0gdGhpcy5sb25naXR1ZGUocG9pbnQpLFxuICAgICAgICAgICAgeCA9IHRoaXMubGF0aXR1ZGUocG9pbnQpO1xuXG4gICAgICAgICAgICBmb3IodmFyIGkgPSAwLCBqID0gY29vcmRzLmxlbmd0aC0xOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMubG9uZ2l0dWRlKGNvb3Jkc1tpXSkgPCB5ICYmIHRoaXMubG9uZ2l0dWRlKGNvb3Jkc1tqXSkgPj15IHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9uZ2l0dWRlKGNvb3Jkc1tqXSkgPCB5ICYmIHRoaXMubG9uZ2l0dWRlKGNvb3Jkc1tpXSkgPj0geSkpIHtcblxuICAgICAgICAgICAgICAgICAgICBmbGdQb2ludEluc2lkZV49KHkqY29vcmRzW2ldLm11bHRpcGxlK2Nvb3Jkc1tpXS5jb25zdGFudCA8IHgpO1xuXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaj1pO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmbGdQb2ludEluc2lkZTtcblxuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogU2hvcnRjdXQgZm9yIGdlb2xpYi5pc1BvaW50SW5zaWRlKClcbiAgICAgICAgKi9cbiAgICAgICAgaXNJbnNpZGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNQb2ludEluc2lkZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQ2hlY2tzIHdoZXRoZXIgYSBwb2ludCBpcyBpbnNpZGUgb2YgYSBjaXJjbGUgb3Igbm90LlxuICAgICAgICAqXG4gICAgICAgICogQHBhcmFtICAgICAgICBvYmplY3QgICAgICBjb29yZGluYXRlIHRvIGNoZWNrIChlLmcuIHtsYXRpdHVkZTogNTEuNTAyMywgbG9uZ2l0dWRlOiA3LjM4MTV9KVxuICAgICAgICAqIEBwYXJhbSAgICAgICAgb2JqZWN0ICAgICAgY29vcmRpbmF0ZSBvZiB0aGUgY2lyY2xlJ3MgY2VudGVyIChlLmcuIHtsYXRpdHVkZTogNTEuNDgxMiwgbG9uZ2l0dWRlOiA3LjQwMjV9KVxuICAgICAgICAqIEBwYXJhbSAgICAgICAgaW50ZWdlciAgICAgbWF4aW11bSByYWRpdXMgaW4gbWV0ZXJzXG4gICAgICAgICogQHJldHVybiAgICAgICBib29sICAgICAgICB0cnVlIGlmIHRoZSBjb29yZGluYXRlIGlzIHdpdGhpbiB0aGUgZ2l2ZW4gcmFkaXVzXG4gICAgICAgICovXG4gICAgICAgIGlzUG9pbnRJbkNpcmNsZTogZnVuY3Rpb24obGF0bG5nLCBjZW50ZXIsIHJhZGl1cykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGlzdGFuY2UobGF0bG5nLCBjZW50ZXIpIDwgcmFkaXVzO1xuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogU2hvcnRjdXQgZm9yIGdlb2xpYi5pc1BvaW50SW5DaXJjbGUoKVxuICAgICAgICAqL1xuICAgICAgICB3aXRoaW5SYWRpdXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNQb2ludEluQ2lyY2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH0sXG5cblxuICAgICAgICAvKipcbiAgICAgICAgKiBHZXRzIHJodW1iIGxpbmUgYmVhcmluZyBvZiB0d28gcG9pbnRzLiBGaW5kIG91dCBhYm91dCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHJodW1iIGxpbmUgYW5kXG4gICAgICAgICogZ3JlYXQgY2lyY2xlIGJlYXJpbmcgb24gV2lraXBlZGlhLiBJdCdzIHF1aXRlIGNvbXBsaWNhdGVkLiBSaHVtYiBsaW5lIHNob3VsZCBiZSBmaW5lIGluIG1vc3QgY2FzZXM6XG4gICAgICAgICpcbiAgICAgICAgKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1JodW1iX2xpbmUjR2VuZXJhbF9hbmRfbWF0aGVtYXRpY2FsX2Rlc2NyaXB0aW9uXG4gICAgICAgICpcbiAgICAgICAgKiBGdW5jdGlvbiBoZWF2aWx5IGJhc2VkIG9uIERvdWcgVmFuZGVyd2VpZGUncyBncmVhdCBQSFAgdmVyc2lvbiAobGljZW5zZWQgdW5kZXIgR1BMIDMuMClcbiAgICAgICAgKiBodHRwOi8vd3d3LmRvdWd2LmNvbS8yMDA5LzA3LzEzL2NhbGN1bGF0aW5nLXRoZS1iZWFyaW5nLWFuZC1jb21wYXNzLXJvc2UtZGlyZWN0aW9uLWJldHdlZW4tdHdvLWxhdGl0dWRlLWxvbmdpdHVkZS1jb29yZGluYXRlcy1pbi1waHAvXG4gICAgICAgICpcbiAgICAgICAgKiBAcGFyYW0gICAgICAgIG9iamVjdCAgICAgIG9yaWdpbiBjb29yZGluYXRlIChlLmcuIHtsYXRpdHVkZTogNTEuNTAyMywgbG9uZ2l0dWRlOiA3LjM4MTV9KVxuICAgICAgICAqIEBwYXJhbSAgICAgICAgb2JqZWN0ICAgICAgZGVzdGluYXRpb24gY29vcmRpbmF0ZVxuICAgICAgICAqIEByZXR1cm4gICAgICAgaW50ZWdlciAgICAgY2FsY3VsYXRlZCBiZWFyaW5nXG4gICAgICAgICovXG4gICAgICAgIGdldFJodW1iTGluZUJlYXJpbmc6IGZ1bmN0aW9uKG9yaWdpbkxMLCBkZXN0TEwpIHtcblxuICAgICAgICAgICAgLy8gZGlmZmVyZW5jZSBvZiBsb25naXR1ZGUgY29vcmRzXG4gICAgICAgICAgICB2YXIgZGlmZkxvbiA9IHRoaXMubG9uZ2l0dWRlKGRlc3RMTCkudG9SYWQoKSAtIHRoaXMubG9uZ2l0dWRlKG9yaWdpbkxMKS50b1JhZCgpO1xuXG4gICAgICAgICAgICAvLyBkaWZmZXJlbmNlIGxhdGl0dWRlIGNvb3JkcyBwaGlcbiAgICAgICAgICAgIHZhciBkaWZmUGhpID0gTWF0aC5sb2coXG4gICAgICAgICAgICAgICAgTWF0aC50YW4oXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGF0aXR1ZGUoZGVzdExMKS50b1JhZCgpIC8gMiArIEdlb2xpYi5QSV9ESVY0XG4gICAgICAgICAgICAgICAgKSAvXG4gICAgICAgICAgICAgICAgTWF0aC50YW4oXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGF0aXR1ZGUob3JpZ2luTEwpLnRvUmFkKCkgLyAyICsgR2VvbGliLlBJX0RJVjRcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyByZWNhbGN1bGF0ZSBkaWZmTG9uIGlmIGl0IGlzIGdyZWF0ZXIgdGhhbiBwaVxuICAgICAgICAgICAgaWYoTWF0aC5hYnMoZGlmZkxvbikgPiBNYXRoLlBJKSB7XG4gICAgICAgICAgICAgICAgaWYoZGlmZkxvbiA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZGlmZkxvbiA9IChHZW9saWIuUElfWDIgLSBkaWZmTG9uKSAqIC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGlmZkxvbiA9IEdlb2xpYi5QSV9YMiArIGRpZmZMb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL3JldHVybiB0aGUgYW5nbGUsIG5vcm1hbGl6ZWRcbiAgICAgICAgICAgIHJldHVybiAoTWF0aC5hdGFuMihkaWZmTG9uLCBkaWZmUGhpKS50b0RlZygpICsgMzYwKSAlIDM2MDtcblxuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogR2V0cyBncmVhdCBjaXJjbGUgYmVhcmluZyBvZiB0d28gcG9pbnRzLiBTZWUgZGVzY3JpcHRpb24gb2YgZ2V0Umh1bWJMaW5lQmVhcmluZyBmb3IgbW9yZSBpbmZvcm1hdGlvblxuICAgICAgICAqXG4gICAgICAgICogQHBhcmFtICAgICAgICBvYmplY3QgICAgICBvcmlnaW4gY29vcmRpbmF0ZSAoZS5nLiB7bGF0aXR1ZGU6IDUxLjUwMjMsIGxvbmdpdHVkZTogNy4zODE1fSlcbiAgICAgICAgKiBAcGFyYW0gICAgICAgIG9iamVjdCAgICAgIGRlc3RpbmF0aW9uIGNvb3JkaW5hdGVcbiAgICAgICAgKiBAcmV0dXJuICAgICAgIGludGVnZXIgICAgIGNhbGN1bGF0ZWQgYmVhcmluZ1xuICAgICAgICAqL1xuICAgICAgICBnZXRCZWFyaW5nOiBmdW5jdGlvbihvcmlnaW5MTCwgZGVzdExMKSB7XG5cbiAgICAgICAgICAgIGRlc3RMTFsnbGF0aXR1ZGUnXSA9IHRoaXMubGF0aXR1ZGUoZGVzdExMKTtcbiAgICAgICAgICAgIGRlc3RMTFsnbG9uZ2l0dWRlJ10gPSB0aGlzLmxvbmdpdHVkZShkZXN0TEwpO1xuICAgICAgICAgICAgb3JpZ2luTExbJ2xhdGl0dWRlJ10gPSB0aGlzLmxhdGl0dWRlKG9yaWdpbkxMKTtcbiAgICAgICAgICAgIG9yaWdpbkxMWydsb25naXR1ZGUnXSA9IHRoaXMubG9uZ2l0dWRlKG9yaWdpbkxMKTtcblxuICAgICAgICAgICAgdmFyIGJlYXJpbmcgPSAoXG4gICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICBNYXRoLmF0YW4yKFxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5zaW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdExMWydsb25naXR1ZGUnXS50b1JhZCgpIC1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5MTFsnbG9uZ2l0dWRlJ10udG9SYWQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSAqXG4gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmNvcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0TExbJ2xhdGl0dWRlJ10udG9SYWQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguY29zKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbkxMWydsYXRpdHVkZSddLnRvUmFkKClcbiAgICAgICAgICAgICAgICAgICAgICAgICkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5zaW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdExMWydsYXRpdHVkZSddLnRvUmFkKClcbiAgICAgICAgICAgICAgICAgICAgICAgICkgLVxuICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5zaW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luTExbJ2xhdGl0dWRlJ10udG9SYWQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSAqXG4gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmNvcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0TExbJ2xhdGl0dWRlJ10udG9SYWQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSAqXG4gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmNvcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0TExbJ2xvbmdpdHVkZSddLnRvUmFkKCkgLSBvcmlnaW5MTFsnbG9uZ2l0dWRlJ10udG9SYWQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKS50b0RlZygpICsgMzYwXG4gICAgICAgICAgICApICUgMzYwO1xuXG4gICAgICAgICAgICByZXR1cm4gYmVhcmluZztcblxuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogR2V0cyB0aGUgY29tcGFzcyBkaXJlY3Rpb24gZnJvbSBhbiBvcmlnaW4gY29vcmRpbmF0ZSB0byBhIGRlc3RpbmF0aW9uIGNvb3JkaW5hdGUuXG4gICAgICAgICpcbiAgICAgICAgKiBAcGFyYW0gICAgICAgIG9iamVjdCAgICAgIG9yaWdpbiBjb29yZGluYXRlIChlLmcuIHtsYXRpdHVkZTogNTEuNTAyMywgbG9uZ2l0dWRlOiA3LjM4MTV9KVxuICAgICAgICAqIEBwYXJhbSAgICAgICAgb2JqZWN0ICAgICAgZGVzdGluYXRpb24gY29vcmRpbmF0ZVxuICAgICAgICAqIEBwYXJhbSAgICAgICAgc3RyaW5nICAgICAgQmVhcmluZyBtb2RlLiBDYW4gYmUgZWl0aGVyIGNpcmNsZSBvciByaHVtYmxpbmVcbiAgICAgICAgKiBAcmV0dXJuICAgICAgIG9iamVjdCAgICAgIFJldHVybnMgYW4gb2JqZWN0IHdpdGggYSByb3VnaCAoTkVTVykgYW5kIGFuIGV4YWN0IGRpcmVjdGlvbiAoTk5FLCBORSwgRU5FLCBFLCBFU0UsIGV0YykuXG4gICAgICAgICovXG4gICAgICAgIGdldENvbXBhc3NEaXJlY3Rpb246IGZ1bmN0aW9uKG9yaWdpbkxMLCBkZXN0TEwsIGJlYXJpbmdNb2RlKSB7XG5cbiAgICAgICAgICAgIHZhciBkaXJlY3Rpb247XG4gICAgICAgICAgICB2YXIgYmVhcmluZztcblxuICAgICAgICAgICAgaWYoYmVhcmluZ01vZGUgPT0gJ2NpcmNsZScpIHtcbiAgICAgICAgICAgICAgICAvLyB1c2UgZ3JlYXQgY2lyY2xlIGJlYXJpbmdcbiAgICAgICAgICAgICAgICBiZWFyaW5nID0gdGhpcy5nZXRCZWFyaW5nKG9yaWdpbkxMLCBkZXN0TEwpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IGlzIHJodW1iIGxpbmUgYmVhcmluZ1xuICAgICAgICAgICAgICAgIGJlYXJpbmcgPSB0aGlzLmdldFJodW1iTGluZUJlYXJpbmcob3JpZ2luTEwsIGRlc3RMTCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaChNYXRoLnJvdW5kKGJlYXJpbmcvMjIuNSkpIHtcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IHtleGFjdDogXCJOTkVcIiwgcm91Z2g6IFwiTlwifTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSB7ZXhhY3Q6IFwiTkVcIiwgcm91Z2g6IFwiTlwifTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSB7ZXhhY3Q6IFwiRU5FXCIsIHJvdWdoOiBcIkVcIn07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0ge2V4YWN0OiBcIkVcIiwgcm91Z2g6IFwiRVwifTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSB7ZXhhY3Q6IFwiRVNFXCIsIHJvdWdoOiBcIkVcIn07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNjpcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0ge2V4YWN0OiBcIlNFXCIsIHJvdWdoOiBcIkVcIn07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0ge2V4YWN0OiBcIlNTRVwiLCByb3VnaDogXCJTXCJ9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IHtleGFjdDogXCJTXCIsIHJvdWdoOiBcIlNcIn07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0ge2V4YWN0OiBcIlNTV1wiLCByb3VnaDogXCJTXCJ9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSB7ZXhhY3Q6IFwiU1dcIiwgcm91Z2g6IFwiU1wifTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0ge2V4YWN0OiBcIldTV1wiLCByb3VnaDogXCJXXCJ9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSB7ZXhhY3Q6IFwiV1wiLCByb3VnaDogXCJXXCJ9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSB7ZXhhY3Q6IFwiV05XXCIsIHJvdWdoOiBcIldcIn07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgMTQ6XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IHtleGFjdDogXCJOV1wiLCByb3VnaDogXCJXXCJ9O1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSB7ZXhhY3Q6IFwiTk5XXCIsIHJvdWdoOiBcIk5cIn07XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IHtleGFjdDogXCJOXCIsIHJvdWdoOiBcIk5cIn07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRpcmVjdGlvblsnYmVhcmluZyddID0gYmVhcmluZztcbiAgICAgICAgICAgIHJldHVybiBkaXJlY3Rpb247XG5cbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFNob3J0Y3V0IGZvciBnZXRDb21wYXNzRGlyZWN0aW9uXG4gICAgICAgICovXG4gICAgICAgIGdldERpcmVjdGlvbjogZnVuY3Rpb24ob3JpZ2luTEwsIGRlc3RMTCwgYmVhcmluZ01vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldENvbXBhc3NEaXJlY3Rpb24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIFNvcnRzIGFuIGFycmF5IG9mIGNvb3JkcyBieSBkaXN0YW5jZSBmcm9tIGEgcmVmZXJlbmNlIGNvb3JkaW5hdGVcbiAgICAgICAgKlxuICAgICAgICAqIEBwYXJhbSAgICAgICAgb2JqZWN0ICAgICAgcmVmZXJlbmNlIGNvb3JkaW5hdGUgZS5nLiB7bGF0aXR1ZGU6IDUxLjUwMjMsIGxvbmdpdHVkZTogNy4zODE1fVxuICAgICAgICAqIEBwYXJhbSAgICAgICAgbWl4ZWQgICAgICAgYXJyYXkgb3Igb2JqZWN0IHdpdGggY29vcmRzIFt7bGF0aXR1ZGU6IDUxLjUxNDMsIGxvbmdpdHVkZTogNy40MTM4fSwge2xhdGl0dWRlOiAxMjMsIGxvbmdpdHVkZTogMTIzfSwgLi4uXVxuICAgICAgICAqIEByZXR1cm4gICAgICAgYXJyYXkgICAgICAgb3JkZXJlZCBhcnJheVxuICAgICAgICAqL1xuICAgICAgICBvcmRlckJ5RGlzdGFuY2U6IGZ1bmN0aW9uKGxhdGxuZywgY29vcmRzKSB7XG5cbiAgICAgICAgICAgIHZhciBjb29yZHNBcnJheSA9IE9iamVjdC5rZXlzKGNvb3JkcykubWFwKGZ1bmN0aW9uKGlkeCkge1xuICAgICAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9IHRoaXMuZ2V0RGlzdGFuY2UobGF0bG5nLCBjb29yZHNbaWR4XSk7XG4gICAgICAgICAgICAgICAgdmFyIGF1Z21lbnRlZENvb3JkID0gT2JqZWN0LmNyZWF0ZShjb29yZHNbaWR4XSk7XG4gICAgICAgICAgICAgICAgYXVnbWVudGVkQ29vcmQuZGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgICAgICAgICBhdWdtZW50ZWRDb29yZC5rZXkgPSBpZHg7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF1Z21lbnRlZENvb3JkO1xuICAgICAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgICAgIHJldHVybiBjb29yZHNBcnJheS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5kaXN0YW5jZSAtIGIuZGlzdGFuY2U7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIENoZWNrIGlmIGEgcG9pbnQgbGllcyBpbiBsaW5lIGNyZWF0ZWQgYnkgdHdvIG90aGVyIHBvaW50c1xuICAgICAgICAqXG4gICAgICAgICogQHBhcmFtICAgIG9iamVjdCAgICBQb2ludCB0byBjaGVjazoge2xhdGl0dWRlOiAxMjMsIGxvbmdpdHVkZTogMTIzfVxuICAgICAgICAqIEBwYXJhbSAgICBvYmplY3QgICAgU3RhcnQgb2YgbGluZSB7bGF0aXR1ZGU6IDEyMywgbG9uZ2l0dWRlOiAxMjN9XG4gICAgICAgICogQHBhcmFtICAgIG9iamVjdCAgICBFbmQgb2YgbGluZSB7bGF0aXR1ZGU6IDEyMywgbG9uZ2l0dWRlOiAxMjN9XG4gICAgICAgICogQHJldHVybiAgIGJvb2xlYW5cbiAgICAgICAgKi9cbiAgICAgICAgaXNQb2ludEluTGluZTogZnVuY3Rpb24ocG9pbnQsIHN0YXJ0LCBlbmQpIHtcblxuICAgICAgICAgICAgcmV0dXJuICh0aGlzLmdldERpc3RhbmNlKHN0YXJ0LCBwb2ludCwgMSwgMykrdGhpcy5nZXREaXN0YW5jZShwb2ludCwgZW5kLCAxLCAzKSkudG9GaXhlZCgzKT09dGhpcy5nZXREaXN0YW5jZShzdGFydCwgZW5kLCAxLCAzKTtcbiAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAqIENoZWNrIGlmIGEgcG9pbnQgbGllcyB3aXRoaW4gYSBnaXZlbiBkaXN0YW5jZSBmcm9tIGEgbGluZSBjcmVhdGVkIGJ5IHR3byBvdGhlciBwb2ludHNcbiAgICAgICAgKlxuICAgICAgICAqIEBwYXJhbSAgICBvYmplY3QgICAgUG9pbnQgdG8gY2hlY2s6IHtsYXRpdHVkZTogMTIzLCBsb25naXR1ZGU6IDEyM31cbiAgICAgICAgKiBAcGFyYW0gICAgb2JqZWN0ICAgIFN0YXJ0IG9mIGxpbmUge2xhdGl0dWRlOiAxMjMsIGxvbmdpdHVkZTogMTIzfVxuICAgICAgICAqIEBwYXJhbSAgICBvYmplY3QgICAgRW5kIG9mIGxpbmUge2xhdGl0dWRlOiAxMjMsIGxvbmdpdHVkZTogMTIzfVxuICAgICAgICAqIEBwYXJhcm0gICBmbG9hdCAgICAgbWF4aW11bSBkaXN0YW5jZSBmcm9tIGxpbmVcbiAgICAgICAgKiBAcmV0dXJuICAgYm9vbGVhblxuICAgICAgICAqL1xuICAgICAgICBpc1BvaW50TmVhckxpbmU6IGZ1bmN0aW9uKHBvaW50LCBzdGFydCwgZW5kLCBkaXN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGlzdGFuY2VGcm9tTGluZShwb2ludCwgc3RhcnQsIGVuZCkgPCBkaXN0YW5jZTtcbiAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICogcmV0dXJuIHRoZSBtaW5pbXVtIGRpc3RhbmNlIGZyb20gYSBwb2ludCB0byBhIGxpbmVcbiAgICAgICAgKlxuICAgICAgICAqIEBwYXJhbSAgICBvYmplY3QgICAgUG9pbnQgYXdheSBmcm9tIGxpbmVcbiAgICAgICAgKiBAcGFyYW0gICAgb2JqZWN0ICAgIFN0YXJ0IG9mIGxpbmUge2xhdGl0dWRlOiAxMjMsIGxvbmdpdHVkZTogMTIzfVxuICAgICAgICAqIEBwYXJhbSAgICBvYmplY3QgICAgRW5kIG9mIGxpbmUge2xhdGl0dWRlOiAxMjMsIGxvbmdpdHVkZTogMTIzfVxuICAgICAgICAqIEByZXR1cm4gICBmbG9hdCAgICAgZGlzdGFuY2UgZnJvbSBwb2ludCB0byBsaW5lXG4gICAgICAgICovXG4gICAgICAgIGdldERpc3RhbmNlRnJvbUxpbmU6IGZ1bmN0aW9uKHBvaW50LCBzdGFydCwgZW5kKSB7XG4gICAgICAgICAgICB2YXIgZDEgPSB0aGlzLmdldERpc3RhbmNlKHN0YXJ0LCBwb2ludCwgMSwgMyk7XG4gICAgICAgICAgICB2YXIgZDIgPSB0aGlzLmdldERpc3RhbmNlKHBvaW50LCBlbmQsIDEsIDMpO1xuICAgICAgICAgICAgdmFyIGQzID0gdGhpcy5nZXREaXN0YW5jZShzdGFydCwgZW5kLCAxLCAzKTtcbiAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9IDA7XG5cbiAgICAgICAgICAgIC8vIGFscGhhIGlzIHRoZSBhbmdsZSBiZXR3ZWVuIHRoZSBsaW5lIGZyb20gc3RhcnQgdG8gcG9pbnQsIGFuZCBmcm9tIHN0YXJ0IHRvIGVuZCAvL1xuICAgICAgICAgICAgdmFyIGFscGhhID0gTWF0aC5hY29zKChkMSpkMSArIGQzKmQzIC0gZDIqZDIpLygyKmQxKmQzKSk7XG4gICAgICAgICAgICAvLyBiZXRhIGlzIHRoZSBhbmdsZSBiZXR3ZWVuIHRoZSBsaW5lIGZyb20gZW5kIHRvIHBvaW50IGFuZCBmcm9tIGVuZCB0byBzdGFydCAvL1xuICAgICAgICAgICAgdmFyIGJldGEgPSBNYXRoLmFjb3MoKGQyKmQyICsgZDMqZDMgLSBkMSpkMSkvKDIqZDIqZDMpKTtcblxuICAgICAgICAgICAgLy8gaWYgdGhlIGFuZ2xlIGlzIGdyZWF0ZXIgdGhhbiA5MCBkZWdyZWVzLCB0aGVuIHRoZSBtaW5pbXVtIGRpc3RhbmNlIGlzIHRoZVxuICAgICAgICAgICAgLy8gbGluZSBmcm9tIHRoZSBzdGFydCB0byB0aGUgcG9pbnQgLy9cbiAgICAgICAgICAgIGlmKGFscGhhPk1hdGguUEkvMikge1xuICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gZDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBzYW1lIGZvciB0aGUgYmV0YSAvL1xuICAgICAgICAgICAgZWxzZSBpZihiZXRhID4gTWF0aC5QSS8yKSB7XG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBkMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIG90aGVyd2lzZSB0aGUgbWluaW11bSBkaXN0YW5jZSBpcyBhY2hpZXZlZCB0aHJvdWdoIGEgbGluZSBwZXJwZW5kdWxhciB0byB0aGUgc3RhcnQtZW5kIGxpbmUsXG4gICAgICAgICAgICAvLyB3aGljaCBnb2VzIGZyb20gdGhlIHN0YXJ0LWVuZCBsaW5lIHRvIHRoZSBwb2ludCAvL1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBNYXRoLnNpbihhbHBoYSkgKiBkMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGRpc3RhbmNlO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIEZpbmRzIHRoZSBuZWFyZXN0IGNvb3JkaW5hdGUgdG8gYSByZWZlcmVuY2UgY29vcmRpbmF0ZVxuICAgICAgICAqXG4gICAgICAgICogQHBhcmFtICAgICAgICBvYmplY3QgICAgICByZWZlcmVuY2UgY29vcmRpbmF0ZSBlLmcuIHtsYXRpdHVkZTogNTEuNTAyMywgbG9uZ2l0dWRlOiA3LjM4MTV9XG4gICAgICAgICogQHBhcmFtICAgICAgICBtaXhlZCAgICAgICBhcnJheSBvciBvYmplY3Qgd2l0aCBjb29yZHMgW3tsYXRpdHVkZTogNTEuNTE0MywgbG9uZ2l0dWRlOiA3LjQxMzh9LCB7bGF0aXR1ZGU6IDEyMywgbG9uZ2l0dWRlOiAxMjN9LCAuLi5dXG4gICAgICAgICogQHJldHVybiAgICAgICBhcnJheSAgICAgICBvcmRlcmVkIGFycmF5XG4gICAgICAgICovXG4gICAgICAgIGZpbmROZWFyZXN0OiBmdW5jdGlvbihsYXRsbmcsIGNvb3Jkcywgb2Zmc2V0LCBsaW1pdCkge1xuXG4gICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcbiAgICAgICAgICAgIGxpbWl0ID0gbGltaXQgfHwgMTtcbiAgICAgICAgICAgIHZhciBvcmRlcmVkID0gdGhpcy5vcmRlckJ5RGlzdGFuY2UobGF0bG5nLCBjb29yZHMpO1xuXG4gICAgICAgICAgICBpZihsaW1pdCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmRlcmVkW29mZnNldF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmRlcmVkLnNwbGljZShvZmZzZXQsIGxpbWl0KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgZ2l2ZW4gcGF0aFxuICAgICAgICAqXG4gICAgICAgICogQHBhcmFtICAgICAgICBtaXhlZCAgICAgICBhcnJheSBvciBvYmplY3Qgd2l0aCBjb29yZHMgW3tsYXRpdHVkZTogNTEuNTE0MywgbG9uZ2l0dWRlOiA3LjQxMzh9LCB7bGF0aXR1ZGU6IDEyMywgbG9uZ2l0dWRlOiAxMjN9LCAuLi5dXG4gICAgICAgICogQHJldHVybiAgICAgICBpbnRlZ2VyICAgICBsZW5ndGggb2YgdGhlIHBhdGggKGluIG1ldGVycylcbiAgICAgICAgKi9cbiAgICAgICAgZ2V0UGF0aExlbmd0aDogZnVuY3Rpb24oY29vcmRzKSB7XG5cbiAgICAgICAgICAgIHZhciBkaXN0ID0gMDtcbiAgICAgICAgICAgIHZhciBsYXN0O1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbCA9IGNvb3Jkcy5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICAgICAgICAgICAgICBpZihsYXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coY29vcmRzW2ldLCBsYXN0LCB0aGlzLmdldERpc3RhbmNlKGNvb3Jkc1tpXSwgbGFzdCkpO1xuICAgICAgICAgICAgICAgICAgICBkaXN0ICs9IHRoaXMuZ2V0RGlzdGFuY2UodGhpcy5jb29yZHMoY29vcmRzW2ldKSwgbGFzdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxhc3QgPSB0aGlzLmNvb3Jkcyhjb29yZHNbaV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZGlzdDtcblxuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQ2FsY3VsYXRlcyB0aGUgc3BlZWQgYmV0d2VlbiB0byBwb2ludHMgd2l0aGluIGEgZ2l2ZW4gdGltZSBzcGFuLlxuICAgICAgICAqXG4gICAgICAgICogQHBhcmFtICAgICAgICBvYmplY3QgICAgICBjb29yZHMgd2l0aCBqYXZhc2NyaXB0IHRpbWVzdGFtcCB7bGF0aXR1ZGU6IDUxLjUxNDMsIGxvbmdpdHVkZTogNy40MTM4LCB0aW1lOiAxMzYwMjMxMjAwODgwfVxuICAgICAgICAqIEBwYXJhbSAgICAgICAgb2JqZWN0ICAgICAgY29vcmRzIHdpdGggamF2YXNjcmlwdCB0aW1lc3RhbXAge2xhdGl0dWRlOiA1MS41NTAyLCBsb25naXR1ZGU6IDcuNDMyMywgdGltZTogMTM2MDI0NTYwMDQ2MH1cbiAgICAgICAgKiBAcGFyYW0gICAgICAgIG9iamVjdCAgICAgIG9wdGlvbnMgKGN1cnJlbnRseSBcInVuaXRcIiBpcyB0aGUgb25seSBvcHRpb24uIERlZmF1bHQ6IGttKGgpKTtcbiAgICAgICAgKiBAcmV0dXJuICAgICAgIGZsb2F0ICAgICAgIHNwZWVkIGluIHVuaXQgcGVyIGhvdXJcbiAgICAgICAgKi9cbiAgICAgICAgZ2V0U3BlZWQ6IGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIG9wdGlvbnMpIHtcblxuICAgICAgICAgICAgdmFyIHVuaXQgPSBvcHRpb25zICYmIG9wdGlvbnMudW5pdCB8fCAna20nO1xuXG4gICAgICAgICAgICBpZih1bml0ID09ICdtcGgnKSB7XG4gICAgICAgICAgICAgICAgdW5pdCA9ICdtaSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYodW5pdCA9PSAna21oJykge1xuICAgICAgICAgICAgICAgIHVuaXQgPSAna20nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgZGlzdGFuY2UgPSBnZW9saWIuZ2V0RGlzdGFuY2Uoc3RhcnQsIGVuZCk7XG4gICAgICAgICAgICB2YXIgdGltZSA9ICgoZW5kLnRpbWUqMSkvMTAwMCkgLSAoKHN0YXJ0LnRpbWUqMSkvMTAwMCk7XG4gICAgICAgICAgICB2YXIgbVBlckhyID0gKGRpc3RhbmNlL3RpbWUpKjM2MDA7XG4gICAgICAgICAgICB2YXIgc3BlZWQgPSBNYXRoLnJvdW5kKG1QZXJIciAqIHRoaXMubWVhc3VyZXNbdW5pdF0gKiAxMDAwMCkvMTAwMDA7XG4gICAgICAgICAgICByZXR1cm4gc3BlZWQ7XG5cbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb21wdXRlcyB0aGUgZGVzdGluYXRpb24gcG9pbnQgZ2l2ZW4gYW4gaW5pdGlhbCBwb2ludCwgYSBkaXN0YW5jZVxuICAgICAgICAgKiBhbmQgYSBiZWFyaW5nXG4gICAgICAgICAqXG4gICAgICAgICAqIHNlZSBodHRwOi8vd3d3Lm1vdmFibGUtdHlwZS5jby51ay9zY3JpcHRzL2xhdGxvbmcuaHRtbCBmb3IgdGhlIG9yaWdpbmFsIGNvZGVcbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtICAgICAgICBvYmplY3QgICAgIHN0YXJ0IGNvb3JkaW5hdGUgKGUuZy4ge2xhdGl0dWRlOiA1MS41MDIzLCBsb25naXR1ZGU6IDcuMzgxNX0pXG4gICAgICAgICAqIEBwYXJhbSAgICAgICAgZmxvYXQgICAgICBsb25naXR1ZGUgb2YgdGhlIGluaXRhbCBwb2ludCBpbiBkZWdyZWVcbiAgICAgICAgICogQHBhcmFtICAgICAgICBmbG9hdCAgICAgIGRpc3RhbmNlIHRvIGdvIGZyb20gdGhlIGluaXRhbCBwb2ludCBpbiBtZXRlclxuICAgICAgICAgKiBAcGFyYW0gICAgICAgIGZsb2F0ICAgICAgYmVhcmluZyBpbiBkZWdyZWUgb2YgdGhlIGRpcmVjdGlvbiB0byBnbywgZS5nLiAwID0gbm9ydGgsIDE4MCA9IHNvdXRoXG4gICAgICAgICAqIEBwYXJhbSAgICAgICAgZmxvYXQgICAgICBvcHRpb25hbCAoaW4gbWV0ZXIpLCBkZWZhdWx0cyB0byBtZWFuIHJhZGl1cyBvZiB0aGUgZWFydGhcbiAgICAgICAgICogQHJldHVybiAgICAgICBvYmplY3QgICAgIHtsYXRpdHVkZTogZGVzdExhdCAoaW4gZGVncmVlKSwgbG9uZ2l0dWRlOiBkZXN0TG5nIChpbiBkZWdyZWUpfVxuICAgICAgICAgKi9cbiAgICAgICAgY29tcHV0ZURlc3RpbmF0aW9uUG9pbnQ6IGZ1bmN0aW9uKHN0YXJ0LCBkaXN0YW5jZSwgYmVhcmluZywgcmFkaXVzKSB7XG5cbiAgICAgICAgICAgIHZhciBsYXQgPSB0aGlzLmxhdGl0dWRlKHN0YXJ0KTtcbiAgICAgICAgICAgIHZhciBsbmcgPSB0aGlzLmxvbmdpdHVkZShzdGFydCk7XG5cbiAgICAgICAgICAgIHJhZGl1cyA9ICh0eXBlb2YgcmFkaXVzID09PSAndW5kZWZpbmVkJykgPyB0aGlzLnJhZGl1cyA6IE51bWJlcihyYWRpdXMpO1xuXG4gICAgICAgICAgICB2YXIgzrQgPSBOdW1iZXIoZGlzdGFuY2UpIC8gcmFkaXVzOyAvLyBhbmd1bGFyIGRpc3RhbmNlIGluIHJhZGlhbnNcbiAgICAgICAgICAgIHZhciDOuCA9IE51bWJlcihiZWFyaW5nKS50b1JhZCgpO1xuXG4gICAgICAgICAgICB2YXIgz4YxID0gTnVtYmVyKGxhdCkudG9SYWQoKTtcbiAgICAgICAgICAgIHZhciDOuzEgPSBOdW1iZXIobG5nKS50b1JhZCgpO1xuXG4gICAgICAgICAgICB2YXIgz4YyID0gTWF0aC5hc2luKCBNYXRoLnNpbijPhjEpKk1hdGguY29zKM60KSArXG4gICAgICAgICAgICAgICAgTWF0aC5jb3Moz4YxKSpNYXRoLnNpbijOtCkqTWF0aC5jb3MozrgpICk7XG4gICAgICAgICAgICB2YXIgzrsyID0gzrsxICsgTWF0aC5hdGFuMihNYXRoLnNpbijOuCkqTWF0aC5zaW4ozrQpKk1hdGguY29zKM+GMSksXG4gICAgICAgICAgICAgICAgICAgIE1hdGguY29zKM60KS1NYXRoLnNpbijPhjEpKk1hdGguc2luKM+GMikpO1xuICAgICAgICAgICAgzrsyID0gKM67MiszKk1hdGguUEkpICUgKDIqTWF0aC5QSSkgLSBNYXRoLlBJOyAvLyBub3JtYWxpc2UgdG8gLTE4MC4uKzE4MMKwXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbGF0aXR1ZGU6IM+GMi50b0RlZygpLFxuICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogzrsyLnRvRGVnKClcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIENvbnZlcnRzIGEgZGlzdGFuY2UgZnJvbSBtZXRlcnMgdG8ga20sIG1tLCBjbSwgbWksIGZ0LCBpbiBvciB5ZFxuICAgICAgICAqXG4gICAgICAgICogQHBhcmFtICAgICAgICBzdHJpbmcgICAgICBGb3JtYXQgdG8gYmUgY29udmVydGVkIGluXG4gICAgICAgICogQHBhcmFtICAgICAgICBmbG9hdCAgICAgICBEaXN0YW5jZSBpbiBtZXRlcnNcbiAgICAgICAgKiBAcGFyYW0gICAgICAgIGZsb2F0ICAgICAgIERlY2ltYWwgcGxhY2VzIGZvciByb3VuZGluZyAoZGVmYXVsdDogNClcbiAgICAgICAgKiBAcmV0dXJuICAgICAgIGZsb2F0ICAgICAgIENvbnZlcnRlZCBkaXN0YW5jZVxuICAgICAgICAqL1xuICAgICAgICBjb252ZXJ0VW5pdDogZnVuY3Rpb24odW5pdCwgZGlzdGFuY2UsIHJvdW5kKSB7XG5cbiAgICAgICAgICAgIGlmKGRpc3RhbmNlID09PSAwKSB7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcblxuICAgICAgICAgICAgfSBlbHNlIGlmKHR5cGVvZiBkaXN0YW5jZSA9PT0gJ3VuZGVmaW5lZCcpIHtcblxuICAgICAgICAgICAgICAgIGlmKHRoaXMuZGlzdGFuY2UgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBkaXN0YW5jZSB3YXMgZ2l2ZW4nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYodGhpcy5kaXN0YW5jZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IHRoaXMuZGlzdGFuY2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHVuaXQgPSB1bml0IHx8ICdtJztcbiAgICAgICAgICAgIHJvdW5kID0gKG51bGwgPT0gcm91bmQgPyA0IDogcm91bmQpO1xuXG4gICAgICAgICAgICBpZih0eXBlb2YgdGhpcy5tZWFzdXJlc1t1bml0XSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yb3VuZChkaXN0YW5jZSAqIHRoaXMubWVhc3VyZXNbdW5pdF0sIHJvdW5kKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHVuaXQgZm9yIGNvbnZlcnNpb24uJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIGluIGRlY2ltYWwgZm9ybWF0IG9yLCBpZiBuZWNjZXNzYXJ5LCBjb252ZXJ0cyB0byBkZWNpbWFsXG4gICAgICAgICpcbiAgICAgICAgKiBAcGFyYW0gICAgICAgIG1peGVkICAgICAgIFZhbHVlKHMpIHRvIGJlIGNoZWNrZWQvY29udmVydGVkIChhcnJheSBvZiBsYXRsbmcgb2JqZWN0cywgbGF0bG5nIG9iamVjdCwgc2V4YWdlc2ltYWwgc3RyaW5nLCBmbG9hdClcbiAgICAgICAgKiBAcmV0dXJuICAgICAgIGZsb2F0ICAgICAgIElucHV0IGRhdGEgaW4gZGVjaW1hbCBmb3JtYXRcbiAgICAgICAgKi9cbiAgICAgICAgdXNlRGVjaW1hbDogZnVuY3Rpb24odmFsdWUpIHtcblxuICAgICAgICAgICAgaWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgQXJyYXldJykge1xuXG4gICAgICAgICAgICAgICAgdmFyIGdlb2xpYiA9IHRoaXM7XG5cbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLm1hcChmdW5jdGlvbih2YWwpIHtcblxuICAgICAgICAgICAgICAgICAgICAvL2lmKCFpc05hTihwYXJzZUZsb2F0KHZhbCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKGdlb2xpYi5pc0RlY2ltYWwodmFsKSkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2VvbGliLnVzZURlY2ltYWwodmFsKTtcblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYodHlwZW9mIHZhbCA9PSAnb2JqZWN0Jykge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihnZW9saWIudmFsaWRhdGUodmFsKSkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlb2xpYi5jb29yZHModmFsKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcih2YXIgcHJvcCBpbiB2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsW3Byb3BdID0gZ2VvbGliLnVzZURlY2ltYWwodmFsW3Byb3BdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKGdlb2xpYi5pc1NleGFnZXNpbWFsKHZhbCkpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlb2xpYi5zZXhhZ2VzaW1hbDJkZWNpbWFsKHZhbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDtcblxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdGhpcy52YWxpZGF0ZSh2YWx1ZSkpIHtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvb3Jkcyh2YWx1ZSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG5cbiAgICAgICAgICAgICAgICBmb3IodmFyIHByb3AgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVbcHJvcF0gPSB0aGlzLnVzZURlY2ltYWwodmFsdWVbcHJvcF0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcblxuICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIGlmICh0aGlzLmlzRGVjaW1hbCh2YWx1ZSkpIHtcblxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbHVlKTtcblxuICAgICAgICAgICAgfSBlbHNlIGlmKHRoaXMuaXNTZXhhZ2VzaW1hbCh2YWx1ZSkgPT09IHRydWUpIHtcblxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHRoaXMuc2V4YWdlc2ltYWwyZGVjaW1hbCh2YWx1ZSkpO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBmb3JtYXQuJyk7XG5cbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAgICAgICAgKiBDb252ZXJ0cyBhIGRlY2ltYWwgY29vcmRpbmF0ZSB2YWx1ZSB0byBzZXhhZ2VzaW1hbCBmb3JtYXRcbiAgICAgICAgKlxuICAgICAgICAqIEBwYXJhbSAgICAgICAgZmxvYXQgICAgICAgZGVjaW1hbFxuICAgICAgICAqIEByZXR1cm4gICAgICAgc3RyaW5nICAgICAgU2V4YWdlc2ltYWwgdmFsdWUgKFhYwrAgWVknIFpaXCIpXG4gICAgICAgICovXG4gICAgICAgIGRlY2ltYWwyc2V4YWdlc2ltYWw6IGZ1bmN0aW9uKGRlYykge1xuXG4gICAgICAgICAgICBpZiAoZGVjIGluIHRoaXMuc2V4YWdlc2ltYWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXhhZ2VzaW1hbFtkZWNdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdG1wID0gZGVjLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTtcblxuICAgICAgICAgICAgdmFyIGRlZyA9IE1hdGguYWJzKHRtcFswXSk7XG4gICAgICAgICAgICB2YXIgbWluID0gKCcwLicgKyAodG1wWzFdIHx8IDApKSo2MDtcbiAgICAgICAgICAgIHZhciBzZWMgPSBtaW4udG9TdHJpbmcoKS5zcGxpdCgnLicpO1xuXG4gICAgICAgICAgICBtaW4gPSBNYXRoLmZsb29yKG1pbik7XG4gICAgICAgICAgICBzZWMgPSAoKCcwLicgKyAoc2VjWzFdIHx8IDApKSAqIDYwKS50b0ZpeGVkKDIpO1xuXG4gICAgICAgICAgICB0aGlzLnNleGFnZXNpbWFsW2RlY10gPSAoZGVnICsgJ8KwICcgKyBtaW4gKyBcIicgXCIgKyBzZWMgKyAnXCInKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V4YWdlc2ltYWxbZGVjXTtcblxuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQ29udmVydHMgYSBzZXhhZ2VzaW1hbCBjb29yZGluYXRlIHRvIGRlY2ltYWwgZm9ybWF0XG4gICAgICAgICpcbiAgICAgICAgKiBAcGFyYW0gICAgICAgIGZsb2F0ICAgICAgIFNleGFnZXNpbWFsIGNvb3JkaW5hdGVcbiAgICAgICAgKiBAcmV0dXJuICAgICAgIHN0cmluZyAgICAgIERlY2ltYWwgdmFsdWUgKFhYLlhYWFhYWFhYKVxuICAgICAgICAqL1xuICAgICAgICBzZXhhZ2VzaW1hbDJkZWNpbWFsOiBmdW5jdGlvbihzZXhhZ2VzaW1hbCkge1xuXG4gICAgICAgICAgICBpZiAoc2V4YWdlc2ltYWwgaW4gdGhpcy5kZWNpbWFsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVjaW1hbFtzZXhhZ2VzaW1hbF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciByZWdFeCA9IG5ldyBSZWdFeHAodGhpcy5zZXhhZ2VzaW1hbFBhdHRlcm4pO1xuICAgICAgICAgICAgdmFyIGRhdGEgPSByZWdFeC5leGVjKHNleGFnZXNpbWFsKTtcbiAgICAgICAgICAgIHZhciBtaW4gPSAwLCBzZWMgPSAwO1xuXG4gICAgICAgICAgICBpZihkYXRhKSB7XG4gICAgICAgICAgICAgICAgbWluID0gcGFyc2VGbG9hdChkYXRhWzJdLzYwKTtcbiAgICAgICAgICAgICAgICBzZWMgPSBwYXJzZUZsb2F0KGRhdGFbNF0vMzYwMCkgfHwgMDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGRlYyA9ICgocGFyc2VGbG9hdChkYXRhWzFdKSArIG1pbiArIHNlYykpLnRvRml4ZWQoOCk7XG4gICAgICAgICAgICAvL3ZhciAgIGRlYyA9ICgocGFyc2VGbG9hdChkYXRhWzFdKSArIG1pbiArIHNlYykpO1xuXG4gICAgICAgICAgICAgICAgLy8gU291dGggYW5kIFdlc3QgYXJlIG5lZ2F0aXZlIGRlY2ltYWxzXG4gICAgICAgICAgICAgICAgZGVjID0gKGRhdGFbN10gPT0gJ1MnIHx8IGRhdGFbN10gPT0gJ1cnKSA/IHBhcnNlRmxvYXQoLWRlYykgOiBwYXJzZUZsb2F0KGRlYyk7XG4gICAgICAgICAgICAgICAgLy9kZWMgPSAoZGF0YVs3XSA9PSAnUycgfHwgZGF0YVs3XSA9PSAnVycpID8gLWRlYyA6IGRlYztcblxuICAgICAgICAgICAgdGhpcy5kZWNpbWFsW3NleGFnZXNpbWFsXSA9IGRlYztcblxuICAgICAgICAgICAgcmV0dXJuIGRlYztcblxuICAgICAgICB9LFxuXG5cbiAgICAgICAgLyoqXG4gICAgICAgICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgaW4gZGVjaW1hbCBmb3JtYXRcbiAgICAgICAgKlxuICAgICAgICAqIEBwYXJhbSAgICAgICAgc3RyaW5nICAgICAgVmFsdWUgdG8gYmUgY2hlY2tlZFxuICAgICAgICAqIEByZXR1cm4gICAgICAgYm9vbCAgICAgICAgVHJ1ZSBpZiBpbiBzZXhhZ2VzaW1hbCBmb3JtYXRcbiAgICAgICAgKi9cbiAgICAgICAgaXNEZWNpbWFsOiBmdW5jdGlvbih2YWx1ZSkge1xuXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxzKi8sICcnKTtcblxuICAgICAgICAgICAgLy8gbG9va3Mgc2lsbHkgYnV0IHdvcmtzIGFzIGV4cGVjdGVkXG4gICAgICAgICAgICAvLyBjaGVja3MgaWYgdmFsdWUgaXMgaW4gZGVjaW1hbCBmb3JtYXRcbiAgICAgICAgICAgIHJldHVybiAoIWlzTmFOKHBhcnNlRmxvYXQodmFsdWUpKSAmJiBwYXJzZUZsb2F0KHZhbHVlKSA9PSB2YWx1ZSk7XG5cbiAgICAgICAgfSxcblxuXG4gICAgICAgIC8qKlxuICAgICAgICAqIENoZWNrcyBpZiBhIHZhbHVlIGlzIGluIHNleGFnZXNpbWFsIGZvcm1hdFxuICAgICAgICAqXG4gICAgICAgICogQHBhcmFtICAgICAgICBzdHJpbmcgICAgICBWYWx1ZSB0byBiZSBjaGVja2VkXG4gICAgICAgICogQHJldHVybiAgICAgICBib29sICAgICAgICBUcnVlIGlmIGluIHNleGFnZXNpbWFsIGZvcm1hdFxuICAgICAgICAqL1xuICAgICAgICBpc1NleGFnZXNpbWFsOiBmdW5jdGlvbih2YWx1ZSkge1xuXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxzKi8sICcnKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2V4YWdlc2ltYWxQYXR0ZXJuLnRlc3QodmFsdWUpO1xuXG4gICAgICAgIH0sXG5cbiAgICAgICAgcm91bmQ6IGZ1bmN0aW9uKHZhbHVlLCBuKSB7XG4gICAgICAgICAgICB2YXIgZGVjUGxhY2UgPSBNYXRoLnBvdygxMCwgbik7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSAqIGRlY1BsYWNlKS9kZWNQbGFjZTtcbiAgICAgICAgfVxuXG4gICAgfSk7XG5cbiAgICAvLyBOb2RlIG1vZHVsZVxuICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgIT09ICd1bmRlZmluZWQnKSB7XG5cbiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBnZW9saWI7XG5cbiAgICAgICAgLy8gcmVhY3QgbmF0aXZlXG4gICAgICAgIGlmICh0eXBlb2YgZ2xvYmFsID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgIGdsb2JhbC5nZW9saWIgPSBnZW9saWI7XG4gICAgICAgIH1cblxuICAgIC8vIEFNRCBtb2R1bGVcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7XG5cbiAgICAgICAgZGVmaW5lKFwiZ2VvbGliXCIsIFtdLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2VvbGliO1xuICAgICAgICB9KTtcblxuICAgIC8vIHdlJ3JlIGluIGEgYnJvd3NlclxuICAgIH0gZWxzZSB7XG5cbiAgICAgICAgZ2xvYmFsLmdlb2xpYiA9IGdlb2xpYjtcblxuICAgIH1cblxufSh0aGlzKSk7XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL25vZGVfbW9kdWxlcy9nZW9saWIvZGlzdC9nZW9saWIuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL2dlb2xpYi9kaXN0L2dlb2xpYi5qc1xuLy8gbW9kdWxlIGNodW5rcyA9IDAgMSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/geolib/dist/geolib.js\n"); +eval("module.exports = __webpack_require__(\"./node_modules/babel-runtime/node_modules/regenerator-runtime/runtime-module.js\");\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvci9pbmRleC5qcz81ZjE2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQixtQkFBTyxDQUFDLGlGQUFxQiIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL3JlZ2VuZXJhdG9yL2luZGV4LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZVwiKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3IvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3IvaW5kZXguanNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/babel-runtime/regenerator/index.js\n"); /***/ }), @@ -313,20 +320,6 @@ eval("// shim for using process in browser\nvar process = module.exports = {};\n /***/ }), -/***/ "./node_modules/regenerator-runtime/runtime-module.js": -/***/ (function(module, exports, __webpack_require__) { - -eval("/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n// This method of obtaining a reference to the global object needs to be\n// kept identical to the way it is obtained in runtime.js\nvar g = (function() { return this })() || Function(\"return this\")();\n\n// Use `getOwnPropertyNames` because not all browsers support calling\n// `hasOwnProperty` on the global `self` object in a worker. See #183.\nvar hadRuntime = g.regeneratorRuntime &&\n Object.getOwnPropertyNames(g).indexOf(\"regeneratorRuntime\") >= 0;\n\n// Save the old regeneratorRuntime in case it needs to be restored later.\nvar oldRuntime = hadRuntime && g.regeneratorRuntime;\n\n// Force reevalutation of runtime.js.\ng.regeneratorRuntime = undefined;\n\nmodule.exports = __webpack_require__(\"./node_modules/regenerator-runtime/runtime.js\");\n\nif (hadRuntime) {\n // Restore the original runtime.\n g.regeneratorRuntime = oldRuntime;\n} else {\n // Remove the global property added by runtime.js.\n try {\n delete g.regeneratorRuntime;\n } catch(e) {\n g.regeneratorRuntime = undefined;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLW1vZHVsZS5qcz84ZjIxIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCLGNBQWM7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQywrQ0FBVzs7QUFFcEM7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLW1vZHVsZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuLy8gVGhpcyBtZXRob2Qgb2Ygb2J0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0IG5lZWRzIHRvIGJlXG4vLyBrZXB0IGlkZW50aWNhbCB0byB0aGUgd2F5IGl0IGlzIG9idGFpbmVkIGluIHJ1bnRpbWUuanNcbnZhciBnID0gKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcyB9KSgpIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcblxuLy8gVXNlIGBnZXRPd25Qcm9wZXJ0eU5hbWVzYCBiZWNhdXNlIG5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCBjYWxsaW5nXG4vLyBgaGFzT3duUHJvcGVydHlgIG9uIHRoZSBnbG9iYWwgYHNlbGZgIG9iamVjdCBpbiBhIHdvcmtlci4gU2VlICMxODMuXG52YXIgaGFkUnVudGltZSA9IGcucmVnZW5lcmF0b3JSdW50aW1lICYmXG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGcpLmluZGV4T2YoXCJyZWdlbmVyYXRvclJ1bnRpbWVcIikgPj0gMDtcblxuLy8gU2F2ZSB0aGUgb2xkIHJlZ2VuZXJhdG9yUnVudGltZSBpbiBjYXNlIGl0IG5lZWRzIHRvIGJlIHJlc3RvcmVkIGxhdGVyLlxudmFyIG9sZFJ1bnRpbWUgPSBoYWRSdW50aW1lICYmIGcucmVnZW5lcmF0b3JSdW50aW1lO1xuXG4vLyBGb3JjZSByZWV2YWx1dGF0aW9uIG9mIHJ1bnRpbWUuanMuXG5nLnJlZ2VuZXJhdG9yUnVudGltZSA9IHVuZGVmaW5lZDtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi9ydW50aW1lXCIpO1xuXG5pZiAoaGFkUnVudGltZSkge1xuICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBydW50aW1lLlxuICBnLnJlZ2VuZXJhdG9yUnVudGltZSA9IG9sZFJ1bnRpbWU7XG59IGVsc2Uge1xuICAvLyBSZW1vdmUgdGhlIGdsb2JhbCBwcm9wZXJ0eSBhZGRlZCBieSBydW50aW1lLmpzLlxuICB0cnkge1xuICAgIGRlbGV0ZSBnLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgfSBjYXRjaChlKSB7XG4gICAgZy5yZWdlbmVyYXRvclJ1bnRpbWUgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS1tb2R1bGUuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS1tb2R1bGUuanNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/regenerator-runtime/runtime-module.js\n"); - -/***/ }), - -/***/ "./node_modules/regenerator-runtime/runtime.js": -/***/ (function(module, exports) { - -eval("/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n!(function(global) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // In sloppy mode, unbound `this` refers to the global object, fallback to\n // Function constructor if we're in global strict mode. That is sadly a form\n // of indirect eval which violates Content Security Policy.\n (function() { return this })() || Function(\"return this\")()\n);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzPzRhNTciXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsS0FBSztBQUNMLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBLHdDQUF3QyxXQUFXO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW9DLGNBQWM7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlDQUFpQyxrQkFBa0I7QUFDbkQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGlCQUFpQjtBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsOENBQThDLFFBQVE7QUFDdEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUEsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsOENBQThDLFFBQVE7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxlQUFlLGNBQWM7QUFDN0IiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4hKGZ1bmN0aW9uKGdsb2JhbCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgT3AgPSBPYmplY3QucHJvdG90eXBlO1xuICB2YXIgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHk7XG4gIHZhciB1bmRlZmluZWQ7IC8vIE1vcmUgY29tcHJlc3NpYmxlIHRoYW4gdm9pZCAwLlxuICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbCA6IHt9O1xuICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiO1xuICB2YXIgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiO1xuICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuXG4gIHZhciBpbk1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCI7XG4gIHZhciBydW50aW1lID0gZ2xvYmFsLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgaWYgKHJ1bnRpbWUpIHtcbiAgICBpZiAoaW5Nb2R1bGUpIHtcbiAgICAgIC8vIElmIHJlZ2VuZXJhdG9yUnVudGltZSBpcyBkZWZpbmVkIGdsb2JhbGx5IGFuZCB3ZSdyZSBpbiBhIG1vZHVsZSxcbiAgICAgIC8vIG1ha2UgdGhlIGV4cG9ydHMgb2JqZWN0IGlkZW50aWNhbCB0byByZWdlbmVyYXRvclJ1bnRpbWUuXG4gICAgICBtb2R1bGUuZXhwb3J0cyA9IHJ1bnRpbWU7XG4gICAgfVxuICAgIC8vIERvbid0IGJvdGhlciBldmFsdWF0aW5nIHRoZSByZXN0IG9mIHRoaXMgZmlsZSBpZiB0aGUgcnVudGltZSB3YXNcbiAgICAvLyBhbHJlYWR5IGRlZmluZWQgZ2xvYmFsbHkuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRGVmaW5lIHRoZSBydW50aW1lIGdsb2JhbGx5IChhcyBleHBlY3RlZCBieSBnZW5lcmF0ZWQgY29kZSkgYXMgZWl0aGVyXG4gIC8vIG1vZHVsZS5leHBvcnRzIChpZiB3ZSdyZSBpbiBhIG1vZHVsZSkgb3IgYSBuZXcsIGVtcHR5IG9iamVjdC5cbiAgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWUgPSBpbk1vZHVsZSA/IG1vZHVsZS5leHBvcnRzIDoge307XG5cbiAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIC8vIElmIG91dGVyRm4gcHJvdmlkZWQgYW5kIG91dGVyRm4ucHJvdG90eXBlIGlzIGEgR2VuZXJhdG9yLCB0aGVuIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yLlxuICAgIHZhciBwcm90b0dlbmVyYXRvciA9IG91dGVyRm4gJiYgb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBvdXRlckZuIDogR2VuZXJhdG9yO1xuICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSk7XG4gICAgdmFyIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7XG5cbiAgICAvLyBUaGUgLl9pbnZva2UgbWV0aG9kIHVuaWZpZXMgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzLlxuICAgIGdlbmVyYXRvci5faW52b2tlID0gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH1cbiAgcnVudGltZS53cmFwID0gd3JhcDtcblxuICAvLyBUcnkvY2F0Y2ggaGVscGVyIHRvIG1pbmltaXplIGRlb3B0aW1pemF0aW9ucy4gUmV0dXJucyBhIGNvbXBsZXRpb25cbiAgLy8gcmVjb3JkIGxpa2UgY29udGV4dC50cnlFbnRyaWVzW2ldLmNvbXBsZXRpb24uIFRoaXMgaW50ZXJmYWNlIGNvdWxkXG4gIC8vIGhhdmUgYmVlbiAoYW5kIHdhcyBwcmV2aW91c2x5KSBkZXNpZ25lZCB0byB0YWtlIGEgY2xvc3VyZSB0byBiZVxuICAvLyBpbnZva2VkIHdpdGhvdXQgYXJndW1lbnRzLCBidXQgaW4gYWxsIHRoZSBjYXNlcyB3ZSBjYXJlIGFib3V0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBtZXRob2Qgd2Ugd2FudCB0byBjYWxsLCBzbyB0aGVyZSdzIG5vIG5lZWRcbiAgLy8gdG8gY3JlYXRlIGEgbmV3IGZ1bmN0aW9uIG9iamVjdC4gV2UgY2FuIGV2ZW4gZ2V0IGF3YXkgd2l0aCBhc3N1bWluZ1xuICAvLyB0aGUgbWV0aG9kIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50LCBzaW5jZSB0aGF0IGhhcHBlbnMgdG8gYmUgdHJ1ZVxuICAvLyBpbiBldmVyeSBjYXNlLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHRvdWNoIHRoZSBhcmd1bWVudHMgb2JqZWN0LiBUaGVcbiAgLy8gb25seSBhZGRpdGlvbmFsIGFsbG9jYXRpb24gcmVxdWlyZWQgaXMgdGhlIGNvbXBsZXRpb24gcmVjb3JkLCB3aGljaFxuICAvLyBoYXMgYSBzdGFibGUgc2hhcGUgYW5kIHNvIGhvcGVmdWxseSBzaG91bGQgYmUgY2hlYXAgdG8gYWxsb2NhdGUuXG4gIGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcIm5vcm1hbFwiLCBhcmc6IGZuLmNhbGwob2JqLCBhcmcpIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInRocm93XCIsIGFyZzogZXJyIH07XG4gICAgfVxuICB9XG5cbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkU3RhcnQgPSBcInN1c3BlbmRlZFN0YXJ0XCI7XG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkID0gXCJzdXNwZW5kZWRZaWVsZFwiO1xuICB2YXIgR2VuU3RhdGVFeGVjdXRpbmcgPSBcImV4ZWN1dGluZ1wiO1xuICB2YXIgR2VuU3RhdGVDb21wbGV0ZWQgPSBcImNvbXBsZXRlZFwiO1xuXG4gIC8vIFJldHVybmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBpbm5lckZuIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXNcbiAgLy8gYnJlYWtpbmcgb3V0IG9mIHRoZSBkaXNwYXRjaCBzd2l0Y2ggc3RhdGVtZW50LlxuICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9O1xuXG4gIC8vIER1bW15IGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyB0aGF0IHdlIHVzZSBhcyB0aGUgLmNvbnN0cnVjdG9yIGFuZFxuICAvLyAuY29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMgZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0cy4gRm9yIGZ1bGwgc3BlYyBjb21wbGlhbmNlLCB5b3UgbWF5IHdpc2ggdG8gY29uZmlndXJlIHlvdXJcbiAgLy8gbWluaWZpZXIgbm90IHRvIG1hbmdsZSB0aGUgbmFtZXMgb2YgdGhlc2UgdHdvIGZ1bmN0aW9ucy5cbiAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9XG5cbiAgLy8gVGhpcyBpcyBhIHBvbHlmaWxsIGZvciAlSXRlcmF0b3JQcm90b3R5cGUlIGZvciBlbnZpcm9ubWVudHMgdGhhdFxuICAvLyBkb24ndCBuYXRpdmVseSBzdXBwb3J0IGl0LlxuICB2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcbiAgSXRlcmF0b3JQcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiAgdmFyIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpO1xuICBpZiAoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiZcbiAgICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJlxuICAgICAgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSkge1xuICAgIC8vIFRoaXMgZW52aXJvbm1lbnQgaGFzIGEgbmF0aXZlICVJdGVyYXRvclByb3RvdHlwZSU7IHVzZSBpdCBpbnN0ZWFkXG4gICAgLy8gb2YgdGhlIHBvbHlmaWxsLlxuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cblxuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPVxuICAgIEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR3AuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvbjtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGVbdG9TdHJpbmdUYWdTeW1ib2xdID1cbiAgICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcblxuICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLlxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICBwcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKGFyZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBydW50aW1lLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGlmICghKHRvU3RyaW5nVGFnU3ltYm9sIGluIGdlbkZ1bikpIHtcbiAgICAgICAgZ2VuRnVuW3RvU3RyaW5nVGFnU3ltYm9sXSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgIHJldHVybiBnZW5GdW47XG4gIH07XG5cbiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvXG4gIC8vIGB5aWVsZCByZWdlbmVyYXRvclJ1bnRpbWUuYXdyYXAoeClgLCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiB0ZXN0XG4gIC8vIGBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpYCB0byBkZXRlcm1pbmUgaWYgdGhlIHlpZWxkZWQgdmFsdWUgaXNcbiAgLy8gbWVhbnQgdG8gYmUgYXdhaXRlZC5cbiAgcnVudGltZS5hd3JhcCA9IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB7IF9fYXdhaXQ6IGFyZyB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJ0aHJvd1wiLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uKHVud3JhcHBlZCkge1xuICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzXG4gICAgICAgICAgLy8gdGhlIC52YWx1ZSBvZiB0aGUgUHJvbWlzZTx7dmFsdWUsZG9uZX0+IHJlc3VsdCBmb3IgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCBpdGVyYXRpb24uIElmIHRoZSBQcm9taXNlIGlzIHJlamVjdGVkLCBob3dldmVyLCB0aGVcbiAgICAgICAgICAvLyByZXN1bHQgZm9yIHRoaXMgaXRlcmF0aW9uIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCB0aGUgc2FtZVxuICAgICAgICAgIC8vIHJlYXNvbi4gTm90ZSB0aGF0IHJlamVjdGlvbnMgb2YgeWllbGRlZCBQcm9taXNlcyBhcmUgbm90XG4gICAgICAgICAgLy8gdGhyb3duIGJhY2sgaW50byB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBhcyBpcyB0aGUgY2FzZVxuICAgICAgICAgIC8vIHdoZW4gYW4gYXdhaXRlZCBQcm9taXNlIGlzIHJlamVjdGVkLiBUaGlzIGRpZmZlcmVuY2UgaW5cbiAgICAgICAgICAvLyBiZWhhdmlvciBiZXR3ZWVuIHlpZWxkIGFuZCBhd2FpdCBpcyBpbXBvcnRhbnQsIGJlY2F1c2UgaXRcbiAgICAgICAgICAvLyBhbGxvd3MgdGhlIGNvbnN1bWVyIHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggdGhlIHlpZWxkZWRcbiAgICAgICAgICAvLyByZWplY3Rpb24gKHN3YWxsb3cgaXQgYW5kIGNvbnRpbnVlLCBtYW51YWxseSAudGhyb3cgaXQgYmFja1xuICAgICAgICAgIC8vIGludG8gdGhlIGdlbmVyYXRvciwgYWJhbmRvbiBpdGVyYXRpb24sIHdoYXRldmVyKS4gV2l0aFxuICAgICAgICAgIC8vIGF3YWl0LCBieSBjb250cmFzdCwgdGhlcmUgaXMgbm8gb3Bwb3J0dW5pdHkgdG8gZXhhbWluZSB0aGVcbiAgICAgICAgICAvLyByZWplY3Rpb24gcmVhc29uIG91dHNpZGUgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiwgc28gdGhlXG4gICAgICAgICAgLy8gb25seSBvcHRpb24gaXMgdG8gdGhyb3cgaXQgZnJvbSB0aGUgYXdhaXQgZXhwcmVzc2lvbiwgYW5kXG4gICAgICAgICAgLy8gbGV0IHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gaGFuZGxlIHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkO1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykge1xuICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID1cbiAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKFxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLFxuICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyXG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnXG4gICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiAoc2VlIGRlZmluZUl0ZXJhdG9yTWV0aG9kcykuXG4gICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTtcbiAgfVxuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7XG4gIEFzeW5jSXRlcmF0b3IucHJvdG90eXBlW2FzeW5jSXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBydW50aW1lLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBydW50aW1lLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKFxuICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdClcbiAgICApO1xuXG4gICAgcmV0dXJuIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXliZUludm9rZURlbGVnYXRlKGNvbnRleHQpIGNoYW5nZWQgY29udGV4dC5tZXRob2QgZnJvbVxuICAgICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCEgaW5mbykge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKTtcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgIC8vIHZhcmlhYmxlIHNwZWNpZmllZCBieSBkZWxlZ2F0ZS5yZXN1bHROYW1lIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcblxuICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcblxuICAgICAgLy8gSWYgY29udGV4dC5tZXRob2Qgd2FzIFwidGhyb3dcIiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlXG4gICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmXG4gICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgLy8gXCJjb25zdW1lZFwiIGJ5IHRoZSBkZWxlZ2F0ZSBpdGVyYXRvci4gSWYgY29udGV4dC5tZXRob2Qgd2FzXG4gICAgICAvLyBcInJldHVyblwiLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZVxuICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlLXlpZWxkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGRlbGVnYXRlIG1ldGhvZC5cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoXG4gICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci5cbiAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBHcFt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvclwiO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIHJ1bnRpbWUua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBydW50aW1lLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xufSkoXG4gIC8vIEluIHNsb3BweSBtb2RlLCB1bmJvdW5kIGB0aGlzYCByZWZlcnMgdG8gdGhlIGdsb2JhbCBvYmplY3QsIGZhbGxiYWNrIHRvXG4gIC8vIEZ1bmN0aW9uIGNvbnN0cnVjdG9yIGlmIHdlJ3JlIGluIGdsb2JhbCBzdHJpY3QgbW9kZS4gVGhhdCBpcyBzYWRseSBhIGZvcm1cbiAgLy8gb2YgaW5kaXJlY3QgZXZhbCB3aGljaCB2aW9sYXRlcyBDb250ZW50IFNlY3VyaXR5IFBvbGljeS5cbiAgKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcyB9KSgpIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKVxuKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/regenerator-runtime/runtime.js\n"); - -/***/ }), - /***/ "./node_modules/rivets/dist/rivets.js": /***/ (function(module, exports, __webpack_require__) { @@ -352,14 +345,22 @@ eval("module.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__storage__ = __webpack_require__(\"./resources/js/storage.js\");\n/**\n * Bootstrap any Javascript libraries required\n */\n\nwindow.axios = __webpack_require__(\"./node_modules/axios/index.js\");\n\n\n\n/**\n * Container for phpVMS specific functions\n */\nwindow.phpvms = {\n config: {},\n Storage: __WEBPACK_IMPORTED_MODULE_0__storage__[\"a\" /* default */]\n};\n\n/**\n * Configure Axios with both the csrf token and the API key\n */\n\nvar base_url = document.head.querySelector('meta[name=\"base-url\"]');\nif (base_url) {\n console.log('baseURL=' + base_url.content);\n window.phpvms.config.base_url = base_url.content;\n window.axios.default.baseURL = base_url.content;\n}\n\nwindow.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';\nvar token = document.head.querySelector('meta[name=\"csrf-token\"]');\n\nif (token) {\n window.phpvms.config.csrf_token = token.content;\n window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;\n} else {\n console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');\n}\n\nvar api_key = document.head.querySelector('meta[name=\"api-key\"]');\nif (api_key) {\n window.axios.defaults.headers.common['x-api-key'] = api_key.content;\n window.phpvms.config.user_api_key = api_key.content;\n window.PHPVMS_USER_API_KEY = api_key.content;\n} else {\n window.phpvms.config.user_api_key = false;\n window.PHPVMS_USER_API_KEY = false;\n console.error('API Key not found!');\n}\n\n__webpack_require__(\"./resources/js/common.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzPzBlNTgiXSwibmFtZXMiOlsid2luZG93IiwiYXhpb3MiLCJyZXF1aXJlIiwicGhwdm1zIiwiY29uZmlnIiwiU3RvcmFnZSIsImJhc2VfdXJsIiwiZG9jdW1lbnQiLCJoZWFkIiwicXVlcnlTZWxlY3RvciIsImNvbnNvbGUiLCJsb2ciLCJjb250ZW50IiwiZGVmYXVsdCIsImJhc2VVUkwiLCJkZWZhdWx0cyIsImhlYWRlcnMiLCJjb21tb24iLCJ0b2tlbiIsImNzcmZfdG9rZW4iLCJlcnJvciIsImFwaV9rZXkiLCJ1c2VyX2FwaV9rZXkiLCJQSFBWTVNfVVNFUl9BUElfS0VZIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7Ozs7QUFLQUEsT0FBT0MsS0FBUCxHQUFlQyxtQkFBT0EsQ0FBQywrQkFBUixDQUFmOztBQUVBOztBQUVBOzs7QUFHQUYsT0FBT0csTUFBUCxHQUFnQjtBQUNkQyxVQUFRLEVBRE07QUFFZEMsb0VBQU9BO0FBRk8sQ0FBaEI7O0FBS0E7Ozs7QUFJQSxJQUFNQyxXQUFXQyxTQUFTQyxJQUFULENBQWNDLGFBQWQsQ0FBNEIsdUJBQTVCLENBQWpCO0FBQ0EsSUFBR0gsUUFBSCxFQUFhO0FBQ1hJLFVBQVFDLEdBQVIsY0FBdUJMLFNBQVNNLE9BQWhDO0FBQ0FaLFNBQU9HLE1BQVAsQ0FBY0MsTUFBZCxDQUFxQkUsUUFBckIsR0FBZ0NBLFNBQVNNLE9BQXpDO0FBQ0FaLFNBQU9DLEtBQVAsQ0FBYVksT0FBYixDQUFxQkMsT0FBckIsR0FBK0JSLFNBQVNNLE9BQXhDO0FBQ0Q7O0FBRURaLE9BQU9DLEtBQVAsQ0FBYWMsUUFBYixDQUFzQkMsT0FBdEIsQ0FBOEJDLE1BQTlCLENBQXFDLGtCQUFyQyxJQUEyRCxnQkFBM0Q7QUFDQSxJQUFNQyxRQUFRWCxTQUFTQyxJQUFULENBQWNDLGFBQWQsQ0FBNEIseUJBQTVCLENBQWQ7O0FBRUEsSUFBSVMsS0FBSixFQUFXO0FBQ1RsQixTQUFPRyxNQUFQLENBQWNDLE1BQWQsQ0FBcUJlLFVBQXJCLEdBQWtDRCxNQUFNTixPQUF4QztBQUNBWixTQUFPQyxLQUFQLENBQWFjLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxjQUFyQyxJQUF1REMsTUFBTU4sT0FBN0Q7QUFDRCxDQUhELE1BR087QUFDTEYsVUFBUVUsS0FBUixDQUFjLHVFQUFkO0FBQ0Q7O0FBRUQsSUFBTUMsVUFBVWQsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHNCQUE1QixDQUFoQjtBQUNBLElBQUlZLE9BQUosRUFBYTtBQUNYckIsU0FBT0MsS0FBUCxDQUFhYyxRQUFiLENBQXNCQyxPQUF0QixDQUE4QkMsTUFBOUIsQ0FBcUMsV0FBckMsSUFBb0RJLFFBQVFULE9BQTVEO0FBQ0FaLFNBQU9HLE1BQVAsQ0FBY0MsTUFBZCxDQUFxQmtCLFlBQXJCLEdBQW9DRCxRQUFRVCxPQUE1QztBQUNBWixTQUFPdUIsbUJBQVAsR0FBNkJGLFFBQVFULE9BQXJDO0FBQ0QsQ0FKRCxNQUlPO0FBQ0xaLFNBQU9HLE1BQVAsQ0FBY0MsTUFBZCxDQUFxQmtCLFlBQXJCLEdBQW9DLEtBQXBDO0FBQ0F0QixTQUFPdUIsbUJBQVAsR0FBNkIsS0FBN0I7QUFDQWIsVUFBUVUsS0FBUixDQUFjLG9CQUFkO0FBQ0Q7O0FBRURsQixtQkFBT0EsQ0FBQywwQkFBUiIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9ib290c3RyYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJvb3RzdHJhcCBhbnkgSmF2YXNjcmlwdCBsaWJyYXJpZXMgcmVxdWlyZWRcbiAqL1xuXG5cbndpbmRvdy5heGlvcyA9IHJlcXVpcmUoJ2F4aW9zJyk7XG5cbmltcG9ydCBTdG9yYWdlIGZyb20gXCIuL3N0b3JhZ2VcIjtcblxuLyoqXG4gKiBDb250YWluZXIgZm9yIHBocFZNUyBzcGVjaWZpYyBmdW5jdGlvbnNcbiAqL1xud2luZG93LnBocHZtcyA9IHtcbiAgY29uZmlnOiB7fSxcbiAgU3RvcmFnZSxcbn07XG5cbi8qKlxuICogQ29uZmlndXJlIEF4aW9zIHdpdGggYm90aCB0aGUgY3NyZiB0b2tlbiBhbmQgdGhlIEFQSSBrZXlcbiAqL1xuXG5jb25zdCBiYXNlX3VybCA9IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiYmFzZS11cmxcIl0nKTtcbmlmKGJhc2VfdXJsKSB7XG4gIGNvbnNvbGUubG9nKGBiYXNlVVJMPSR7YmFzZV91cmwuY29udGVudH1gKTtcbiAgd2luZG93LnBocHZtcy5jb25maWcuYmFzZV91cmwgPSBiYXNlX3VybC5jb250ZW50O1xuICB3aW5kb3cuYXhpb3MuZGVmYXVsdC5iYXNlVVJMID0gYmFzZV91cmwuY29udGVudDtcbn1cblxud2luZG93LmF4aW9zLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uWydYLVJlcXVlc3RlZC1XaXRoJ10gPSAnWE1MSHR0cFJlcXVlc3QnO1xuY29uc3QgdG9rZW4gPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImNzcmYtdG9rZW5cIl0nKTtcblxuaWYgKHRva2VuKSB7XG4gIHdpbmRvdy5waHB2bXMuY29uZmlnLmNzcmZfdG9rZW4gPSB0b2tlbi5jb250ZW50O1xuICB3aW5kb3cuYXhpb3MuZGVmYXVsdHMuaGVhZGVycy5jb21tb25bJ1gtQ1NSRi1UT0tFTiddID0gdG9rZW4uY29udGVudFxufSBlbHNlIHtcbiAgY29uc29sZS5lcnJvcignQ1NSRiB0b2tlbiBub3QgZm91bmQ6IGh0dHBzOi8vbGFyYXZlbC5jb20vZG9jcy9jc3JmI2NzcmYteC1jc3JmLXRva2VuJylcbn1cblxuY29uc3QgYXBpX2tleSA9IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiYXBpLWtleVwiXScpO1xuaWYgKGFwaV9rZXkpIHtcbiAgd2luZG93LmF4aW9zLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uWyd4LWFwaS1rZXknXSA9IGFwaV9rZXkuY29udGVudDtcbiAgd2luZG93LnBocHZtcy5jb25maWcudXNlcl9hcGlfa2V5ID0gYXBpX2tleS5jb250ZW50O1xuICB3aW5kb3cuUEhQVk1TX1VTRVJfQVBJX0tFWSA9IGFwaV9rZXkuY29udGVudFxufSBlbHNlIHtcbiAgd2luZG93LnBocHZtcy5jb25maWcudXNlcl9hcGlfa2V5ID0gZmFsc2U7XG4gIHdpbmRvdy5QSFBWTVNfVVNFUl9BUElfS0VZID0gZmFsc2U7XG4gIGNvbnNvbGUuZXJyb3IoJ0FQSSBLZXkgbm90IGZvdW5kIScpXG59XG5cbnJlcXVpcmUoJy4vY29tbW9uJyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/bootstrap.js\n"); +eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__storage__ = __webpack_require__(\"./resources/js/storage.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__config__ = __webpack_require__(\"./resources/js/config.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__request__ = __webpack_require__(\"./resources/js/request.js\");\n/**\n * Bootstrap any Javascript libraries required\n */\n\n\n\n\n\nwindow.axios = __webpack_require__(\"./node_modules/axios/index.js\");\n\n/**\n * Container for phpVMS specific functions\n */\nwindow.phpvms = {\n config: __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* default */],\n request: __WEBPACK_IMPORTED_MODULE_2__request__[\"a\" /* default */],\n Storage: __WEBPACK_IMPORTED_MODULE_0__storage__[\"a\" /* default */]\n};\n\n__webpack_require__(\"./resources/js/common.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzPzBlNTgiXSwibmFtZXMiOlsid2luZG93IiwiYXhpb3MiLCJyZXF1aXJlIiwicGhwdm1zIiwiY29uZmlnIiwicmVxdWVzdCIsIlN0b3JhZ2UiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUFJQTtBQUNBO0FBQ0E7O0FBRUFBLE9BQU9DLEtBQVAsR0FBZUMsbUJBQU9BLENBQUMsK0JBQVIsQ0FBZjs7QUFFQTs7O0FBR0FGLE9BQU9HLE1BQVAsR0FBZ0I7QUFDZEMsa0VBRGM7QUFFZEMsb0VBRmM7QUFHZEMsb0VBQU9BO0FBSE8sQ0FBaEI7O0FBTUFKLG1CQUFPQSxDQUFDLDBCQUFSIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL2Jvb3RzdHJhcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQm9vdHN0cmFwIGFueSBKYXZhc2NyaXB0IGxpYnJhcmllcyByZXF1aXJlZFxuICovXG5cbmltcG9ydCBTdG9yYWdlIGZyb20gJy4vc3RvcmFnZSc7XG5pbXBvcnQgY29uZmlnIGZyb20gJy4vY29uZmlnJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5cbndpbmRvdy5heGlvcyA9IHJlcXVpcmUoJ2F4aW9zJyk7XG5cbi8qKlxuICogQ29udGFpbmVyIGZvciBwaHBWTVMgc3BlY2lmaWMgZnVuY3Rpb25zXG4gKi9cbndpbmRvdy5waHB2bXMgPSB7XG4gIGNvbmZpZyxcbiAgcmVxdWVzdCxcbiAgU3RvcmFnZSxcbn07XG5cbnJlcXVpcmUoJy4vY29tbW9uJyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/bootstrap.js\n"); /***/ }), /***/ "./resources/js/common.js": /***/ (function(module, exports, __webpack_require__) { -eval("/**\n *\n */\n\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n/**\n * Generic formatter to prepend\n * @param value\n * @param prepend\n * @returns {*}\n */\nrivets.formatters.prepend = function (value, prepend) {\n return prepend + value;\n};\n\n/**\n * Format minutes into HHh MMm\n * @param value\n * @returns {string}\n */\nrivets.formatters.time_hm = function (value) {\n var hours = Math.floor(value / 60);\n var mins = value % 60;\n return hours + 'h ' + mins + 'm';\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.gt = function (value, len) {\n return value.length > len;\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.lt = function (value, len) {\n return value.length < len;\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.eq = function (value, len) {\n return value.length > len;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzPzVmZDUiXSwibmFtZXMiOlsicml2ZXRzIiwicmVxdWlyZSIsImZvcm1hdHRlcnMiLCJwcmVwZW5kIiwidmFsdWUiLCJ0aW1lX2htIiwiaG91cnMiLCJNYXRoIiwiZmxvb3IiLCJtaW5zIiwiZ3QiLCJsZW4iLCJsZW5ndGgiLCJsdCIsImVxIl0sIm1hcHBpbmdzIjoiQUFBQTs7OztBQUlBLElBQU1BLFNBQVNDLG1CQUFPQSxDQUFDLHNDQUFSLENBQWY7O0FBRUE7Ozs7OztBQU1BRCxPQUFPRSxVQUFQLENBQWtCQyxPQUFsQixHQUE0QixVQUFVQyxLQUFWLEVBQWlCRCxPQUFqQixFQUEwQjtBQUNsRCxTQUFPQSxVQUFVQyxLQUFqQjtBQUNILENBRkQ7O0FBSUE7Ozs7O0FBS0FKLE9BQU9FLFVBQVAsQ0FBa0JHLE9BQWxCLEdBQTRCLFVBQVNELEtBQVQsRUFBZ0I7QUFDeEMsTUFBTUUsUUFBUUMsS0FBS0MsS0FBTCxDQUFXSixRQUFRLEVBQW5CLENBQWQ7QUFDQSxNQUFNSyxPQUFPTCxRQUFRLEVBQXJCO0FBQ0EsU0FBT0UsUUFBUSxJQUFSLEdBQWVHLElBQWYsR0FBc0IsR0FBN0I7QUFDSCxDQUpEOztBQU1BOzs7Ozs7QUFNQVQsT0FBT0UsVUFBUCxDQUFrQlEsRUFBbEIsR0FBdUIsVUFBQ04sS0FBRCxFQUFRTyxHQUFSLEVBQWdCO0FBQ25DLFNBQU9QLE1BQU1RLE1BQU4sR0FBZUQsR0FBdEI7QUFDSCxDQUZEOztBQUlBOzs7Ozs7QUFNQVgsT0FBT0UsVUFBUCxDQUFrQlcsRUFBbEIsR0FBdUIsVUFBQ1QsS0FBRCxFQUFRTyxHQUFSLEVBQWdCO0FBQ25DLFNBQU9QLE1BQU1RLE1BQU4sR0FBZUQsR0FBdEI7QUFDSCxDQUZEOztBQUlBOzs7Ozs7QUFNQVgsT0FBT0UsVUFBUCxDQUFrQlksRUFBbEIsR0FBdUIsVUFBQ1YsS0FBRCxFQUFRTyxHQUFSLEVBQWdCO0FBQ25DLFNBQU9QLE1BQU1RLE1BQU4sR0FBZUQsR0FBdEI7QUFDSCxDQUZEIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL2NvbW1vbi5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICpcbiAqL1xuXG5jb25zdCByaXZldHMgPSByZXF1aXJlKCdyaXZldHMnKTtcblxuLyoqXG4gKiBHZW5lcmljIGZvcm1hdHRlciB0byBwcmVwZW5kXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBwcmVwZW5kXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMucHJlcGVuZCA9IGZ1bmN0aW9uICh2YWx1ZSwgcHJlcGVuZCkge1xuICAgIHJldHVybiBwcmVwZW5kICsgdmFsdWVcbn07XG5cbi8qKlxuICogRm9ybWF0IG1pbnV0ZXMgaW50byBISGggTU1tXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbnJpdmV0cy5mb3JtYXR0ZXJzLnRpbWVfaG0gPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcih2YWx1ZSAvIDYwKTtcbiAgICBjb25zdCBtaW5zID0gdmFsdWUgJSA2MDtcbiAgICByZXR1cm4gaG91cnMgKyAnaCAnICsgbWlucyArICdtJztcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIGxlblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbnJpdmV0cy5mb3JtYXR0ZXJzLmd0ID0gKHZhbHVlLCBsZW4pID0+IHtcbiAgICByZXR1cm4gdmFsdWUubGVuZ3RoID4gbGVuO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHZhbHVlXG4gKiBAcGFyYW0gbGVuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMubHQgPSAodmFsdWUsIGxlbikgPT4ge1xuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPCBsZW47XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBsZW5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5yaXZldHMuZm9ybWF0dGVycy5lcSA9ICh2YWx1ZSwgbGVuKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA+IGxlbjtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/common.js\n"); +eval("\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n/**\n * Generic formatter to prepend\n * @param value\n * @param prepend\n * @returns {*}\n */\nrivets.formatters.prepend = function (value, prepend) {\n return prepend + value;\n};\n\n/**\n * Format minutes into HHh MMm\n * @param value\n * @returns {string}\n */\nrivets.formatters.time_hm = function (value) {\n var hours = Math.floor(value / 60);\n var mins = value % 60;\n return hours + 'h ' + mins + 'm';\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.gt = function (value, len) {\n return value.length > len;\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.lt = function (value, len) {\n return value.length < len;\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.eq = function (value, len) {\n return value.length > len;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzPzVmZDUiXSwibmFtZXMiOlsicml2ZXRzIiwicmVxdWlyZSIsImZvcm1hdHRlcnMiLCJwcmVwZW5kIiwidmFsdWUiLCJ0aW1lX2htIiwiaG91cnMiLCJNYXRoIiwiZmxvb3IiLCJtaW5zIiwiZ3QiLCJsZW4iLCJsZW5ndGgiLCJsdCIsImVxIl0sIm1hcHBpbmdzIjoiO0FBQ0EsSUFBTUEsU0FBU0MsbUJBQU9BLENBQUMsc0NBQVIsQ0FBZjs7QUFFQTs7Ozs7O0FBTUFELE9BQU9FLFVBQVAsQ0FBa0JDLE9BQWxCLEdBQTRCLFVBQVVDLEtBQVYsRUFBaUJELE9BQWpCLEVBQTBCO0FBQ3BELFNBQU9BLFVBQVVDLEtBQWpCO0FBQ0QsQ0FGRDs7QUFJQTs7Ozs7QUFLQUosT0FBT0UsVUFBUCxDQUFrQkcsT0FBbEIsR0FBNEIsVUFBVUQsS0FBVixFQUFpQjtBQUMzQyxNQUFNRSxRQUFRQyxLQUFLQyxLQUFMLENBQVdKLFFBQVEsRUFBbkIsQ0FBZDtBQUNBLE1BQU1LLE9BQU9MLFFBQVEsRUFBckI7QUFDQSxTQUFVRSxLQUFWLFVBQW9CRyxJQUFwQjtBQUNELENBSkQ7O0FBTUE7Ozs7OztBQU1BVCxPQUFPRSxVQUFQLENBQWtCUSxFQUFsQixHQUF1QixVQUFDTixLQUFELEVBQVFPLEdBQVI7QUFBQSxTQUFnQlAsTUFBTVEsTUFBTixHQUFlRCxHQUEvQjtBQUFBLENBQXZCOztBQUVBOzs7Ozs7QUFNQVgsT0FBT0UsVUFBUCxDQUFrQlcsRUFBbEIsR0FBdUIsVUFBQ1QsS0FBRCxFQUFRTyxHQUFSO0FBQUEsU0FBZ0JQLE1BQU1RLE1BQU4sR0FBZUQsR0FBL0I7QUFBQSxDQUF2Qjs7QUFFQTs7Ozs7O0FBTUFYLE9BQU9FLFVBQVAsQ0FBa0JZLEVBQWxCLEdBQXVCLFVBQUNWLEtBQUQsRUFBUU8sR0FBUjtBQUFBLFNBQWdCUCxNQUFNUSxNQUFOLEdBQWVELEdBQS9CO0FBQUEsQ0FBdkIiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5jb25zdCByaXZldHMgPSByZXF1aXJlKCdyaXZldHMnKTtcblxuLyoqXG4gKiBHZW5lcmljIGZvcm1hdHRlciB0byBwcmVwZW5kXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBwcmVwZW5kXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMucHJlcGVuZCA9IGZ1bmN0aW9uICh2YWx1ZSwgcHJlcGVuZCkge1xuICByZXR1cm4gcHJlcGVuZCArIHZhbHVlO1xufTtcblxuLyoqXG4gKiBGb3JtYXQgbWludXRlcyBpbnRvIEhIaCBNTW1cbiAqIEBwYXJhbSB2YWx1ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMudGltZV9obSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IodmFsdWUgLyA2MCk7XG4gIGNvbnN0IG1pbnMgPSB2YWx1ZSAlIDYwO1xuICByZXR1cm4gYCR7aG91cnN9aCAke21pbnN9bWA7XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBsZW5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5yaXZldHMuZm9ybWF0dGVycy5ndCA9ICh2YWx1ZSwgbGVuKSA9PiB2YWx1ZS5sZW5ndGggPiBsZW47XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIGxlblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbnJpdmV0cy5mb3JtYXR0ZXJzLmx0ID0gKHZhbHVlLCBsZW4pID0+IHZhbHVlLmxlbmd0aCA8IGxlbjtcblxuLyoqXG4gKlxuICogQHBhcmFtIHZhbHVlXG4gKiBAcGFyYW0gbGVuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMuZXEgPSAodmFsdWUsIGxlbikgPT4gdmFsdWUubGVuZ3RoID4gbGVuO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL2NvbW1vbi5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/common.js\n"); + +/***/ }), + +/***/ "./resources/js/config.js": +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("\nvar base_url = document.head.querySelector('meta[name=\"base-url\"]');\nvar token = document.head.querySelector('meta[name=\"csrf-token\"]');\nvar api_key = document.head.querySelector('meta[name=\"api-key\"]');\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n api_key: api_key.content || '',\n base_url: base_url.content || '',\n csrf_token: token.content || ''\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29uZmlnLmpzPzdmNTciXSwibmFtZXMiOlsiYmFzZV91cmwiLCJkb2N1bWVudCIsImhlYWQiLCJxdWVyeVNlbGVjdG9yIiwidG9rZW4iLCJhcGlfa2V5IiwiY29udGVudCIsImNzcmZfdG9rZW4iXSwibWFwcGluZ3MiOiI7QUFDQSxJQUFNQSxXQUFXQyxTQUFTQyxJQUFULENBQWNDLGFBQWQsQ0FBNEIsdUJBQTVCLENBQWpCO0FBQ0EsSUFBTUMsUUFBUUgsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHlCQUE1QixDQUFkO0FBQ0EsSUFBTUUsVUFBVUosU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHNCQUE1QixDQUFoQjs7QUFFZTtBQUNiRSxXQUFTQSxRQUFRQyxPQUFSLElBQW1CLEVBRGY7QUFFYk4sWUFBVUEsU0FBU00sT0FBVCxJQUFvQixFQUZqQjtBQUdiQyxjQUFZSCxNQUFNRSxPQUFOLElBQWlCO0FBSGhCLENBQWYiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29uZmlnLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5jb25zdCBiYXNlX3VybCA9IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiYmFzZS11cmxcIl0nKTtcbmNvbnN0IHRva2VuID0gZG9jdW1lbnQuaGVhZC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJjc3JmLXRva2VuXCJdJyk7XG5jb25zdCBhcGlfa2V5ID0gZG9jdW1lbnQuaGVhZC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJhcGkta2V5XCJdJyk7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgYXBpX2tleTogYXBpX2tleS5jb250ZW50IHx8ICcnLFxuICBiYXNlX3VybDogYmFzZV91cmwuY29udGVudCB8fCAnJyxcbiAgY3NyZl90b2tlbjogdG9rZW4uY29udGVudCB8fCAnJyxcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvY29uZmlnLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/config.js\n"); /***/ }), @@ -367,7 +368,7 @@ eval("/**\n *\n */\n\nvar rivets = __webpack_require__(\"./node_modules/rivets/d /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__bids__ = __webpack_require__(\"./resources/js/frontend/bids.js\");\n\n__webpack_require__(\"./resources/js/bootstrap.js\");\n\n// Import the bids functionality\n\nwindow.phpvms.bids = {\n addBid: __WEBPACK_IMPORTED_MODULE_0__bids__[\"a\" /* addBid */],\n removeBid: __WEBPACK_IMPORTED_MODULE_0__bids__[\"b\" /* removeBid */]\n};\n\n// Import the mapping function\nwindow.phpvms.map = __webpack_require__(\"./resources/js/maps/index.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvZnJvbnRlbmQvYXBwLmpzPzYwZTgiXSwibmFtZXMiOlsicmVxdWlyZSIsIndpbmRvdyIsInBocHZtcyIsImJpZHMiLCJhZGRCaWQiLCJyZW1vdmVCaWQiLCJtYXAiXSwibWFwcGluZ3MiOiI7OztBQUNBQSxtQkFBT0EsQ0FBQyw2QkFBUjs7QUFFQTtBQUNBO0FBQ0FDLE9BQU9DLE1BQVAsQ0FBY0MsSUFBZCxHQUFxQjtBQUNqQkMsaUVBRGlCO0FBRWpCQyx1RUFBU0E7QUFGUSxDQUFyQjs7QUFLQTtBQUNBSixPQUFPQyxNQUFQLENBQWNJLEdBQWQsR0FBb0JOLG1CQUFPQSxDQUFDLDhCQUFSLENBQXBCIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL2Zyb250ZW5kL2FwcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxucmVxdWlyZSgnLi8uLi9ib290c3RyYXAnKTtcblxuLy8gSW1wb3J0IHRoZSBiaWRzIGZ1bmN0aW9uYWxpdHlcbmltcG9ydCB7YWRkQmlkLCByZW1vdmVCaWR9IGZyb20gJy4vYmlkcyc7XG53aW5kb3cucGhwdm1zLmJpZHMgPSB7XG4gICAgYWRkQmlkLFxuICAgIHJlbW92ZUJpZCxcbn07XG5cbi8vIEltcG9ydCB0aGUgbWFwcGluZyBmdW5jdGlvblxud2luZG93LnBocHZtcy5tYXAgPSByZXF1aXJlKCcuLi9tYXBzL2luZGV4Jyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvZnJvbnRlbmQvYXBwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/frontend/app.js\n"); +eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__bids__ = __webpack_require__(\"./resources/js/frontend/bids.js\");\n\n// Import the bids functionality\n\n\n__webpack_require__(\"./resources/js/bootstrap.js\");\n\nwindow.phpvms.bids = {\n addBid: __WEBPACK_IMPORTED_MODULE_0__bids__[\"a\" /* addBid */],\n removeBid: __WEBPACK_IMPORTED_MODULE_0__bids__[\"b\" /* removeBid */]\n};\n\n// Import the mapping function\nwindow.phpvms.map = __webpack_require__(\"./resources/js/maps/index.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvZnJvbnRlbmQvYXBwLmpzPzYwZTgiXSwibmFtZXMiOlsicmVxdWlyZSIsIndpbmRvdyIsInBocHZtcyIsImJpZHMiLCJhZGRCaWQiLCJyZW1vdmVCaWQiLCJtYXAiXSwibWFwcGluZ3MiOiI7OztBQUNBO0FBQ0E7O0FBRUFBLG1CQUFPQSxDQUFDLDZCQUFSOztBQUVBQyxPQUFPQyxNQUFQLENBQWNDLElBQWQsR0FBcUI7QUFDbkJDLCtEQURtQjtBQUVuQkMscUVBQVNBO0FBRlUsQ0FBckI7O0FBS0E7QUFDQUosT0FBT0MsTUFBUCxDQUFjSSxHQUFkLEdBQW9CTixtQkFBT0EsQ0FBQyw4QkFBUixDQUFwQiIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9mcm9udGVuZC9hcHAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8vIEltcG9ydCB0aGUgYmlkcyBmdW5jdGlvbmFsaXR5XG5pbXBvcnQgeyBhZGRCaWQsIHJlbW92ZUJpZCB9IGZyb20gJy4vYmlkcyc7XG5cbnJlcXVpcmUoJy4vLi4vYm9vdHN0cmFwJyk7XG5cbndpbmRvdy5waHB2bXMuYmlkcyA9IHtcbiAgYWRkQmlkLFxuICByZW1vdmVCaWQsXG59O1xuXG4vLyBJbXBvcnQgdGhlIG1hcHBpbmcgZnVuY3Rpb25cbndpbmRvdy5waHB2bXMubWFwID0gcmVxdWlyZSgnLi4vbWFwcy9pbmRleCcpO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL2Zyb250ZW5kL2FwcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/frontend/app.js\n"); /***/ }), @@ -375,7 +376,7 @@ eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true } /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return addBid; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return removeBid; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__ = __webpack_require__(\"./node_modules/babel-runtime/regenerator/index.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__);\n\n\n/**\n * Add a bid to a flight\n *\n * @param {String} flight_id\n *\n * @returns {Promise<*>}\n */\n\n\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nvar addBid = function () {\n var _ref = _asyncToGenerator( /*#__PURE__*/__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.mark(function _callee(flight_id) {\n var params;\n return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n params = {\n method: 'POST',\n url: '/api/user/bids',\n data: {\n '_method': 'POST',\n 'flight_id': flight_id\n }\n };\n return _context.abrupt('return', axios(params));\n\n case 2:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function addBid(_x) {\n return _ref.apply(this, arguments);\n };\n}();\n\n/**\n * Remove a bid from a given flight\n *\n * @param {String} flight_id\n *\n * @returns {Promise<*>}\n */\nvar removeBid = function () {\n var _ref2 = _asyncToGenerator( /*#__PURE__*/__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.mark(function _callee2(flight_id) {\n var params;\n return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n params = {\n method: 'POST',\n url: '/api/user/bids',\n data: {\n '_method': 'DELETE',\n 'flight_id': flight_id\n }\n };\n return _context2.abrupt('return', axios(params));\n\n case 2:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n return function removeBid(_x2) {\n return _ref2.apply(this, arguments);\n };\n}();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvZnJvbnRlbmQvYmlkcy5qcz84N2ZkIl0sIm5hbWVzIjpbImZsaWdodF9pZCIsInBhcmFtcyIsIm1ldGhvZCIsInVybCIsImRhdGEiLCJheGlvcyIsImFkZEJpZCIsInJlbW92ZUJpZCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQUE7QUFBYTs7QUFFYjs7Ozs7Ozs7Ozs7O0FBT087QUFBUCxzSEFBTyxpQkFBc0JBLFNBQXRCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNHQyw4QkFESCxHQUNZO0FBQ1hDLG9DQUFRLE1BREc7QUFFWEMsaUNBQUssZ0JBRk07QUFHWEMsa0NBQU07QUFDRiwyQ0FBVyxNQURUO0FBRUYsNkNBQWFKO0FBRlg7QUFISyx5QkFEWjtBQUFBLHlEQVVJSyxNQUFNSixNQUFOLENBVko7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FBUDs7QUFBQSxvQkFBc0JLLE1BQXRCO0FBQUE7QUFBQTtBQUFBOztBQWFBOzs7Ozs7O0FBT087QUFBUCx1SEFBTyxrQkFBeUJOLFNBQXpCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNHQyw4QkFESCxHQUNZO0FBQ1hDLG9DQUFRLE1BREc7QUFFWEMsaUNBQUssZ0JBRk07QUFHWEMsa0NBQU07QUFDRiwyQ0FBVyxRQURUO0FBRUYsNkNBQWFKO0FBRlg7QUFISyx5QkFEWjtBQUFBLDBEQVVJSyxNQUFNSixNQUFOLENBVko7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsS0FBUDs7QUFBQSxvQkFBc0JNLFNBQXRCO0FBQUE7QUFBQTtBQUFBIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL2Zyb250ZW5kL2JpZHMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQWRkIGEgYmlkIHRvIGEgZmxpZ2h0XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGZsaWdodF9pZFxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPCo+fVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYWRkQmlkKGZsaWdodF9pZCkge1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIHVybDogJy9hcGkvdXNlci9iaWRzJyxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgJ19tZXRob2QnOiAnUE9TVCcsXG4gICAgICAgICAgICAnZmxpZ2h0X2lkJzogZmxpZ2h0X2lkXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIGF4aW9zKHBhcmFtcyk7XG59XG5cbi8qKlxuICogUmVtb3ZlIGEgYmlkIGZyb20gYSBnaXZlbiBmbGlnaHRcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmxpZ2h0X2lkXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8Kj59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW1vdmVCaWQoZmxpZ2h0X2lkKSB7XG4gICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgdXJsOiAnL2FwaS91c2VyL2JpZHMnLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAnX21ldGhvZCc6ICdERUxFVEUnLFxuICAgICAgICAgICAgJ2ZsaWdodF9pZCc6IGZsaWdodF9pZFxuICAgICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBheGlvcyhwYXJhbXMpO1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL2Zyb250ZW5kL2JpZHMuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/frontend/bids.js\n"); +eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return addBid; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return removeBid; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__ = __webpack_require__(\"./node_modules/babel-runtime/regenerator/index.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__request__ = __webpack_require__(\"./resources/js/request.js\");\n\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\n\n\n/**\n * Add a bid to a flight\n *\n * @param {String} flight_id\n *\n * @returns {Promise<*>}\n */\nvar addBid = function () {\n var _ref = _asyncToGenerator( /*#__PURE__*/__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.mark(function _callee(flight_id) {\n var params;\n return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n params = {\n method: 'POST',\n url: '/api/user/bids',\n data: {\n _method: 'POST',\n flight_id: flight_id\n }\n };\n return _context.abrupt('return', Object(__WEBPACK_IMPORTED_MODULE_1__request__[\"a\" /* default */])(params));\n\n case 2:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function addBid(_x) {\n return _ref.apply(this, arguments);\n };\n}();\n\n/**\n * Remove a bid from a given flight\n *\n * @param {String} flight_id\n *\n * @returns {Promise<*>}\n */\nvar removeBid = function () {\n var _ref2 = _asyncToGenerator( /*#__PURE__*/__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.mark(function _callee2(flight_id) {\n var params;\n return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n params = {\n method: 'POST',\n url: '/api/user/bids',\n data: {\n _method: 'DELETE',\n flight_id: flight_id\n }\n };\n return _context2.abrupt('return', Object(__WEBPACK_IMPORTED_MODULE_1__request__[\"a\" /* default */])(params));\n\n case 2:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n return function removeBid(_x2) {\n return _ref2.apply(this, arguments);\n };\n}();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvZnJvbnRlbmQvYmlkcy5qcz84N2ZkIl0sIm5hbWVzIjpbImZsaWdodF9pZCIsInBhcmFtcyIsIm1ldGhvZCIsInVybCIsImRhdGEiLCJfbWV0aG9kIiwicmVxdWVzdCIsImFkZEJpZCIsInJlbW92ZUJpZCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQ0E7O0FBRUE7Ozs7Ozs7QUFPTztBQUFQLG9IQUFPLGlCQUFzQkEsU0FBdEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0NDLGtCQURELEdBQ1U7QUFDYkMsc0JBQVEsTUFESztBQUViQyxtQkFBSyxnQkFGUTtBQUdiQyxvQkFBTTtBQUNKQyx5QkFBUyxNQURMO0FBRUpMO0FBRkk7QUFITyxhQURWO0FBQUEsNkNBVUVNLGlFQUFPQSxDQUFDTCxNQUFSLENBVkY7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0FBUDs7QUFBQSxrQkFBc0JNLE1BQXRCO0FBQUE7QUFBQTtBQUFBOztBQWFBOzs7Ozs7O0FBT087QUFBUCxxSEFBTyxrQkFBeUJQLFNBQXpCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNDQyxrQkFERCxHQUNVO0FBQ2JDLHNCQUFRLE1BREs7QUFFYkMsbUJBQUssZ0JBRlE7QUFHYkMsb0JBQU07QUFDSkMseUJBQVMsUUFETDtBQUVKTDtBQUZJO0FBSE8sYUFEVjtBQUFBLDhDQVVFTSxpRUFBT0EsQ0FBQ0wsTUFBUixDQVZGOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBQVA7O0FBQUEsa0JBQXNCTyxTQUF0QjtBQUFBO0FBQUE7QUFBQSIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9mcm9udGVuZC9iaWRzLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgcmVxdWVzdCBmcm9tICcuLi9yZXF1ZXN0JztcblxuLyoqXG4gKiBBZGQgYSBiaWQgdG8gYSBmbGlnaHRcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZmxpZ2h0X2lkXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8Kj59XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRCaWQoZmxpZ2h0X2lkKSB7XG4gIGNvbnN0IHBhcmFtcyA9IHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICB1cmw6ICcvYXBpL3VzZXIvYmlkcycsXG4gICAgZGF0YToge1xuICAgICAgX21ldGhvZDogJ1BPU1QnLFxuICAgICAgZmxpZ2h0X2lkLFxuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIHJlcXVlc3QocGFyYW1zKTtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYSBiaWQgZnJvbSBhIGdpdmVuIGZsaWdodFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBmbGlnaHRfaWRcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTwqPn1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZUJpZChmbGlnaHRfaWQpIHtcbiAgY29uc3QgcGFyYW1zID0ge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIHVybDogJy9hcGkvdXNlci9iaWRzJyxcbiAgICBkYXRhOiB7XG4gICAgICBfbWV0aG9kOiAnREVMRVRFJyxcbiAgICAgIGZsaWdodF9pZCxcbiAgICB9LFxuICB9O1xuXG4gIHJldHVybiByZXF1ZXN0KHBhcmFtcyk7XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvZnJvbnRlbmQvYmlkcy5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/frontend/bids.js\n"); /***/ }), @@ -383,7 +384,7 @@ eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(\"./resources/js/maps/helpers.js\");\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n\n\n\n/**\n * Render a map with the airspace, etc around a given set of coords\n * e.g, the airport map\n * @param opts\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n opts = Object.assign({\n render_elem: 'map',\n overlay_elem: '',\n lat: 0,\n lon: 0,\n zoom: 12,\n layers: [],\n set_marker: true,\n marker_popup: '',\n\n // Passed from the config/maps.php file\n metar_wms: {\n url: '',\n params: {}\n }\n }, opts);\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var coords = [opts.lat, opts.lon];\n console.log('Applying coords', coords);\n\n map.setView(coords, opts.zoom);\n if (opts.set_marker === true) {\n leaflet.marker(coords).addTo(map).bindPopup(opts.marker_popup);\n }\n\n if (opts.metar_wms.url !== '') {\n Object(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"a\" /* addWMSLayer */])(map, opts.metar_wms);\n }\n\n return map;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9haXJzcGFjZV9tYXAuanM/NGZiMCJdLCJuYW1lcyI6WyJsZWFmbGV0IiwicmVxdWlyZSIsIm9wdHMiLCJPYmplY3QiLCJhc3NpZ24iLCJyZW5kZXJfZWxlbSIsIm92ZXJsYXlfZWxlbSIsImxhdCIsImxvbiIsInpvb20iLCJsYXllcnMiLCJzZXRfbWFya2VyIiwibWFya2VyX3BvcHVwIiwibWV0YXJfd21zIiwidXJsIiwicGFyYW1zIiwibWFwIiwiZHJhd19iYXNlX21hcCIsImNvb3JkcyIsImNvbnNvbGUiLCJsb2ciLCJzZXRWaWV3IiwibWFya2VyIiwiYWRkVG8iLCJiaW5kUG9wdXAiLCJhZGRXTVNMYXllciJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsSUFBTUEsVUFBVUMsbUJBQU9BLENBQUMsNENBQVIsQ0FBaEI7O0FBRUE7QUFDQTs7QUFFQTs7Ozs7QUFLZSxtRUFBQ0MsSUFBRCxFQUFVO0FBQ3ZCQSxTQUFPQyxPQUFPQyxNQUFQLENBQWM7QUFDbkJDLGlCQUFhLEtBRE07QUFFbkJDLGtCQUFjLEVBRks7QUFHbkJDLFNBQUssQ0FIYztBQUluQkMsU0FBSyxDQUpjO0FBS25CQyxVQUFNLEVBTGE7QUFNbkJDLFlBQVEsRUFOVztBQU9uQkMsZ0JBQVksSUFQTztBQVFuQkMsa0JBQWMsRUFSSzs7QUFVbkI7QUFDQUMsZUFBVztBQUNQQyxXQUFLLEVBREU7QUFFUEMsY0FBUTtBQUZEO0FBWFEsR0FBZCxFQWVKYixJQWZJLENBQVA7O0FBaUJBLE1BQUljLE1BQU1DLGtFQUFhQSxDQUFDZixJQUFkLENBQVY7QUFDQSxNQUFNZ0IsU0FBUyxDQUFDaEIsS0FBS0ssR0FBTixFQUFXTCxLQUFLTSxHQUFoQixDQUFmO0FBQ0FXLFVBQVFDLEdBQVIsQ0FBWSxpQkFBWixFQUErQkYsTUFBL0I7O0FBRUFGLE1BQUlLLE9BQUosQ0FBWUgsTUFBWixFQUFvQmhCLEtBQUtPLElBQXpCO0FBQ0EsTUFBSVAsS0FBS1MsVUFBTCxLQUFvQixJQUF4QixFQUE4QjtBQUM1QlgsWUFBUXNCLE1BQVIsQ0FBZUosTUFBZixFQUF1QkssS0FBdkIsQ0FBNkJQLEdBQTdCLEVBQWtDUSxTQUFsQyxDQUE0Q3RCLEtBQUtVLFlBQWpEO0FBQ0Q7O0FBRUQsTUFBR1YsS0FBS1csU0FBTCxDQUFlQyxHQUFmLEtBQXVCLEVBQTFCLEVBQThCO0FBQzFCVyx5RUFBV0EsQ0FBQ1QsR0FBWixFQUFpQmQsS0FBS1csU0FBdEI7QUFDSDs7QUFFRCxTQUFPRyxHQUFQO0FBQ0QsQ0FoQ0QiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9haXJzcGFjZV9tYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmNvbnN0IGxlYWZsZXQgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XG5cbmltcG9ydCBkcmF3X2Jhc2VfbWFwIGZyb20gJy4vYmFzZV9tYXAnXG5pbXBvcnQgeyBhZGRXTVNMYXllciB9IGZyb20gJy4vaGVscGVycyc7XG5cbi8qKlxuICogUmVuZGVyIGEgbWFwIHdpdGggdGhlIGFpcnNwYWNlLCBldGMgYXJvdW5kIGEgZ2l2ZW4gc2V0IG9mIGNvb3Jkc1xuICogZS5nLCB0aGUgYWlycG9ydCBtYXBcbiAqIEBwYXJhbSBvcHRzXG4gKi9cbmV4cG9ydCBkZWZhdWx0IChvcHRzKSA9PiB7XG4gIG9wdHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICByZW5kZXJfZWxlbTogJ21hcCcsXG4gICAgb3ZlcmxheV9lbGVtOiAnJyxcbiAgICBsYXQ6IDAsXG4gICAgbG9uOiAwLFxuICAgIHpvb206IDEyLFxuICAgIGxheWVyczogW10sXG4gICAgc2V0X21hcmtlcjogdHJ1ZSxcbiAgICBtYXJrZXJfcG9wdXA6ICcnLFxuXG4gICAgLy8gUGFzc2VkIGZyb20gdGhlIGNvbmZpZy9tYXBzLnBocCBmaWxlXG4gICAgbWV0YXJfd21zOiB7XG4gICAgICAgIHVybDogJycsXG4gICAgICAgIHBhcmFtczoge31cbiAgICB9LFxuICB9LCBvcHRzKTtcblxuICBsZXQgbWFwID0gZHJhd19iYXNlX21hcChvcHRzKTtcbiAgY29uc3QgY29vcmRzID0gW29wdHMubGF0LCBvcHRzLmxvbl07XG4gIGNvbnNvbGUubG9nKCdBcHBseWluZyBjb29yZHMnLCBjb29yZHMpO1xuXG4gIG1hcC5zZXRWaWV3KGNvb3Jkcywgb3B0cy56b29tKTtcbiAgaWYgKG9wdHMuc2V0X21hcmtlciA9PT0gdHJ1ZSkge1xuICAgIGxlYWZsZXQubWFya2VyKGNvb3JkcykuYWRkVG8obWFwKS5iaW5kUG9wdXAob3B0cy5tYXJrZXJfcG9wdXApO1xuICB9XG5cbiAgaWYob3B0cy5tZXRhcl93bXMudXJsICE9PSAnJykge1xuICAgICAgYWRkV01TTGF5ZXIobWFwLCBvcHRzLm1ldGFyX3dtcyk7XG4gIH1cblxuICByZXR1cm4gbWFwO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2FpcnNwYWNlX21hcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/maps/airspace_map.js\n"); +eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(\"./resources/js/maps/helpers.js\");\n\n\n\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n/**\n * Render a map with the airspace, etc around a given set of coords\n * e.g, the airport map\n * @param {Object} _opts\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (_opts) {\n var opts = Object.assign({\n render_elem: 'map',\n overlay_elem: '',\n lat: 0,\n lon: 0,\n zoom: 12,\n layers: [],\n set_marker: true,\n marker_popup: '',\n\n // Passed from the config/maps.php file\n metar_wms: {\n url: '',\n params: {}\n }\n }, _opts);\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var coords = [opts.lat, opts.lon];\n console.log('Applying coords', coords);\n\n map.setView(coords, opts.zoom);\n if (opts.set_marker === true) {\n leaflet.marker(coords).addTo(map).bindPopup(opts.marker_popup);\n }\n\n if (opts.metar_wms.url !== '') {\n Object(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"a\" /* addWMSLayer */])(map, opts.metar_wms);\n }\n\n return map;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9haXJzcGFjZV9tYXAuanM/NGZiMCJdLCJuYW1lcyI6WyJsZWFmbGV0IiwicmVxdWlyZSIsIl9vcHRzIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsInJlbmRlcl9lbGVtIiwib3ZlcmxheV9lbGVtIiwibGF0IiwibG9uIiwiem9vbSIsImxheWVycyIsInNldF9tYXJrZXIiLCJtYXJrZXJfcG9wdXAiLCJtZXRhcl93bXMiLCJ1cmwiLCJwYXJhbXMiLCJtYXAiLCJkcmF3X2Jhc2VfbWFwIiwiY29vcmRzIiwiY29uc29sZSIsImxvZyIsInNldFZpZXciLCJtYXJrZXIiLCJhZGRUbyIsImJpbmRQb3B1cCIsImFkZFdNU0xheWVyIl0sIm1hcHBpbmdzIjoiOzs7QUFDQTtBQUNBOztBQUVBLElBQU1BLFVBQVVDLG1CQUFPQSxDQUFDLDRDQUFSLENBQWhCOztBQUVBOzs7OztBQUtlLG1FQUFDQyxLQUFELEVBQVc7QUFDeEIsTUFBTUMsT0FBT0MsT0FBT0MsTUFBUCxDQUFjO0FBQ3pCQyxpQkFBYSxLQURZO0FBRXpCQyxrQkFBYyxFQUZXO0FBR3pCQyxTQUFLLENBSG9CO0FBSXpCQyxTQUFLLENBSm9CO0FBS3pCQyxVQUFNLEVBTG1CO0FBTXpCQyxZQUFRLEVBTmlCO0FBT3pCQyxnQkFBWSxJQVBhO0FBUXpCQyxrQkFBYyxFQVJXOztBQVV6QjtBQUNBQyxlQUFXO0FBQ1RDLFdBQUssRUFESTtBQUVUQyxjQUFRO0FBRkM7QUFYYyxHQUFkLEVBZVZkLEtBZlUsQ0FBYjs7QUFpQkEsTUFBTWUsTUFBTUMsa0VBQWFBLENBQUNmLElBQWQsQ0FBWjtBQUNBLE1BQU1nQixTQUFTLENBQUNoQixLQUFLSyxHQUFOLEVBQVdMLEtBQUtNLEdBQWhCLENBQWY7QUFDQVcsVUFBUUMsR0FBUixDQUFZLGlCQUFaLEVBQStCRixNQUEvQjs7QUFFQUYsTUFBSUssT0FBSixDQUFZSCxNQUFaLEVBQW9CaEIsS0FBS08sSUFBekI7QUFDQSxNQUFJUCxLQUFLUyxVQUFMLEtBQW9CLElBQXhCLEVBQThCO0FBQzVCWixZQUFRdUIsTUFBUixDQUFlSixNQUFmLEVBQXVCSyxLQUF2QixDQUE2QlAsR0FBN0IsRUFBa0NRLFNBQWxDLENBQTRDdEIsS0FBS1UsWUFBakQ7QUFDRDs7QUFFRCxNQUFJVixLQUFLVyxTQUFMLENBQWVDLEdBQWYsS0FBdUIsRUFBM0IsRUFBK0I7QUFDN0JXLHlFQUFXQSxDQUFDVCxHQUFaLEVBQWlCZCxLQUFLVyxTQUF0QjtBQUNEOztBQUVELFNBQU9HLEdBQVA7QUFDRCxDQWhDRCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2FpcnNwYWNlX21hcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IGRyYXdfYmFzZV9tYXAgZnJvbSAnLi9iYXNlX21hcCc7XG5pbXBvcnQgeyBhZGRXTVNMYXllciB9IGZyb20gJy4vaGVscGVycyc7XG5cbmNvbnN0IGxlYWZsZXQgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XG5cbi8qKlxuICogUmVuZGVyIGEgbWFwIHdpdGggdGhlIGFpcnNwYWNlLCBldGMgYXJvdW5kIGEgZ2l2ZW4gc2V0IG9mIGNvb3Jkc1xuICogZS5nLCB0aGUgYWlycG9ydCBtYXBcbiAqIEBwYXJhbSB7T2JqZWN0fSBfb3B0c1xuICovXG5leHBvcnQgZGVmYXVsdCAoX29wdHMpID0+IHtcbiAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHJlbmRlcl9lbGVtOiAnbWFwJyxcbiAgICBvdmVybGF5X2VsZW06ICcnLFxuICAgIGxhdDogMCxcbiAgICBsb246IDAsXG4gICAgem9vbTogMTIsXG4gICAgbGF5ZXJzOiBbXSxcbiAgICBzZXRfbWFya2VyOiB0cnVlLFxuICAgIG1hcmtlcl9wb3B1cDogJycsXG5cbiAgICAvLyBQYXNzZWQgZnJvbSB0aGUgY29uZmlnL21hcHMucGhwIGZpbGVcbiAgICBtZXRhcl93bXM6IHtcbiAgICAgIHVybDogJycsXG4gICAgICBwYXJhbXM6IHt9LFxuICAgIH0sXG4gIH0sIF9vcHRzKTtcblxuICBjb25zdCBtYXAgPSBkcmF3X2Jhc2VfbWFwKG9wdHMpO1xuICBjb25zdCBjb29yZHMgPSBbb3B0cy5sYXQsIG9wdHMubG9uXTtcbiAgY29uc29sZS5sb2coJ0FwcGx5aW5nIGNvb3JkcycsIGNvb3Jkcyk7XG5cbiAgbWFwLnNldFZpZXcoY29vcmRzLCBvcHRzLnpvb20pO1xuICBpZiAob3B0cy5zZXRfbWFya2VyID09PSB0cnVlKSB7XG4gICAgbGVhZmxldC5tYXJrZXIoY29vcmRzKS5hZGRUbyhtYXApLmJpbmRQb3B1cChvcHRzLm1hcmtlcl9wb3B1cCk7XG4gIH1cblxuICBpZiAob3B0cy5tZXRhcl93bXMudXJsICE9PSAnJykge1xuICAgIGFkZFdNU0xheWVyKG1hcCwgb3B0cy5tZXRhcl93bXMpO1xuICB9XG5cbiAgcmV0dXJuIG1hcDtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvbWFwcy9haXJzcGFjZV9tYXAuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/airspace_map.js\n"); /***/ }), @@ -391,7 +392,7 @@ eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpa /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("//\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n__webpack_require__(\"./node_modules/leaflet-providers/leaflet-providers.js\");\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n render_elem: 'map',\n center: [29.98139, -95.33374],\n zoom: 5,\n maxZoom: 10,\n layers: [],\n set_marker: false,\n providers: ['Esri.WorldStreetMap'],\n tile_layers: []\n }, opts);\n\n /*\n let feature_groups = [];\n const openaip_airspace_labels = new leaflet.TileLayer.WMS(\n \"http://{s}.tile.maps.openaip.net/geowebcache/service/wms\", {\n maxZoom: 14,\n minZoom: 12,\n layers: 'openaip_approved_airspaces_labels',\n tileSize: 1024,\n detectRetina: true,\n subdomains: '12',\n format: 'image/png',\n transparent: true\n });\n openaip_airspace_labels.addTo(map);*/\n\n /*const openaip_cached_basemap = new leaflet.TileLayer(\"http://{s}.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_basemap@EPSG%3A900913@png/{z}/{x}/{y}.png\", {\n maxZoom: 14,\n minZoom: 4,\n tms: true,\n detectRetina: true,\n subdomains: '12',\n format: 'image/png',\n transparent: true\n });\n feature_groups.push(openaip_cached_basemap);\n */\n\n var map = leaflet.map('map', {\n //layers: [openaip_basemap_phys_osm],\n center: opts.center,\n zoom: opts.zoom,\n scrollWheelZoom: false\n });\n\n for (var i in opts.providers) {\n leaflet.tileLayer.provider(opts.providers[i]).addTo(map);\n }\n\n return map;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9iYXNlX21hcC5qcz80MzA3Il0sIm5hbWVzIjpbImxlYWZsZXQiLCJyZXF1aXJlIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsInJlbmRlcl9lbGVtIiwiY2VudGVyIiwiem9vbSIsIm1heFpvb20iLCJsYXllcnMiLCJzZXRfbWFya2VyIiwicHJvdmlkZXJzIiwidGlsZV9sYXllcnMiLCJtYXAiLCJzY3JvbGxXaGVlbFpvb20iLCJpIiwidGlsZUxheWVyIiwicHJvdmlkZXIiLCJhZGRUbyJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUEsSUFBTUEsVUFBVUMsbUJBQU9BLENBQUMsNENBQVIsQ0FBaEI7QUFDQUEsbUJBQU9BLENBQUMsdURBQVI7O0FBRWUsbUVBQUNDLElBQUQsRUFBVTs7QUFFckJBLFdBQU9DLE9BQU9DLE1BQVAsQ0FBYztBQUNqQkMscUJBQWEsS0FESTtBQUVqQkMsZ0JBQVEsQ0FBQyxRQUFELEVBQVcsQ0FBQyxRQUFaLENBRlM7QUFHakJDLGNBQU0sQ0FIVztBQUlqQkMsaUJBQVMsRUFKUTtBQUtqQkMsZ0JBQVEsRUFMUztBQU1qQkMsb0JBQVksS0FOSztBQU9qQkMsbUJBQVcsQ0FDUCxxQkFETyxDQVBNO0FBVWpCQyxxQkFBYTtBQVZJLEtBQWQsRUFXSlYsSUFYSSxDQUFQOztBQWFBOzs7Ozs7Ozs7Ozs7Ozs7QUFnQkE7Ozs7Ozs7Ozs7OztBQWFBLFFBQUlXLE1BQU1iLFFBQVFhLEdBQVIsQ0FBWSxLQUFaLEVBQW1CO0FBQ3pCO0FBQ0FQLGdCQUFRSixLQUFLSSxNQUZZO0FBR3pCQyxjQUFNTCxLQUFLSyxJQUhjO0FBSXpCTyx5QkFBaUI7QUFKUSxLQUFuQixDQUFWOztBQU9BLFNBQUksSUFBTUMsQ0FBVixJQUFlYixLQUFLUyxTQUFwQixFQUErQjtBQUMzQlgsZ0JBQVFnQixTQUFSLENBQWtCQyxRQUFsQixDQUEyQmYsS0FBS1MsU0FBTCxDQUFlSSxDQUFmLENBQTNCLEVBQThDRyxLQUE5QyxDQUFvREwsR0FBcEQ7QUFDSDs7QUFFRCxXQUFPQSxHQUFQO0FBQ0gsQ0F4REQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9iYXNlX21hcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vXG5cbmNvbnN0IGxlYWZsZXQgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XG5yZXF1aXJlKCdsZWFmbGV0LXByb3ZpZGVycycpO1xuXG5leHBvcnQgZGVmYXVsdCAob3B0cykgPT4ge1xuXG4gICAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICByZW5kZXJfZWxlbTogJ21hcCcsXG4gICAgICAgIGNlbnRlcjogWzI5Ljk4MTM5LCAtOTUuMzMzNzRdLFxuICAgICAgICB6b29tOiA1LFxuICAgICAgICBtYXhab29tOiAxMCxcbiAgICAgICAgbGF5ZXJzOiBbXSxcbiAgICAgICAgc2V0X21hcmtlcjogZmFsc2UsXG4gICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgJ0VzcmkuV29ybGRTdHJlZXRNYXAnLFxuICAgICAgICBdLFxuICAgICAgICB0aWxlX2xheWVyczogW10sXG4gICAgfSwgb3B0cyk7XG5cbiAgICAvKlxuICAgIGxldCBmZWF0dXJlX2dyb3VwcyA9IFtdO1xuICAgIGNvbnN0IG9wZW5haXBfYWlyc3BhY2VfbGFiZWxzID0gbmV3IGxlYWZsZXQuVGlsZUxheWVyLldNUyhcbiAgICAgICAgXCJodHRwOi8ve3N9LnRpbGUubWFwcy5vcGVuYWlwLm5ldC9nZW93ZWJjYWNoZS9zZXJ2aWNlL3dtc1wiLCB7XG4gICAgICAgICAgICBtYXhab29tOiAxNCxcbiAgICAgICAgICAgIG1pblpvb206IDEyLFxuICAgICAgICAgICAgbGF5ZXJzOiAnb3BlbmFpcF9hcHByb3ZlZF9haXJzcGFjZXNfbGFiZWxzJyxcbiAgICAgICAgICAgIHRpbGVTaXplOiAxMDI0LFxuICAgICAgICAgICAgZGV0ZWN0UmV0aW5hOiB0cnVlLFxuICAgICAgICAgICAgc3ViZG9tYWluczogJzEyJyxcbiAgICAgICAgICAgIGZvcm1hdDogJ2ltYWdlL3BuZycsXG4gICAgICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgIG9wZW5haXBfYWlyc3BhY2VfbGFiZWxzLmFkZFRvKG1hcCk7Ki9cblxuICAgIC8qY29uc3Qgb3BlbmFpcF9jYWNoZWRfYmFzZW1hcCA9IG5ldyBsZWFmbGV0LlRpbGVMYXllcihcImh0dHA6Ly97c30udGlsZS5tYXBzLm9wZW5haXAubmV0L2dlb3dlYmNhY2hlL3NlcnZpY2UvdG1zLzEuMC4wL29wZW5haXBfYmFzZW1hcEBFUFNHJTNBOTAwOTEzQHBuZy97en0ve3h9L3t5fS5wbmdcIiwge1xuICAgICAgICBtYXhab29tOiAxNCxcbiAgICAgICAgbWluWm9vbTogNCxcbiAgICAgICAgdG1zOiB0cnVlLFxuICAgICAgICBkZXRlY3RSZXRpbmE6IHRydWUsXG4gICAgICAgIHN1YmRvbWFpbnM6ICcxMicsXG4gICAgICAgIGZvcm1hdDogJ2ltYWdlL3BuZycsXG4gICAgICAgIHRyYW5zcGFyZW50OiB0cnVlXG4gICAgfSk7XG5cbiAgICBmZWF0dXJlX2dyb3Vwcy5wdXNoKG9wZW5haXBfY2FjaGVkX2Jhc2VtYXApO1xuICAgICovXG5cbiAgICBsZXQgbWFwID0gbGVhZmxldC5tYXAoJ21hcCcsIHtcbiAgICAgICAgLy9sYXllcnM6IFtvcGVuYWlwX2Jhc2VtYXBfcGh5c19vc21dLFxuICAgICAgICBjZW50ZXI6IG9wdHMuY2VudGVyLFxuICAgICAgICB6b29tOiBvcHRzLnpvb20sXG4gICAgICAgIHNjcm9sbFdoZWVsWm9vbTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICBmb3IoY29uc3QgaSBpbiBvcHRzLnByb3ZpZGVycykge1xuICAgICAgICBsZWFmbGV0LnRpbGVMYXllci5wcm92aWRlcihvcHRzLnByb3ZpZGVyc1tpXSkuYWRkVG8obWFwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWFwO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2Jhc2VfbWFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/base_map.js\n"); +eval("\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n__webpack_require__(\"./node_modules/leaflet-providers/leaflet-providers.js\");\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (_opts) {\n var opts = Object.assign({\n render_elem: 'map',\n center: [29.98139, -95.33374],\n zoom: 5,\n maxZoom: 10,\n layers: [],\n set_marker: false,\n providers: ['Esri.WorldStreetMap'],\n tile_layers: []\n }, _opts);\n\n /*\n let feature_groups = [];\n const openaip_airspace_labels = new leaflet.TileLayer.WMS(\n \"http://{s}.tile.maps.openaip.net/geowebcache/service/wms\", {\n maxZoom: 14,\n minZoom: 12,\n layers: 'openaip_approved_airspaces_labels',\n tileSize: 1024,\n detectRetina: true,\n subdomains: '12',\n format: 'image/png',\n transparent: true\n });\n openaip_airspace_labels.addTo(map); */\n\n /*\n const openaip_cached_basemap = new leaflet.TileLayer(\"http://{s}.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_basemap@EPSG%3A900913@png/{z}/{x}/{y}.png\", {\n maxZoom: 14,\n minZoom: 4,\n tms: true,\n detectRetina: true,\n subdomains: '12',\n format: 'image/png',\n transparent: true\n });\n feature_groups.push(openaip_cached_basemap);\n */\n\n var map = leaflet.map('map', {\n // layers: [openaip_basemap_phys_osm],\n center: opts.center,\n zoom: opts.zoom,\n scrollWheelZoom: false\n });\n\n // eslint-disable-next-line no-unused-vars\n opts.providers.forEach(function (p, idx) {\n leaflet.tileLayer.provider(p).addTo(map);\n });\n\n return map;\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9iYXNlX21hcC5qcz80MzA3Il0sIm5hbWVzIjpbImxlYWZsZXQiLCJyZXF1aXJlIiwiX29wdHMiLCJvcHRzIiwiT2JqZWN0IiwiYXNzaWduIiwicmVuZGVyX2VsZW0iLCJjZW50ZXIiLCJ6b29tIiwibWF4Wm9vbSIsImxheWVycyIsInNldF9tYXJrZXIiLCJwcm92aWRlcnMiLCJ0aWxlX2xheWVycyIsIm1hcCIsInNjcm9sbFdoZWVsWm9vbSIsImZvckVhY2giLCJwIiwiaWR4IiwidGlsZUxheWVyIiwicHJvdmlkZXIiLCJhZGRUbyJdLCJtYXBwaW5ncyI6IjtBQUNBLElBQU1BLFVBQVVDLG1CQUFPQSxDQUFDLDRDQUFSLENBQWhCO0FBQ0FBLG1CQUFPQSxDQUFDLHVEQUFSOztBQUVlLG1FQUFDQyxLQUFELEVBQVc7QUFDeEIsTUFBTUMsT0FBT0MsT0FBT0MsTUFBUCxDQUFjO0FBQ3pCQyxpQkFBYSxLQURZO0FBRXpCQyxZQUFRLENBQUMsUUFBRCxFQUFXLENBQUMsUUFBWixDQUZpQjtBQUd6QkMsVUFBTSxDQUhtQjtBQUl6QkMsYUFBUyxFQUpnQjtBQUt6QkMsWUFBUSxFQUxpQjtBQU16QkMsZ0JBQVksS0FOYTtBQU96QkMsZUFBVyxDQUNULHFCQURTLENBUGM7QUFVekJDLGlCQUFhO0FBVlksR0FBZCxFQVdWWCxLQVhVLENBQWI7O0FBYUE7Ozs7Ozs7Ozs7Ozs7OztBQWdCQTs7Ozs7Ozs7Ozs7OztBQWNBLE1BQU1ZLE1BQU1kLFFBQVFjLEdBQVIsQ0FBWSxLQUFaLEVBQW1CO0FBQzdCO0FBQ0FQLFlBQVFKLEtBQUtJLE1BRmdCO0FBRzdCQyxVQUFNTCxLQUFLSyxJQUhrQjtBQUk3Qk8scUJBQWlCO0FBSlksR0FBbkIsQ0FBWjs7QUFPQTtBQUNBWixPQUFLUyxTQUFMLENBQWVJLE9BQWYsQ0FBdUIsVUFBQ0MsQ0FBRCxFQUFJQyxHQUFKLEVBQVk7QUFDakNsQixZQUFRbUIsU0FBUixDQUFrQkMsUUFBbEIsQ0FBMkJILENBQTNCLEVBQThCSSxLQUE5QixDQUFvQ1AsR0FBcEM7QUFDRCxHQUZEOztBQUlBLFNBQU9BLEdBQVA7QUFDRCxDQXpERCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2Jhc2VfbWFwLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5jb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xucmVxdWlyZSgnbGVhZmxldC1wcm92aWRlcnMnKTtcblxuZXhwb3J0IGRlZmF1bHQgKF9vcHRzKSA9PiB7XG4gIGNvbnN0IG9wdHMgPSBPYmplY3QuYXNzaWduKHtcbiAgICByZW5kZXJfZWxlbTogJ21hcCcsXG4gICAgY2VudGVyOiBbMjkuOTgxMzksIC05NS4zMzM3NF0sXG4gICAgem9vbTogNSxcbiAgICBtYXhab29tOiAxMCxcbiAgICBsYXllcnM6IFtdLFxuICAgIHNldF9tYXJrZXI6IGZhbHNlLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgJ0VzcmkuV29ybGRTdHJlZXRNYXAnLFxuICAgIF0sXG4gICAgdGlsZV9sYXllcnM6IFtdLFxuICB9LCBfb3B0cyk7XG5cbiAgLypcbiAgbGV0IGZlYXR1cmVfZ3JvdXBzID0gW107XG4gIGNvbnN0IG9wZW5haXBfYWlyc3BhY2VfbGFiZWxzID0gbmV3IGxlYWZsZXQuVGlsZUxheWVyLldNUyhcbiAgICAgIFwiaHR0cDovL3tzfS50aWxlLm1hcHMub3BlbmFpcC5uZXQvZ2Vvd2ViY2FjaGUvc2VydmljZS93bXNcIiwge1xuICAgICAgICAgIG1heFpvb206IDE0LFxuICAgICAgICAgIG1pblpvb206IDEyLFxuICAgICAgICAgIGxheWVyczogJ29wZW5haXBfYXBwcm92ZWRfYWlyc3BhY2VzX2xhYmVscycsXG4gICAgICAgICAgdGlsZVNpemU6IDEwMjQsXG4gICAgICAgICAgZGV0ZWN0UmV0aW5hOiB0cnVlLFxuICAgICAgICAgIHN1YmRvbWFpbnM6ICcxMicsXG4gICAgICAgICAgZm9ybWF0OiAnaW1hZ2UvcG5nJyxcbiAgICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZVxuICAgICAgfSk7XG5cbiAgb3BlbmFpcF9haXJzcGFjZV9sYWJlbHMuYWRkVG8obWFwKTsgKi9cblxuICAvKlxuICBjb25zdCBvcGVuYWlwX2NhY2hlZF9iYXNlbWFwID0gbmV3IGxlYWZsZXQuVGlsZUxheWVyKFwiaHR0cDovL3tzfS50aWxlLm1hcHMub3BlbmFpcC5uZXQvZ2Vvd2ViY2FjaGUvc2VydmljZS90bXMvMS4wLjAvb3BlbmFpcF9iYXNlbWFwQEVQU0clM0E5MDA5MTNAcG5nL3t6fS97eH0ve3l9LnBuZ1wiLCB7XG4gICAgICBtYXhab29tOiAxNCxcbiAgICAgIG1pblpvb206IDQsXG4gICAgICB0bXM6IHRydWUsXG4gICAgICBkZXRlY3RSZXRpbmE6IHRydWUsXG4gICAgICBzdWJkb21haW5zOiAnMTInLFxuICAgICAgZm9ybWF0OiAnaW1hZ2UvcG5nJyxcbiAgICAgIHRyYW5zcGFyZW50OiB0cnVlXG4gIH0pO1xuXG4gIGZlYXR1cmVfZ3JvdXBzLnB1c2gob3BlbmFpcF9jYWNoZWRfYmFzZW1hcCk7XG4gICovXG5cbiAgY29uc3QgbWFwID0gbGVhZmxldC5tYXAoJ21hcCcsIHtcbiAgICAvLyBsYXllcnM6IFtvcGVuYWlwX2Jhc2VtYXBfcGh5c19vc21dLFxuICAgIGNlbnRlcjogb3B0cy5jZW50ZXIsXG4gICAgem9vbTogb3B0cy56b29tLFxuICAgIHNjcm9sbFdoZWVsWm9vbTogZmFsc2UsXG4gIH0pO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBvcHRzLnByb3ZpZGVycy5mb3JFYWNoKChwLCBpZHgpID0+IHtcbiAgICBsZWFmbGV0LnRpbGVMYXllci5wcm92aWRlcihwKS5hZGRUbyhtYXApO1xuICB9KTtcblxuICByZXR1cm4gbWFwO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2Jhc2VfbWFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/base_map.js\n"); /***/ }), @@ -399,7 +400,7 @@ eval("//\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaf /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return PLAN_ROUTE_COLOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return ACTUAL_ROUTE_COLOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return CIRCLE_COLOR; });\nvar PLAN_ROUTE_COLOR = '#043758',\n ACTUAL_ROUTE_COLOR = '#067ec1',\n CIRCLE_COLOR = '#056093';//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanM/NzdmNyJdLCJuYW1lcyI6WyJQTEFOX1JPVVRFX0NPTE9SIiwiQUNUVUFMX1JPVVRFX0NPTE9SIiwiQ0lSQ0xFX0NPTE9SIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBTyxJQUNIQSxtQkFBbUIsU0FEaEI7QUFBQSxJQUVIQyxxQkFBcUIsU0FGbEI7QUFBQSxJQUdIQyxlQUFlLFNBSFoiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgbGV0XG4gICAgUExBTl9ST1VURV9DT0xPUiA9ICcjMDQzNzU4JyxcbiAgICBBQ1RVQUxfUk9VVEVfQ09MT1IgPSAnIzA2N2VjMScsXG4gICAgQ0lSQ0xFX0NPTE9SID0gJyMwNTYwOTMnO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvY29uZmlnLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/config.js\n"); +eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return PLAN_ROUTE_COLOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return ACTUAL_ROUTE_COLOR; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return CIRCLE_COLOR; });\nvar PLAN_ROUTE_COLOR = '#043758';\nvar ACTUAL_ROUTE_COLOR = '#067ec1';\nvar CIRCLE_COLOR = '#056093';//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9jb25maWcuanM/NzdmNyJdLCJuYW1lcyI6WyJQTEFOX1JPVVRFX0NPTE9SIiwiQUNUVUFMX1JPVVRFX0NPTE9SIiwiQ0lSQ0xFX0NPTE9SIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBTyxJQUFNQSxtQkFBbUIsU0FBekI7QUFDQSxJQUFNQyxxQkFBcUIsU0FBM0I7QUFDQSxJQUFNQyxlQUFlLFNBQXJCIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL21hcHMvY29uZmlnLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IFBMQU5fUk9VVEVfQ09MT1IgPSAnIzA0Mzc1OCc7XG5leHBvcnQgY29uc3QgQUNUVUFMX1JPVVRFX0NPTE9SID0gJyMwNjdlYzEnO1xuZXhwb3J0IGNvbnN0IENJUkNMRV9DT0xPUiA9ICcjMDU2MDkzJztcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2NvbmZpZy5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/maps/config.js\n"); /***/ }), @@ -407,7 +408,7 @@ eval("/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony export (immutable) */ __webpack_exports__[\"a\"] = addWMSLayer;\n/* unused harmony export showFeaturePopup */\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n/**\n * Add a WMS layer to a map. opts must be:\n * {\n * url: '',\n * params: {}\n * }\n * @param map\n * @param opts\n */\nfunction addWMSLayer(map, opts) {\n\n if (opts.url === '') {\n return;\n }\n\n opts.params = Object.assign({\n format: 'image/png',\n transparent: true,\n maxZoom: 14,\n minZoom: 4\n }, opts.params);\n\n var mlayer = leaflet.tileLayer.wms(opts.url, opts.params);\n\n mlayer.addTo(map);\n\n return mlayer;\n}\n\n/**\n * Show a popup\n * @param feature\n * @param layer\n */\nfunction showFeaturePopup(feature, layer) {\n var popup_html = '';\n if (feature.properties && feature.properties.popup) {\n popup_html += feature.properties.popup;\n }\n\n layer.bindPopup(popup_html);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9oZWxwZXJzLmpzPzNjZDUiXSwibmFtZXMiOlsibGVhZmxldCIsInJlcXVpcmUiLCJhZGRXTVNMYXllciIsIm1hcCIsIm9wdHMiLCJ1cmwiLCJwYXJhbXMiLCJPYmplY3QiLCJhc3NpZ24iLCJmb3JtYXQiLCJ0cmFuc3BhcmVudCIsIm1heFpvb20iLCJtaW5ab29tIiwibWxheWVyIiwidGlsZUxheWVyIiwid21zIiwiYWRkVG8iLCJzaG93RmVhdHVyZVBvcHVwIiwiZmVhdHVyZSIsImxheWVyIiwicG9wdXBfaHRtbCIsInByb3BlcnRpZXMiLCJwb3B1cCIsImJpbmRQb3B1cCJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsSUFBTUEsVUFBVUMsbUJBQU9BLENBQUMsNENBQVIsQ0FBaEI7O0FBRUE7Ozs7Ozs7OztBQVNPLFNBQVNDLFdBQVQsQ0FBcUJDLEdBQXJCLEVBQTBCQyxJQUExQixFQUFnQzs7QUFFbkMsUUFBR0EsS0FBS0MsR0FBTCxLQUFhLEVBQWhCLEVBQW9CO0FBQ2hCO0FBQ0g7O0FBRURELFNBQUtFLE1BQUwsR0FBY0MsT0FBT0MsTUFBUCxDQUFjO0FBQ3hCQyxnQkFBUSxXQURnQjtBQUV4QkMscUJBQWEsSUFGVztBQUd4QkMsaUJBQVMsRUFIZTtBQUl4QkMsaUJBQVM7QUFKZSxLQUFkLEVBS1hSLEtBQUtFLE1BTE0sQ0FBZDs7QUFPQSxRQUFNTyxTQUFTYixRQUFRYyxTQUFSLENBQWtCQyxHQUFsQixDQUNYWCxLQUFLQyxHQURNLEVBQ0RELEtBQUtFLE1BREosQ0FBZjs7QUFJQU8sV0FBT0csS0FBUCxDQUFhYixHQUFiOztBQUVBLFdBQU9VLE1BQVA7QUFDSDs7QUFFRDs7Ozs7QUFLTyxTQUFTSSxnQkFBVCxDQUEwQkMsT0FBMUIsRUFBbUNDLEtBQW5DLEVBQTBDO0FBQzdDLFFBQUlDLGFBQWEsRUFBakI7QUFDQSxRQUFJRixRQUFRRyxVQUFSLElBQXNCSCxRQUFRRyxVQUFSLENBQW1CQyxLQUE3QyxFQUFvRDtBQUNoREYsc0JBQWNGLFFBQVFHLFVBQVIsQ0FBbUJDLEtBQWpDO0FBQ0g7O0FBRURILFVBQU1JLFNBQU4sQ0FBZ0JILFVBQWhCO0FBQ0giLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9oZWxwZXJzLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5jb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xuXG4vKipcbiAqIEFkZCBhIFdNUyBsYXllciB0byBhIG1hcC4gb3B0cyBtdXN0IGJlOlxuICoge1xuICogIHVybDogJycsXG4gKiAgcGFyYW1zOiB7fVxuICogIH1cbiAqIEBwYXJhbSBtYXBcbiAqIEBwYXJhbSBvcHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGRXTVNMYXllcihtYXAsIG9wdHMpIHtcblxuICAgIGlmKG9wdHMudXJsID09PSAnJykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb3B0cy5wYXJhbXMgPSBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgZm9ybWF0OiAnaW1hZ2UvcG5nJyxcbiAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICAgIG1heFpvb206IDE0LFxuICAgICAgICBtaW5ab29tOiA0LFxuICAgIH0sIG9wdHMucGFyYW1zKTtcblxuICAgIGNvbnN0IG1sYXllciA9IGxlYWZsZXQudGlsZUxheWVyLndtcyhcbiAgICAgICAgb3B0cy51cmwsIG9wdHMucGFyYW1zXG4gICAgKTtcblxuICAgIG1sYXllci5hZGRUbyhtYXApO1xuXG4gICAgcmV0dXJuIG1sYXllcjtcbn1cblxuLyoqXG4gKiBTaG93IGEgcG9wdXBcbiAqIEBwYXJhbSBmZWF0dXJlXG4gKiBAcGFyYW0gbGF5ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3dGZWF0dXJlUG9wdXAoZmVhdHVyZSwgbGF5ZXIpIHtcbiAgICBsZXQgcG9wdXBfaHRtbCA9ICcnO1xuICAgIGlmIChmZWF0dXJlLnByb3BlcnRpZXMgJiYgZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwKSB7XG4gICAgICAgIHBvcHVwX2h0bWwgKz0gZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwXG4gICAgfVxuXG4gICAgbGF5ZXIuYmluZFBvcHVwKHBvcHVwX2h0bWwpXG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvbWFwcy9oZWxwZXJzLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/helpers.js\n"); +eval("/* harmony export (immutable) */ __webpack_exports__[\"a\"] = addWMSLayer;\n/* unused harmony export showFeaturePopup */\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n/**\n * Add a WMS layer to a map. opts must be:\n * {\n * url: '',\n * params: {}\n * }\n * @param map\n * @param opts\n */\nfunction addWMSLayer(map, opts) {\n if (opts.url === '') {\n return null;\n }\n\n opts.params = Object.assign({\n format: 'image/png',\n transparent: true,\n maxZoom: 14,\n minZoom: 4\n }, opts.params);\n\n var mlayer = leaflet.tileLayer.wms(opts.url, opts.params);\n\n mlayer.addTo(map);\n\n return mlayer;\n}\n\n/**\n * Show a popup\n * @param feature\n * @param layer\n */\nfunction showFeaturePopup(feature, layer) {\n var popup_html = '';\n if (feature.properties && feature.properties.popup) {\n popup_html += feature.properties.popup;\n }\n\n layer.bindPopup(popup_html);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9oZWxwZXJzLmpzPzNjZDUiXSwibmFtZXMiOlsibGVhZmxldCIsInJlcXVpcmUiLCJhZGRXTVNMYXllciIsIm1hcCIsIm9wdHMiLCJ1cmwiLCJwYXJhbXMiLCJPYmplY3QiLCJhc3NpZ24iLCJmb3JtYXQiLCJ0cmFuc3BhcmVudCIsIm1heFpvb20iLCJtaW5ab29tIiwibWxheWVyIiwidGlsZUxheWVyIiwid21zIiwiYWRkVG8iLCJzaG93RmVhdHVyZVBvcHVwIiwiZmVhdHVyZSIsImxheWVyIiwicG9wdXBfaHRtbCIsInByb3BlcnRpZXMiLCJwb3B1cCIsImJpbmRQb3B1cCJdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsSUFBTUEsVUFBVUMsbUJBQU9BLENBQUMsNENBQVIsQ0FBaEI7O0FBRUE7Ozs7Ozs7OztBQVNPLFNBQVNDLFdBQVQsQ0FBcUJDLEdBQXJCLEVBQTBCQyxJQUExQixFQUFnQztBQUNyQyxNQUFJQSxLQUFLQyxHQUFMLEtBQWEsRUFBakIsRUFBcUI7QUFDbkIsV0FBTyxJQUFQO0FBQ0Q7O0FBRURELE9BQUtFLE1BQUwsR0FBY0MsT0FBT0MsTUFBUCxDQUFjO0FBQzFCQyxZQUFRLFdBRGtCO0FBRTFCQyxpQkFBYSxJQUZhO0FBRzFCQyxhQUFTLEVBSGlCO0FBSTFCQyxhQUFTO0FBSmlCLEdBQWQsRUFLWFIsS0FBS0UsTUFMTSxDQUFkOztBQU9BLE1BQU1PLFNBQVNiLFFBQVFjLFNBQVIsQ0FBa0JDLEdBQWxCLENBQ2JYLEtBQUtDLEdBRFEsRUFDSEQsS0FBS0UsTUFERixDQUFmOztBQUlBTyxTQUFPRyxLQUFQLENBQWFiLEdBQWI7O0FBRUEsU0FBT1UsTUFBUDtBQUNEOztBQUVEOzs7OztBQUtPLFNBQVNJLGdCQUFULENBQTBCQyxPQUExQixFQUFtQ0MsS0FBbkMsRUFBMEM7QUFDL0MsTUFBSUMsYUFBYSxFQUFqQjtBQUNBLE1BQUlGLFFBQVFHLFVBQVIsSUFBc0JILFFBQVFHLFVBQVIsQ0FBbUJDLEtBQTdDLEVBQW9EO0FBQ2xERixrQkFBY0YsUUFBUUcsVUFBUixDQUFtQkMsS0FBakM7QUFDRDs7QUFFREgsUUFBTUksU0FBTixDQUFnQkgsVUFBaEI7QUFDRCIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9tYXBzL2hlbHBlcnMuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmNvbnN0IGxlYWZsZXQgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XG5cbi8qKlxuICogQWRkIGEgV01TIGxheWVyIHRvIGEgbWFwLiBvcHRzIG11c3QgYmU6XG4gKiB7XG4gKiAgdXJsOiAnJyxcbiAqICBwYXJhbXM6IHt9XG4gKiAgfVxuICogQHBhcmFtIG1hcFxuICogQHBhcmFtIG9wdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFdNU0xheWVyKG1hcCwgb3B0cykge1xuICBpZiAob3B0cy51cmwgPT09ICcnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBvcHRzLnBhcmFtcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIGZvcm1hdDogJ2ltYWdlL3BuZycsXG4gICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgbWF4Wm9vbTogMTQsXG4gICAgbWluWm9vbTogNCxcbiAgfSwgb3B0cy5wYXJhbXMpO1xuXG4gIGNvbnN0IG1sYXllciA9IGxlYWZsZXQudGlsZUxheWVyLndtcyhcbiAgICBvcHRzLnVybCwgb3B0cy5wYXJhbXMsXG4gICk7XG5cbiAgbWxheWVyLmFkZFRvKG1hcCk7XG5cbiAgcmV0dXJuIG1sYXllcjtcbn1cblxuLyoqXG4gKiBTaG93IGEgcG9wdXBcbiAqIEBwYXJhbSBmZWF0dXJlXG4gKiBAcGFyYW0gbGF5ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3dGZWF0dXJlUG9wdXAoZmVhdHVyZSwgbGF5ZXIpIHtcbiAgbGV0IHBvcHVwX2h0bWwgPSAnJztcbiAgaWYgKGZlYXR1cmUucHJvcGVydGllcyAmJiBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXApIHtcbiAgICBwb3B1cF9odG1sICs9IGZlYXR1cmUucHJvcGVydGllcy5wb3B1cDtcbiAgfVxuXG4gIGxheWVyLmJpbmRQb3B1cChwb3B1cF9odG1sKTtcbn1cblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2hlbHBlcnMuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/helpers.js\n"); /***/ }), @@ -415,7 +416,7 @@ eval("/* harmony export (immutable) */ __webpack_exports__[\"a\"] = addWMSLayer; /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__airspace_map__ = __webpack_require__(\"./resources/js/maps/airspace_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__live_map__ = __webpack_require__(\"./resources/js/maps/live_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__route_map__ = __webpack_require__(\"./resources/js/maps/route_map.js\");\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_airspace_map\", function() { return __WEBPACK_IMPORTED_MODULE_0__airspace_map__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_live_map\", function() { return __WEBPACK_IMPORTED_MODULE_1__live_map__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_route_map\", function() { return __WEBPACK_IMPORTED_MODULE_2__route_map__[\"a\"]; });\n/**\n * All of the functionality required for maps\n */\n\nwindow.L = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n__webpack_require__(\"./node_modules/Leaflet.Geodesic/Leaflet.Geodesic.js\");\n__webpack_require__(\"./node_modules/leaflet-rotatedmarker/leaflet.rotatedMarker.js\");\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9pbmRleC5qcz85MmYwIl0sIm5hbWVzIjpbIndpbmRvdyIsIkwiLCJyZXF1aXJlIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FBSUFBLE9BQU9DLENBQVAsR0FBV0MsbUJBQU9BLENBQUMsNENBQVIsQ0FBWDtBQUNBQSxtQkFBT0EsQ0FBQyxxREFBUjtBQUNBQSxtQkFBT0EsQ0FBQywrREFBUjs7QUFFQTtBQUNBO0FBQ0EiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9pbmRleC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQWxsIG9mIHRoZSBmdW5jdGlvbmFsaXR5IHJlcXVpcmVkIGZvciBtYXBzXG4gKi9cblxud2luZG93LkwgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XG5yZXF1aXJlKCdMZWFmbGV0Lkdlb2Rlc2ljJyk7XG5yZXF1aXJlKCdsZWFmbGV0LXJvdGF0ZWRtYXJrZXInKTtcblxuaW1wb3J0IHJlbmRlcl9haXJzcGFjZV9tYXAgZnJvbSAnLi9haXJzcGFjZV9tYXAnXG5pbXBvcnQgcmVuZGVyX2xpdmVfbWFwIGZyb20gJy4vbGl2ZV9tYXAnXG5pbXBvcnQgcmVuZGVyX3JvdXRlX21hcCBmcm9tICcuL3JvdXRlX21hcCdcblxuZXhwb3J0IHtcbiAgcmVuZGVyX2FpcnNwYWNlX21hcCxcbiAgcmVuZGVyX2xpdmVfbWFwLFxuICByZW5kZXJfcm91dGVfbWFwLFxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvaW5kZXguanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/index.js\n"); +eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__airspace_map__ = __webpack_require__(\"./resources/js/maps/airspace_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__live_map__ = __webpack_require__(\"./resources/js/maps/live_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__route_map__ = __webpack_require__(\"./resources/js/maps/route_map.js\");\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_airspace_map\", function() { return __WEBPACK_IMPORTED_MODULE_0__airspace_map__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_live_map\", function() { return __WEBPACK_IMPORTED_MODULE_1__live_map__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"render_route_map\", function() { return __WEBPACK_IMPORTED_MODULE_2__route_map__[\"a\"]; });\n/**\n * All of the functionality required for maps\n */\n\n\n\n\n\n__webpack_require__(\"./node_modules/Leaflet.Geodesic/Leaflet.Geodesic.js\");\n__webpack_require__(\"./node_modules/leaflet-rotatedmarker/leaflet.rotatedMarker.js\");\n\nwindow.L = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9pbmRleC5qcz85MmYwIl0sIm5hbWVzIjpbInJlcXVpcmUiLCJ3aW5kb3ciLCJMIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7O0FBSUE7QUFDQTtBQUNBOztBQUVBQSxtQkFBT0EsQ0FBQyxxREFBUjtBQUNBQSxtQkFBT0EsQ0FBQywrREFBUjs7QUFFQUMsT0FBT0MsQ0FBUCxHQUFXRixtQkFBT0EsQ0FBQyw0Q0FBUixDQUFYIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL21hcHMvaW5kZXguanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFsbCBvZiB0aGUgZnVuY3Rpb25hbGl0eSByZXF1aXJlZCBmb3IgbWFwc1xuICovXG5cbmltcG9ydCByZW5kZXJfYWlyc3BhY2VfbWFwIGZyb20gJy4vYWlyc3BhY2VfbWFwJztcbmltcG9ydCByZW5kZXJfbGl2ZV9tYXAgZnJvbSAnLi9saXZlX21hcCc7XG5pbXBvcnQgcmVuZGVyX3JvdXRlX21hcCBmcm9tICcuL3JvdXRlX21hcCc7XG5cbnJlcXVpcmUoJ0xlYWZsZXQuR2VvZGVzaWMnKTtcbnJlcXVpcmUoJ2xlYWZsZXQtcm90YXRlZG1hcmtlcicpO1xuXG53aW5kb3cuTCA9IHJlcXVpcmUoJ2xlYWZsZXQnKTtcblxuZXhwb3J0IHtcbiAgcmVuZGVyX2FpcnNwYWNlX21hcCxcbiAgcmVuZGVyX2xpdmVfbWFwLFxuICByZW5kZXJfcm91dGVfbWFwLFxufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2luZGV4LmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/index.js\n"); /***/ }), @@ -423,7 +424,7 @@ eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true } /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__config__ = __webpack_require__(\"./resources/js/maps/config.js\");\n//\n\nvar geolib = __webpack_require__(\"./node_modules/geolib/dist/geolib.js\");\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n\n\n\n/**\n * Render the live map\n * @param opts\n * @private\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n center: [29.98139, -95.33374],\n zoom: 5,\n update_uri: '/api/acars',\n pirep_uri: '/api/pireps/{id}',\n pirep_link_uri: '/pireps/{id}',\n positions: null,\n render_elem: 'map',\n aircraft_icon: '/assets/img/acars/aircraft.png',\n units: 'nmi'\n }, opts);\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var aircraftIcon = leaflet.icon({\n iconUrl: opts.aircraft_icon,\n iconSize: [42, 42],\n iconAnchor: [21, 21]\n });\n\n /**\n * Hold the markers\n * @type {{}}\n */\n var markers_list = {};\n\n var pannedToCenter = false;\n\n var layerFlights = null;\n var layerSelFlight = null;\n var layerSelFlightFeature = null;\n var layerSelFlightLayer = null;\n var layerSelArr = null;\n var layerSelDep = null;\n\n /**\n * Controller for two-way bindings\n * @type {{focusMarker: focusMarker}}\n */\n var mapController = {\n /**\n * Focus on a specific marker\n * @param e\n * @param model\n */\n focusMarker: function focusMarker(e, model) {\n if (!(model.pirep.id in markers_list)) {\n console.log('marker not found in list');\n return;\n }\n\n var marker = markers_list[model.pirep.id];\n onFlightClick(marker[0], marker[1]);\n }\n };\n\n var r_map_view = rivets.bind($('#map-info-box'), { pirep: {}, controller: mapController });\n var r_table_view = rivets.bind($('#live_flights'), { pireps: [], controller: mapController });\n\n /**\n * When a flight is clicked on, show the path, etc for that flight\n * @param feature\n * @param layer\n */\n var onFlightClick = function onFlightClick(feature, layer) {\n\n var pirep_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id);\n var geojson_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id) + \"/acars/geojson\";\n\n var pirep_info = $.ajax({\n url: pirep_uri,\n dataType: 'json',\n error: console.log\n });\n\n var flight_route = $.ajax({\n url: geojson_uri,\n dataType: 'json',\n error: console.log\n });\n\n // Load up the PIREP info\n $.when(flight_route).done(function (rte) {\n if (layerSelFlight !== null) {\n map.removeLayer(layerSelFlight);\n //map.removeLayer(layerSelArr);\n //map.removeLayer(layerSelDep);\n }\n\n layerSelFlight = leaflet.geodesic([], {\n weight: 5,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n wrap: false\n }).addTo(map);\n\n layerSelFlight.geoJson(rte.line);\n layerSelFlightFeature = feature;\n layerSelFlightLayer = layer;\n\n /*const dptIcon = leaflet.divIcon({\n html: '
' + rte.airports.d.icao + '
'\n });\n layerSelDep = leaflet.marker([rte.airports.d.lat, rte.airports.d.lon], {icon:dptIcon}).addTo(map);\n */\n\n // Center on it, but only do it once, in case the map is moved\n if (!pannedToCenter) {\n // find center\n var c = geolib.getCenter([{ latitude: rte.airports.a.lat, longitude: rte.airports.a.lon }, { latitude: rte.airports.d.lat, longitude: rte.airports.d.lon }]);\n\n //map.panTo({lat: c.latitude, lng: c.longitude});\n map.panTo({ lat: rte.position.lat, lng: rte.position.lon });\n pannedToCenter = true;\n }\n });\n\n //\n // When the PIREP info is done loading, show the bottom bar\n //\n $.when(pirep_info).done(function (pirep) {\n r_map_view.update({ pirep: pirep.data });\n $('#map-info-box').show();\n });\n };\n\n var updateMap = function updateMap() {\n\n console.log('reloading flights from acars...');\n\n /**\n * AJAX UPDATE\n */\n var pirep_uri = opts.pirep_uri.replace('{id}', '');\n var pireps = $.ajax({\n url: pirep_uri,\n dataType: 'json',\n error: console.log\n });\n\n var flights = $.ajax({\n url: opts.update_uri,\n dataType: 'json',\n error: console.log\n });\n\n $.when(flights).done(function (flightGeoJson) {\n\n if (layerFlights !== null) {\n layerFlights.clearLayers();\n }\n\n layerFlights = leaflet.geoJSON(flightGeoJson, {\n onEachFeature: function onEachFeature(feature, layer) {\n layer.on({\n click: function click(e) {\n pannedToCenter = false;\n onFlightClick(feature, layer);\n }\n });\n\n var popup_html = '';\n if (feature.properties && feature.properties.popup !== '' && feature.properties.popup !== undefined) {\n popup_html += feature.properties.popup;\n layer.bindPopup(popup_html);\n }\n\n // add to the list\n markers_list[feature.properties.pirep_id] = [feature, layer];\n },\n pointToLayer: function pointToLayer(feature, latlon) {\n return leaflet.marker(latlon, {\n icon: aircraftIcon,\n rotationAngle: feature.properties.heading\n });\n }\n });\n\n layerFlights.addTo(map);\n\n // Reload the clicked-flight information\n if (layerSelFlight !== null) {\n onFlightClick(layerSelFlightFeature, layerSelFlightLayer);\n }\n });\n\n $.when(pireps).done(function (pireps) {\n r_table_view.update({\n pireps: pireps.data,\n has_data: pireps.data.length > 0\n });\n });\n };\n\n updateMap();\n setInterval(updateMap, 10000);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9saXZlX21hcC5qcz9lN2Y2Il0sIm5hbWVzIjpbImdlb2xpYiIsInJlcXVpcmUiLCJsZWFmbGV0Iiwicml2ZXRzIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsImNlbnRlciIsInpvb20iLCJ1cGRhdGVfdXJpIiwicGlyZXBfdXJpIiwicGlyZXBfbGlua191cmkiLCJwb3NpdGlvbnMiLCJyZW5kZXJfZWxlbSIsImFpcmNyYWZ0X2ljb24iLCJ1bml0cyIsIm1hcCIsImRyYXdfYmFzZV9tYXAiLCJhaXJjcmFmdEljb24iLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsIm1hcmtlcnNfbGlzdCIsInBhbm5lZFRvQ2VudGVyIiwibGF5ZXJGbGlnaHRzIiwibGF5ZXJTZWxGbGlnaHQiLCJsYXllclNlbEZsaWdodEZlYXR1cmUiLCJsYXllclNlbEZsaWdodExheWVyIiwibGF5ZXJTZWxBcnIiLCJsYXllclNlbERlcCIsIm1hcENvbnRyb2xsZXIiLCJmb2N1c01hcmtlciIsImUiLCJtb2RlbCIsInBpcmVwIiwiaWQiLCJjb25zb2xlIiwibG9nIiwibWFya2VyIiwib25GbGlnaHRDbGljayIsInJfbWFwX3ZpZXciLCJiaW5kIiwiJCIsImNvbnRyb2xsZXIiLCJyX3RhYmxlX3ZpZXciLCJwaXJlcHMiLCJmZWF0dXJlIiwibGF5ZXIiLCJyZXBsYWNlIiwicHJvcGVydGllcyIsInBpcmVwX2lkIiwiZ2VvanNvbl91cmkiLCJwaXJlcF9pbmZvIiwiYWpheCIsInVybCIsImRhdGFUeXBlIiwiZXJyb3IiLCJmbGlnaHRfcm91dGUiLCJ3aGVuIiwiZG9uZSIsInJ0ZSIsInJlbW92ZUxheWVyIiwiZ2VvZGVzaWMiLCJ3ZWlnaHQiLCJvcGFjaXR5IiwiY29sb3IiLCJBQ1RVQUxfUk9VVEVfQ09MT1IiLCJ3cmFwIiwiYWRkVG8iLCJnZW9Kc29uIiwibGluZSIsImMiLCJnZXRDZW50ZXIiLCJsYXRpdHVkZSIsImFpcnBvcnRzIiwiYSIsImxhdCIsImxvbmdpdHVkZSIsImxvbiIsImQiLCJwYW5UbyIsInBvc2l0aW9uIiwibG5nIiwidXBkYXRlIiwiZGF0YSIsInNob3ciLCJ1cGRhdGVNYXAiLCJmbGlnaHRzIiwiY2xlYXJMYXllcnMiLCJnZW9KU09OIiwiZmxpZ2h0R2VvSnNvbiIsIm9uRWFjaEZlYXR1cmUiLCJvbiIsImNsaWNrIiwicG9wdXBfaHRtbCIsInBvcHVwIiwidW5kZWZpbmVkIiwiYmluZFBvcHVwIiwicG9pbnRUb0xheWVyIiwibGF0bG9uIiwicm90YXRpb25BbmdsZSIsImhlYWRpbmciLCJoYXNfZGF0YSIsImxlbmd0aCIsInNldEludGVydmFsIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7O0FBRUEsSUFBTUEsU0FBU0MsbUJBQU9BLENBQUMsc0NBQVIsQ0FBZjtBQUNBLElBQU1DLFVBQVVELG1CQUFPQSxDQUFDLDRDQUFSLENBQWhCO0FBQ0EsSUFBTUUsU0FBU0YsbUJBQU9BLENBQUMsc0NBQVIsQ0FBZjs7QUFFQTtBQUNBOztBQUVBOzs7OztBQUtlLG1FQUFDRyxJQUFELEVBQVU7O0FBRXJCQSxXQUFPQyxPQUFPQyxNQUFQLENBQWM7QUFDakJDLGdCQUFRLENBQUMsUUFBRCxFQUFXLENBQUMsUUFBWixDQURTO0FBRWpCQyxjQUFNLENBRlc7QUFHakJDLG9CQUFZLFlBSEs7QUFJakJDLG1CQUFXLGtCQUpNO0FBS2pCQyx3QkFBZ0IsY0FMQztBQU1qQkMsbUJBQVcsSUFOTTtBQU9qQkMscUJBQWEsS0FQSTtBQVFqQkMsdUJBQWUsZ0NBUkU7QUFTakJDLGVBQU87QUFUVSxLQUFkLEVBVUpYLElBVkksQ0FBUDs7QUFZQSxRQUFNWSxNQUFNQyxrRUFBYUEsQ0FBQ2IsSUFBZCxDQUFaO0FBQ0EsUUFBTWMsZUFBZWhCLFFBQVFpQixJQUFSLENBQWE7QUFDOUJDLGlCQUFTaEIsS0FBS1UsYUFEZ0I7QUFFOUJPLGtCQUFVLENBQUMsRUFBRCxFQUFLLEVBQUwsQ0FGb0I7QUFHOUJDLG9C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SUFBRixDQUFPYixNQUFQLEVBQWVjLElBQWYsQ0FBb0Isa0JBQVU7QUFDMUJmLHlCQUFhdUMsTUFBYixDQUFvQjtBQUNoQnRDLHdCQUFRQSxPQUFPdUMsSUFEQztBQUVoQmtCLDBCQUFXekQsT0FBT3VDLElBQVAsQ0FBWW1CLE1BQVosR0FBcUI7QUFGaEIsYUFBcEI7QUFJSCxTQUxEO0FBTUgsS0FsRUQ7O0FBb0VBakI7QUFDQWtCLGdCQUFZbEIsU0FBWixFQUF1QixLQUF2QjtBQUNILENBek1EIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL21hcHMvbGl2ZV9tYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvL1xuXG5jb25zdCBnZW9saWIgPSByZXF1aXJlKCdnZW9saWInKTtcbmNvbnN0IGxlYWZsZXQgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XG5jb25zdCByaXZldHMgPSByZXF1aXJlKCdyaXZldHMnKTtcblxuaW1wb3J0IGRyYXdfYmFzZV9tYXAgZnJvbSAnLi9iYXNlX21hcCdcbmltcG9ydCB7IEFDVFVBTF9ST1VURV9DT0xPUiB9IGZyb20gJy4vY29uZmlnJ1xuXG4vKipcbiAqIFJlbmRlciB0aGUgbGl2ZSBtYXBcbiAqIEBwYXJhbSBvcHRzXG4gKiBAcHJpdmF0ZVxuICovXG5leHBvcnQgZGVmYXVsdCAob3B0cykgPT4ge1xuXG4gICAgb3B0cyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgICBjZW50ZXI6IFsyOS45ODEzOSwgLTk1LjMzMzc0XSxcbiAgICAgICAgem9vbTogNSxcbiAgICAgICAgdXBkYXRlX3VyaTogJy9hcGkvYWNhcnMnLFxuICAgICAgICBwaXJlcF91cmk6ICcvYXBpL3BpcmVwcy97aWR9JyxcbiAgICAgICAgcGlyZXBfbGlua191cmk6ICcvcGlyZXBzL3tpZH0nLFxuICAgICAgICBwb3NpdGlvbnM6IG51bGwsXG4gICAgICAgIHJlbmRlcl9lbGVtOiAnbWFwJyxcbiAgICAgICAgYWlyY3JhZnRfaWNvbjogJy9hc3NldHMvaW1nL2FjYXJzL2FpcmNyYWZ0LnBuZycsXG4gICAgICAgIHVuaXRzOiAnbm1pJyxcbiAgICB9LCBvcHRzKTtcblxuICAgIGNvbnN0IG1hcCA9IGRyYXdfYmFzZV9tYXAob3B0cyk7XG4gICAgY29uc3QgYWlyY3JhZnRJY29uID0gbGVhZmxldC5pY29uKHtcbiAgICAgICAgaWNvblVybDogb3B0cy5haXJjcmFmdF9pY29uLFxuICAgICAgICBpY29uU2l6ZTogWzQyLCA0Ml0sXG4gICAgICAgIGljb25BbmNob3I6IFsyMSwgMjFdLFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogSG9sZCB0aGUgbWFya2Vyc1xuICAgICAqIEB0eXBlIHt7fX1cbiAgICAgKi9cbiAgICBsZXQgbWFya2Vyc19saXN0ID0ge307XG5cbiAgICBsZXQgcGFubmVkVG9DZW50ZXIgPSBmYWxzZTtcblxuICAgIGxldCBsYXllckZsaWdodHMgPSBudWxsO1xuICAgIGxldCBsYXllclNlbEZsaWdodCA9IG51bGw7XG4gICAgbGV0IGxheWVyU2VsRmxpZ2h0RmVhdHVyZSA9IG51bGw7XG4gICAgbGV0IGxheWVyU2VsRmxpZ2h0TGF5ZXIgPSBudWxsO1xuICAgIGxldCBsYXllclNlbEFyciA9IG51bGw7XG4gICAgbGV0IGxheWVyU2VsRGVwID0gbnVsbDtcblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xsZXIgZm9yIHR3by13YXkgYmluZGluZ3NcbiAgICAgKiBAdHlwZSB7e2ZvY3VzTWFya2VyOiBmb2N1c01hcmtlcn19XG4gICAgICovXG4gICAgY29uc3QgbWFwQ29udHJvbGxlciA9IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZvY3VzIG9uIGEgc3BlY2lmaWMgbWFya2VyXG4gICAgICAgICAqIEBwYXJhbSBlXG4gICAgICAgICAqIEBwYXJhbSBtb2RlbFxuICAgICAgICAgKi9cbiAgICAgICAgZm9jdXNNYXJrZXI6IChlLCBtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYoIShtb2RlbC5waXJlcC5pZCBpbiBtYXJrZXJzX2xpc3QpKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ21hcmtlciBub3QgZm91bmQgaW4gbGlzdCcpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbWFya2VyID0gbWFya2Vyc19saXN0W21vZGVsLnBpcmVwLmlkXTtcbiAgICAgICAgICAgIG9uRmxpZ2h0Q2xpY2sobWFya2VyWzBdLCBtYXJrZXJbMV0pO1xuICAgICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCByX21hcF92aWV3ID0gcml2ZXRzLmJpbmQoJCgnI21hcC1pbmZvLWJveCcpLCB7cGlyZXA6IHt9LCBjb250cm9sbGVyOiBtYXBDb250cm9sbGVyfSk7XG4gICAgY29uc3Qgcl90YWJsZV92aWV3ID0gcml2ZXRzLmJpbmQoJCgnI2xpdmVfZmxpZ2h0cycpLCB7cGlyZXBzOiBbXSwgY29udHJvbGxlcjogbWFwQ29udHJvbGxlcn0pO1xuXG4gICAgLyoqXG4gICAgICogV2hlbiBhIGZsaWdodCBpcyBjbGlja2VkIG9uLCBzaG93IHRoZSBwYXRoLCBldGMgZm9yIHRoYXQgZmxpZ2h0XG4gICAgICogQHBhcmFtIGZlYXR1cmVcbiAgICAgKiBAcGFyYW0gbGF5ZXJcbiAgICAgKi9cbiAgICBjb25zdCBvbkZsaWdodENsaWNrID0gKGZlYXR1cmUsIGxheWVyKSA9PiB7XG5cbiAgICAgICAgY29uc3QgcGlyZXBfdXJpID0gb3B0cy5waXJlcF91cmkucmVwbGFjZSgne2lkfScsIGZlYXR1cmUucHJvcGVydGllcy5waXJlcF9pZCk7XG4gICAgICAgIGNvbnN0IGdlb2pzb25fdXJpID0gb3B0cy5waXJlcF91cmkucmVwbGFjZSgne2lkfScsIGZlYXR1cmUucHJvcGVydGllcy5waXJlcF9pZCkgKyBcIi9hY2Fycy9nZW9qc29uXCI7XG5cbiAgICAgICAgY29uc3QgcGlyZXBfaW5mbyA9ICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6IHBpcmVwX3VyaSxcbiAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXG4gICAgICAgICAgICBlcnJvcjogY29uc29sZS5sb2dcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZmxpZ2h0X3JvdXRlID0gJC5hamF4KHtcbiAgICAgICAgICAgIHVybDogZ2VvanNvbl91cmksXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgICAgICAgZXJyb3I6IGNvbnNvbGUubG9nXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIExvYWQgdXAgdGhlIFBJUkVQIGluZm9cbiAgICAgICAgJC53aGVuKGZsaWdodF9yb3V0ZSkuZG9uZSgocnRlKSA9PiB7XG4gICAgICAgICAgICBpZiAobGF5ZXJTZWxGbGlnaHQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBtYXAucmVtb3ZlTGF5ZXIobGF5ZXJTZWxGbGlnaHQpO1xuICAgICAgICAgICAgICAgIC8vbWFwLnJlbW92ZUxheWVyKGxheWVyU2VsQXJyKTtcbiAgICAgICAgICAgICAgICAvL21hcC5yZW1vdmVMYXllcihsYXllclNlbERlcCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxheWVyU2VsRmxpZ2h0ID0gbGVhZmxldC5nZW9kZXNpYyhbXSwge1xuICAgICAgICAgICAgICAgIHdlaWdodDogNSxcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLjksXG4gICAgICAgICAgICAgICAgY29sb3I6IEFDVFVBTF9ST1VURV9DT0xPUixcbiAgICAgICAgICAgICAgICB3cmFwOiBmYWxzZSxcbiAgICAgICAgICAgIH0pLmFkZFRvKG1hcCk7XG5cbiAgICAgICAgICAgIGxheWVyU2VsRmxpZ2h0Lmdlb0pzb24ocnRlLmxpbmUpO1xuICAgICAgICAgICAgbGF5ZXJTZWxGbGlnaHRGZWF0dXJlID0gZmVhdHVyZTtcbiAgICAgICAgICAgIGxheWVyU2VsRmxpZ2h0TGF5ZXIgPSBsYXllcjtcblxuICAgICAgICAgICAgLypjb25zdCBkcHRJY29uID0gbGVhZmxldC5kaXZJY29uKHtcbiAgICAgICAgICAgICAgICBodG1sOiAnPGRpdiBjbGFzcz1cIm1hcC1pbmZvLWxhYmVsXCI+PGg1PicgKyBydGUuYWlycG9ydHMuZC5pY2FvICsgJzwvaDU+PC9kaXY+J1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxheWVyU2VsRGVwID0gbGVhZmxldC5tYXJrZXIoW3J0ZS5haXJwb3J0cy5kLmxhdCwgcnRlLmFpcnBvcnRzLmQubG9uXSwge2ljb246ZHB0SWNvbn0pLmFkZFRvKG1hcCk7XG4gICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAvLyBDZW50ZXIgb24gaXQsIGJ1dCBvbmx5IGRvIGl0IG9uY2UsIGluIGNhc2UgdGhlIG1hcCBpcyBtb3ZlZFxuICAgICAgICAgICAgaWYoIXBhbm5lZFRvQ2VudGVyKSB7XG4gICAgICAgICAgICAgICAgLy8gZmluZCBjZW50ZXJcbiAgICAgICAgICAgICAgICBjb25zdCBjID0gZ2VvbGliLmdldENlbnRlcihbXG4gICAgICAgICAgICAgICAgICAgIHtsYXRpdHVkZTogcnRlLmFpcnBvcnRzLmEubGF0LCBsb25naXR1ZGU6IHJ0ZS5haXJwb3J0cy5hLmxvbn0sXG4gICAgICAgICAgICAgICAgICAgIHtsYXRpdHVkZTogcnRlLmFpcnBvcnRzLmQubGF0LCBsb25naXR1ZGU6IHJ0ZS5haXJwb3J0cy5kLmxvbn0sXG4gICAgICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgICAgICAvL21hcC5wYW5Ubyh7bGF0OiBjLmxhdGl0dWRlLCBsbmc6IGMubG9uZ2l0dWRlfSk7XG4gICAgICAgICAgICAgICAgbWFwLnBhblRvKHtsYXQ6IHJ0ZS5wb3NpdGlvbi5sYXQsIGxuZzogcnRlLnBvc2l0aW9uLmxvbn0pO1xuICAgICAgICAgICAgICAgIHBhbm5lZFRvQ2VudGVyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2hlbiB0aGUgUElSRVAgaW5mbyBpcyBkb25lIGxvYWRpbmcsIHNob3cgdGhlIGJvdHRvbSBiYXJcbiAgICAgICAgLy9cbiAgICAgICAgJC53aGVuKHBpcmVwX2luZm8pLmRvbmUocGlyZXAgPT4ge1xuICAgICAgICAgICAgcl9tYXBfdmlldy51cGRhdGUoe3BpcmVwOnBpcmVwLmRhdGF9KTtcbiAgICAgICAgICAgICQoJyNtYXAtaW5mby1ib3gnKS5zaG93KCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjb25zdCB1cGRhdGVNYXAgPSAoKSA9PiB7XG5cbiAgICAgICAgY29uc29sZS5sb2coJ3JlbG9hZGluZyBmbGlnaHRzIGZyb20gYWNhcnMuLi4nKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogQUpBWCBVUERBVEVcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHBpcmVwX3VyaSA9IG9wdHMucGlyZXBfdXJpLnJlcGxhY2UoJ3tpZH0nLCAnJyk7XG4gICAgICAgIGxldCBwaXJlcHMgPSAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiBwaXJlcF91cmksXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgICAgICAgZXJyb3I6IGNvbnNvbGUubG9nXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCBmbGlnaHRzID0gJC5hamF4KHtcbiAgICAgICAgICAgIHVybDogb3B0cy51cGRhdGVfdXJpLFxuICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJyxcbiAgICAgICAgICAgIGVycm9yOiBjb25zb2xlLmxvZ1xuICAgICAgICB9KTtcblxuICAgICAgICAkLndoZW4oZmxpZ2h0cykuZG9uZShmbGlnaHRHZW9Kc29uID0+IHtcblxuICAgICAgICAgICAgaWYgKGxheWVyRmxpZ2h0cyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxheWVyRmxpZ2h0cy5jbGVhckxheWVycygpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxheWVyRmxpZ2h0cyA9IGxlYWZsZXQuZ2VvSlNPTihmbGlnaHRHZW9Kc29uLCB7XG4gICAgICAgICAgICAgICAgb25FYWNoRmVhdHVyZTogKGZlYXR1cmUsIGxheWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyLm9uKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrOiAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbm5lZFRvQ2VudGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25GbGlnaHRDbGljayhmZWF0dXJlLCBsYXllcilcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvcHVwX2h0bWwgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUucHJvcGVydGllcyAmJiAoZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwICE9PSAnJyAmJiBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXAgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcHVwX2h0bWwgKz0gZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIuYmluZFBvcHVwKHBvcHVwX2h0bWwpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRvIHRoZSBsaXN0XG4gICAgICAgICAgICAgICAgICAgIG1hcmtlcnNfbGlzdFtmZWF0dXJlLnByb3BlcnRpZXMucGlyZXBfaWRdID0gW2ZlYXR1cmUsIGxheWVyXTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBvaW50VG9MYXllcjogZnVuY3Rpb24gKGZlYXR1cmUsIGxhdGxvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGVhZmxldC5tYXJrZXIobGF0bG9uLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uOiBhaXJjcmFmdEljb24sXG4gICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbkFuZ2xlOiBmZWF0dXJlLnByb3BlcnRpZXMuaGVhZGluZ1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsYXllckZsaWdodHMuYWRkVG8obWFwKTtcblxuICAgICAgICAgICAgLy8gUmVsb2FkIHRoZSBjbGlja2VkLWZsaWdodCBpbmZvcm1hdGlvblxuICAgICAgICAgICAgaWYgKGxheWVyU2VsRmxpZ2h0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb25GbGlnaHRDbGljayhsYXllclNlbEZsaWdodEZlYXR1cmUsIGxheWVyU2VsRmxpZ2h0TGF5ZXIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQud2hlbihwaXJlcHMpLmRvbmUocGlyZXBzID0+IHtcbiAgICAgICAgICAgIHJfdGFibGVfdmlldy51cGRhdGUoe1xuICAgICAgICAgICAgICAgIHBpcmVwczogcGlyZXBzLmRhdGEsXG4gICAgICAgICAgICAgICAgaGFzX2RhdGE6IChwaXJlcHMuZGF0YS5sZW5ndGggPiAwKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgdXBkYXRlTWFwKCk7XG4gICAgc2V0SW50ZXJ2YWwodXBkYXRlTWFwLCAxMDAwMClcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvbWFwcy9saXZlX21hcC5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/maps/live_map.js\n"); +eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__config__ = __webpack_require__(\"./resources/js/maps/config.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__request__ = __webpack_require__(\"./resources/js/request.js\");\n\n\n\n\n\n\n\n// const geolib = require('geolib');\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n/**\n * Render the live map\n * @param _opts\n * @private\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (_opts) {\n var opts = Object.assign({\n center: [29.98139, -95.33374],\n refresh_interval: 10, // seconds\n zoom: 5,\n update_uri: '/api/acars',\n pirep_uri: '/api/pireps/{id}',\n pirep_link_uri: '/pireps/{id}',\n positions: null,\n render_elem: 'map',\n aircraft_icon: '/assets/img/acars/aircraft.png',\n units: 'nmi'\n }, _opts);\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var aircraftIcon = leaflet.icon({\n iconUrl: opts.aircraft_icon,\n iconSize: [42, 42],\n iconAnchor: [21, 21]\n });\n\n /**\n * Hold the markers\n * @type {{}}\n */\n var markers_list = {};\n var pannedToCenter = false;\n var layerFlights = null;\n var layerSelFlight = null;\n var layerSelFlightFeature = null;\n var layerSelFlightLayer = null;\n\n var liveMapController = {\n pirep: {},\n pireps: [],\n has_data: false,\n controller: {\n /**\n * Focus on a specific marker\n * @param e\n * @param model\n */\n focusMarker: function focusMarker(e, model) {\n if (!(model.pirep.id in markers_list)) {\n console.log('marker not found in list');\n return;\n }\n\n var marker = markers_list[model.pirep.id];\n onFlightClick(marker[0], marker[1]);\n }\n }\n };\n\n rivets.bind($('#map-info-box'), liveMapController);\n rivets.bind($('#live_flights'), liveMapController);\n\n var drawRoute = function drawRoute(feature, layer, route) {\n console.log('drawRoute');\n if (layerSelFlight !== null) {\n map.removeLayer(layerSelFlight);\n }\n\n layerSelFlight = leaflet.geodesic([], {\n weight: 5,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n wrap: false\n }).addTo(map);\n\n layerSelFlight.geoJson(route.line);\n layerSelFlightFeature = feature;\n layerSelFlightLayer = layer;\n\n // Center on it, but only do it once, in case the map is moved\n if (!pannedToCenter) {\n map.panTo({\n lat: route.position.lat,\n lng: route.position.lon\n });\n\n pannedToCenter = true;\n }\n };\n\n /**\n * When a flight is clicked on, show the path, etc for that flight\n * @param feature\n * @param layer\n */\n var onFlightClick = function onFlightClick(feature, layer) {\n var pirep_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id);\n var geojson_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id) + '/acars/geojson';\n\n /*\n * Run these in parallel:\n * 1. Get information about the PIREP and populate the bottom box/container\n * 2. Draw out the flight route\n */\n Object(__WEBPACK_IMPORTED_MODULE_2__request__[\"a\" /* default */])(pirep_uri).then(function (response) {\n var pirep = response.data.data;\n console.log(pirep);\n\n liveMapController.pirep = pirep;\n });\n\n Object(__WEBPACK_IMPORTED_MODULE_2__request__[\"a\" /* default */])(geojson_uri).then(function (response) {\n var route = response.data.data;\n console.log(route);\n\n drawRoute(feature, layer, route);\n });\n };\n\n var updateMap = function updateMap() {\n var pirep_uri = opts.pirep_uri.replace('{id}', '');\n\n Object(__WEBPACK_IMPORTED_MODULE_2__request__[\"a\" /* default */])(pirep_uri).then(function (response) {\n var pireps = response.data.data;\n liveMapController.pireps = pireps;\n liveMapController.has_data = pireps.length > 0;\n });\n\n Object(__WEBPACK_IMPORTED_MODULE_2__request__[\"a\" /* default */])({ url: opts.update_uri }).then(function (response) {\n var flightGeoJson = response.data.data;\n\n if (layerFlights !== null) {\n layerFlights.clearLayers();\n }\n\n layerFlights = leaflet.geoJSON(flightGeoJson, {\n onEachFeature: function onEachFeature(feature, layer) {\n layer.on({\n // eslint-disable-next-line no-unused-vars\n click: function click(e) {\n pannedToCenter = false;\n liveMapController.controller.onFlightClick(feature, layer);\n }\n });\n\n var popup_html = '';\n if (feature.properties && feature.properties.popup !== '' && feature.properties.popup !== undefined) {\n popup_html += feature.properties.popup;\n layer.bindPopup(popup_html);\n }\n\n // add to the list\n markers_list[feature.properties.pirep_id] = [feature, layer];\n },\n pointToLayer: function pointToLayer(feature, latlon) {\n return leaflet.marker(latlon, {\n icon: aircraftIcon,\n rotationAngle: feature.properties.heading\n });\n }\n });\n\n layerFlights.addTo(map);\n\n // Reload the clicked-flight information\n if (layerSelFlight !== null) {\n liveMapController.controller.onFlightClick(layerSelFlightFeature, layerSelFlightLayer);\n }\n });\n };\n\n updateMap();\n setInterval(updateMap, opts.refresh_interval * 1000);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9saXZlX21hcC5qcz9lN2Y2Il0sIm5hbWVzIjpbImxlYWZsZXQiLCJyZXF1aXJlIiwicml2ZXRzIiwiX29wdHMiLCJvcHRzIiwiT2JqZWN0IiwiYXNzaWduIiwiY2VudGVyIiwicmVmcmVzaF9pbnRlcnZhbCIsInpvb20iLCJ1cGRhdGVfdXJpIiwicGlyZXBfdXJpIiwicGlyZXBfbGlua191cmkiLCJwb3NpdGlvbnMiLCJyZW5kZXJfZWxlbSIsImFpcmNyYWZ0X2ljb24iLCJ1bml0cyIsIm1hcCIsImRyYXdfYmFzZV9tYXAiLCJhaXJjcmFmdEljb24iLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsIm1hcmtlcnNfbGlzdCIsInBhbm5lZFRvQ2VudGVyIiwibGF5ZXJGbGlnaHRzIiwibGF5ZXJTZWxGbGlnaHQiLCJsYXllclNlbEZsaWdodEZlYXR1cmUiLCJsYXllclNlbEZsaWdodExheWVyIiwibGl2ZU1hcENvbnRyb2xsZXIiLCJwaXJlcCIsInBpcmVwcyIsImhhc19kYXRhIiwiY29udHJvbGxlciIsImZvY3VzTWFya2VyIiwiZSIsIm1vZGVsIiwiaWQiLCJjb25zb2xlIiwibG9nIiwibWFya2VyIiwib25GbGlnaHRDbGljayIsImJpbmQiLCIkIiwiZHJhd1JvdXRlIiwiZmVhdHVyZSIsImxheWVyIiwicm91dGUiLCJyZW1vdmVMYXllciIsImdlb2Rlc2ljIiwid2VpZ2h0Iiwib3BhY2l0eSIsImNvbG9yIiwiQUNUVUFMX1JPVVRFX0NPTE9SIiwid3JhcCIsImFkZFRvIiwiZ2VvSnNvbiIsImxpbmUiLCJwYW5UbyIsImxhdCIsInBvc2l0aW9uIiwibG5nIiwibG9uIiwicmVwbGFjZSIsInByb3BlcnRpZXMiLCJwaXJlcF9pZCIsImdlb2pzb25fdXJpIiwicmVxdWVzdCIsInRoZW4iLCJyZXNwb25zZSIsImRhdGEiLCJ1cGRhdGVNYXAiLCJsZW5ndGgiLCJ1cmwiLCJmbGlnaHRHZW9Kc29uIiwiY2xlYXJMYXllcnMiLCJnZW9KU09OIiwib25FYWNoRmVhdHVyZSIsIm9uIiwiY2xpY2siLCJwb3B1cF9odG1sIiwicG9wdXAiLCJ1bmRlZmluZWQiLCJiaW5kUG9wdXAiLCJwb2ludFRvTGF5ZXIiLCJsYXRsb24iLCJyb3RhdGlvbkFuZ2xlIiwiaGVhZGluZyIsInNldEludGVydmFsIl0sIm1hcHBpbmdzIjoiOzs7O0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQSxJQUFNQSxVQUFVQyxtQkFBT0EsQ0FBQyw0Q0FBUixDQUFoQjtBQUNBLElBQU1DLFNBQVNELG1CQUFPQSxDQUFDLHNDQUFSLENBQWY7O0FBRUE7Ozs7O0FBS2UsbUVBQUNFLEtBQUQsRUFBVztBQUN4QixNQUFNQyxPQUFPQyxPQUFPQyxNQUFQLENBQWM7QUFDekJDLFlBQVEsQ0FBQyxRQUFELEVBQVcsQ0FBQyxRQUFaLENBRGlCO0FBRXpCQyxzQkFBa0IsRUFGTyxFQUVIO0FBQ3RCQyxVQUFNLENBSG1CO0FBSXpCQyxnQkFBWSxZQUphO0FBS3pCQyxlQUFXLGtCQUxjO0FBTXpCQyxvQkFBZ0IsY0FOUztBQU96QkMsZUFBVyxJQVBjO0FBUXpCQyxpQkFBYSxLQVJZO0FBU3pCQyxtQkFBZSxnQ0FUVTtBQVV6QkMsV0FBTztBQVZrQixHQUFkLEVBV1ZiLEtBWFUsQ0FBYjs7QUFhQSxNQUFNYyxNQUFNQyxrRUFBYUEsQ0FBQ2QsSUFBZCxDQUFaO0FBQ0EsTUFBTWUsZUFBZW5CLFFBQVFvQixJQUFSLENBQWE7QUFDaENDLGFBQVNqQixLQUFLVyxhQURrQjtBQUVoQ08sY0FBVSxDQUFDLEVBQUQsRUFBSyxFQUFMLENBRnNCO0FBR2hDQyxnQkFBWSxDQUFDLEVBQUQsRUFBSyxFQUFMO0FBSG9CLEdBQWIsQ0FBckI7O0FBTUE7Ozs7QUFJQSxNQUFNQyxlQUFlLEVBQXJCO0FBQ0EsTUFBSUMsaUJBQWlCLEtBQXJCO0FBQ0EsTUFBSUMsZUFBZSxJQUFuQjtBQUNBLE1BQUlDLGlCQUFpQixJQUFyQjtBQUNBLE1BQUlDLHdCQUF3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YXNCLFFBQVFtQixVQUFSLENBQW1CQyxRQUFoQyxJQUE0QyxDQUFDcEIsT0FBRCxFQUFVQyxLQUFWLENBQTVDO0FBQ0QsU0FsQjJDO0FBbUI1Q3NDLG9CQW5CNEMsd0JBbUIvQnZDLE9BbkIrQixFQW1CdEJ3QyxNQW5Cc0IsRUFtQmQ7QUFDNUIsaUJBQU90RixRQUFReUMsTUFBUixDQUFlNkMsTUFBZixFQUF1QjtBQUM1QmxFLGtCQUFNRCxZQURzQjtBQUU1Qm9FLDJCQUFlekMsUUFBUW1CLFVBQVIsQ0FBbUJ1QjtBQUZOLFdBQXZCLENBQVA7QUFJRDtBQXhCMkMsT0FBL0IsQ0FBZjs7QUEyQkE5RCxtQkFBYThCLEtBQWIsQ0FBbUJ2QyxHQUFuQjs7QUFFQTtBQUNBLFVBQUlVLG1CQUFtQixJQUF2QixFQUE2QjtBQUMzQkcsMEJBQWtCSSxVQUFsQixDQUE2QlEsYUFBN0IsQ0FBMkNkLHFCQUEzQyxFQUFrRUMsbUJBQWxFO0FBQ0Q7QUFDRixLQXhDRDtBQXlDRCxHQWxERDs7QUFvREEyQztBQUNBaUIsY0FBWWpCLFNBQVosRUFBdUJwRSxLQUFLSSxnQkFBTCxHQUF3QixJQUEvQztBQUNELENBeEtEIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL21hcHMvbGl2ZV9tYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCBkcmF3X2Jhc2VfbWFwIGZyb20gJy4vYmFzZV9tYXAnO1xuXG5pbXBvcnQgeyBBQ1RVQUxfUk9VVEVfQ09MT1IgfSBmcm9tICcuL2NvbmZpZyc7XG5cbmltcG9ydCByZXF1ZXN0IGZyb20gJy4uL3JlcXVlc3QnO1xuXG4vLyBjb25zdCBnZW9saWIgPSByZXF1aXJlKCdnZW9saWInKTtcbmNvbnN0IGxlYWZsZXQgPSByZXF1aXJlKCdsZWFmbGV0Jyk7XG5jb25zdCByaXZldHMgPSByZXF1aXJlKCdyaXZldHMnKTtcblxuLyoqXG4gKiBSZW5kZXIgdGhlIGxpdmUgbWFwXG4gKiBAcGFyYW0gX29wdHNcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IChfb3B0cykgPT4ge1xuICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgY2VudGVyOiBbMjkuOTgxMzksIC05NS4zMzM3NF0sXG4gICAgcmVmcmVzaF9pbnRlcnZhbDogMTAsIC8vIHNlY29uZHNcbiAgICB6b29tOiA1LFxuICAgIHVwZGF0ZV91cmk6ICcvYXBpL2FjYXJzJyxcbiAgICBwaXJlcF91cmk6ICcvYXBpL3BpcmVwcy97aWR9JyxcbiAgICBwaXJlcF9saW5rX3VyaTogJy9waXJlcHMve2lkfScsXG4gICAgcG9zaXRpb25zOiBudWxsLFxuICAgIHJlbmRlcl9lbGVtOiAnbWFwJyxcbiAgICBhaXJjcmFmdF9pY29uOiAnL2Fzc2V0cy9pbWcvYWNhcnMvYWlyY3JhZnQucG5nJyxcbiAgICB1bml0czogJ25taScsXG4gIH0sIF9vcHRzKTtcblxuICBjb25zdCBtYXAgPSBkcmF3X2Jhc2VfbWFwKG9wdHMpO1xuICBjb25zdCBhaXJjcmFmdEljb24gPSBsZWFmbGV0Lmljb24oe1xuICAgIGljb25Vcmw6IG9wdHMuYWlyY3JhZnRfaWNvbixcbiAgICBpY29uU2l6ZTogWzQyLCA0Ml0sXG4gICAgaWNvbkFuY2hvcjogWzIxLCAyMV0sXG4gIH0pO1xuXG4gIC8qKlxuICAgKiBIb2xkIHRoZSBtYXJrZXJzXG4gICAqIEB0eXBlIHt7fX1cbiAgICovXG4gIGNvbnN0IG1hcmtlcnNfbGlzdCA9IHt9O1xuICBsZXQgcGFubmVkVG9DZW50ZXIgPSBmYWxzZTtcbiAgbGV0IGxheWVyRmxpZ2h0cyA9IG51bGw7XG4gIGxldCBsYXllclNlbEZsaWdodCA9IG51bGw7XG4gIGxldCBsYXllclNlbEZsaWdodEZlYXR1cmUgPSBudWxsO1xuICBsZXQgbGF5ZXJTZWxGbGlnaHRMYXllciA9IG51bGw7XG5cbiAgY29uc3QgbGl2ZU1hcENvbnRyb2xsZXIgPSB7XG4gICAgcGlyZXA6IHt9LFxuICAgIHBpcmVwczogW10sXG4gICAgaGFzX2RhdGE6IGZhbHNlLFxuICAgIGNvbnRyb2xsZXI6IHtcbiAgICAgIC8qKlxuICAgICAgICogRm9jdXMgb24gYSBzcGVjaWZpYyBtYXJrZXJcbiAgICAgICAqIEBwYXJhbSBlXG4gICAgICAgKiBAcGFyYW0gbW9kZWxcbiAgICAgICAqL1xuICAgICAgZm9jdXNNYXJrZXI6IChlLCBtb2RlbCkgPT4ge1xuICAgICAgICBpZiAoIShtb2RlbC5waXJlcC5pZCBpbiBtYXJrZXJzX2xpc3QpKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ21hcmtlciBub3QgZm91bmQgaW4gbGlzdCcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1hcmtlciA9IG1hcmtlcnNfbGlzdFttb2RlbC5waXJlcC5pZF07XG4gICAgICAgIG9uRmxpZ2h0Q2xpY2sobWFya2VyWzBdLCBtYXJrZXJbMV0pO1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xuXG4gIHJpdmV0cy5iaW5kKCQoJyNtYXAtaW5mby1ib3gnKSwgbGl2ZU1hcENvbnRyb2xsZXIpO1xuICByaXZldHMuYmluZCgkKCcjbGl2ZV9mbGlnaHRzJyksIGxpdmVNYXBDb250cm9sbGVyKTtcblxuICBjb25zdCBkcmF3Um91dGUgPSAoZmVhdHVyZSwgbGF5ZXIsIHJvdXRlKSA9PiB7XG4gICAgY29uc29sZS5sb2coJ2RyYXdSb3V0ZScpO1xuICAgIGlmIChsYXllclNlbEZsaWdodCAhPT0gbnVsbCkge1xuICAgICAgbWFwLnJlbW92ZUxheWVyKGxheWVyU2VsRmxpZ2h0KTtcbiAgICB9XG5cbiAgICBsYXllclNlbEZsaWdodCA9IGxlYWZsZXQuZ2VvZGVzaWMoW10sIHtcbiAgICAgIHdlaWdodDogNSxcbiAgICAgIG9wYWNpdHk6IDAuOSxcbiAgICAgIGNvbG9yOiBBQ1RVQUxfUk9VVEVfQ09MT1IsXG4gICAgICB3cmFwOiBmYWxzZSxcbiAgICB9KS5hZGRUbyhtYXApO1xuXG4gICAgbGF5ZXJTZWxGbGlnaHQuZ2VvSnNvbihyb3V0ZS5saW5lKTtcbiAgICBsYXllclNlbEZsaWdodEZlYXR1cmUgPSBmZWF0dXJlO1xuICAgIGxheWVyU2VsRmxpZ2h0TGF5ZXIgPSBsYXllcjtcblxuICAgIC8vIENlbnRlciBvbiBpdCwgYnV0IG9ubHkgZG8gaXQgb25jZSwgaW4gY2FzZSB0aGUgbWFwIGlzIG1vdmVkXG4gICAgaWYgKCFwYW5uZWRUb0NlbnRlcikge1xuICAgICAgbWFwLnBhblRvKHtcbiAgICAgICAgbGF0OiByb3V0ZS5wb3NpdGlvbi5sYXQsXG4gICAgICAgIGxuZzogcm91dGUucG9zaXRpb24ubG9uLFxuICAgICAgfSk7XG5cbiAgICAgIHBhbm5lZFRvQ2VudGVyID0gdHJ1ZTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIFdoZW4gYSBmbGlnaHQgaXMgY2xpY2tlZCBvbiwgc2hvdyB0aGUgcGF0aCwgZXRjIGZvciB0aGF0IGZsaWdodFxuICAgKiBAcGFyYW0gZmVhdHVyZVxuICAgKiBAcGFyYW0gbGF5ZXJcbiAgICovXG4gIGNvbnN0IG9uRmxpZ2h0Q2xpY2sgPSAoZmVhdHVyZSwgbGF5ZXIpID0+IHtcbiAgICBjb25zdCBwaXJlcF91cmkgPSBvcHRzLnBpcmVwX3VyaS5yZXBsYWNlKCd7aWR9JywgZmVhdHVyZS5wcm9wZXJ0aWVzLnBpcmVwX2lkKTtcbiAgICBjb25zdCBnZW9qc29uX3VyaSA9IGAke29wdHMucGlyZXBfdXJpLnJlcGxhY2UoJ3tpZH0nLCBmZWF0dXJlLnByb3BlcnRpZXMucGlyZXBfaWQpfS9hY2Fycy9nZW9qc29uYDtcblxuICAgIC8qXG4gICAgICogUnVuIHRoZXNlIGluIHBhcmFsbGVsOlxuICAgICAqIDEuIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgUElSRVAgYW5kIHBvcHVsYXRlIHRoZSBib3R0b20gYm94L2NvbnRhaW5lclxuICAgICAqIDIuIERyYXcgb3V0IHRoZSBmbGlnaHQgcm91dGVcbiAgICAgKi9cbiAgICByZXF1ZXN0KHBpcmVwX3VyaSkudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHBpcmVwID0gcmVzcG9uc2UuZGF0YS5kYXRhO1xuICAgICAgY29uc29sZS5sb2cocGlyZXApO1xuXG4gICAgICBsaXZlTWFwQ29udHJvbGxlci5waXJlcCA9IHBpcmVwO1xuICAgIH0pO1xuXG4gICAgcmVxdWVzdChnZW9qc29uX3VyaSkudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJvdXRlID0gcmVzcG9uc2UuZGF0YS5kYXRhO1xuICAgICAgY29uc29sZS5sb2cocm91dGUpO1xuXG4gICAgICBkcmF3Um91dGUoZmVhdHVyZSwgbGF5ZXIsIHJvdXRlKTtcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCB1cGRhdGVNYXAgPSAoKSA9PiB7XG4gICAgY29uc3QgcGlyZXBfdXJpID0gb3B0cy5waXJlcF91cmkucmVwbGFjZSgne2lkfScsICcnKTtcblxuICAgIHJlcXVlc3QocGlyZXBfdXJpKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcGlyZXBzID0gcmVzcG9uc2UuZGF0YS5kYXRhO1xuICAgICAgbGl2ZU1hcENvbnRyb2xsZXIucGlyZXBzID0gcGlyZXBzO1xuICAgICAgbGl2ZU1hcENvbnRyb2xsZXIuaGFzX2RhdGEgPSBwaXJlcHMubGVuZ3RoID4gMDtcbiAgICB9KTtcblxuICAgIHJlcXVlc3QoeyB1cmw6IG9wdHMudXBkYXRlX3VyaSB9KS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZmxpZ2h0R2VvSnNvbiA9IHJlc3BvbnNlLmRhdGEuZGF0YTtcblxuICAgICAgaWYgKGxheWVyRmxpZ2h0cyAhPT0gbnVsbCkge1xuICAgICAgICBsYXllckZsaWdodHMuY2xlYXJMYXllcnMoKTtcbiAgICAgIH1cblxuICAgICAgbGF5ZXJGbGlnaHRzID0gbGVhZmxldC5nZW9KU09OKGZsaWdodEdlb0pzb24sIHtcbiAgICAgICAgb25FYWNoRmVhdHVyZTogKGZlYXR1cmUsIGxheWVyKSA9PiB7XG4gICAgICAgICAgbGF5ZXIub24oe1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICAgICAgICBjbGljazogKGUpID0+IHtcbiAgICAgICAgICAgICAgcGFubmVkVG9DZW50ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgbGl2ZU1hcENvbnRyb2xsZXIuY29udHJvbGxlci5vbkZsaWdodENsaWNrKGZlYXR1cmUsIGxheWVyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBsZXQgcG9wdXBfaHRtbCA9ICcnO1xuICAgICAgICAgIGlmIChmZWF0dXJlLnByb3BlcnRpZXMgJiYgKGZlYXR1cmUucHJvcGVydGllcy5wb3B1cCAhPT0gJycgJiYgZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICBwb3B1cF9odG1sICs9IGZlYXR1cmUucHJvcGVydGllcy5wb3B1cDtcbiAgICAgICAgICAgIGxheWVyLmJpbmRQb3B1cChwb3B1cF9odG1sKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBhZGQgdG8gdGhlIGxpc3RcbiAgICAgICAgICBtYXJrZXJzX2xpc3RbZmVhdHVyZS5wcm9wZXJ0aWVzLnBpcmVwX2lkXSA9IFtmZWF0dXJlLCBsYXllcl07XG4gICAgICAgIH0sXG4gICAgICAgIHBvaW50VG9MYXllcihmZWF0dXJlLCBsYXRsb24pIHtcbiAgICAgICAgICByZXR1cm4gbGVhZmxldC5tYXJrZXIobGF0bG9uLCB7XG4gICAgICAgICAgICBpY29uOiBhaXJjcmFmdEljb24sXG4gICAgICAgICAgICByb3RhdGlvbkFuZ2xlOiBmZWF0dXJlLnByb3BlcnRpZXMuaGVhZGluZyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBsYXllckZsaWdodHMuYWRkVG8obWFwKTtcblxuICAgICAgLy8gUmVsb2FkIHRoZSBjbGlja2VkLWZsaWdodCBpbmZvcm1hdGlvblxuICAgICAgaWYgKGxheWVyU2VsRmxpZ2h0ICE9PSBudWxsKSB7XG4gICAgICAgIGxpdmVNYXBDb250cm9sbGVyLmNvbnRyb2xsZXIub25GbGlnaHRDbGljayhsYXllclNlbEZsaWdodEZlYXR1cmUsIGxheWVyU2VsRmxpZ2h0TGF5ZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHVwZGF0ZU1hcCgpO1xuICBzZXRJbnRlcnZhbCh1cGRhdGVNYXAsIG9wdHMucmVmcmVzaF9pbnRlcnZhbCAqIDEwMDApO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9tYXBzL2xpdmVfbWFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/live_map.js\n"); /***/ }), @@ -431,7 +432,15 @@ eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpa /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("/* unused harmony export onFeaturePointClick */\n/* unused harmony export pointToLayer */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(\"./resources/js/maps/helpers.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__config__ = __webpack_require__(\"./resources/js/maps/config.js\");\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n\n\n\n\n\n/**\n * Show some popup text when a feature is clicked on\n * @param feature\n * @param layer\n */\nvar onFeaturePointClick = function onFeaturePointClick(feature, layer) {\n var popup_html = '';\n if (feature.properties && feature.properties.popup) {\n popup_html += feature.properties.popup;\n }\n\n layer.bindPopup(popup_html);\n};\n\n/**\n * Show each point as a marker\n * @param feature\n * @param latlng\n * @returns {*}\n */\nvar pointToLayer = function pointToLayer(feature, latlng) {\n return leaflet.circleMarker(latlng, {\n radius: 5,\n fillColor: __WEBPACK_IMPORTED_MODULE_2__config__[\"b\" /* CIRCLE_COLOR */],\n color: '#000',\n weight: 1,\n opacity: 1,\n fillOpacity: 0.8\n });\n};\n\n/**\n *\n * @param opts\n * @private\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (opts) {\n\n opts = Object.assign({\n\n route_points: null,\n planned_route_line: null,\n actual_route_points: null,\n actual_route_line: null,\n render_elem: 'map',\n live_map: false,\n aircraft_icon: '/assets/img/acars/aircraft.png',\n metar_wms: {\n url: '',\n params: {}\n }\n }, opts);\n\n var aircraftIcon = leaflet.icon({\n iconUrl: opts.aircraft_icon,\n iconSize: [42, 42],\n iconAnchor: [21, 21]\n });\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var layerLiveFlight = void 0;\n\n if (opts.metar_wms.url !== '') {\n Object(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"a\" /* addWMSLayer */])(map, opts.metar_wms);\n }\n\n var geodesicLayer = leaflet.geodesic([], {\n weight: 4,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_2__config__[\"c\" /* PLAN_ROUTE_COLOR */],\n steps: 50,\n wrap: false\n }).addTo(map);\n\n geodesicLayer.geoJson(opts.planned_route_line);\n\n try {\n map.fitBounds(geodesicLayer.getBounds());\n } catch (e) {\n console.log(e);\n }\n\n // Draw the route points after\n if (opts.route_points !== null) {\n var route_points = leaflet.geoJSON(opts.route_points, {\n onEachFeature: onFeaturePointClick,\n pointToLayer: pointToLayer,\n style: {\n 'color': __WEBPACK_IMPORTED_MODULE_2__config__[\"c\" /* PLAN_ROUTE_COLOR */],\n 'weight': 3,\n 'opacity': 0.65\n }\n });\n\n route_points.addTo(map);\n }\n\n /**\n * draw the actual route\n */\n\n if (opts.actual_route_line !== null && opts.actual_route_line.features.length > 0) {\n var _geodesicLayer = leaflet.geodesic([], {\n weight: 3,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_2__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n steps: 50,\n wrap: false\n }).addTo(map);\n\n _geodesicLayer.geoJson(opts.actual_route_line);\n\n try {\n map.fitBounds(_geodesicLayer.getBounds());\n } catch (e) {\n console.log(e);\n }\n }\n\n if (opts.actual_route_points !== null && opts.actual_route_points.features.length > 0) {\n var _route_points = leaflet.geoJSON(opts.actual_route_points, {\n onEachFeature: onFeaturePointClick,\n pointToLayer: pointToLayer,\n style: {\n 'color': __WEBPACK_IMPORTED_MODULE_2__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n 'weight': 3,\n 'opacity': 0.65\n }\n });\n\n _route_points.addTo(map);\n }\n\n /**\n *\n */\n var liveFlight = function liveFlight() {\n var uri = opts.pirep_uri;\n var live_route = $.ajax({\n url: uri,\n dataType: 'json',\n error: console.log\n });\n\n $.when(live_route).done(function (routeJson) {\n layerLiveFlight = leaflet.geoJSON(routeJson, {\n pointToLayer: function pointToLayer(feature, latlon) {\n return leaflet.marker(latlon, {\n icon: aircraftIcon,\n rotationAngle: feature.properties.heading\n });\n }\n });\n\n layerLiveFlight.addTo(map);\n });\n };\n\n setInterval(liveFlight, 10000);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanM/YTc0NSJdLCJuYW1lcyI6WyJsZWFmbGV0IiwicmVxdWlyZSIsIm9uRmVhdHVyZVBvaW50Q2xpY2siLCJmZWF0dXJlIiwibGF5ZXIiLCJwb3B1cF9odG1sIiwicHJvcGVydGllcyIsInBvcHVwIiwiYmluZFBvcHVwIiwicG9pbnRUb0xheWVyIiwibGF0bG5nIiwiY2lyY2xlTWFya2VyIiwicmFkaXVzIiwiZmlsbENvbG9yIiwiQ0lSQ0xFX0NPTE9SIiwiY29sb3IiLCJ3ZWlnaHQiLCJvcGFjaXR5IiwiZmlsbE9wYWNpdHkiLCJvcHRzIiwiT2JqZWN0IiwiYXNzaWduIiwicm91dGVfcG9pbnRzIiwicGxhbm5lZF9yb3V0ZV9saW5lIiwiYWN0dWFsX3JvdXRlX3BvaW50cyIsImFjdHVhbF9yb3V0ZV9saW5lIiwicmVuZGVyX2VsZW0iLCJsaXZlX21hcCIsImFpcmNyYWZ0X2ljb24iLCJtZXRhcl93bXMiLCJ1cmwiLCJwYXJhbXMiLCJhaXJjcmFmdEljb24iLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsIm1hcCIsImRyYXdfYmFzZV9tYXAiLCJsYXllckxpdmVGbGlnaHQiLCJhZGRXTVNMYXllciIsImdlb2Rlc2ljTGF5ZXIiLCJnZW9kZXNpYyIsIlBMQU5fUk9VVEVfQ09MT1IiLCJzdGVwcyIsIndyYXAiLCJhZGRUbyIsImdlb0pzb24iLCJmaXRCb3VuZHMiLCJnZXRCb3VuZHMiLCJlIiwiY29uc29sZSIsImxvZyIsImdlb0pTT04iLCJvbkVhY2hGZWF0dXJlIiwic3R5bGUiLCJmZWF0dXJlcyIsImxlbmd0aCIsIkFDVFVBTF9ST1VURV9DT0xPUiIsImxpdmVGbGlnaHQiLCJ1cmkiLCJwaXJlcF91cmkiLCJsaXZlX3JvdXRlIiwiJCIsImFqYXgiLCJkYXRhVHlwZSIsImVycm9yIiwid2hlbiIsImRvbmUiLCJyb3V0ZUpzb24iLCJsYXRsb24iLCJtYXJr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QyxpQkFBSzhCLEdBRGlCO0FBRXRCSyxzQkFBVSxNQUZZO0FBR3RCQyxtQkFBT2YsUUFBUUM7QUFITyxTQUFQLENBQW5COztBQU1BVyxVQUFFSSxJQUFGLENBQU9MLFVBQVAsRUFBbUJNLElBQW5CLENBQXdCLFVBQUNDLFNBQUQsRUFBZTtBQUNuQzlCLDhCQUFrQnZDLFFBQVFxRCxPQUFSLENBQWdCZ0IsU0FBaEIsRUFBMkI7QUFDekM1RCw4QkFBYyxzQkFBVU4sT0FBVixFQUFtQm1FLE1BQW5CLEVBQTJCO0FBQ3JDLDJCQUFPdEUsUUFBUXVFLE1BQVIsQ0FBZUQsTUFBZixFQUF1QjtBQUMxQnJDLDhCQUFNRCxZQURvQjtBQUUxQndDLHVDQUFlckUsUUFBUUcsVUFBUixDQUFtQm1FO0FBRlIscUJBQXZCLENBQVA7QUFJSDtBQU53QyxhQUEzQixDQUFsQjs7QUFTQWxDLDRCQUFnQk8sS0FBaEIsQ0FBc0JULEdBQXRCO0FBQ0gsU0FYRDtBQVlILEtBcEJEOztBQXNCQXFDLGdCQUFZZixVQUFaLEVBQXdCLEtBQXhCO0FBQ0gsQ0EzSEQiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBsZWFmbGV0ID0gcmVxdWlyZSgnbGVhZmxldCcpO1xuXG5pbXBvcnQgZHJhd19iYXNlX21hcCBmcm9tICcuL2Jhc2VfbWFwJ1xuaW1wb3J0IHthZGRXTVNMYXllcn0gZnJvbSAnLi9oZWxwZXJzJztcblxuaW1wb3J0IHtBQ1RVQUxfUk9VVEVfQ09MT1IsIENJUkNMRV9DT0xPUiwgUExBTl9ST1VURV9DT0xPUn0gZnJvbSAnLi9jb25maWcnXG5cbi8qKlxuICogU2hvdyBzb21lIHBvcHVwIHRleHQgd2hlbiBhIGZlYXR1cmUgaXMgY2xpY2tlZCBvblxuICogQHBhcmFtIGZlYXR1cmVcbiAqIEBwYXJhbSBsYXllclxuICovXG5leHBvcnQgY29uc3Qgb25GZWF0dXJlUG9pbnRDbGljayA9IChmZWF0dXJlLCBsYXllcikgPT4ge1xuICAgIGxldCBwb3B1cF9odG1sID0gJyc7XG4gICAgaWYgKGZlYXR1cmUucHJvcGVydGllcyAmJiBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXApIHtcbiAgICAgICAgcG9wdXBfaHRtbCArPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXBcbiAgICB9XG5cbiAgICBsYXllci5iaW5kUG9wdXAocG9wdXBfaHRtbClcbn07XG5cbi8qKlxuICogU2hvdyBlYWNoIHBvaW50IGFzIGEgbWFya2VyXG4gKiBAcGFyYW0gZmVhdHVyZVxuICogQHBhcmFtIGxhdGxuZ1xuICogQHJldHVybnMgeyp9XG4gKi9cbmV4cG9ydCBjb25zdCBwb2ludFRvTGF5ZXIgPSAoZmVhdHVyZSwgbGF0bG5nKSA9PiB7XG4gICAgcmV0dXJuIGxlYWZsZXQuY2lyY2xlTWFya2VyKGxhdGxuZywge1xuICAgICAgICByYWRpdXM6IDUsXG4gICAgICAgIGZpbGxDb2xvcjogQ0lSQ0xFX0NPTE9SLFxuICAgICAgICBjb2xvcjogJyMwMDAnLFxuICAgICAgICB3ZWlnaHQ6IDEsXG4gICAgICAgIG9wYWNpdHk6IDEsXG4gICAgICAgIGZpbGxPcGFjaXR5OiAwLjhcbiAgICB9KVxufVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gb3B0c1xuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGRlZmF1bHQgKG9wdHMpID0+IHtcblxuICAgIG9wdHMgPSBPYmplY3QuYXNzaWduKHtcblxuICAgICAgICByb3V0ZV9wb2ludHM6IG51bGwsXG4gICAgICAgIHBsYW5uZWRfcm91dGVfbGluZTogbnVsbCxcbiAgICAgICAgYWN0dWFsX3JvdXRlX3BvaW50czogbnVsbCxcbiAgICAgICAgYWN0dWFsX3JvdXRlX2xpbmU6IG51bGwsXG4gICAgICAgIHJlbmRlcl9lbGVtOiAnbWFwJyxcbiAgICAgICAgbGl2ZV9tYXA6IGZhbHNlLFxuICAgICAgICBhaXJjcmFmdF9pY29uOiAnL2Fzc2V0cy9pbWcvYWNhcnMvYWlyY3JhZnQucG5nJyxcbiAgICAgICAgbWV0YXJfd21zOiB7XG4gICAgICAgICAgICB1cmw6ICcnLFxuICAgICAgICAgICAgcGFyYW1zOiB7fVxuICAgICAgICB9LFxuICAgIH0sIG9wdHMpO1xuXG4gICAgY29uc3QgYWlyY3JhZnRJY29uID0gbGVhZmxldC5pY29uKHtcbiAgICAgICAgaWNvblVybDogb3B0cy5haXJjcmFmdF9pY29uLFxuICAgICAgICBpY29uU2l6ZTogWzQyLCA0Ml0sXG4gICAgICAgIGljb25BbmNob3I6IFsyMSwgMjFdLFxuICAgIH0pO1xuXG4gICAgbGV0IG1hcCA9IGRyYXdfYmFzZV9tYXAob3B0cyk7XG4gICAgbGV0IGxheWVyTGl2ZUZsaWdodDtcblxuICAgIGlmIChvcHRzLm1ldGFyX3dtcy51cmwgIT09ICcnKSB7XG4gICAgICAgIGFkZFdNU0xheWVyKG1hcCwgb3B0cy5tZXRhcl93bXMpO1xuICAgIH1cblxuICAgIGxldCBnZW9kZXNpY0xheWVyID0gbGVhZmxldC5nZW9kZXNpYyhbXSwge1xuICAgICAgICB3ZWlnaHQ6IDQsXG4gICAgICAgIG9wYWNpdHk6IDAuOSxcbiAgICAgICAgY29sb3I6IFBMQU5fUk9VVEVfQ09MT1IsXG4gICAgICAgIHN0ZXBzOiA1MCxcbiAgICAgICAgd3JhcDogZmFsc2UsXG4gICAgfSkuYWRkVG8obWFwKTtcblxuICAgIGdlb2Rlc2ljTGF5ZXIuZ2VvSnNvbihvcHRzLnBsYW5uZWRfcm91dGVfbGluZSk7XG5cbiAgICB0cnkge1xuICAgICAgICBtYXAuZml0Qm91bmRzKGdlb2Rlc2ljTGF5ZXIuZ2V0Qm91bmRzKCkpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhlKVxuICAgIH1cblxuICAgIC8vIERyYXcgdGhlIHJvdXRlIHBvaW50cyBhZnRlclxuICAgIGlmIChvcHRzLnJvdXRlX3BvaW50cyAhPT0gbnVsbCkge1xuICAgICAgICBsZXQgcm91dGVfcG9pbnRzID0gbGVhZmxldC5nZW9KU09OKG9wdHMucm91dGVfcG9pbnRzLCB7XG4gICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBvbkZlYXR1cmVQb2ludENsaWNrLFxuICAgICAgICAgICAgcG9pbnRUb0xheWVyOiBwb2ludFRvTGF5ZXIsXG4gICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICdjb2xvcic6IFBMQU5fUk9VVEVfQ09MT1IsXG4gICAgICAgICAgICAgICAgJ3dlaWdodCc6IDMsXG4gICAgICAgICAgICAgICAgJ29wYWNpdHknOiAwLjY1LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcm91dGVfcG9pbnRzLmFkZFRvKG1hcCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZHJhdyB0aGUgYWN0dWFsIHJvdXRlXG4gICAgICovXG5cbiAgICBpZiAob3B0cy5hY3R1YWxfcm91dGVfbGluZSAhPT0gbnVsbCAmJiBvcHRzLmFjdHVhbF9yb3V0ZV9saW5lLmZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGdlb2Rlc2ljTGF5ZXIgPSBsZWFmbGV0Lmdlb2Rlc2ljKFtdLCB7XG4gICAgICAgICAgICB3ZWlnaHQ6IDMsXG4gICAgICAgICAgICBvcGFjaXR5OiAwLjksXG4gICAgICAgICAgICBjb2xvcjogQUNUVUFMX1JPVVRFX0NPTE9SLFxuICAgICAgICAgICAgc3RlcHM6IDUwLFxuICAgICAgICAgICAgd3JhcDogZmFsc2UsXG4gICAgICAgIH0pLmFkZFRvKG1hcCk7XG5cbiAgICAgICAgZ2VvZGVzaWNMYXllci5nZW9Kc29uKG9wdHMuYWN0dWFsX3JvdXRlX2xpbmUpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBtYXAuZml0Qm91bmRzKGdlb2Rlc2ljTGF5ZXIuZ2V0Qm91bmRzKCkpXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0cy5hY3R1YWxfcm91dGVfcG9pbnRzICE9PSBudWxsICYmIG9wdHMuYWN0dWFsX3JvdXRlX3BvaW50cy5mZWF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCByb3V0ZV9wb2ludHMgPSBsZWFmbGV0Lmdlb0pTT04ob3B0cy5hY3R1YWxfcm91dGVfcG9pbnRzLCB7XG4gICAgICAgICAgICBvbkVhY2hGZWF0dXJlOiBvbkZlYXR1cmVQb2ludENsaWNrLFxuICAgICAgICAgICAgcG9pbnRUb0xheWVyOiBwb2ludFRvTGF5ZXIsXG4gICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICdjb2xvcic6IEFDVFVBTF9ST1VURV9DT0xPUixcbiAgICAgICAgICAgICAgICAnd2VpZ2h0JzogMyxcbiAgICAgICAgICAgICAgICAnb3BhY2l0eSc6IDAuNjUsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICByb3V0ZV9wb2ludHMuYWRkVG8obWFwKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqXG4gICAgICovXG4gICAgY29uc3QgbGl2ZUZsaWdodCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdXJpID0gb3B0cy5waXJlcF91cmk7XG4gICAgICAgIGNvbnN0IGxpdmVfcm91dGUgPSAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiB1cmksXG4gICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgICAgICAgZXJyb3I6IGNvbnNvbGUubG9nXG4gICAgICAgIH0pO1xuXG4gICAgICAgICQud2hlbihsaXZlX3JvdXRlKS5kb25lKChyb3V0ZUpzb24pID0+IHtcbiAgICAgICAgICAgIGxheWVyTGl2ZUZsaWdodCA9IGxlYWZsZXQuZ2VvSlNPTihyb3V0ZUpzb24sIHtcbiAgICAgICAgICAgICAgICBwb2ludFRvTGF5ZXI6IGZ1bmN0aW9uIChmZWF0dXJlLCBsYXRsb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlYWZsZXQubWFya2VyKGxhdGxvbiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogYWlyY3JhZnRJY29uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb25BbmdsZTogZmVhdHVyZS5wcm9wZXJ0aWVzLmhlYWRpbmdcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGF5ZXJMaXZlRmxpZ2h0LmFkZFRvKG1hcClcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHNldEludGVydmFsKGxpdmVGbGlnaHQsIDEwMDAwKTtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/maps/route_map.js\n"); +eval("/* unused harmony export onFeaturePointClick */\n/* unused harmony export pointToLayer */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__base_map__ = __webpack_require__(\"./resources/js/maps/base_map.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__helpers__ = __webpack_require__(\"./resources/js/maps/helpers.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__request__ = __webpack_require__(\"./resources/js/request.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__config__ = __webpack_require__(\"./resources/js/maps/config.js\");\n\n\n\n\n\n\n\nvar leaflet = __webpack_require__(\"./node_modules/leaflet/dist/leaflet-src.js\");\n\n/**\n * Show some popup text when a feature is clicked on\n * @param feature\n * @param layer\n */\nvar onFeaturePointClick = function onFeaturePointClick(feature, layer) {\n var popup_html = '';\n if (feature.properties && feature.properties.popup) {\n popup_html += feature.properties.popup;\n }\n\n layer.bindPopup(popup_html);\n};\n\n/**\n * Show each point as a marker\n * @param feature\n * @param latlng\n * @returns {*}\n */\nvar pointToLayer = function pointToLayer(feature, latlng) {\n return leaflet.circleMarker(latlng, {\n radius: 5,\n fillColor: __WEBPACK_IMPORTED_MODULE_3__config__[\"b\" /* CIRCLE_COLOR */],\n color: '#000',\n weight: 1,\n opacity: 1,\n fillOpacity: 0.8\n });\n};\n\n/**\n *\n * @param _opts\n * @private\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = (function (_opts) {\n var opts = Object.assign({\n route_points: null,\n planned_route_line: null,\n actual_route_points: null,\n actual_route_line: null,\n render_elem: 'map',\n live_map: false,\n aircraft_icon: '/assets/img/acars/aircraft.png',\n refresh_interval: 10,\n metar_wms: {\n url: '',\n params: {}\n }\n }, _opts);\n\n var aircraftIcon = leaflet.icon({\n iconUrl: opts.aircraft_icon,\n iconSize: [42, 42],\n iconAnchor: [21, 21]\n });\n\n var map = Object(__WEBPACK_IMPORTED_MODULE_0__base_map__[\"a\" /* default */])(opts);\n var layerLiveFlight = void 0;\n\n if (opts.metar_wms.url !== '') {\n Object(__WEBPACK_IMPORTED_MODULE_1__helpers__[\"a\" /* addWMSLayer */])(map, opts.metar_wms);\n }\n\n var plannedRouteLayer = leaflet.geodesic([], {\n weight: 4,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_3__config__[\"c\" /* PLAN_ROUTE_COLOR */],\n steps: 50,\n wrap: false\n }).addTo(map);\n\n plannedRouteLayer.geoJson(opts.planned_route_line);\n\n try {\n map.fitBounds(plannedRouteLayer.getBounds());\n } catch (e) {\n console.log(e);\n }\n\n // Draw the route points after\n if (opts.route_points !== null) {\n var route_points = leaflet.geoJSON(opts.route_points, {\n onEachFeature: onFeaturePointClick,\n pointToLayer: pointToLayer,\n style: {\n color: __WEBPACK_IMPORTED_MODULE_3__config__[\"c\" /* PLAN_ROUTE_COLOR */],\n weight: 3,\n opacity: 0.65\n }\n });\n\n route_points.addTo(map);\n }\n\n /**\n * draw the actual route\n */\n\n if (opts.actual_route_line !== null && opts.actual_route_line.features.length > 0) {\n var actualRouteLayer = leaflet.geodesic([], {\n weight: 3,\n opacity: 0.9,\n color: __WEBPACK_IMPORTED_MODULE_3__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n steps: 50,\n wrap: false\n }).addTo(map);\n\n actualRouteLayer.geoJson(opts.actual_route_line);\n\n try {\n map.fitBounds(actualRouteLayer.getBounds());\n } catch (e) {\n console.log(e);\n }\n }\n\n if (opts.actual_route_points !== null && opts.actual_route_points.features.length > 0) {\n var _route_points = leaflet.geoJSON(opts.actual_route_points, {\n onEachFeature: onFeaturePointClick,\n pointToLayer: pointToLayer,\n style: {\n color: __WEBPACK_IMPORTED_MODULE_3__config__[\"a\" /* ACTUAL_ROUTE_COLOR */],\n weight: 3,\n opacity: 0.65\n }\n });\n\n _route_points.addTo(map);\n }\n\n /**\n *\n */\n var liveFlight = function liveFlight() {\n Object(__WEBPACK_IMPORTED_MODULE_2__request__[\"a\" /* default */])({ url: opts.pirep_uri }).then(function (response) {\n var routeJson = response.data.data;\n layerLiveFlight = leaflet.geoJSON(routeJson, {\n pointToLayer: function pointToLayer(feature, latlon) {\n return leaflet.marker(latlon, {\n icon: aircraftIcon,\n rotationAngle: feature.properties.heading\n });\n }\n });\n\n layerLiveFlight.addTo(map);\n });\n };\n\n setInterval(liveFlight, opts.refresh_interval * 1000);\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvbWFwcy9yb3V0ZV9tYXAuanM/YTc0NSJdLCJuYW1lcyI6WyJsZWFmbGV0IiwicmVxdWlyZSIsIm9uRmVhdHVyZVBvaW50Q2xpY2siLCJmZWF0dXJlIiwibGF5ZXIiLCJwb3B1cF9odG1sIiwicHJvcGVydGllcyIsInBvcHVwIiwiYmluZFBvcHVwIiwicG9pbnRUb0xheWVyIiwibGF0bG5nIiwiY2lyY2xlTWFya2VyIiwicmFkaXVzIiwiZmlsbENvbG9yIiwiQ0lSQ0xFX0NPTE9SIiwiY29sb3IiLCJ3ZWlnaHQiLCJvcGFjaXR5IiwiZmlsbE9wYWNpdHkiLCJfb3B0cyIsIm9wdHMiLCJPYmplY3QiLCJhc3NpZ24iLCJyb3V0ZV9wb2ludHMiLCJwbGFubmVkX3JvdXRlX2xpbmUiLCJhY3R1YWxfcm91dGVfcG9pbnRzIiwiYWN0dWFsX3JvdXRlX2xpbmUiLCJyZW5kZXJfZWxlbSIsImxpdmVfbWFwIiwiYWlyY3JhZnRfaWNvbiIsInJlZnJlc2hfaW50ZXJ2YWwiLCJtZXRhcl93bXMiLCJ1cmwiLCJwYXJhbXMiLCJhaXJjcmFmdEljb24iLCJpY29uIiwiaWNvblVybCIsImljb25TaXplIiwiaWNvbkFuY2hvciIsIm1hcCIsImRyYXdfYmFzZV9tYXAiLCJsYXllckxpdmVGbGlnaHQiLCJhZGRXTVNMYXllciIsInBsYW5uZWRSb3V0ZUxheWVyIiwiZ2VvZGVzaWMiLCJQTEFOX1JPVVRFX0NPTE9SIiwic3RlcHMiLCJ3cmFwIiwiYWRkVG8iLCJnZW9Kc29uIiwiZml0Qm91bmRzIiwiZ2V0Qm91bmRzIiwiZSIsImNvbnNvbGUiLCJsb2ciLCJnZW9KU09OIiwib25FYWNoRmVhdHVyZSIsInN0eWxlIiwiZmVhdHVyZXMiLCJsZW5ndGgiLCJhY3R1YWxSb3V0ZUxheWVyIiwiQUNUVUFMX1JPVVRFX0NPTE9SIiwibGl2ZUZsaWdodCIsInJlcXVlc3QiLCJwaXJlcF91cmkiLCJ0aGVuIiwicmVzcG9uc2UiLCJyb3V0ZUpzb24i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LElBQWpDLENBQXNDLFVBQUNDLFFBQUQsRUFBYztBQUNsRCxVQUFNQyxZQUFZRCxTQUFTRSxJQUFULENBQWNBLElBQWhDO0FBQ0EzQix3QkFBa0J6QyxRQUFRdUQsT0FBUixDQUFnQlksU0FBaEIsRUFBMkI7QUFDM0MxRCxvQkFEMkMsd0JBQzlCTixPQUQ4QixFQUNyQmtFLE1BRHFCLEVBQ2I7QUFDNUIsaUJBQU9yRSxRQUFRc0UsTUFBUixDQUFlRCxNQUFmLEVBQXVCO0FBQzVCbEMsa0JBQU1ELFlBRHNCO0FBRTVCcUMsMkJBQWVwRSxRQUFRRyxVQUFSLENBQW1Ca0U7QUFGTixXQUF2QixDQUFQO0FBSUQ7QUFOMEMsT0FBM0IsQ0FBbEI7O0FBU0EvQixzQkFBZ0JPLEtBQWhCLENBQXNCVCxHQUF0QjtBQUNELEtBWkQ7QUFhRCxHQWREOztBQWdCQWtDLGNBQVlYLFVBQVosRUFBd0IxQyxLQUFLVSxnQkFBTCxHQUF3QixJQUFoRDtBQUNELENBcEhEIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL21hcHMvcm91dGVfbWFwLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgZHJhd19iYXNlX21hcCBmcm9tICcuL2Jhc2VfbWFwJztcbmltcG9ydCB7IGFkZFdNU0xheWVyIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJy4uL3JlcXVlc3QnO1xuXG5pbXBvcnQgeyBBQ1RVQUxfUk9VVEVfQ09MT1IsIENJUkNMRV9DT0xPUiwgUExBTl9ST1VURV9DT0xPUiB9IGZyb20gJy4vY29uZmlnJztcblxuY29uc3QgbGVhZmxldCA9IHJlcXVpcmUoJ2xlYWZsZXQnKTtcblxuLyoqXG4gKiBTaG93IHNvbWUgcG9wdXAgdGV4dCB3aGVuIGEgZmVhdHVyZSBpcyBjbGlja2VkIG9uXG4gKiBAcGFyYW0gZmVhdHVyZVxuICogQHBhcmFtIGxheWVyXG4gKi9cbmV4cG9ydCBjb25zdCBvbkZlYXR1cmVQb2ludENsaWNrID0gKGZlYXR1cmUsIGxheWVyKSA9PiB7XG4gIGxldCBwb3B1cF9odG1sID0gJyc7XG4gIGlmIChmZWF0dXJlLnByb3BlcnRpZXMgJiYgZmVhdHVyZS5wcm9wZXJ0aWVzLnBvcHVwKSB7XG4gICAgcG9wdXBfaHRtbCArPSBmZWF0dXJlLnByb3BlcnRpZXMucG9wdXA7XG4gIH1cblxuICBsYXllci5iaW5kUG9wdXAocG9wdXBfaHRtbCk7XG59O1xuXG4vKipcbiAqIFNob3cgZWFjaCBwb2ludCBhcyBhIG1hcmtlclxuICogQHBhcmFtIGZlYXR1cmVcbiAqIEBwYXJhbSBsYXRsbmdcbiAqIEByZXR1cm5zIHsqfVxuICovXG5leHBvcnQgY29uc3QgcG9pbnRUb0xheWVyID0gKGZlYXR1cmUsIGxhdGxuZykgPT4gbGVhZmxldC5jaXJjbGVNYXJrZXIobGF0bG5nLCB7XG4gIHJhZGl1czogNSxcbiAgZmlsbENvbG9yOiBDSVJDTEVfQ09MT1IsXG4gIGNvbG9yOiAnIzAwMCcsXG4gIHdlaWdodDogMSxcbiAgb3BhY2l0eTogMSxcbiAgZmlsbE9wYWNpdHk6IDAuOCxcbn0pO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gX29wdHNcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IChfb3B0cykgPT4ge1xuICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbih7XG4gICAgcm91dGVfcG9pbnRzOiBudWxsLFxuICAgIHBsYW5uZWRfcm91dGVfbGluZTogbnVsbCxcbiAgICBhY3R1YWxfcm91dGVfcG9pbnRzOiBudWxsLFxuICAgIGFjdHVhbF9yb3V0ZV9saW5lOiBudWxsLFxuICAgIHJlbmRlcl9lbGVtOiAnbWFwJyxcbiAgICBsaXZlX21hcDogZmFsc2UsXG4gICAgYWlyY3JhZnRfaWNvbjogJy9hc3NldHMvaW1nL2FjYXJzL2FpcmNyYWZ0LnBuZycsXG4gICAgcmVmcmVzaF9pbnRlcnZhbDogMTAsXG4gICAgbWV0YXJfd21zOiB7XG4gICAgICB1cmw6ICcnLFxuICAgICAgcGFyYW1zOiB7fSxcbiAgICB9LFxuICB9LCBfb3B0cyk7XG5cbiAgY29uc3QgYWlyY3JhZnRJY29uID0gbGVhZmxldC5pY29uKHtcbiAgICBpY29uVXJsOiBvcHRzLmFpcmNyYWZ0X2ljb24sXG4gICAgaWNvblNpemU6IFs0MiwgNDJdLFxuICAgIGljb25BbmNob3I6IFsyMSwgMjFdLFxuICB9KTtcblxuICBjb25zdCBtYXAgPSBkcmF3X2Jhc2VfbWFwKG9wdHMpO1xuICBsZXQgbGF5ZXJMaXZlRmxpZ2h0O1xuXG4gIGlmIChvcHRzLm1ldGFyX3dtcy51cmwgIT09ICcnKSB7XG4gICAgYWRkV01TTGF5ZXIobWFwLCBvcHRzLm1ldGFyX3dtcyk7XG4gIH1cblxuICBjb25zdCBwbGFubmVkUm91dGVMYXllciA9IGxlYWZsZXQuZ2VvZGVzaWMoW10sIHtcbiAgICB3ZWlnaHQ6IDQsXG4gICAgb3BhY2l0eTogMC45LFxuICAgIGNvbG9yOiBQTEFOX1JPVVRFX0NPTE9SLFxuICAgIHN0ZXBzOiA1MCxcbiAgICB3cmFwOiBmYWxzZSxcbiAgfSkuYWRkVG8obWFwKTtcblxuICBwbGFubmVkUm91dGVMYXllci5nZW9Kc29uKG9wdHMucGxhbm5lZF9yb3V0ZV9saW5lKTtcblxuICB0cnkge1xuICAgIG1hcC5maXRCb3VuZHMocGxhbm5lZFJvdXRlTGF5ZXIuZ2V0Qm91bmRzKCkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5sb2coZSk7XG4gIH1cblxuICAvLyBEcmF3IHRoZSByb3V0ZSBwb2ludHMgYWZ0ZXJcbiAgaWYgKG9wdHMucm91dGVfcG9pbnRzICE9PSBudWxsKSB7XG4gICAgY29uc3Qgcm91dGVfcG9pbnRzID0gbGVhZmxldC5nZW9KU09OKG9wdHMucm91dGVfcG9pbnRzLCB7XG4gICAgICBvbkVhY2hGZWF0dXJlOiBvbkZlYXR1cmVQb2ludENsaWNrLFxuICAgICAgcG9pbnRUb0xheWVyLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY29sb3I6IFBMQU5fUk9VVEVfQ09MT1IsXG4gICAgICAgIHdlaWdodDogMyxcbiAgICAgICAgb3BhY2l0eTogMC42NSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByb3V0ZV9wb2ludHMuYWRkVG8obWFwKTtcbiAgfVxuXG4gIC8qKlxuICAgICAqIGRyYXcgdGhlIGFjdHVhbCByb3V0ZVxuICAgICAqL1xuXG4gIGlmIChvcHRzLmFjdHVhbF9yb3V0ZV9saW5lICE9PSBudWxsICYmIG9wdHMuYWN0dWFsX3JvdXRlX2xpbmUuZmVhdHVyZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGFjdHVhbFJvdXRlTGF5ZXIgPSBsZWFmbGV0Lmdlb2Rlc2ljKFtdLCB7XG4gICAgICB3ZWlnaHQ6IDMsXG4gICAgICBvcGFjaXR5OiAwLjksXG4gICAgICBjb2xvcjogQUNUVUFMX1JPVVRFX0NPTE9SLFxuICAgICAgc3RlcHM6IDUwLFxuICAgICAgd3JhcDogZmFsc2UsXG4gICAgfSkuYWRkVG8obWFwKTtcblxuICAgIGFjdHVhbFJvdXRlTGF5ZXIuZ2VvSnNvbihvcHRzLmFjdHVhbF9yb3V0ZV9saW5lKTtcblxuICAgIHRyeSB7XG4gICAgICBtYXAuZml0Qm91bmRzKGFjdHVhbFJvdXRlTGF5ZXIuZ2V0Qm91bmRzKCkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRzLmFjdHVhbF9yb3V0ZV9wb2ludHMgIT09IG51bGwgJiYgb3B0cy5hY3R1YWxfcm91dGVfcG9pbnRzLmZlYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCByb3V0ZV9wb2ludHMgPSBsZWFmbGV0Lmdlb0pTT04ob3B0cy5hY3R1YWxfcm91dGVfcG9pbnRzLCB7XG4gICAgICBvbkVhY2hGZWF0dXJlOiBvbkZlYXR1cmVQb2ludENsaWNrLFxuICAgICAgcG9pbnRUb0xheWVyLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgY29sb3I6IEFDVFVBTF9ST1VURV9DT0xPUixcbiAgICAgICAgd2VpZ2h0OiAzLFxuICAgICAgICBvcGFjaXR5OiAwLjY1LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJvdXRlX3BvaW50cy5hZGRUbyhtYXApO1xuICB9XG5cbiAgLyoqXG4gICAgICpcbiAgICAgKi9cbiAgY29uc3QgbGl2ZUZsaWdodCA9ICgpID0+IHtcbiAgICByZXF1ZXN0KHsgdXJsOiBvcHRzLnBpcmVwX3VyaSB9KS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3Qgcm91dGVKc29uID0gcmVzcG9uc2UuZGF0YS5kYXRhO1xuICAgICAgbGF5ZXJMaXZlRmxpZ2h0ID0gbGVhZmxldC5nZW9KU09OKHJvdXRlSnNvbiwge1xuICAgICAgICBwb2ludFRvTGF5ZXIoZmVhdHVyZSwgbGF0bG9uKSB7XG4gICAgICAgICAgcmV0dXJuIGxlYWZsZXQubWFya2VyKGxhdGxvbiwge1xuICAgICAgICAgICAgaWNvbjogYWlyY3JhZnRJY29uLFxuICAgICAgICAgICAgcm90YXRpb25BbmdsZTogZmVhdHVyZS5wcm9wZXJ0aWVzLmhlYWRpbmcsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgbGF5ZXJMaXZlRmxpZ2h0LmFkZFRvKG1hcCk7XG4gICAgfSk7XG4gIH07XG5cbiAgc2V0SW50ZXJ2YWwobGl2ZUZsaWdodCwgb3B0cy5yZWZyZXNoX2ludGVydmFsICogMTAwMCk7XG59O1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL21hcHMvcm91dGVfbWFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/maps/route_map.js\n"); + +/***/ }), + +/***/ "./resources/js/request.js": +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__ = __webpack_require__(\"./node_modules/babel-runtime/regenerator/index.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__config__ = __webpack_require__(\"./resources/js/config.js\");\n\n\nvar _this = this;\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\n\n\nvar axios = __webpack_require__(\"./node_modules/axios/index.js\");\n\n/**\n * Run an API request, with some common options\n *\n * @param {Object|String} _opts Axios request options, or pass a URL\n * @param {String} _opts.url\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = ((function () {\n var _ref = _asyncToGenerator( /*#__PURE__*/__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.mark(function _callee(_opts) {\n var opts;\n return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n if (typeof _opts === 'string' || _opts instanceof String) {\n // eslint-disable-next-line no-param-reassign\n _opts = {\n url: _opts\n };\n }\n\n opts = Object.assign({}, {\n baseURL: __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* default */].base_url,\n headers: {\n 'X-API-KEY': __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* default */].api_key,\n 'X-CSRF-TOKEN': __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* default */].csrf_token\n }\n }, _opts);\n return _context.abrupt('return', axios.request(opts));\n\n case 3:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, _this);\n }));\n\n return function (_x) {\n return _ref.apply(this, arguments);\n };\n})());//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvcmVxdWVzdC5qcz84MjVlIl0sIm5hbWVzIjpbImF4aW9zIiwicmVxdWlyZSIsIl9vcHRzIiwiU3RyaW5nIiwidXJsIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsImJhc2VVUkwiLCJjb25maWciLCJiYXNlX3VybCIsImhlYWRlcnMiLCJhcGlfa2V5IiwiY3NyZl90b2tlbiIsInJlcXVlc3QiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUNBOztBQUVBLElBQU1BLFFBQVFDLG1CQUFPQSxDQUFDLCtCQUFSLENBQWQ7O0FBRUE7Ozs7OztBQU1lO0FBQWYsb0hBQWUsaUJBQU9DLEtBQVA7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ2IsZ0JBQUksT0FBT0EsS0FBUCxLQUFpQixRQUFqQixJQUE2QkEsaUJBQWlCQyxNQUFsRCxFQUEwRDtBQUN4RDtBQUNBRCxzQkFBUTtBQUNORSxxQkFBS0Y7QUFEQyxlQUFSO0FBR0Q7O0FBRUtHLGdCQVJPLEdBUUFDLE9BQU9DLE1BQVAsQ0FBYyxFQUFkLEVBQWtCO0FBQzdCQyx1QkFBU0Msd0RBQU1BLENBQUNDLFFBRGE7QUFFN0JDLHVCQUFTO0FBQ1AsNkJBQWFGLHdEQUFNQSxDQUFDRyxPQURiO0FBRVAsZ0NBQWdCSCx3REFBTUEsQ0FBQ0k7QUFGaEI7QUFGb0IsYUFBbEIsRUFNVlgsS0FOVSxDQVJBO0FBQUEsNkNBZ0JORixNQUFNYyxPQUFOLENBQWNULElBQWQsQ0FoQk07O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0FBZjs7QUFBQTtBQUFBO0FBQUE7QUFBQSIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9yZXF1ZXN0LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgY29uZmlnIGZyb20gJy4vY29uZmlnJztcblxuY29uc3QgYXhpb3MgPSByZXF1aXJlKCdheGlvcycpO1xuXG4vKipcbiAqIFJ1biBhbiBBUEkgcmVxdWVzdCwgd2l0aCBzb21lIGNvbW1vbiBvcHRpb25zXG4gKlxuICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBfb3B0cyBBeGlvcyByZXF1ZXN0IG9wdGlvbnMsIG9yIHBhc3MgYSBVUkxcbiAqIEBwYXJhbSB7U3RyaW5nfSBfb3B0cy51cmxcbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgKF9vcHRzKSA9PiB7XG4gIGlmICh0eXBlb2YgX29wdHMgPT09ICdzdHJpbmcnIHx8IF9vcHRzIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgX29wdHMgPSB7XG4gICAgICB1cmw6IF9vcHRzLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbih7fSwge1xuICAgIGJhc2VVUkw6IGNvbmZpZy5iYXNlX3VybCxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnWC1BUEktS0VZJzogY29uZmlnLmFwaV9rZXksXG4gICAgICAnWC1DU1JGLVRPS0VOJzogY29uZmlnLmNzcmZfdG9rZW4sXG4gICAgfSxcbiAgfSwgX29wdHMpO1xuXG4gIHJldHVybiBheGlvcy5yZXF1ZXN0KG9wdHMpO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9yZXF1ZXN0LmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/request.js\n"); /***/ }), @@ -439,7 +448,7 @@ eval("/* unused harmony export onFeaturePointClick */\n/* unused harmony export /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("\n\n/**\n * Simple browser storage interface\n */\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Storage = function () {\n function Storage(name, default_value) {\n _classCallCheck(this, Storage);\n\n this.name = name;\n\n // Read the object from storage; if it doesn't exist, set\n // it to the default value\n var st = window.localStorage.getItem(this.name);\n if (!st) {\n console.log('Nothing found in storage, starting from default');\n this.data = default_value;\n } else {\n console.log('Found in storage: ', st);\n this.data = JSON.parse(st);\n }\n }\n\n /**\n * Save to local storage\n */\n\n\n _createClass(Storage, [{\n key: 'save',\n value: function save() {\n window.localStorage.setItem(this.name, JSON.stringify(this.data));\n }\n\n /**\n * Return a list from a given key\n *\n * @param {String} key\n *\n * @returns {Array|*}\n */\n\n }, {\n key: 'getList',\n value: function getList(key) {\n if (!(key in this.data)) {\n return [];\n }\n\n return this.data[key];\n }\n\n /**\n * Add `value` to a given `key`\n *\n * @param {string} key\n * @param {*} value\n */\n\n }, {\n key: 'addToList',\n value: function addToList(key, value) {\n if (!(key in this.data)) {\n this.data[key] = [];\n }\n\n var index = this.data[key].indexOf(value);\n if (index === -1) {\n this.data[key].push(value);\n }\n }\n\n /**\n * Remove `value` from the given `key`\n *\n * @param {String} key\n * @param {*} value\n */\n\n }, {\n key: 'removeFromList',\n value: function removeFromList(key, value) {\n if (!(key in this.data)) {\n return;\n }\n\n var index = this.data[key].indexOf(value);\n if (index !== -1) {\n this.data[key].splice(index, 1);\n }\n }\n }]);\n\n return Storage;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Storage);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc3RvcmFnZS5qcz83YjRhIl0sIm5hbWVzIjpbIlN0b3JhZ2UiLCJuYW1lIiwiZGVmYXVsdF92YWx1ZSIsInN0Iiwid2luZG93IiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsImNvbnNvbGUiLCJsb2ciLCJkYXRhIiwiSlNPTiIsInBhcnNlIiwic2V0SXRlbSIsInN0cmluZ2lmeSIsImtleSIsInZhbHVlIiwiaW5kZXgiLCJpbmRleE9mIiwicHVzaCIsInNwbGljZSJdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7Ozs7Ozs7O0lBR3FCQSxPO0FBQ2pCLHFCQUFZQyxJQUFaLEVBQWtCQyxhQUFsQixFQUFpQztBQUFBOztBQUM3QixhQUFLRCxJQUFMLEdBQVlBLElBQVo7O0FBRUE7QUFDQTtBQUNBLFlBQU1FLEtBQUtDLE9BQU9DLFlBQVAsQ0FBb0JDLE9BQXBCLENBQTRCLEtBQUtMLElBQWpDLENBQVg7QUFDQSxZQUFJLENBQUNFLEVBQUwsRUFBUztBQUNMSSxvQkFBUUMsR0FBUixDQUFZLGlEQUFaO0FBQ0EsaUJBQUtDLElBQUwsR0FBWVAsYUFBWjtBQUNILFNBSEQsTUFHTztBQUNISyxvQkFBUUMsR0FBUixDQUFZLG9CQUFaLEVBQWtDTCxFQUFsQztBQUNBLGlCQUFLTSxJQUFMLEdBQVlDLEtBQUtDLEtBQUwsQ0FBV1IsRUFBWCxDQUFaO0FBQ0g7QUFDSjs7QUFFRDs7Ozs7OzsrQkFHTztBQUNIQyxtQkFBT0MsWUFBUCxDQUFvQk8sT0FBcEIsQ0FBNEIsS0FBS1gsSUFBakMsRUFBdUNTLEtBQUtHLFNBQUwsQ0FBZSxLQUFLSixJQUFwQixDQUF2QztBQUNIOztBQUVEOzs7Ozs7Ozs7O2dDQU9RSyxHLEVBQUs7QUFDVCxnQkFBSSxFQUFFQSxPQUFPLEtBQUtMLElBQWQsQ0FBSixFQUF5QjtBQUNyQix1QkFBTyxFQUFQO0FBQ0g7O0FBRUQsbUJBQU8sS0FBS0EsSUFBTCxDQUFVSyxHQUFWLENBQVA7QUFDSDs7QUFFRDs7Ozs7Ozs7O2tDQU1VQSxHLEVBQUtDLEssRUFBTztBQUNsQixnQkFBSSxFQUFFRCxPQUFPLEtBQUtMLElBQWQsQ0FBSixFQUF5QjtBQUNyQixxQkFBS0EsSUFBTCxDQUFVSyxHQUFWLElBQWlCLEVBQWpCO0FBQ0g7O0FBRUQsZ0JBQU1FLFFBQVEsS0FBS1AsSUFBTCxDQUFVSyxHQUFWLEVBQWVHLE9BQWYsQ0FBdUJGLEtBQXZCLENBQWQ7QUFDQSxnQkFBSUMsVUFBVSxDQUFDLENBQWYsRUFBa0I7QUFDZCxxQkFBS1AsSUFBTCxDQUFVSyxHQUFWLEVBQWVJLElBQWYsQ0FBb0JILEtBQXBCO0FBQ0g7QUFDSjs7QUFFRDs7Ozs7Ozs7O3VDQU1lRCxHLEVBQUtDLEssRUFBTztBQUN2QixnQkFBSSxFQUFFRCxPQUFPLEtBQUtMLElBQWQsQ0FBSixFQUF5QjtBQUNyQjtBQUNIOztBQUVELGdCQUFNTyxRQUFRLEtBQUtQLElBQUwsQ0FBVUssR0FBVixFQUFlRyxPQUFmLENBQXVCRixLQUF2QixDQUFkO0FBQ0EsZ0JBQUlDLFVBQVUsQ0FBQyxDQUFmLEVBQWtCO0FBQ2QscUJBQUtQLElBQUwsQ0FBVUssR0FBVixFQUFlSyxNQUFmLENBQXNCSCxLQUF0QixFQUE2QixDQUE3QjtBQUNIO0FBQ0o7Ozs7OztBQXRFZ0JoQixnRSIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9zdG9yYWdlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFNpbXBsZSBicm93c2VyIHN0b3JhZ2UgaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0b3JhZ2Uge1xuICAgIGNvbnN0cnVjdG9yKG5hbWUsIGRlZmF1bHRfdmFsdWUpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBvYmplY3QgZnJvbSBzdG9yYWdlOyBpZiBpdCBkb2Vzbid0IGV4aXN0LCBzZXRcbiAgICAgICAgLy8gaXQgdG8gdGhlIGRlZmF1bHQgdmFsdWVcbiAgICAgICAgY29uc3Qgc3QgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5uYW1lKTtcbiAgICAgICAgaWYgKCFzdCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ05vdGhpbmcgZm91bmQgaW4gc3RvcmFnZSwgc3RhcnRpbmcgZnJvbSBkZWZhdWx0Jyk7XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBkZWZhdWx0X3ZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZvdW5kIGluIHN0b3JhZ2U6ICcsIHN0KTtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IEpTT04ucGFyc2Uoc3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2F2ZSB0byBsb2NhbCBzdG9yYWdlXG4gICAgICovXG4gICAgc2F2ZSgpIHtcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubmFtZSwgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgbGlzdCBmcm9tIGEgZ2l2ZW4ga2V5XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8Kn1cbiAgICAgKi9cbiAgICBnZXRMaXN0KGtleSkge1xuICAgICAgICBpZiAoIShrZXkgaW4gdGhpcy5kYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVtrZXldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBgdmFsdWVgIHRvIGEgZ2l2ZW4gYGtleWBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAgICovXG4gICAgYWRkVG9MaXN0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluIHRoaXMuZGF0YSkpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVtrZXldID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZGF0YVtrZXldLmluZGV4T2YodmFsdWUpO1xuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFba2V5XS5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBgdmFsdWVgIGZyb20gdGhlIGdpdmVuIGBrZXlgXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgICAqL1xuICAgIHJlbW92ZUZyb21MaXN0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluIHRoaXMuZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5kYXRhW2tleV0uaW5kZXhPZih2YWx1ZSk7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVtrZXldLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvc3RvcmFnZS5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/storage.js\n"); +eval("var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Simple browser storage interface\n */\nvar Storage = function () {\n function Storage(name, default_value) {\n _classCallCheck(this, Storage);\n\n this.name = name;\n\n // Read the object from storage; if it doesn't exist, set\n // it to the default value\n var st = window.localStorage.getItem(this.name);\n if (!st) {\n console.log('Nothing found in storage, starting from default');\n this.data = default_value;\n } else {\n console.log('Found in storage: ', st);\n this.data = JSON.parse(st);\n }\n }\n\n /**\n * Save to local storage\n */\n\n\n _createClass(Storage, [{\n key: 'save',\n value: function save() {\n window.localStorage.setItem(this.name, JSON.stringify(this.data));\n }\n\n /**\n * Return a list from a given key\n *\n * @param {String} key\n *\n * @returns {Array|*}\n */\n\n }, {\n key: 'getList',\n value: function getList(key) {\n if (!(key in this.data)) {\n return [];\n }\n\n return this.data[key];\n }\n\n /**\n * Add `value` to a given `key`\n *\n * @param {string} key\n * @param {*} value\n */\n\n }, {\n key: 'addToList',\n value: function addToList(key, value) {\n if (!(key in this.data)) {\n this.data[key] = [];\n }\n\n var index = this.data[key].indexOf(value);\n if (index === -1) {\n this.data[key].push(value);\n }\n }\n\n /**\n * Remove `value` from the given `key`\n *\n * @param {String} key\n * @param {*} value\n */\n\n }, {\n key: 'removeFromList',\n value: function removeFromList(key, value) {\n if (!(key in this.data)) {\n return;\n }\n\n var index = this.data[key].indexOf(value);\n if (index !== -1) {\n this.data[key].splice(index, 1);\n }\n }\n }]);\n\n return Storage;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Storage);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc3RvcmFnZS5qcz83YjRhIl0sIm5hbWVzIjpbIlN0b3JhZ2UiLCJuYW1lIiwiZGVmYXVsdF92YWx1ZSIsInN0Iiwid2luZG93IiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsImNvbnNvbGUiLCJsb2ciLCJkYXRhIiwiSlNPTiIsInBhcnNlIiwic2V0SXRlbSIsInN0cmluZ2lmeSIsImtleSIsInZhbHVlIiwiaW5kZXgiLCJpbmRleE9mIiwicHVzaCIsInNwbGljZSJdLCJtYXBwaW5ncyI6Ijs7OztBQUNBOzs7SUFHcUJBLE87QUFDbkIsbUJBQVlDLElBQVosRUFBa0JDLGFBQWxCLEVBQWlDO0FBQUE7O0FBQy9CLFNBQUtELElBQUwsR0FBWUEsSUFBWjs7QUFFQTtBQUNBO0FBQ0EsUUFBTUUsS0FBS0MsT0FBT0MsWUFBUCxDQUFvQkMsT0FBcEIsQ0FBNEIsS0FBS0wsSUFBakMsQ0FBWDtBQUNBLFFBQUksQ0FBQ0UsRUFBTCxFQUFTO0FBQ1BJLGNBQVFDLEdBQVIsQ0FBWSxpREFBWjtBQUNBLFdBQUtDLElBQUwsR0FBWVAsYUFBWjtBQUNELEtBSEQsTUFHTztBQUNMSyxjQUFRQyxHQUFSLENBQVksb0JBQVosRUFBa0NMLEVBQWxDO0FBQ0EsV0FBS00sSUFBTCxHQUFZQyxLQUFLQyxLQUFMLENBQVdSLEVBQVgsQ0FBWjtBQUNEO0FBQ0Y7O0FBRUQ7Ozs7Ozs7MkJBR087QUFDTEMsYUFBT0MsWUFBUCxDQUFvQk8sT0FBcEIsQ0FBNEIsS0FBS1gsSUFBakMsRUFBdUNTLEtBQUtHLFNBQUwsQ0FBZSxLQUFLSixJQUFwQixDQUF2QztBQUNEOztBQUVEOzs7Ozs7Ozs7OzRCQU9RSyxHLEVBQUs7QUFDWCxVQUFJLEVBQUVBLE9BQU8sS0FBS0wsSUFBZCxDQUFKLEVBQXlCO0FBQ3ZCLGVBQU8sRUFBUDtBQUNEOztBQUVELGFBQU8sS0FBS0EsSUFBTCxDQUFVSyxHQUFWLENBQVA7QUFDRDs7QUFFRDs7Ozs7Ozs7OzhCQU1VQSxHLEVBQUtDLEssRUFBTztBQUNwQixVQUFJLEVBQUVELE9BQU8sS0FBS0wsSUFBZCxDQUFKLEVBQXlCO0FBQ3ZCLGFBQUtBLElBQUwsQ0FBVUssR0FBVixJQUFpQixFQUFqQjtBQUNEOztBQUVELFVBQU1FLFFBQVEsS0FBS1AsSUFBTCxDQUFVSyxHQUFWLEVBQWVHLE9BQWYsQ0FBdUJGLEtBQXZCLENBQWQ7QUFDQSxVQUFJQyxVQUFVLENBQUMsQ0FBZixFQUFrQjtBQUNoQixhQUFLUCxJQUFMLENBQVVLLEdBQVYsRUFBZUksSUFBZixDQUFvQkgsS0FBcEI7QUFDRDtBQUNGOztBQUVEOzs7Ozs7Ozs7bUNBTWVELEcsRUFBS0MsSyxFQUFPO0FBQ3pCLFVBQUksRUFBRUQsT0FBTyxLQUFLTCxJQUFkLENBQUosRUFBeUI7QUFDdkI7QUFDRDs7QUFFRCxVQUFNTyxRQUFRLEtBQUtQLElBQUwsQ0FBVUssR0FBVixFQUFlRyxPQUFmLENBQXVCRixLQUF2QixDQUFkO0FBQ0EsVUFBSUMsVUFBVSxDQUFDLENBQWYsRUFBa0I7QUFDaEIsYUFBS1AsSUFBTCxDQUFVSyxHQUFWLEVBQWVLLE1BQWYsQ0FBc0JILEtBQXRCLEVBQTZCLENBQTdCO0FBQ0Q7QUFDRjs7Ozs7O0FBdEVrQmhCLGdFIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL3N0b3JhZ2UuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogU2ltcGxlIGJyb3dzZXIgc3RvcmFnZSBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RvcmFnZSB7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGRlZmF1bHRfdmFsdWUpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXG4gICAgLy8gUmVhZCB0aGUgb2JqZWN0IGZyb20gc3RvcmFnZTsgaWYgaXQgZG9lc24ndCBleGlzdCwgc2V0XG4gICAgLy8gaXQgdG8gdGhlIGRlZmF1bHQgdmFsdWVcbiAgICBjb25zdCBzdCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLm5hbWUpO1xuICAgIGlmICghc3QpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdOb3RoaW5nIGZvdW5kIGluIHN0b3JhZ2UsIHN0YXJ0aW5nIGZyb20gZGVmYXVsdCcpO1xuICAgICAgdGhpcy5kYXRhID0gZGVmYXVsdF92YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coJ0ZvdW5kIGluIHN0b3JhZ2U6ICcsIHN0KTtcbiAgICAgIHRoaXMuZGF0YSA9IEpTT04ucGFyc2Uoc3QpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgICAqIFNhdmUgdG8gbG9jYWwgc3RvcmFnZVxuICAgICAqL1xuICBzYXZlKCkge1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLm5hbWUsIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSkpO1xuICB9XG5cbiAgLyoqXG4gICAgICogUmV0dXJuIGEgbGlzdCBmcm9tIGEgZ2l2ZW4ga2V5XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8Kn1cbiAgICAgKi9cbiAgZ2V0TGlzdChrZXkpIHtcbiAgICBpZiAoIShrZXkgaW4gdGhpcy5kYXRhKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRhdGFba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgICAqIEFkZCBgdmFsdWVgIHRvIGEgZ2l2ZW4gYGtleWBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAgICovXG4gIGFkZFRvTGlzdChrZXksIHZhbHVlKSB7XG4gICAgaWYgKCEoa2V5IGluIHRoaXMuZGF0YSkpIHtcbiAgICAgIHRoaXMuZGF0YVtrZXldID0gW107XG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmRhdGFba2V5XS5pbmRleE9mKHZhbHVlKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICB0aGlzLmRhdGFba2V5XS5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICAgKiBSZW1vdmUgYHZhbHVlYCBmcm9tIHRoZSBnaXZlbiBga2V5YFxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICAgKi9cbiAgcmVtb3ZlRnJvbUxpc3Qoa2V5LCB2YWx1ZSkge1xuICAgIGlmICghKGtleSBpbiB0aGlzLmRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmRhdGFba2V5XS5pbmRleE9mKHZhbHVlKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmRhdGFba2V5XS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL3N0b3JhZ2UuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/storage.js\n"); /***/ }), diff --git a/public/assets/installer/js/app.js b/public/assets/installer/js/app.js index 34a14d0f..4a9a0339 100644 --- a/public/assets/installer/js/app.js +++ b/public/assets/installer/js/app.js @@ -263,6 +263,27 @@ eval("/*!\n * Determine if an object is a Buffer\n *\n * @author Feross Aboukh /***/ }), +/***/ "./node_modules/babel-runtime/node_modules/regenerator-runtime/runtime-module.js": +/***/ (function(module, exports, __webpack_require__) { + +eval("/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n// This method of obtaining a reference to the global object needs to be\n// kept identical to the way it is obtained in runtime.js\nvar g = (function() { return this })() || Function(\"return this\")();\n\n// Use `getOwnPropertyNames` because not all browsers support calling\n// `hasOwnProperty` on the global `self` object in a worker. See #183.\nvar hadRuntime = g.regeneratorRuntime &&\n Object.getOwnPropertyNames(g).indexOf(\"regeneratorRuntime\") >= 0;\n\n// Save the old regeneratorRuntime in case it needs to be restored later.\nvar oldRuntime = hadRuntime && g.regeneratorRuntime;\n\n// Force reevalutation of runtime.js.\ng.regeneratorRuntime = undefined;\n\nmodule.exports = __webpack_require__(\"./node_modules/babel-runtime/node_modules/regenerator-runtime/runtime.js\");\n\nif (hadRuntime) {\n // Restore the original runtime.\n g.regeneratorRuntime = oldRuntime;\n} else {\n // Remove the global property added by runtime.js.\n try {\n delete g.regeneratorRuntime;\n } catch(e) {\n g.regeneratorRuntime = undefined;\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLW1vZHVsZS5qcz9kNDdlIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EscUJBQXFCLGNBQWM7O0FBRW5DO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpQkFBaUIsbUJBQU8sQ0FBQywwRUFBVzs7QUFFcEM7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLW1vZHVsZS5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE0LXByZXNlbnQsIEZhY2Vib29rLCBJbmMuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gKi9cblxuLy8gVGhpcyBtZXRob2Qgb2Ygb2J0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWwgb2JqZWN0IG5lZWRzIHRvIGJlXG4vLyBrZXB0IGlkZW50aWNhbCB0byB0aGUgd2F5IGl0IGlzIG9idGFpbmVkIGluIHJ1bnRpbWUuanNcbnZhciBnID0gKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcyB9KSgpIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKTtcblxuLy8gVXNlIGBnZXRPd25Qcm9wZXJ0eU5hbWVzYCBiZWNhdXNlIG5vdCBhbGwgYnJvd3NlcnMgc3VwcG9ydCBjYWxsaW5nXG4vLyBgaGFzT3duUHJvcGVydHlgIG9uIHRoZSBnbG9iYWwgYHNlbGZgIG9iamVjdCBpbiBhIHdvcmtlci4gU2VlICMxODMuXG52YXIgaGFkUnVudGltZSA9IGcucmVnZW5lcmF0b3JSdW50aW1lICYmXG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGcpLmluZGV4T2YoXCJyZWdlbmVyYXRvclJ1bnRpbWVcIikgPj0gMDtcblxuLy8gU2F2ZSB0aGUgb2xkIHJlZ2VuZXJhdG9yUnVudGltZSBpbiBjYXNlIGl0IG5lZWRzIHRvIGJlIHJlc3RvcmVkIGxhdGVyLlxudmFyIG9sZFJ1bnRpbWUgPSBoYWRSdW50aW1lICYmIGcucmVnZW5lcmF0b3JSdW50aW1lO1xuXG4vLyBGb3JjZSByZWV2YWx1dGF0aW9uIG9mIHJ1bnRpbWUuanMuXG5nLnJlZ2VuZXJhdG9yUnVudGltZSA9IHVuZGVmaW5lZDtcblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiLi9ydW50aW1lXCIpO1xuXG5pZiAoaGFkUnVudGltZSkge1xuICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBydW50aW1lLlxuICBnLnJlZ2VuZXJhdG9yUnVudGltZSA9IG9sZFJ1bnRpbWU7XG59IGVsc2Uge1xuICAvLyBSZW1vdmUgdGhlIGdsb2JhbCBwcm9wZXJ0eSBhZGRlZCBieSBydW50aW1lLmpzLlxuICB0cnkge1xuICAgIGRlbGV0ZSBnLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgfSBjYXRjaChlKSB7XG4gICAgZy5yZWdlbmVyYXRvclJ1bnRpbWUgPSB1bmRlZmluZWQ7XG4gIH1cbn1cblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS1tb2R1bGUuanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS1tb2R1bGUuanNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/babel-runtime/node_modules/regenerator-runtime/runtime-module.js\n"); + +/***/ }), + +/***/ "./node_modules/babel-runtime/node_modules/regenerator-runtime/runtime.js": +/***/ (function(module, exports) { + +eval("/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n!(function(global) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // In sloppy mode, unbound `this` refers to the global object, fallback to\n // Function constructor if we're in global strict mode. That is sadly a form\n // of indirect eval which violates Content Security Policy.\n (function() { return this })() || Function(\"return this\")()\n);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzPzFlMTMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2QsS0FBSztBQUNMLGNBQWM7QUFDZDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQTtBQUNBLHdDQUF3QyxXQUFXO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLFNBQVM7QUFDVDtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0NBQW9DLGNBQWM7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlDQUFpQyxrQkFBa0I7QUFDbkQ7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGlCQUFpQjs7QUFFakI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGlCQUFpQjtBQUN6QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFlBQVk7QUFDWjtBQUNBOztBQUVBO0FBQ0EsWUFBWTtBQUNaOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsOENBQThDLFFBQVE7QUFDdEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7O0FBRUEsV0FBVztBQUNYO0FBQ0E7QUFDQTs7QUFFQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0EsOENBQThDLFFBQVE7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSw4Q0FBOEMsUUFBUTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxlQUFlLGNBQWM7QUFDN0IiLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG4hKGZ1bmN0aW9uKGdsb2JhbCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgT3AgPSBPYmplY3QucHJvdG90eXBlO1xuICB2YXIgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHk7XG4gIHZhciB1bmRlZmluZWQ7IC8vIE1vcmUgY29tcHJlc3NpYmxlIHRoYW4gdm9pZCAwLlxuICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbCA6IHt9O1xuICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiO1xuICB2YXIgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiO1xuICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuXG4gIHZhciBpbk1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCI7XG4gIHZhciBydW50aW1lID0gZ2xvYmFsLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgaWYgKHJ1bnRpbWUpIHtcbiAgICBpZiAoaW5Nb2R1bGUpIHtcbiAgICAgIC8vIElmIHJlZ2VuZXJhdG9yUnVudGltZSBpcyBkZWZpbmVkIGdsb2JhbGx5IGFuZCB3ZSdyZSBpbiBhIG1vZHVsZSxcbiAgICAgIC8vIG1ha2UgdGhlIGV4cG9ydHMgb2JqZWN0IGlkZW50aWNhbCB0byByZWdlbmVyYXRvclJ1bnRpbWUuXG4gICAgICBtb2R1bGUuZXhwb3J0cyA9IHJ1bnRpbWU7XG4gICAgfVxuICAgIC8vIERvbid0IGJvdGhlciBldmFsdWF0aW5nIHRoZSByZXN0IG9mIHRoaXMgZmlsZSBpZiB0aGUgcnVudGltZSB3YXNcbiAgICAvLyBhbHJlYWR5IGRlZmluZWQgZ2xvYmFsbHkuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRGVmaW5lIHRoZSBydW50aW1lIGdsb2JhbGx5IChhcyBleHBlY3RlZCBieSBnZW5lcmF0ZWQgY29kZSkgYXMgZWl0aGVyXG4gIC8vIG1vZHVsZS5leHBvcnRzIChpZiB3ZSdyZSBpbiBhIG1vZHVsZSkgb3IgYSBuZXcsIGVtcHR5IG9iamVjdC5cbiAgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWUgPSBpbk1vZHVsZSA/IG1vZHVsZS5leHBvcnRzIDoge307XG5cbiAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIC8vIElmIG91dGVyRm4gcHJvdmlkZWQgYW5kIG91dGVyRm4ucHJvdG90eXBlIGlzIGEgR2VuZXJhdG9yLCB0aGVuIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yLlxuICAgIHZhciBwcm90b0dlbmVyYXRvciA9IG91dGVyRm4gJiYgb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBvdXRlckZuIDogR2VuZXJhdG9yO1xuICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSk7XG4gICAgdmFyIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7XG5cbiAgICAvLyBUaGUgLl9pbnZva2UgbWV0aG9kIHVuaWZpZXMgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzLlxuICAgIGdlbmVyYXRvci5faW52b2tlID0gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH1cbiAgcnVudGltZS53cmFwID0gd3JhcDtcblxuICAvLyBUcnkvY2F0Y2ggaGVscGVyIHRvIG1pbmltaXplIGRlb3B0aW1pemF0aW9ucy4gUmV0dXJucyBhIGNvbXBsZXRpb25cbiAgLy8gcmVjb3JkIGxpa2UgY29udGV4dC50cnlFbnRyaWVzW2ldLmNvbXBsZXRpb24uIFRoaXMgaW50ZXJmYWNlIGNvdWxkXG4gIC8vIGhhdmUgYmVlbiAoYW5kIHdhcyBwcmV2aW91c2x5KSBkZXNpZ25lZCB0byB0YWtlIGEgY2xvc3VyZSB0byBiZVxuICAvLyBpbnZva2VkIHdpdGhvdXQgYXJndW1lbnRzLCBidXQgaW4gYWxsIHRoZSBjYXNlcyB3ZSBjYXJlIGFib3V0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBtZXRob2Qgd2Ugd2FudCB0byBjYWxsLCBzbyB0aGVyZSdzIG5vIG5lZWRcbiAgLy8gdG8gY3JlYXRlIGEgbmV3IGZ1bmN0aW9uIG9iamVjdC4gV2UgY2FuIGV2ZW4gZ2V0IGF3YXkgd2l0aCBhc3N1bWluZ1xuICAvLyB0aGUgbWV0aG9kIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50LCBzaW5jZSB0aGF0IGhhcHBlbnMgdG8gYmUgdHJ1ZVxuICAvLyBpbiBldmVyeSBjYXNlLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHRvdWNoIHRoZSBhcmd1bWVudHMgb2JqZWN0LiBUaGVcbiAgLy8gb25seSBhZGRpdGlvbmFsIGFsbG9jYXRpb24gcmVxdWlyZWQgaXMgdGhlIGNvbXBsZXRpb24gcmVjb3JkLCB3aGljaFxuICAvLyBoYXMgYSBzdGFibGUgc2hhcGUgYW5kIHNvIGhvcGVmdWxseSBzaG91bGQgYmUgY2hlYXAgdG8gYWxsb2NhdGUuXG4gIGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcIm5vcm1hbFwiLCBhcmc6IGZuLmNhbGwob2JqLCBhcmcpIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInRocm93XCIsIGFyZzogZXJyIH07XG4gICAgfVxuICB9XG5cbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkU3RhcnQgPSBcInN1c3BlbmRlZFN0YXJ0XCI7XG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkID0gXCJzdXNwZW5kZWRZaWVsZFwiO1xuICB2YXIgR2VuU3RhdGVFeGVjdXRpbmcgPSBcImV4ZWN1dGluZ1wiO1xuICB2YXIgR2VuU3RhdGVDb21wbGV0ZWQgPSBcImNvbXBsZXRlZFwiO1xuXG4gIC8vIFJldHVybmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBpbm5lckZuIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXNcbiAgLy8gYnJlYWtpbmcgb3V0IG9mIHRoZSBkaXNwYXRjaCBzd2l0Y2ggc3RhdGVtZW50LlxuICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9O1xuXG4gIC8vIER1bW15IGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyB0aGF0IHdlIHVzZSBhcyB0aGUgLmNvbnN0cnVjdG9yIGFuZFxuICAvLyAuY29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMgZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0cy4gRm9yIGZ1bGwgc3BlYyBjb21wbGlhbmNlLCB5b3UgbWF5IHdpc2ggdG8gY29uZmlndXJlIHlvdXJcbiAgLy8gbWluaWZpZXIgbm90IHRvIG1hbmdsZSB0aGUgbmFtZXMgb2YgdGhlc2UgdHdvIGZ1bmN0aW9ucy5cbiAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9XG5cbiAgLy8gVGhpcyBpcyBhIHBvbHlmaWxsIGZvciAlSXRlcmF0b3JQcm90b3R5cGUlIGZvciBlbnZpcm9ubWVudHMgdGhhdFxuICAvLyBkb24ndCBuYXRpdmVseSBzdXBwb3J0IGl0LlxuICB2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcbiAgSXRlcmF0b3JQcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiAgdmFyIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpO1xuICBpZiAoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiZcbiAgICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJlxuICAgICAgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSkge1xuICAgIC8vIFRoaXMgZW52aXJvbm1lbnQgaGFzIGEgbmF0aXZlICVJdGVyYXRvclByb3RvdHlwZSU7IHVzZSBpdCBpbnN0ZWFkXG4gICAgLy8gb2YgdGhlIHBvbHlmaWxsLlxuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cblxuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPVxuICAgIEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR3AuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvbjtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGVbdG9TdHJpbmdUYWdTeW1ib2xdID1cbiAgICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcblxuICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLlxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICBwcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKGFyZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBydW50aW1lLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGlmICghKHRvU3RyaW5nVGFnU3ltYm9sIGluIGdlbkZ1bikpIHtcbiAgICAgICAgZ2VuRnVuW3RvU3RyaW5nVGFnU3ltYm9sXSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgIHJldHVybiBnZW5GdW47XG4gIH07XG5cbiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvXG4gIC8vIGB5aWVsZCByZWdlbmVyYXRvclJ1bnRpbWUuYXdyYXAoeClgLCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiB0ZXN0XG4gIC8vIGBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpYCB0byBkZXRlcm1pbmUgaWYgdGhlIHlpZWxkZWQgdmFsdWUgaXNcbiAgLy8gbWVhbnQgdG8gYmUgYXdhaXRlZC5cbiAgcnVudGltZS5hd3JhcCA9IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB7IF9fYXdhaXQ6IGFyZyB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJ0aHJvd1wiLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uKHVud3JhcHBlZCkge1xuICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzXG4gICAgICAgICAgLy8gdGhlIC52YWx1ZSBvZiB0aGUgUHJvbWlzZTx7dmFsdWUsZG9uZX0+IHJlc3VsdCBmb3IgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCBpdGVyYXRpb24uIElmIHRoZSBQcm9taXNlIGlzIHJlamVjdGVkLCBob3dldmVyLCB0aGVcbiAgICAgICAgICAvLyByZXN1bHQgZm9yIHRoaXMgaXRlcmF0aW9uIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCB0aGUgc2FtZVxuICAgICAgICAgIC8vIHJlYXNvbi4gTm90ZSB0aGF0IHJlamVjdGlvbnMgb2YgeWllbGRlZCBQcm9taXNlcyBhcmUgbm90XG4gICAgICAgICAgLy8gdGhyb3duIGJhY2sgaW50byB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBhcyBpcyB0aGUgY2FzZVxuICAgICAgICAgIC8vIHdoZW4gYW4gYXdhaXRlZCBQcm9taXNlIGlzIHJlamVjdGVkLiBUaGlzIGRpZmZlcmVuY2UgaW5cbiAgICAgICAgICAvLyBiZWhhdmlvciBiZXR3ZWVuIHlpZWxkIGFuZCBhd2FpdCBpcyBpbXBvcnRhbnQsIGJlY2F1c2UgaXRcbiAgICAgICAgICAvLyBhbGxvd3MgdGhlIGNvbnN1bWVyIHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggdGhlIHlpZWxkZWRcbiAgICAgICAgICAvLyByZWplY3Rpb24gKHN3YWxsb3cgaXQgYW5kIGNvbnRpbnVlLCBtYW51YWxseSAudGhyb3cgaXQgYmFja1xuICAgICAgICAgIC8vIGludG8gdGhlIGdlbmVyYXRvciwgYWJhbmRvbiBpdGVyYXRpb24sIHdoYXRldmVyKS4gV2l0aFxuICAgICAgICAgIC8vIGF3YWl0LCBieSBjb250cmFzdCwgdGhlcmUgaXMgbm8gb3Bwb3J0dW5pdHkgdG8gZXhhbWluZSB0aGVcbiAgICAgICAgICAvLyByZWplY3Rpb24gcmVhc29uIG91dHNpZGUgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiwgc28gdGhlXG4gICAgICAgICAgLy8gb25seSBvcHRpb24gaXMgdG8gdGhyb3cgaXQgZnJvbSB0aGUgYXdhaXQgZXhwcmVzc2lvbiwgYW5kXG4gICAgICAgICAgLy8gbGV0IHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gaGFuZGxlIHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkO1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykge1xuICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID1cbiAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKFxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLFxuICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyXG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnXG4gICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiAoc2VlIGRlZmluZUl0ZXJhdG9yTWV0aG9kcykuXG4gICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTtcbiAgfVxuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7XG4gIEFzeW5jSXRlcmF0b3IucHJvdG90eXBlW2FzeW5jSXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBydW50aW1lLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBydW50aW1lLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKFxuICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdClcbiAgICApO1xuXG4gICAgcmV0dXJuIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXliZUludm9rZURlbGVnYXRlKGNvbnRleHQpIGNoYW5nZWQgY29udGV4dC5tZXRob2QgZnJvbVxuICAgICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCEgaW5mbykge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKTtcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgIC8vIHZhcmlhYmxlIHNwZWNpZmllZCBieSBkZWxlZ2F0ZS5yZXN1bHROYW1lIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcblxuICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcblxuICAgICAgLy8gSWYgY29udGV4dC5tZXRob2Qgd2FzIFwidGhyb3dcIiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlXG4gICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmXG4gICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgLy8gXCJjb25zdW1lZFwiIGJ5IHRoZSBkZWxlZ2F0ZSBpdGVyYXRvci4gSWYgY29udGV4dC5tZXRob2Qgd2FzXG4gICAgICAvLyBcInJldHVyblwiLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZVxuICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlLXlpZWxkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGRlbGVnYXRlIG1ldGhvZC5cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoXG4gICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci5cbiAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBHcFt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvclwiO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIHJ1bnRpbWUua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBydW50aW1lLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xufSkoXG4gIC8vIEluIHNsb3BweSBtb2RlLCB1bmJvdW5kIGB0aGlzYCByZWZlcnMgdG8gdGhlIGdsb2JhbCBvYmplY3QsIGZhbGxiYWNrIHRvXG4gIC8vIEZ1bmN0aW9uIGNvbnN0cnVjdG9yIGlmIHdlJ3JlIGluIGdsb2JhbCBzdHJpY3QgbW9kZS4gVGhhdCBpcyBzYWRseSBhIGZvcm1cbiAgLy8gb2YgaW5kaXJlY3QgZXZhbCB3aGljaCB2aW9sYXRlcyBDb250ZW50IFNlY3VyaXR5IFBvbGljeS5cbiAgKGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcyB9KSgpIHx8IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKVxuKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL3JlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qc1xuLy8gbW9kdWxlIGlkID0gLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzXG4vLyBtb2R1bGUgY2h1bmtzID0gMCAxIDIiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./node_modules/babel-runtime/node_modules/regenerator-runtime/runtime.js\n"); + +/***/ }), + +/***/ "./node_modules/babel-runtime/regenerator/index.js": +/***/ (function(module, exports, __webpack_require__) { + +eval("module.exports = __webpack_require__(\"./node_modules/babel-runtime/node_modules/regenerator-runtime/runtime-module.js\");\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9ub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9yZWdlbmVyYXRvci9pbmRleC5qcz81ZjE2Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlCQUFpQixtQkFBTyxDQUFDLGlGQUFxQiIsImZpbGUiOiIuL25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL3JlZ2VuZXJhdG9yL2luZGV4LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZVwiKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3IvaW5kZXguanNcbi8vIG1vZHVsZSBpZCA9IC4vbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvcmVnZW5lcmF0b3IvaW5kZXguanNcbi8vIG1vZHVsZSBjaHVua3MgPSAwIDEgMiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/babel-runtime/regenerator/index.js\n"); + +/***/ }), + /***/ "./node_modules/process/browser.js": /***/ (function(module, exports) { @@ -295,14 +316,22 @@ eval("module.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__storage__ = __webpack_require__(\"./resources/js/storage.js\");\n/**\n * Bootstrap any Javascript libraries required\n */\n\nwindow.axios = __webpack_require__(\"./node_modules/axios/index.js\");\n\n\n\n/**\n * Container for phpVMS specific functions\n */\nwindow.phpvms = {\n config: {},\n Storage: __WEBPACK_IMPORTED_MODULE_0__storage__[\"a\" /* default */]\n};\n\n/**\n * Configure Axios with both the csrf token and the API key\n */\n\nvar base_url = document.head.querySelector('meta[name=\"base-url\"]');\nif (base_url) {\n console.log('baseURL=' + base_url.content);\n window.phpvms.config.base_url = base_url.content;\n window.axios.default.baseURL = base_url.content;\n}\n\nwindow.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';\nvar token = document.head.querySelector('meta[name=\"csrf-token\"]');\n\nif (token) {\n window.phpvms.config.csrf_token = token.content;\n window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;\n} else {\n console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');\n}\n\nvar api_key = document.head.querySelector('meta[name=\"api-key\"]');\nif (api_key) {\n window.axios.defaults.headers.common['x-api-key'] = api_key.content;\n window.phpvms.config.user_api_key = api_key.content;\n window.PHPVMS_USER_API_KEY = api_key.content;\n} else {\n window.phpvms.config.user_api_key = false;\n window.PHPVMS_USER_API_KEY = false;\n console.error('API Key not found!');\n}\n\n__webpack_require__(\"./resources/js/common.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzPzBlNTgiXSwibmFtZXMiOlsid2luZG93IiwiYXhpb3MiLCJyZXF1aXJlIiwicGhwdm1zIiwiY29uZmlnIiwiU3RvcmFnZSIsImJhc2VfdXJsIiwiZG9jdW1lbnQiLCJoZWFkIiwicXVlcnlTZWxlY3RvciIsImNvbnNvbGUiLCJsb2ciLCJjb250ZW50IiwiZGVmYXVsdCIsImJhc2VVUkwiLCJkZWZhdWx0cyIsImhlYWRlcnMiLCJjb21tb24iLCJ0b2tlbiIsImNzcmZfdG9rZW4iLCJlcnJvciIsImFwaV9rZXkiLCJ1c2VyX2FwaV9rZXkiLCJQSFBWTVNfVVNFUl9BUElfS0VZIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7Ozs7QUFLQUEsT0FBT0MsS0FBUCxHQUFlQyxtQkFBT0EsQ0FBQywrQkFBUixDQUFmOztBQUVBOztBQUVBOzs7QUFHQUYsT0FBT0csTUFBUCxHQUFnQjtBQUNkQyxVQUFRLEVBRE07QUFFZEMsb0VBQU9BO0FBRk8sQ0FBaEI7O0FBS0E7Ozs7QUFJQSxJQUFNQyxXQUFXQyxTQUFTQyxJQUFULENBQWNDLGFBQWQsQ0FBNEIsdUJBQTVCLENBQWpCO0FBQ0EsSUFBR0gsUUFBSCxFQUFhO0FBQ1hJLFVBQVFDLEdBQVIsY0FBdUJMLFNBQVNNLE9BQWhDO0FBQ0FaLFNBQU9HLE1BQVAsQ0FBY0MsTUFBZCxDQUFxQkUsUUFBckIsR0FBZ0NBLFNBQVNNLE9BQXpDO0FBQ0FaLFNBQU9DLEtBQVAsQ0FBYVksT0FBYixDQUFxQkMsT0FBckIsR0FBK0JSLFNBQVNNLE9BQXhDO0FBQ0Q7O0FBRURaLE9BQU9DLEtBQVAsQ0FBYWMsUUFBYixDQUFzQkMsT0FBdEIsQ0FBOEJDLE1BQTlCLENBQXFDLGtCQUFyQyxJQUEyRCxnQkFBM0Q7QUFDQSxJQUFNQyxRQUFRWCxTQUFTQyxJQUFULENBQWNDLGFBQWQsQ0FBNEIseUJBQTVCLENBQWQ7O0FBRUEsSUFBSVMsS0FBSixFQUFXO0FBQ1RsQixTQUFPRyxNQUFQLENBQWNDLE1BQWQsQ0FBcUJlLFVBQXJCLEdBQWtDRCxNQUFNTixPQUF4QztBQUNBWixTQUFPQyxLQUFQLENBQWFjLFFBQWIsQ0FBc0JDLE9BQXRCLENBQThCQyxNQUE5QixDQUFxQyxjQUFyQyxJQUF1REMsTUFBTU4sT0FBN0Q7QUFDRCxDQUhELE1BR087QUFDTEYsVUFBUVUsS0FBUixDQUFjLHVFQUFkO0FBQ0Q7O0FBRUQsSUFBTUMsVUFBVWQsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHNCQUE1QixDQUFoQjtBQUNBLElBQUlZLE9BQUosRUFBYTtBQUNYckIsU0FBT0MsS0FBUCxDQUFhYyxRQUFiLENBQXNCQyxPQUF0QixDQUE4QkMsTUFBOUIsQ0FBcUMsV0FBckMsSUFBb0RJLFFBQVFULE9BQTVEO0FBQ0FaLFNBQU9HLE1BQVAsQ0FBY0MsTUFBZCxDQUFxQmtCLFlBQXJCLEdBQW9DRCxRQUFRVCxPQUE1QztBQUNBWixTQUFPdUIsbUJBQVAsR0FBNkJGLFFBQVFULE9BQXJDO0FBQ0QsQ0FKRCxNQUlPO0FBQ0xaLFNBQU9HLE1BQVAsQ0FBY0MsTUFBZCxDQUFxQmtCLFlBQXJCLEdBQW9DLEtBQXBDO0FBQ0F0QixTQUFPdUIsbUJBQVAsR0FBNkIsS0FBN0I7QUFDQWIsVUFBUVUsS0FBUixDQUFjLG9CQUFkO0FBQ0Q7O0FBRURsQixtQkFBT0EsQ0FBQywwQkFBUiIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9ib290c3RyYXAuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJvb3RzdHJhcCBhbnkgSmF2YXNjcmlwdCBsaWJyYXJpZXMgcmVxdWlyZWRcbiAqL1xuXG5cbndpbmRvdy5heGlvcyA9IHJlcXVpcmUoJ2F4aW9zJyk7XG5cbmltcG9ydCBTdG9yYWdlIGZyb20gXCIuL3N0b3JhZ2VcIjtcblxuLyoqXG4gKiBDb250YWluZXIgZm9yIHBocFZNUyBzcGVjaWZpYyBmdW5jdGlvbnNcbiAqL1xud2luZG93LnBocHZtcyA9IHtcbiAgY29uZmlnOiB7fSxcbiAgU3RvcmFnZSxcbn07XG5cbi8qKlxuICogQ29uZmlndXJlIEF4aW9zIHdpdGggYm90aCB0aGUgY3NyZiB0b2tlbiBhbmQgdGhlIEFQSSBrZXlcbiAqL1xuXG5jb25zdCBiYXNlX3VybCA9IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiYmFzZS11cmxcIl0nKTtcbmlmKGJhc2VfdXJsKSB7XG4gIGNvbnNvbGUubG9nKGBiYXNlVVJMPSR7YmFzZV91cmwuY29udGVudH1gKTtcbiAgd2luZG93LnBocHZtcy5jb25maWcuYmFzZV91cmwgPSBiYXNlX3VybC5jb250ZW50O1xuICB3aW5kb3cuYXhpb3MuZGVmYXVsdC5iYXNlVVJMID0gYmFzZV91cmwuY29udGVudDtcbn1cblxud2luZG93LmF4aW9zLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uWydYLVJlcXVlc3RlZC1XaXRoJ10gPSAnWE1MSHR0cFJlcXVlc3QnO1xuY29uc3QgdG9rZW4gPSBkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbbmFtZT1cImNzcmYtdG9rZW5cIl0nKTtcblxuaWYgKHRva2VuKSB7XG4gIHdpbmRvdy5waHB2bXMuY29uZmlnLmNzcmZfdG9rZW4gPSB0b2tlbi5jb250ZW50O1xuICB3aW5kb3cuYXhpb3MuZGVmYXVsdHMuaGVhZGVycy5jb21tb25bJ1gtQ1NSRi1UT0tFTiddID0gdG9rZW4uY29udGVudFxufSBlbHNlIHtcbiAgY29uc29sZS5lcnJvcignQ1NSRiB0b2tlbiBub3QgZm91bmQ6IGh0dHBzOi8vbGFyYXZlbC5jb20vZG9jcy9jc3JmI2NzcmYteC1jc3JmLXRva2VuJylcbn1cblxuY29uc3QgYXBpX2tleSA9IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiYXBpLWtleVwiXScpO1xuaWYgKGFwaV9rZXkpIHtcbiAgd2luZG93LmF4aW9zLmRlZmF1bHRzLmhlYWRlcnMuY29tbW9uWyd4LWFwaS1rZXknXSA9IGFwaV9rZXkuY29udGVudDtcbiAgd2luZG93LnBocHZtcy5jb25maWcudXNlcl9hcGlfa2V5ID0gYXBpX2tleS5jb250ZW50O1xuICB3aW5kb3cuUEhQVk1TX1VTRVJfQVBJX0tFWSA9IGFwaV9rZXkuY29udGVudFxufSBlbHNlIHtcbiAgd2luZG93LnBocHZtcy5jb25maWcudXNlcl9hcGlfa2V5ID0gZmFsc2U7XG4gIHdpbmRvdy5QSFBWTVNfVVNFUl9BUElfS0VZID0gZmFsc2U7XG4gIGNvbnNvbGUuZXJyb3IoJ0FQSSBLZXkgbm90IGZvdW5kIScpXG59XG5cbnJlcXVpcmUoJy4vY29tbW9uJyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/bootstrap.js\n"); +eval("Object.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__storage__ = __webpack_require__(\"./resources/js/storage.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__config__ = __webpack_require__(\"./resources/js/config.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__request__ = __webpack_require__(\"./resources/js/request.js\");\n/**\n * Bootstrap any Javascript libraries required\n */\n\n\n\n\n\nwindow.axios = __webpack_require__(\"./node_modules/axios/index.js\");\n\n/**\n * Container for phpVMS specific functions\n */\nwindow.phpvms = {\n config: __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* default */],\n request: __WEBPACK_IMPORTED_MODULE_2__request__[\"a\" /* default */],\n Storage: __WEBPACK_IMPORTED_MODULE_0__storage__[\"a\" /* default */]\n};\n\n__webpack_require__(\"./resources/js/common.js\");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzPzBlNTgiXSwibmFtZXMiOlsid2luZG93IiwiYXhpb3MiLCJyZXF1aXJlIiwicGhwdm1zIiwiY29uZmlnIiwicmVxdWVzdCIsIlN0b3JhZ2UiXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7QUFJQTtBQUNBO0FBQ0E7O0FBRUFBLE9BQU9DLEtBQVAsR0FBZUMsbUJBQU9BLENBQUMsK0JBQVIsQ0FBZjs7QUFFQTs7O0FBR0FGLE9BQU9HLE1BQVAsR0FBZ0I7QUFDZEMsa0VBRGM7QUFFZEMsb0VBRmM7QUFHZEMsb0VBQU9BO0FBSE8sQ0FBaEI7O0FBTUFKLG1CQUFPQSxDQUFDLDBCQUFSIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL2Jvb3RzdHJhcC5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQm9vdHN0cmFwIGFueSBKYXZhc2NyaXB0IGxpYnJhcmllcyByZXF1aXJlZFxuICovXG5cbmltcG9ydCBTdG9yYWdlIGZyb20gJy4vc3RvcmFnZSc7XG5pbXBvcnQgY29uZmlnIGZyb20gJy4vY29uZmlnJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJy4vcmVxdWVzdCc7XG5cbndpbmRvdy5heGlvcyA9IHJlcXVpcmUoJ2F4aW9zJyk7XG5cbi8qKlxuICogQ29udGFpbmVyIGZvciBwaHBWTVMgc3BlY2lmaWMgZnVuY3Rpb25zXG4gKi9cbndpbmRvdy5waHB2bXMgPSB7XG4gIGNvbmZpZyxcbiAgcmVxdWVzdCxcbiAgU3RvcmFnZSxcbn07XG5cbnJlcXVpcmUoJy4vY29tbW9uJyk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvYm9vdHN0cmFwLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/bootstrap.js\n"); /***/ }), /***/ "./resources/js/common.js": /***/ (function(module, exports, __webpack_require__) { -eval("/**\n *\n */\n\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n/**\n * Generic formatter to prepend\n * @param value\n * @param prepend\n * @returns {*}\n */\nrivets.formatters.prepend = function (value, prepend) {\n return prepend + value;\n};\n\n/**\n * Format minutes into HHh MMm\n * @param value\n * @returns {string}\n */\nrivets.formatters.time_hm = function (value) {\n var hours = Math.floor(value / 60);\n var mins = value % 60;\n return hours + 'h ' + mins + 'm';\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.gt = function (value, len) {\n return value.length > len;\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.lt = function (value, len) {\n return value.length < len;\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.eq = function (value, len) {\n return value.length > len;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzPzVmZDUiXSwibmFtZXMiOlsicml2ZXRzIiwicmVxdWlyZSIsImZvcm1hdHRlcnMiLCJwcmVwZW5kIiwidmFsdWUiLCJ0aW1lX2htIiwiaG91cnMiLCJNYXRoIiwiZmxvb3IiLCJtaW5zIiwiZ3QiLCJsZW4iLCJsZW5ndGgiLCJsdCIsImVxIl0sIm1hcHBpbmdzIjoiQUFBQTs7OztBQUlBLElBQU1BLFNBQVNDLG1CQUFPQSxDQUFDLHNDQUFSLENBQWY7O0FBRUE7Ozs7OztBQU1BRCxPQUFPRSxVQUFQLENBQWtCQyxPQUFsQixHQUE0QixVQUFVQyxLQUFWLEVBQWlCRCxPQUFqQixFQUEwQjtBQUNsRCxTQUFPQSxVQUFVQyxLQUFqQjtBQUNILENBRkQ7O0FBSUE7Ozs7O0FBS0FKLE9BQU9FLFVBQVAsQ0FBa0JHLE9BQWxCLEdBQTRCLFVBQVNELEtBQVQsRUFBZ0I7QUFDeEMsTUFBTUUsUUFBUUMsS0FBS0MsS0FBTCxDQUFXSixRQUFRLEVBQW5CLENBQWQ7QUFDQSxNQUFNSyxPQUFPTCxRQUFRLEVBQXJCO0FBQ0EsU0FBT0UsUUFBUSxJQUFSLEdBQWVHLElBQWYsR0FBc0IsR0FBN0I7QUFDSCxDQUpEOztBQU1BOzs7Ozs7QUFNQVQsT0FBT0UsVUFBUCxDQUFrQlEsRUFBbEIsR0FBdUIsVUFBQ04sS0FBRCxFQUFRTyxHQUFSLEVBQWdCO0FBQ25DLFNBQU9QLE1BQU1RLE1BQU4sR0FBZUQsR0FBdEI7QUFDSCxDQUZEOztBQUlBOzs7Ozs7QUFNQVgsT0FBT0UsVUFBUCxDQUFrQlcsRUFBbEIsR0FBdUIsVUFBQ1QsS0FBRCxFQUFRTyxHQUFSLEVBQWdCO0FBQ25DLFNBQU9QLE1BQU1RLE1BQU4sR0FBZUQsR0FBdEI7QUFDSCxDQUZEOztBQUlBOzs7Ozs7QUFNQVgsT0FBT0UsVUFBUCxDQUFrQlksRUFBbEIsR0FBdUIsVUFBQ1YsS0FBRCxFQUFRTyxHQUFSLEVBQWdCO0FBQ25DLFNBQU9QLE1BQU1RLE1BQU4sR0FBZUQsR0FBdEI7QUFDSCxDQUZEIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL2NvbW1vbi5qcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICpcbiAqL1xuXG5jb25zdCByaXZldHMgPSByZXF1aXJlKCdyaXZldHMnKTtcblxuLyoqXG4gKiBHZW5lcmljIGZvcm1hdHRlciB0byBwcmVwZW5kXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBwcmVwZW5kXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMucHJlcGVuZCA9IGZ1bmN0aW9uICh2YWx1ZSwgcHJlcGVuZCkge1xuICAgIHJldHVybiBwcmVwZW5kICsgdmFsdWVcbn07XG5cbi8qKlxuICogRm9ybWF0IG1pbnV0ZXMgaW50byBISGggTU1tXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbnJpdmV0cy5mb3JtYXR0ZXJzLnRpbWVfaG0gPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcih2YWx1ZSAvIDYwKTtcbiAgICBjb25zdCBtaW5zID0gdmFsdWUgJSA2MDtcbiAgICByZXR1cm4gaG91cnMgKyAnaCAnICsgbWlucyArICdtJztcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIGxlblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbnJpdmV0cy5mb3JtYXR0ZXJzLmd0ID0gKHZhbHVlLCBsZW4pID0+IHtcbiAgICByZXR1cm4gdmFsdWUubGVuZ3RoID4gbGVuO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHZhbHVlXG4gKiBAcGFyYW0gbGVuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMubHQgPSAodmFsdWUsIGxlbikgPT4ge1xuICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPCBsZW47XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBsZW5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5yaXZldHMuZm9ybWF0dGVycy5lcSA9ICh2YWx1ZSwgbGVuKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlLmxlbmd0aCA+IGxlbjtcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/common.js\n"); +eval("\nvar rivets = __webpack_require__(\"./node_modules/rivets/dist/rivets.js\");\n\n/**\n * Generic formatter to prepend\n * @param value\n * @param prepend\n * @returns {*}\n */\nrivets.formatters.prepend = function (value, prepend) {\n return prepend + value;\n};\n\n/**\n * Format minutes into HHh MMm\n * @param value\n * @returns {string}\n */\nrivets.formatters.time_hm = function (value) {\n var hours = Math.floor(value / 60);\n var mins = value % 60;\n return hours + 'h ' + mins + 'm';\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.gt = function (value, len) {\n return value.length > len;\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.lt = function (value, len) {\n return value.length < len;\n};\n\n/**\n *\n * @param value\n * @param len\n * @returns {boolean}\n */\nrivets.formatters.eq = function (value, len) {\n return value.length > len;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzPzVmZDUiXSwibmFtZXMiOlsicml2ZXRzIiwicmVxdWlyZSIsImZvcm1hdHRlcnMiLCJwcmVwZW5kIiwidmFsdWUiLCJ0aW1lX2htIiwiaG91cnMiLCJNYXRoIiwiZmxvb3IiLCJtaW5zIiwiZ3QiLCJsZW4iLCJsZW5ndGgiLCJsdCIsImVxIl0sIm1hcHBpbmdzIjoiO0FBQ0EsSUFBTUEsU0FBU0MsbUJBQU9BLENBQUMsc0NBQVIsQ0FBZjs7QUFFQTs7Ozs7O0FBTUFELE9BQU9FLFVBQVAsQ0FBa0JDLE9BQWxCLEdBQTRCLFVBQVVDLEtBQVYsRUFBaUJELE9BQWpCLEVBQTBCO0FBQ3BELFNBQU9BLFVBQVVDLEtBQWpCO0FBQ0QsQ0FGRDs7QUFJQTs7Ozs7QUFLQUosT0FBT0UsVUFBUCxDQUFrQkcsT0FBbEIsR0FBNEIsVUFBVUQsS0FBVixFQUFpQjtBQUMzQyxNQUFNRSxRQUFRQyxLQUFLQyxLQUFMLENBQVdKLFFBQVEsRUFBbkIsQ0FBZDtBQUNBLE1BQU1LLE9BQU9MLFFBQVEsRUFBckI7QUFDQSxTQUFVRSxLQUFWLFVBQW9CRyxJQUFwQjtBQUNELENBSkQ7O0FBTUE7Ozs7OztBQU1BVCxPQUFPRSxVQUFQLENBQWtCUSxFQUFsQixHQUF1QixVQUFDTixLQUFELEVBQVFPLEdBQVI7QUFBQSxTQUFnQlAsTUFBTVEsTUFBTixHQUFlRCxHQUEvQjtBQUFBLENBQXZCOztBQUVBOzs7Ozs7QUFNQVgsT0FBT0UsVUFBUCxDQUFrQlcsRUFBbEIsR0FBdUIsVUFBQ1QsS0FBRCxFQUFRTyxHQUFSO0FBQUEsU0FBZ0JQLE1BQU1RLE1BQU4sR0FBZUQsR0FBL0I7QUFBQSxDQUF2Qjs7QUFFQTs7Ozs7O0FBTUFYLE9BQU9FLFVBQVAsQ0FBa0JZLEVBQWxCLEdBQXVCLFVBQUNWLEtBQUQsRUFBUU8sR0FBUjtBQUFBLFNBQWdCUCxNQUFNUSxNQUFOLEdBQWVELEdBQS9CO0FBQUEsQ0FBdkIiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29tbW9uLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5jb25zdCByaXZldHMgPSByZXF1aXJlKCdyaXZldHMnKTtcblxuLyoqXG4gKiBHZW5lcmljIGZvcm1hdHRlciB0byBwcmVwZW5kXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBwcmVwZW5kXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMucHJlcGVuZCA9IGZ1bmN0aW9uICh2YWx1ZSwgcHJlcGVuZCkge1xuICByZXR1cm4gcHJlcGVuZCArIHZhbHVlO1xufTtcblxuLyoqXG4gKiBGb3JtYXQgbWludXRlcyBpbnRvIEhIaCBNTW1cbiAqIEBwYXJhbSB2YWx1ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMudGltZV9obSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IodmFsdWUgLyA2MCk7XG4gIGNvbnN0IG1pbnMgPSB2YWx1ZSAlIDYwO1xuICByZXR1cm4gYCR7aG91cnN9aCAke21pbnN9bWA7XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBsZW5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5yaXZldHMuZm9ybWF0dGVycy5ndCA9ICh2YWx1ZSwgbGVuKSA9PiB2YWx1ZS5sZW5ndGggPiBsZW47XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIGxlblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbnJpdmV0cy5mb3JtYXR0ZXJzLmx0ID0gKHZhbHVlLCBsZW4pID0+IHZhbHVlLmxlbmd0aCA8IGxlbjtcblxuLyoqXG4gKlxuICogQHBhcmFtIHZhbHVlXG4gKiBAcGFyYW0gbGVuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xucml2ZXRzLmZvcm1hdHRlcnMuZXEgPSAodmFsdWUsIGxlbikgPT4gdmFsdWUubGVuZ3RoID4gbGVuO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL2NvbW1vbi5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/common.js\n"); + +/***/ }), + +/***/ "./resources/js/config.js": +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("\nvar base_url = document.head.querySelector('meta[name=\"base-url\"]');\nvar token = document.head.querySelector('meta[name=\"csrf-token\"]');\nvar api_key = document.head.querySelector('meta[name=\"api-key\"]');\n\n/* harmony default export */ __webpack_exports__[\"a\"] = ({\n api_key: api_key.content || '',\n base_url: base_url.content || '',\n csrf_token: token.content || ''\n});//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvY29uZmlnLmpzPzdmNTciXSwibmFtZXMiOlsiYmFzZV91cmwiLCJkb2N1bWVudCIsImhlYWQiLCJxdWVyeVNlbGVjdG9yIiwidG9rZW4iLCJhcGlfa2V5IiwiY29udGVudCIsImNzcmZfdG9rZW4iXSwibWFwcGluZ3MiOiI7QUFDQSxJQUFNQSxXQUFXQyxTQUFTQyxJQUFULENBQWNDLGFBQWQsQ0FBNEIsdUJBQTVCLENBQWpCO0FBQ0EsSUFBTUMsUUFBUUgsU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHlCQUE1QixDQUFkO0FBQ0EsSUFBTUUsVUFBVUosU0FBU0MsSUFBVCxDQUFjQyxhQUFkLENBQTRCLHNCQUE1QixDQUFoQjs7QUFFZTtBQUNiRSxXQUFTQSxRQUFRQyxPQUFSLElBQW1CLEVBRGY7QUFFYk4sWUFBVUEsU0FBU00sT0FBVCxJQUFvQixFQUZqQjtBQUdiQyxjQUFZSCxNQUFNRSxPQUFOLElBQWlCO0FBSGhCLENBQWYiLCJmaWxlIjoiLi9yZXNvdXJjZXMvanMvY29uZmlnLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5jb25zdCBiYXNlX3VybCA9IGRvY3VtZW50LmhlYWQucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiYmFzZS11cmxcIl0nKTtcbmNvbnN0IHRva2VuID0gZG9jdW1lbnQuaGVhZC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJjc3JmLXRva2VuXCJdJyk7XG5jb25zdCBhcGlfa2V5ID0gZG9jdW1lbnQuaGVhZC5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJhcGkta2V5XCJdJyk7XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgYXBpX2tleTogYXBpX2tleS5jb250ZW50IHx8ICcnLFxuICBiYXNlX3VybDogYmFzZV91cmwuY29udGVudCB8fCAnJyxcbiAgY3NyZl90b2tlbjogdG9rZW4uY29udGVudCB8fCAnJyxcbn07XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvY29uZmlnLmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/config.js\n"); /***/ }), @@ -313,11 +342,19 @@ eval("/**\n * Admin stuff needed\n */\n\n__webpack_require__(\"./resources/js/bo /***/ }), +/***/ "./resources/js/request.js": +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__ = __webpack_require__(\"./node_modules/babel-runtime/regenerator/index.js\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__config__ = __webpack_require__(\"./resources/js/config.js\");\n\n\nvar _this = this;\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\n\n\nvar axios = __webpack_require__(\"./node_modules/axios/index.js\");\n\n/**\n * Run an API request, with some common options\n *\n * @param {Object|String} _opts Axios request options, or pass a URL\n * @param {String} _opts.url\n */\n/* harmony default export */ __webpack_exports__[\"a\"] = ((function () {\n var _ref = _asyncToGenerator( /*#__PURE__*/__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.mark(function _callee(_opts) {\n var opts;\n return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n if (typeof _opts === 'string' || _opts instanceof String) {\n // eslint-disable-next-line no-param-reassign\n _opts = {\n url: _opts\n };\n }\n\n opts = Object.assign({}, {\n baseURL: __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* default */].base_url,\n headers: {\n 'X-API-KEY': __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* default */].api_key,\n 'X-CSRF-TOKEN': __WEBPACK_IMPORTED_MODULE_1__config__[\"a\" /* default */].csrf_token\n }\n }, _opts);\n return _context.abrupt('return', axios.request(opts));\n\n case 3:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, _this);\n }));\n\n return function (_x) {\n return _ref.apply(this, arguments);\n };\n})());//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvcmVxdWVzdC5qcz84MjVlIl0sIm5hbWVzIjpbImF4aW9zIiwicmVxdWlyZSIsIl9vcHRzIiwiU3RyaW5nIiwidXJsIiwib3B0cyIsIk9iamVjdCIsImFzc2lnbiIsImJhc2VVUkwiLCJjb25maWciLCJiYXNlX3VybCIsImhlYWRlcnMiLCJhcGlfa2V5IiwiY3NyZl90b2tlbiIsInJlcXVlc3QiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUNBOztBQUVBLElBQU1BLFFBQVFDLG1CQUFPQSxDQUFDLCtCQUFSLENBQWQ7O0FBRUE7Ozs7OztBQU1lO0FBQWYsb0hBQWUsaUJBQU9DLEtBQVA7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ2IsZ0JBQUksT0FBT0EsS0FBUCxLQUFpQixRQUFqQixJQUE2QkEsaUJBQWlCQyxNQUFsRCxFQUEwRDtBQUN4RDtBQUNBRCxzQkFBUTtBQUNORSxxQkFBS0Y7QUFEQyxlQUFSO0FBR0Q7O0FBRUtHLGdCQVJPLEdBUUFDLE9BQU9DLE1BQVAsQ0FBYyxFQUFkLEVBQWtCO0FBQzdCQyx1QkFBU0Msd0RBQU1BLENBQUNDLFFBRGE7QUFFN0JDLHVCQUFTO0FBQ1AsNkJBQWFGLHdEQUFNQSxDQUFDRyxPQURiO0FBRVAsZ0NBQWdCSCx3REFBTUEsQ0FBQ0k7QUFGaEI7QUFGb0IsYUFBbEIsRUFNVlgsS0FOVSxDQVJBO0FBQUEsNkNBZ0JORixNQUFNYyxPQUFOLENBQWNULElBQWQsQ0FoQk07O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsR0FBZjs7QUFBQTtBQUFBO0FBQUE7QUFBQSIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9yZXF1ZXN0LmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQgY29uZmlnIGZyb20gJy4vY29uZmlnJztcblxuY29uc3QgYXhpb3MgPSByZXF1aXJlKCdheGlvcycpO1xuXG4vKipcbiAqIFJ1biBhbiBBUEkgcmVxdWVzdCwgd2l0aCBzb21lIGNvbW1vbiBvcHRpb25zXG4gKlxuICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBfb3B0cyBBeGlvcyByZXF1ZXN0IG9wdGlvbnMsIG9yIHBhc3MgYSBVUkxcbiAqIEBwYXJhbSB7U3RyaW5nfSBfb3B0cy51cmxcbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgKF9vcHRzKSA9PiB7XG4gIGlmICh0eXBlb2YgX29wdHMgPT09ICdzdHJpbmcnIHx8IF9vcHRzIGluc3RhbmNlb2YgU3RyaW5nKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgX29wdHMgPSB7XG4gICAgICB1cmw6IF9vcHRzLFxuICAgIH07XG4gIH1cblxuICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbih7fSwge1xuICAgIGJhc2VVUkw6IGNvbmZpZy5iYXNlX3VybCxcbiAgICBoZWFkZXJzOiB7XG4gICAgICAnWC1BUEktS0VZJzogY29uZmlnLmFwaV9rZXksXG4gICAgICAnWC1DU1JGLVRPS0VOJzogY29uZmlnLmNzcmZfdG9rZW4sXG4gICAgfSxcbiAgfSwgX29wdHMpO1xuXG4gIHJldHVybiBheGlvcy5yZXF1ZXN0KG9wdHMpO1xufTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyAuL3Jlc291cmNlcy9qcy9yZXF1ZXN0LmpzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./resources/js/request.js\n"); + +/***/ }), + /***/ "./resources/js/storage.js": /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("\n\n/**\n * Simple browser storage interface\n */\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Storage = function () {\n function Storage(name, default_value) {\n _classCallCheck(this, Storage);\n\n this.name = name;\n\n // Read the object from storage; if it doesn't exist, set\n // it to the default value\n var st = window.localStorage.getItem(this.name);\n if (!st) {\n console.log('Nothing found in storage, starting from default');\n this.data = default_value;\n } else {\n console.log('Found in storage: ', st);\n this.data = JSON.parse(st);\n }\n }\n\n /**\n * Save to local storage\n */\n\n\n _createClass(Storage, [{\n key: 'save',\n value: function save() {\n window.localStorage.setItem(this.name, JSON.stringify(this.data));\n }\n\n /**\n * Return a list from a given key\n *\n * @param {String} key\n *\n * @returns {Array|*}\n */\n\n }, {\n key: 'getList',\n value: function getList(key) {\n if (!(key in this.data)) {\n return [];\n }\n\n return this.data[key];\n }\n\n /**\n * Add `value` to a given `key`\n *\n * @param {string} key\n * @param {*} value\n */\n\n }, {\n key: 'addToList',\n value: function addToList(key, value) {\n if (!(key in this.data)) {\n this.data[key] = [];\n }\n\n var index = this.data[key].indexOf(value);\n if (index === -1) {\n this.data[key].push(value);\n }\n }\n\n /**\n * Remove `value` from the given `key`\n *\n * @param {String} key\n * @param {*} value\n */\n\n }, {\n key: 'removeFromList',\n value: function removeFromList(key, value) {\n if (!(key in this.data)) {\n return;\n }\n\n var index = this.data[key].indexOf(value);\n if (index !== -1) {\n this.data[key].splice(index, 1);\n }\n }\n }]);\n\n return Storage;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Storage);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc3RvcmFnZS5qcz83YjRhIl0sIm5hbWVzIjpbIlN0b3JhZ2UiLCJuYW1lIiwiZGVmYXVsdF92YWx1ZSIsInN0Iiwid2luZG93IiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsImNvbnNvbGUiLCJsb2ciLCJkYXRhIiwiSlNPTiIsInBhcnNlIiwic2V0SXRlbSIsInN0cmluZ2lmeSIsImtleSIsInZhbHVlIiwiaW5kZXgiLCJpbmRleE9mIiwicHVzaCIsInNwbGljZSJdLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7Ozs7Ozs7O0lBR3FCQSxPO0FBQ2pCLHFCQUFZQyxJQUFaLEVBQWtCQyxhQUFsQixFQUFpQztBQUFBOztBQUM3QixhQUFLRCxJQUFMLEdBQVlBLElBQVo7O0FBRUE7QUFDQTtBQUNBLFlBQU1FLEtBQUtDLE9BQU9DLFlBQVAsQ0FBb0JDLE9BQXBCLENBQTRCLEtBQUtMLElBQWpDLENBQVg7QUFDQSxZQUFJLENBQUNFLEVBQUwsRUFBUztBQUNMSSxvQkFBUUMsR0FBUixDQUFZLGlEQUFaO0FBQ0EsaUJBQUtDLElBQUwsR0FBWVAsYUFBWjtBQUNILFNBSEQsTUFHTztBQUNISyxvQkFBUUMsR0FBUixDQUFZLG9CQUFaLEVBQWtDTCxFQUFsQztBQUNBLGlCQUFLTSxJQUFMLEdBQVlDLEtBQUtDLEtBQUwsQ0FBV1IsRUFBWCxDQUFaO0FBQ0g7QUFDSjs7QUFFRDs7Ozs7OzsrQkFHTztBQUNIQyxtQkFBT0MsWUFBUCxDQUFvQk8sT0FBcEIsQ0FBNEIsS0FBS1gsSUFBakMsRUFBdUNTLEtBQUtHLFNBQUwsQ0FBZSxLQUFLSixJQUFwQixDQUF2QztBQUNIOztBQUVEOzs7Ozs7Ozs7O2dDQU9RSyxHLEVBQUs7QUFDVCxnQkFBSSxFQUFFQSxPQUFPLEtBQUtMLElBQWQsQ0FBSixFQUF5QjtBQUNyQix1QkFBTyxFQUFQO0FBQ0g7O0FBRUQsbUJBQU8sS0FBS0EsSUFBTCxDQUFVSyxHQUFWLENBQVA7QUFDSDs7QUFFRDs7Ozs7Ozs7O2tDQU1VQSxHLEVBQUtDLEssRUFBTztBQUNsQixnQkFBSSxFQUFFRCxPQUFPLEtBQUtMLElBQWQsQ0FBSixFQUF5QjtBQUNyQixxQkFBS0EsSUFBTCxDQUFVSyxHQUFWLElBQWlCLEVBQWpCO0FBQ0g7O0FBRUQsZ0JBQU1FLFFBQVEsS0FBS1AsSUFBTCxDQUFVSyxHQUFWLEVBQWVHLE9BQWYsQ0FBdUJGLEtBQXZCLENBQWQ7QUFDQSxnQkFBSUMsVUFBVSxDQUFDLENBQWYsRUFBa0I7QUFDZCxxQkFBS1AsSUFBTCxDQUFVSyxHQUFWLEVBQWVJLElBQWYsQ0FBb0JILEtBQXBCO0FBQ0g7QUFDSjs7QUFFRDs7Ozs7Ozs7O3VDQU1lRCxHLEVBQUtDLEssRUFBTztBQUN2QixnQkFBSSxFQUFFRCxPQUFPLEtBQUtMLElBQWQsQ0FBSixFQUF5QjtBQUNyQjtBQUNIOztBQUVELGdCQUFNTyxRQUFRLEtBQUtQLElBQUwsQ0FBVUssR0FBVixFQUFlRyxPQUFmLENBQXVCRixLQUF2QixDQUFkO0FBQ0EsZ0JBQUlDLFVBQVUsQ0FBQyxDQUFmLEVBQWtCO0FBQ2QscUJBQUtQLElBQUwsQ0FBVUssR0FBVixFQUFlSyxNQUFmLENBQXNCSCxLQUF0QixFQUE2QixDQUE3QjtBQUNIO0FBQ0o7Ozs7OztBQXRFZ0JoQixnRSIsImZpbGUiOiIuL3Jlc291cmNlcy9qcy9zdG9yYWdlLmpzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vKipcbiAqIFNpbXBsZSBicm93c2VyIHN0b3JhZ2UgaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0b3JhZ2Uge1xuICAgIGNvbnN0cnVjdG9yKG5hbWUsIGRlZmF1bHRfdmFsdWUpIHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcblxuICAgICAgICAvLyBSZWFkIHRoZSBvYmplY3QgZnJvbSBzdG9yYWdlOyBpZiBpdCBkb2Vzbid0IGV4aXN0LCBzZXRcbiAgICAgICAgLy8gaXQgdG8gdGhlIGRlZmF1bHQgdmFsdWVcbiAgICAgICAgY29uc3Qgc3QgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5uYW1lKTtcbiAgICAgICAgaWYgKCFzdCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ05vdGhpbmcgZm91bmQgaW4gc3RvcmFnZSwgc3RhcnRpbmcgZnJvbSBkZWZhdWx0Jyk7XG4gICAgICAgICAgICB0aGlzLmRhdGEgPSBkZWZhdWx0X3ZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZvdW5kIGluIHN0b3JhZ2U6ICcsIHN0KTtcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IEpTT04ucGFyc2Uoc3QpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2F2ZSB0byBsb2NhbCBzdG9yYWdlXG4gICAgICovXG4gICAgc2F2ZSgpIHtcbiAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKHRoaXMubmFtZSwgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJuIGEgbGlzdCBmcm9tIGEgZ2l2ZW4ga2V5XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8Kn1cbiAgICAgKi9cbiAgICBnZXRMaXN0KGtleSkge1xuICAgICAgICBpZiAoIShrZXkgaW4gdGhpcy5kYXRhKSkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVtrZXldO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCBgdmFsdWVgIHRvIGEgZ2l2ZW4gYGtleWBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAgICovXG4gICAgYWRkVG9MaXN0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluIHRoaXMuZGF0YSkpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVtrZXldID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZGF0YVtrZXldLmluZGV4T2YodmFsdWUpO1xuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGFba2V5XS5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBgdmFsdWVgIGZyb20gdGhlIGdpdmVuIGBrZXlgXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gICAgICogQHBhcmFtIHsqfSB2YWx1ZVxuICAgICAqL1xuICAgIHJlbW92ZUZyb21MaXN0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluIHRoaXMuZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5kYXRhW2tleV0uaW5kZXhPZih2YWx1ZSk7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVtrZXldLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gLi9yZXNvdXJjZXMvanMvc3RvcmFnZS5qcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./resources/js/storage.js\n"); +eval("var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Simple browser storage interface\n */\nvar Storage = function () {\n function Storage(name, default_value) {\n _classCallCheck(this, Storage);\n\n this.name = name;\n\n // Read the object from storage; if it doesn't exist, set\n // it to the default value\n var st = window.localStorage.getItem(this.name);\n if (!st) {\n console.log('Nothing found in storage, starting from default');\n this.data = default_value;\n } else {\n console.log('Found in storage: ', st);\n this.data = JSON.parse(st);\n }\n }\n\n /**\n * Save to local storage\n */\n\n\n _createClass(Storage, [{\n key: 'save',\n value: function save() {\n window.localStorage.setItem(this.name, JSON.stringify(this.data));\n }\n\n /**\n * Return a list from a given key\n *\n * @param {String} key\n *\n * @returns {Array|*}\n */\n\n }, {\n key: 'getList',\n value: function getList(key) {\n if (!(key in this.data)) {\n return [];\n }\n\n return this.data[key];\n }\n\n /**\n * Add `value` to a given `key`\n *\n * @param {string} key\n * @param {*} value\n */\n\n }, {\n key: 'addToList',\n value: function addToList(key, value) {\n if (!(key in this.data)) {\n this.data[key] = [];\n }\n\n var index = this.data[key].indexOf(value);\n if (index === -1) {\n this.data[key].push(value);\n }\n }\n\n /**\n * Remove `value` from the given `key`\n *\n * @param {String} key\n * @param {*} value\n */\n\n }, {\n key: 'removeFromList',\n value: function removeFromList(key, value) {\n if (!(key in this.data)) {\n return;\n }\n\n var index = this.data[key].indexOf(value);\n if (index !== -1) {\n this.data[key].splice(index, 1);\n }\n }\n }]);\n\n return Storage;\n}();\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (Storage);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9yZXNvdXJjZXMvanMvc3RvcmFnZS5qcz83YjRhIl0sIm5hbWVzIjpbIlN0b3JhZ2UiLCJuYW1lIiwiZGVmYXVsdF92YWx1ZSIsInN0Iiwid2luZG93IiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsImNvbnNvbGUiLCJsb2ciLCJkYXRhIiwiSlNPTiIsInBhcnNlIiwic2V0SXRlbSIsInN0cmluZ2lmeSIsImtleSIsInZhbHVlIiwiaW5kZXgiLCJpbmRleE9mIiwicHVzaCIsInNwbGljZSJdLCJtYXBwaW5ncyI6Ijs7OztBQUNBOzs7SUFHcUJBLE87QUFDbkIsbUJBQVlDLElBQVosRUFBa0JDLGFBQWxCLEVBQWlDO0FBQUE7O0FBQy9CLFNBQUtELElBQUwsR0FBWUEsSUFBWjs7QUFFQTtBQUNBO0FBQ0EsUUFBTUUsS0FBS0MsT0FBT0MsWUFBUCxDQUFvQkMsT0FBcEIsQ0FBNEIsS0FBS0wsSUFBakMsQ0FBWDtBQUNBLFFBQUksQ0FBQ0UsRUFBTCxFQUFTO0FBQ1BJLGNBQVFDLEdBQVIsQ0FBWSxpREFBWjtBQUNBLFdBQUtDLElBQUwsR0FBWVAsYUFBWjtBQUNELEtBSEQsTUFHTztBQUNMSyxjQUFRQyxHQUFSLENBQVksb0JBQVosRUFBa0NMLEVBQWxDO0FBQ0EsV0FBS00sSUFBTCxHQUFZQyxLQUFLQyxLQUFMLENBQVdSLEVBQVgsQ0FBWjtBQUNEO0FBQ0Y7O0FBRUQ7Ozs7Ozs7MkJBR087QUFDTEMsYUFBT0MsWUFBUCxDQUFvQk8sT0FBcEIsQ0FBNEIsS0FBS1gsSUFBakMsRUFBdUNTLEtBQUtHLFNBQUwsQ0FBZSxLQUFLSixJQUFwQixDQUF2QztBQUNEOztBQUVEOzs7Ozs7Ozs7OzRCQU9RSyxHLEVBQUs7QUFDWCxVQUFJLEVBQUVBLE9BQU8sS0FBS0wsSUFBZCxDQUFKLEVBQXlCO0FBQ3ZCLGVBQU8sRUFBUDtBQUNEOztBQUVELGFBQU8sS0FBS0EsSUFBTCxDQUFVSyxHQUFWLENBQVA7QUFDRDs7QUFFRDs7Ozs7Ozs7OzhCQU1VQSxHLEVBQUtDLEssRUFBTztBQUNwQixVQUFJLEVBQUVELE9BQU8sS0FBS0wsSUFBZCxDQUFKLEVBQXlCO0FBQ3ZCLGFBQUtBLElBQUwsQ0FBVUssR0FBVixJQUFpQixFQUFqQjtBQUNEOztBQUVELFVBQU1FLFFBQVEsS0FBS1AsSUFBTCxDQUFVSyxHQUFWLEVBQWVHLE9BQWYsQ0FBdUJGLEtBQXZCLENBQWQ7QUFDQSxVQUFJQyxVQUFVLENBQUMsQ0FBZixFQUFrQjtBQUNoQixhQUFLUCxJQUFMLENBQVVLLEdBQVYsRUFBZUksSUFBZixDQUFvQkgsS0FBcEI7QUFDRDtBQUNGOztBQUVEOzs7Ozs7Ozs7bUNBTWVELEcsRUFBS0MsSyxFQUFPO0FBQ3pCLFVBQUksRUFBRUQsT0FBTyxLQUFLTCxJQUFkLENBQUosRUFBeUI7QUFDdkI7QUFDRDs7QUFFRCxVQUFNTyxRQUFRLEtBQUtQLElBQUwsQ0FBVUssR0FBVixFQUFlRyxPQUFmLENBQXVCRixLQUF2QixDQUFkO0FBQ0EsVUFBSUMsVUFBVSxDQUFDLENBQWYsRUFBa0I7QUFDaEIsYUFBS1AsSUFBTCxDQUFVSyxHQUFWLEVBQWVLLE1BQWYsQ0FBc0JILEtBQXRCLEVBQTZCLENBQTdCO0FBQ0Q7QUFDRjs7Ozs7O0FBdEVrQmhCLGdFIiwiZmlsZSI6Ii4vcmVzb3VyY2VzL2pzL3N0b3JhZ2UuanMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogU2ltcGxlIGJyb3dzZXIgc3RvcmFnZSBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RvcmFnZSB7XG4gIGNvbnN0cnVjdG9yKG5hbWUsIGRlZmF1bHRfdmFsdWUpIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuXG4gICAgLy8gUmVhZCB0aGUgb2JqZWN0IGZyb20gc3RvcmFnZTsgaWYgaXQgZG9lc24ndCBleGlzdCwgc2V0XG4gICAgLy8gaXQgdG8gdGhlIGRlZmF1bHQgdmFsdWVcbiAgICBjb25zdCBzdCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLm5hbWUpO1xuICAgIGlmICghc3QpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdOb3RoaW5nIGZvdW5kIGluIHN0b3JhZ2UsIHN0YXJ0aW5nIGZyb20gZGVmYXVsdCcpO1xuICAgICAgdGhpcy5kYXRhID0gZGVmYXVsdF92YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coJ0ZvdW5kIGluIHN0b3JhZ2U6ICcsIHN0KTtcbiAgICAgIHRoaXMuZGF0YSA9IEpTT04ucGFyc2Uoc3QpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgICAqIFNhdmUgdG8gbG9jYWwgc3RvcmFnZVxuICAgICAqL1xuICBzYXZlKCkge1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0aGlzLm5hbWUsIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSkpO1xuICB9XG5cbiAgLyoqXG4gICAgICogUmV0dXJuIGEgbGlzdCBmcm9tIGEgZ2l2ZW4ga2V5XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30ga2V5XG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7QXJyYXl8Kn1cbiAgICAgKi9cbiAgZ2V0TGlzdChrZXkpIHtcbiAgICBpZiAoIShrZXkgaW4gdGhpcy5kYXRhKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRhdGFba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgICAqIEFkZCBgdmFsdWVgIHRvIGEgZ2l2ZW4gYGtleWBcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAgICovXG4gIGFkZFRvTGlzdChrZXksIHZhbHVlKSB7XG4gICAgaWYgKCEoa2V5IGluIHRoaXMuZGF0YSkpIHtcbiAgICAgIHRoaXMuZGF0YVtrZXldID0gW107XG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmRhdGFba2V5XS5pbmRleE9mKHZhbHVlKTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICB0aGlzLmRhdGFba2V5XS5wdXNoKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICAgKiBSZW1vdmUgYHZhbHVlYCBmcm9tIHRoZSBnaXZlbiBga2V5YFxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGtleVxuICAgICAqIEBwYXJhbSB7Kn0gdmFsdWVcbiAgICAgKi9cbiAgcmVtb3ZlRnJvbUxpc3Qoa2V5LCB2YWx1ZSkge1xuICAgIGlmICghKGtleSBpbiB0aGlzLmRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmRhdGFba2V5XS5pbmRleE9mKHZhbHVlKTtcbiAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmRhdGFba2V5XS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIC4vcmVzb3VyY2VzL2pzL3N0b3JhZ2UuanMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./resources/js/storage.js\n"); /***/ }), diff --git a/public/mix-manifest.json b/public/mix-manifest.json index e3ca1a3d..4e70ea8e 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -1,9 +1,9 @@ { - "/assets/frontend/js/app.js": "/assets/frontend/js/app.js?id=4ef5a26ff476bb0a9fcf", + "/assets/frontend/js/app.js": "/assets/frontend/js/app.js?id=96bf382a8107b3fa5495", "/assets/frontend/css/now-ui-kit.css": "/assets/frontend/css/now-ui-kit.css?id=c4987da93365a82d32b6", "/assets/admin/css/vendor.min.css": "/assets/admin/css/vendor.min.css?id=da87041e81048759bd41", - "/assets/admin/js/app.js": "/assets/admin/js/app.js?id=918b9ff17affe36bab4c", - "/assets/installer/js/app.js": "/assets/installer/js/app.js?id=964075bbd7379552bc05", + "/assets/admin/js/app.js": "/assets/admin/js/app.js?id=09af8d2b342688a72153", + "/assets/installer/js/app.js": "/assets/installer/js/app.js?id=db625369782c7597e139", "/assets/fonts/glyphicons-halflings-regular.woff2": "/assets/fonts/glyphicons-halflings-regular.woff2?id=349344e92fb16221dd56", "/assets/admin/fonts/glyphicons-halflings-regular.woff2": "/assets/admin/fonts/glyphicons-halflings-regular.woff2?id=349344e92fb16221dd56", "/assets/admin/img/clear.png": "/assets/admin/img/clear.png?id=63b3af84650a0145d61a", diff --git a/resources/js/admin/airport_lookup.js b/resources/js/admin/airport_lookup.js index bfa927e1..2deca124 100644 --- a/resources/js/admin/airport_lookup.js +++ b/resources/js/admin/airport_lookup.js @@ -1,4 +1,5 @@ -'use strict'; + +import request from '../request'; /** * Lookup an airport from the server @@ -6,12 +7,12 @@ * @param {String} icao */ export default async (icao) => { - let params = { - method: 'GET', - url: '/api/airports/' + icao + '/lookup', - }; + const params = { + method: 'GET', + url: `/api/airports/${icao}/lookup`, + }; - const response = await axios(params); - console.log('lookup raw response: ', response); - return response.data; + const response = await request(params); + console.log('lookup raw response: ', response); + return response.data; }; diff --git a/resources/js/admin/app.js b/resources/js/admin/app.js index 4a8177b1..9c032114 100644 --- a/resources/js/admin/app.js +++ b/resources/js/admin/app.js @@ -3,10 +3,10 @@ */ -require('./../bootstrap'); +import airport_lookup from './airport_lookup'; +import calculate_distance from './calculate_distance'; -import airport_lookup from "./airport_lookup"; -import calculate_distance from "./calculate_distance"; +require('./../bootstrap'); window.phpvms.airport_lookup = airport_lookup; window.phpvms.calculate_distance = calculate_distance; diff --git a/resources/js/admin/calculate_distance.js b/resources/js/admin/calculate_distance.js index 0404b001..ff3c0c65 100644 --- a/resources/js/admin/calculate_distance.js +++ b/resources/js/admin/calculate_distance.js @@ -1,3 +1,6 @@ + +import request from '../request'; + /** * Lookup an airport from the server * @@ -5,12 +8,12 @@ * @param {String} toICAO */ export default async (fromICAO, toICAO) => { - let params = { - method: 'GET', - url: '/api/airports/' + fromICAO + '/distance/' + toICAO, - }; + const params = { + method: 'GET', + url: `/api/airports/${fromICAO}/distance/${toICAO}`, + }; - const response = await axios(params); - console.log('distance raw response: ', response); - return response.data; + const response = await request(params); + console.log('distance raw response: ', response); + return response.data; }; diff --git a/resources/js/bootstrap.js b/resources/js/bootstrap.js index 0259b3eb..3b29becc 100644 --- a/resources/js/bootstrap.js +++ b/resources/js/bootstrap.js @@ -2,49 +2,19 @@ * Bootstrap any Javascript libraries required */ +import Storage from './storage'; +import config from './config'; +import request from './request'; window.axios = require('axios'); -import Storage from "./storage"; - /** * Container for phpVMS specific functions */ window.phpvms = { - config: {}, + config, + request, Storage, }; -/** - * Configure Axios with both the csrf token and the API key - */ - -const base_url = document.head.querySelector('meta[name="base-url"]'); -if(base_url) { - console.log(`baseURL=${base_url.content}`); - window.phpvms.config.base_url = base_url.content; - window.axios.default.baseURL = base_url.content; -} - -window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; -const token = document.head.querySelector('meta[name="csrf-token"]'); - -if (token) { - window.phpvms.config.csrf_token = token.content; - window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content -} else { - console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token') -} - -const api_key = document.head.querySelector('meta[name="api-key"]'); -if (api_key) { - window.axios.defaults.headers.common['x-api-key'] = api_key.content; - window.phpvms.config.user_api_key = api_key.content; - window.PHPVMS_USER_API_KEY = api_key.content -} else { - window.phpvms.config.user_api_key = false; - window.PHPVMS_USER_API_KEY = false; - console.error('API Key not found!') -} - require('./common'); diff --git a/resources/js/common.js b/resources/js/common.js index 754eda28..ceeb933c 100644 --- a/resources/js/common.js +++ b/resources/js/common.js @@ -1,6 +1,3 @@ -/** - * - */ const rivets = require('rivets'); @@ -11,7 +8,7 @@ const rivets = require('rivets'); * @returns {*} */ rivets.formatters.prepend = function (value, prepend) { - return prepend + value + return prepend + value; }; /** @@ -19,10 +16,10 @@ rivets.formatters.prepend = function (value, prepend) { * @param value * @returns {string} */ -rivets.formatters.time_hm = function(value) { - const hours = Math.floor(value / 60); - const mins = value % 60; - return hours + 'h ' + mins + 'm'; +rivets.formatters.time_hm = function (value) { + const hours = Math.floor(value / 60); + const mins = value % 60; + return `${hours}h ${mins}m`; }; /** @@ -31,9 +28,7 @@ rivets.formatters.time_hm = function(value) { * @param len * @returns {boolean} */ -rivets.formatters.gt = (value, len) => { - return value.length > len; -}; +rivets.formatters.gt = (value, len) => value.length > len; /** * @@ -41,9 +36,7 @@ rivets.formatters.gt = (value, len) => { * @param len * @returns {boolean} */ -rivets.formatters.lt = (value, len) => { - return value.length < len; -}; +rivets.formatters.lt = (value, len) => value.length < len; /** * @@ -51,6 +44,4 @@ rivets.formatters.lt = (value, len) => { * @param len * @returns {boolean} */ -rivets.formatters.eq = (value, len) => { - return value.length > len; -}; +rivets.formatters.eq = (value, len) => value.length > len; diff --git a/resources/js/config.js b/resources/js/config.js new file mode 100644 index 00000000..74e6f3fb --- /dev/null +++ b/resources/js/config.js @@ -0,0 +1,10 @@ + +const base_url = document.head.querySelector('meta[name="base-url"]'); +const token = document.head.querySelector('meta[name="csrf-token"]'); +const api_key = document.head.querySelector('meta[name="api-key"]'); + +export default { + api_key: api_key.content || '', + base_url: base_url.content || '', + csrf_token: token.content || '', +}; diff --git a/resources/js/frontend/app.js b/resources/js/frontend/app.js index f488e6b3..f46b30d7 100644 --- a/resources/js/frontend/app.js +++ b/resources/js/frontend/app.js @@ -1,11 +1,12 @@ +// Import the bids functionality +import { addBid, removeBid } from './bids'; + require('./../bootstrap'); -// Import the bids functionality -import {addBid, removeBid} from './bids'; window.phpvms.bids = { - addBid, - removeBid, + addBid, + removeBid, }; // Import the mapping function diff --git a/resources/js/frontend/bids.js b/resources/js/frontend/bids.js index b1abd690..13d85b57 100644 --- a/resources/js/frontend/bids.js +++ b/resources/js/frontend/bids.js @@ -1,4 +1,5 @@ -'use strict'; + +import request from '../request'; /** * Add a bid to a flight @@ -8,16 +9,16 @@ * @returns {Promise<*>} */ export async function addBid(flight_id) { - const params = { - method: 'POST', - url: '/api/user/bids', - data: { - '_method': 'POST', - 'flight_id': flight_id - } - }; + const params = { + method: 'POST', + url: '/api/user/bids', + data: { + _method: 'POST', + flight_id, + }, + }; - return axios(params); + return request(params); } /** @@ -28,14 +29,14 @@ export async function addBid(flight_id) { * @returns {Promise<*>} */ export async function removeBid(flight_id) { - const params = { - method: 'POST', - url: '/api/user/bids', - data: { - '_method': 'DELETE', - 'flight_id': flight_id - } - }; + const params = { + method: 'POST', + url: '/api/user/bids', + data: { + _method: 'DELETE', + flight_id, + }, + }; - return axios(params); + return request(params); } diff --git a/resources/js/maps/airspace_map.js b/resources/js/maps/airspace_map.js index 6718e446..cbff1773 100644 --- a/resources/js/maps/airspace_map.js +++ b/resources/js/maps/airspace_map.js @@ -1,16 +1,16 @@ +import draw_base_map from './base_map'; +import { addWMSLayer } from './helpers'; + const leaflet = require('leaflet'); -import draw_base_map from './base_map' -import { addWMSLayer } from './helpers'; - /** * Render a map with the airspace, etc around a given set of coords * e.g, the airport map - * @param opts + * @param {Object} _opts */ -export default (opts) => { - opts = Object.assign({ +export default (_opts) => { + const opts = Object.assign({ render_elem: 'map', overlay_elem: '', lat: 0, @@ -22,12 +22,12 @@ export default (opts) => { // Passed from the config/maps.php file metar_wms: { - url: '', - params: {} + url: '', + params: {}, }, - }, opts); + }, _opts); - let map = draw_base_map(opts); + const map = draw_base_map(opts); const coords = [opts.lat, opts.lon]; console.log('Applying coords', coords); @@ -36,8 +36,8 @@ export default (opts) => { leaflet.marker(coords).addTo(map).bindPopup(opts.marker_popup); } - if(opts.metar_wms.url !== '') { - addWMSLayer(map, opts.metar_wms); + if (opts.metar_wms.url !== '') { + addWMSLayer(map, opts.metar_wms); } return map; diff --git a/resources/js/maps/base_map.js b/resources/js/maps/base_map.js index fff2c335..9348d09a 100644 --- a/resources/js/maps/base_map.js +++ b/resources/js/maps/base_map.js @@ -1,62 +1,62 @@ -// const leaflet = require('leaflet'); require('leaflet-providers'); -export default (opts) => { +export default (_opts) => { + const opts = Object.assign({ + render_elem: 'map', + center: [29.98139, -95.33374], + zoom: 5, + maxZoom: 10, + layers: [], + set_marker: false, + providers: [ + 'Esri.WorldStreetMap', + ], + tile_layers: [], + }, _opts); - opts = Object.assign({ - render_elem: 'map', - center: [29.98139, -95.33374], - zoom: 5, - maxZoom: 10, - layers: [], - set_marker: false, - providers: [ - 'Esri.WorldStreetMap', - ], - tile_layers: [], - }, opts); + /* + let feature_groups = []; + const openaip_airspace_labels = new leaflet.TileLayer.WMS( + "http://{s}.tile.maps.openaip.net/geowebcache/service/wms", { + maxZoom: 14, + minZoom: 12, + layers: 'openaip_approved_airspaces_labels', + tileSize: 1024, + detectRetina: true, + subdomains: '12', + format: 'image/png', + transparent: true + }); - /* - let feature_groups = []; - const openaip_airspace_labels = new leaflet.TileLayer.WMS( - "http://{s}.tile.maps.openaip.net/geowebcache/service/wms", { - maxZoom: 14, - minZoom: 12, - layers: 'openaip_approved_airspaces_labels', - tileSize: 1024, - detectRetina: true, - subdomains: '12', - format: 'image/png', - transparent: true - }); + openaip_airspace_labels.addTo(map); */ - openaip_airspace_labels.addTo(map);*/ + /* + const openaip_cached_basemap = new leaflet.TileLayer("http://{s}.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_basemap@EPSG%3A900913@png/{z}/{x}/{y}.png", { + maxZoom: 14, + minZoom: 4, + tms: true, + detectRetina: true, + subdomains: '12', + format: 'image/png', + transparent: true + }); - /*const openaip_cached_basemap = new leaflet.TileLayer("http://{s}.tile.maps.openaip.net/geowebcache/service/tms/1.0.0/openaip_basemap@EPSG%3A900913@png/{z}/{x}/{y}.png", { - maxZoom: 14, - minZoom: 4, - tms: true, - detectRetina: true, - subdomains: '12', - format: 'image/png', - transparent: true - }); + feature_groups.push(openaip_cached_basemap); + */ - feature_groups.push(openaip_cached_basemap); - */ + const map = leaflet.map('map', { + // layers: [openaip_basemap_phys_osm], + center: opts.center, + zoom: opts.zoom, + scrollWheelZoom: false, + }); - let map = leaflet.map('map', { - //layers: [openaip_basemap_phys_osm], - center: opts.center, - zoom: opts.zoom, - scrollWheelZoom: false, - }); + // eslint-disable-next-line no-unused-vars + opts.providers.forEach((p, idx) => { + leaflet.tileLayer.provider(p).addTo(map); + }); - for(const i in opts.providers) { - leaflet.tileLayer.provider(opts.providers[i]).addTo(map); - } - - return map; + return map; }; diff --git a/resources/js/maps/config.js b/resources/js/maps/config.js index 50b2518d..aaf1eaa9 100644 --- a/resources/js/maps/config.js +++ b/resources/js/maps/config.js @@ -1,4 +1,3 @@ -export let - PLAN_ROUTE_COLOR = '#043758', - ACTUAL_ROUTE_COLOR = '#067ec1', - CIRCLE_COLOR = '#056093'; +export const PLAN_ROUTE_COLOR = '#043758'; +export const ACTUAL_ROUTE_COLOR = '#067ec1'; +export const CIRCLE_COLOR = '#056093'; diff --git a/resources/js/maps/helpers.js b/resources/js/maps/helpers.js index 4df02a77..b48a2bf5 100644 --- a/resources/js/maps/helpers.js +++ b/resources/js/maps/helpers.js @@ -11,25 +11,24 @@ const leaflet = require('leaflet'); * @param opts */ export function addWMSLayer(map, opts) { + if (opts.url === '') { + return null; + } - if(opts.url === '') { - return; - } + opts.params = Object.assign({ + format: 'image/png', + transparent: true, + maxZoom: 14, + minZoom: 4, + }, opts.params); - opts.params = Object.assign({ - format: 'image/png', - transparent: true, - maxZoom: 14, - minZoom: 4, - }, opts.params); + const mlayer = leaflet.tileLayer.wms( + opts.url, opts.params, + ); - const mlayer = leaflet.tileLayer.wms( - opts.url, opts.params - ); + mlayer.addTo(map); - mlayer.addTo(map); - - return mlayer; + return mlayer; } /** @@ -38,10 +37,10 @@ export function addWMSLayer(map, opts) { * @param layer */ export function showFeaturePopup(feature, layer) { - let popup_html = ''; - if (feature.properties && feature.properties.popup) { - popup_html += feature.properties.popup - } + let popup_html = ''; + if (feature.properties && feature.properties.popup) { + popup_html += feature.properties.popup; + } - layer.bindPopup(popup_html) + layer.bindPopup(popup_html); } diff --git a/resources/js/maps/index.js b/resources/js/maps/index.js index 2413ed81..c883dafe 100644 --- a/resources/js/maps/index.js +++ b/resources/js/maps/index.js @@ -2,16 +2,17 @@ * All of the functionality required for maps */ -window.L = require('leaflet'); +import render_airspace_map from './airspace_map'; +import render_live_map from './live_map'; +import render_route_map from './route_map'; + require('Leaflet.Geodesic'); require('leaflet-rotatedmarker'); -import render_airspace_map from './airspace_map' -import render_live_map from './live_map' -import render_route_map from './route_map' +window.L = require('leaflet'); export { render_airspace_map, render_live_map, render_route_map, -} +}; diff --git a/resources/js/maps/live_map.js b/resources/js/maps/live_map.js index 21193fe0..ed729d81 100644 --- a/resources/js/maps/live_map.js +++ b/resources/js/maps/live_map.js @@ -1,216 +1,185 @@ -// -const geolib = require('geolib'); +import draw_base_map from './base_map'; + +import { ACTUAL_ROUTE_COLOR } from './config'; + +import request from '../request'; + +// const geolib = require('geolib'); const leaflet = require('leaflet'); const rivets = require('rivets'); -import draw_base_map from './base_map' -import { ACTUAL_ROUTE_COLOR } from './config' - /** * Render the live map - * @param opts + * @param _opts * @private */ -export default (opts) => { +export default (_opts) => { + const opts = Object.assign({ + center: [29.98139, -95.33374], + refresh_interval: 10, // seconds + zoom: 5, + update_uri: '/api/acars', + pirep_uri: '/api/pireps/{id}', + pirep_link_uri: '/pireps/{id}', + positions: null, + render_elem: 'map', + aircraft_icon: '/assets/img/acars/aircraft.png', + units: 'nmi', + }, _opts); - opts = Object.assign({ - center: [29.98139, -95.33374], - zoom: 5, - update_uri: '/api/acars', - pirep_uri: '/api/pireps/{id}', - pirep_link_uri: '/pireps/{id}', - positions: null, - render_elem: 'map', - aircraft_icon: '/assets/img/acars/aircraft.png', - units: 'nmi', - }, opts); + const map = draw_base_map(opts); + const aircraftIcon = leaflet.icon({ + iconUrl: opts.aircraft_icon, + iconSize: [42, 42], + iconAnchor: [21, 21], + }); - const map = draw_base_map(opts); - const aircraftIcon = leaflet.icon({ - iconUrl: opts.aircraft_icon, - iconSize: [42, 42], - iconAnchor: [21, 21], + /** + * Hold the markers + * @type {{}} + */ + const markers_list = {}; + let pannedToCenter = false; + let layerFlights = null; + let layerSelFlight = null; + let layerSelFlightFeature = null; + let layerSelFlightLayer = null; + + const liveMapController = { + pirep: {}, + pireps: [], + has_data: false, + controller: { + /** + * Focus on a specific marker + * @param e + * @param model + */ + focusMarker: (e, model) => { + if (!(model.pirep.id in markers_list)) { + console.log('marker not found in list'); + return; + } + + const marker = markers_list[model.pirep.id]; + onFlightClick(marker[0], marker[1]); + }, + }, + }; + + rivets.bind($('#map-info-box'), liveMapController); + rivets.bind($('#live_flights'), liveMapController); + + const drawRoute = (feature, layer, route) => { + console.log('drawRoute'); + if (layerSelFlight !== null) { + map.removeLayer(layerSelFlight); + } + + layerSelFlight = leaflet.geodesic([], { + weight: 5, + opacity: 0.9, + color: ACTUAL_ROUTE_COLOR, + wrap: false, + }).addTo(map); + + layerSelFlight.geoJson(route.line); + layerSelFlightFeature = feature; + layerSelFlightLayer = layer; + + // Center on it, but only do it once, in case the map is moved + if (!pannedToCenter) { + map.panTo({ + lat: route.position.lat, + lng: route.position.lon, + }); + + pannedToCenter = true; + } + }; + + /** + * When a flight is clicked on, show the path, etc for that flight + * @param feature + * @param layer + */ + const onFlightClick = (feature, layer) => { + const pirep_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id); + const geojson_uri = `${opts.pirep_uri.replace('{id}', feature.properties.pirep_id)}/acars/geojson`; + + /* + * Run these in parallel: + * 1. Get information about the PIREP and populate the bottom box/container + * 2. Draw out the flight route + */ + request(pirep_uri).then((response) => { + const pirep = response.data.data; + console.log(pirep); + + liveMapController.pirep = pirep; }); - /** - * Hold the markers - * @type {{}} - */ - let markers_list = {}; + request(geojson_uri).then((response) => { + const route = response.data.data; + console.log(route); - let pannedToCenter = false; + drawRoute(feature, layer, route); + }); + }; - let layerFlights = null; - let layerSelFlight = null; - let layerSelFlightFeature = null; - let layerSelFlightLayer = null; - let layerSelArr = null; - let layerSelDep = null; + const updateMap = () => { + const pirep_uri = opts.pirep_uri.replace('{id}', ''); - /** - * Controller for two-way bindings - * @type {{focusMarker: focusMarker}} - */ - const mapController = { - /** - * Focus on a specific marker - * @param e - * @param model - */ - focusMarker: (e, model) => { - if(!(model.pirep.id in markers_list)) { - console.log('marker not found in list'); - return; - } + request(pirep_uri).then((response) => { + const pireps = response.data.data; + liveMapController.pireps = pireps; + liveMapController.has_data = pireps.length > 0; + }); - const marker = markers_list[model.pirep.id]; - onFlightClick(marker[0], marker[1]); + request({ url: opts.update_uri }).then((response) => { + const flightGeoJson = response.data.data; + + if (layerFlights !== null) { + layerFlights.clearLayers(); + } + + layerFlights = leaflet.geoJSON(flightGeoJson, { + onEachFeature: (feature, layer) => { + layer.on({ + // eslint-disable-next-line no-unused-vars + click: (e) => { + pannedToCenter = false; + liveMapController.controller.onFlightClick(feature, layer); + }, + }); + + let popup_html = ''; + if (feature.properties && (feature.properties.popup !== '' && feature.properties.popup !== undefined)) { + popup_html += feature.properties.popup; + layer.bindPopup(popup_html); + } + + // add to the list + markers_list[feature.properties.pirep_id] = [feature, layer]; }, - }; + pointToLayer(feature, latlon) { + return leaflet.marker(latlon, { + icon: aircraftIcon, + rotationAngle: feature.properties.heading, + }); + }, + }); - const r_map_view = rivets.bind($('#map-info-box'), {pirep: {}, controller: mapController}); - const r_table_view = rivets.bind($('#live_flights'), {pireps: [], controller: mapController}); + layerFlights.addTo(map); - /** - * When a flight is clicked on, show the path, etc for that flight - * @param feature - * @param layer - */ - const onFlightClick = (feature, layer) => { + // Reload the clicked-flight information + if (layerSelFlight !== null) { + liveMapController.controller.onFlightClick(layerSelFlightFeature, layerSelFlightLayer); + } + }); + }; - const pirep_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id); - const geojson_uri = opts.pirep_uri.replace('{id}', feature.properties.pirep_id) + "/acars/geojson"; - - const pirep_info = $.ajax({ - url: pirep_uri, - dataType: 'json', - error: console.log - }); - - const flight_route = $.ajax({ - url: geojson_uri, - dataType: 'json', - error: console.log - }); - - // Load up the PIREP info - $.when(flight_route).done((rte) => { - if (layerSelFlight !== null) { - map.removeLayer(layerSelFlight); - //map.removeLayer(layerSelArr); - //map.removeLayer(layerSelDep); - } - - layerSelFlight = leaflet.geodesic([], { - weight: 5, - opacity: 0.9, - color: ACTUAL_ROUTE_COLOR, - wrap: false, - }).addTo(map); - - layerSelFlight.geoJson(rte.line); - layerSelFlightFeature = feature; - layerSelFlightLayer = layer; - - /*const dptIcon = leaflet.divIcon({ - html: '
' + rte.airports.d.icao + '
' - }); - - layerSelDep = leaflet.marker([rte.airports.d.lat, rte.airports.d.lon], {icon:dptIcon}).addTo(map); - */ - - // Center on it, but only do it once, in case the map is moved - if(!pannedToCenter) { - // find center - const c = geolib.getCenter([ - {latitude: rte.airports.a.lat, longitude: rte.airports.a.lon}, - {latitude: rte.airports.d.lat, longitude: rte.airports.d.lon}, - ]); - - //map.panTo({lat: c.latitude, lng: c.longitude}); - map.panTo({lat: rte.position.lat, lng: rte.position.lon}); - pannedToCenter = true; - } - }); - - // - // When the PIREP info is done loading, show the bottom bar - // - $.when(pirep_info).done(pirep => { - r_map_view.update({pirep:pirep.data}); - $('#map-info-box').show(); - }); - }; - - const updateMap = () => { - - console.log('reloading flights from acars...'); - - /** - * AJAX UPDATE - */ - const pirep_uri = opts.pirep_uri.replace('{id}', ''); - let pireps = $.ajax({ - url: pirep_uri, - dataType: 'json', - error: console.log - }); - - let flights = $.ajax({ - url: opts.update_uri, - dataType: 'json', - error: console.log - }); - - $.when(flights).done(flightGeoJson => { - - if (layerFlights !== null) { - layerFlights.clearLayers() - } - - layerFlights = leaflet.geoJSON(flightGeoJson, { - onEachFeature: (feature, layer) => { - layer.on({ - click: (e) => { - pannedToCenter = false; - onFlightClick(feature, layer) - } - }); - - let popup_html = ''; - if (feature.properties && (feature.properties.popup !== '' && feature.properties.popup !== undefined)) { - popup_html += feature.properties.popup; - layer.bindPopup(popup_html); - } - - // add to the list - markers_list[feature.properties.pirep_id] = [feature, layer]; - }, - pointToLayer: function (feature, latlon) { - return leaflet.marker(latlon, { - icon: aircraftIcon, - rotationAngle: feature.properties.heading - }) - } - }); - - layerFlights.addTo(map); - - // Reload the clicked-flight information - if (layerSelFlight !== null) { - onFlightClick(layerSelFlightFeature, layerSelFlightLayer) - } - }); - - $.when(pireps).done(pireps => { - r_table_view.update({ - pireps: pireps.data, - has_data: (pireps.data.length > 0), - }); - }); - }; - - updateMap(); - setInterval(updateMap, 10000) + updateMap(); + setInterval(updateMap, opts.refresh_interval * 1000); }; diff --git a/resources/js/maps/route_map.js b/resources/js/maps/route_map.js index 233de223..b5e955c3 100644 --- a/resources/js/maps/route_map.js +++ b/resources/js/maps/route_map.js @@ -1,22 +1,24 @@ + +import draw_base_map from './base_map'; +import { addWMSLayer } from './helpers'; +import request from '../request'; + +import { ACTUAL_ROUTE_COLOR, CIRCLE_COLOR, PLAN_ROUTE_COLOR } from './config'; + const leaflet = require('leaflet'); -import draw_base_map from './base_map' -import {addWMSLayer} from './helpers'; - -import {ACTUAL_ROUTE_COLOR, CIRCLE_COLOR, PLAN_ROUTE_COLOR} from './config' - /** * Show some popup text when a feature is clicked on * @param feature * @param layer */ export const onFeaturePointClick = (feature, layer) => { - let popup_html = ''; - if (feature.properties && feature.properties.popup) { - popup_html += feature.properties.popup - } + let popup_html = ''; + if (feature.properties && feature.properties.popup) { + popup_html += feature.properties.popup; + } - layer.bindPopup(popup_html) + layer.bindPopup(popup_html); }; /** @@ -25,143 +27,134 @@ export const onFeaturePointClick = (feature, layer) => { * @param latlng * @returns {*} */ -export const pointToLayer = (feature, latlng) => { - return leaflet.circleMarker(latlng, { - radius: 5, - fillColor: CIRCLE_COLOR, - color: '#000', - weight: 1, - opacity: 1, - fillOpacity: 0.8 - }) -} +export const pointToLayer = (feature, latlng) => leaflet.circleMarker(latlng, { + radius: 5, + fillColor: CIRCLE_COLOR, + color: '#000', + weight: 1, + opacity: 1, + fillOpacity: 0.8, +}); /** * - * @param opts + * @param _opts * @private */ -export default (opts) => { +export default (_opts) => { + const opts = Object.assign({ + route_points: null, + planned_route_line: null, + actual_route_points: null, + actual_route_line: null, + render_elem: 'map', + live_map: false, + aircraft_icon: '/assets/img/acars/aircraft.png', + refresh_interval: 10, + metar_wms: { + url: '', + params: {}, + }, + }, _opts); - opts = Object.assign({ + const aircraftIcon = leaflet.icon({ + iconUrl: opts.aircraft_icon, + iconSize: [42, 42], + iconAnchor: [21, 21], + }); - route_points: null, - planned_route_line: null, - actual_route_points: null, - actual_route_line: null, - render_elem: 'map', - live_map: false, - aircraft_icon: '/assets/img/acars/aircraft.png', - metar_wms: { - url: '', - params: {} - }, - }, opts); + const map = draw_base_map(opts); + let layerLiveFlight; - const aircraftIcon = leaflet.icon({ - iconUrl: opts.aircraft_icon, - iconSize: [42, 42], - iconAnchor: [21, 21], + if (opts.metar_wms.url !== '') { + addWMSLayer(map, opts.metar_wms); + } + + const plannedRouteLayer = leaflet.geodesic([], { + weight: 4, + opacity: 0.9, + color: PLAN_ROUTE_COLOR, + steps: 50, + wrap: false, + }).addTo(map); + + plannedRouteLayer.geoJson(opts.planned_route_line); + + try { + map.fitBounds(plannedRouteLayer.getBounds()); + } catch (e) { + console.log(e); + } + + // Draw the route points after + if (opts.route_points !== null) { + const route_points = leaflet.geoJSON(opts.route_points, { + onEachFeature: onFeaturePointClick, + pointToLayer, + style: { + color: PLAN_ROUTE_COLOR, + weight: 3, + opacity: 0.65, + }, }); - let map = draw_base_map(opts); - let layerLiveFlight; + route_points.addTo(map); + } - if (opts.metar_wms.url !== '') { - addWMSLayer(map, opts.metar_wms); - } - - let geodesicLayer = leaflet.geodesic([], { - weight: 4, - opacity: 0.9, - color: PLAN_ROUTE_COLOR, - steps: 50, - wrap: false, - }).addTo(map); - - geodesicLayer.geoJson(opts.planned_route_line); - - try { - map.fitBounds(geodesicLayer.getBounds()) - } catch (e) { - console.log(e) - } - - // Draw the route points after - if (opts.route_points !== null) { - let route_points = leaflet.geoJSON(opts.route_points, { - onEachFeature: onFeaturePointClick, - pointToLayer: pointToLayer, - style: { - 'color': PLAN_ROUTE_COLOR, - 'weight': 3, - 'opacity': 0.65, - }, - }); - - route_points.addTo(map); - } - - /** + /** * draw the actual route */ - if (opts.actual_route_line !== null && opts.actual_route_line.features.length > 0) { - let geodesicLayer = leaflet.geodesic([], { - weight: 3, - opacity: 0.9, - color: ACTUAL_ROUTE_COLOR, - steps: 50, - wrap: false, - }).addTo(map); + if (opts.actual_route_line !== null && opts.actual_route_line.features.length > 0) { + const actualRouteLayer = leaflet.geodesic([], { + weight: 3, + opacity: 0.9, + color: ACTUAL_ROUTE_COLOR, + steps: 50, + wrap: false, + }).addTo(map); - geodesicLayer.geoJson(opts.actual_route_line); + actualRouteLayer.geoJson(opts.actual_route_line); - try { - map.fitBounds(geodesicLayer.getBounds()) - } catch (e) { - console.log(e) - } + try { + map.fitBounds(actualRouteLayer.getBounds()); + } catch (e) { + console.log(e); } + } - if (opts.actual_route_points !== null && opts.actual_route_points.features.length > 0) { - let route_points = leaflet.geoJSON(opts.actual_route_points, { - onEachFeature: onFeaturePointClick, - pointToLayer: pointToLayer, - style: { - 'color': ACTUAL_ROUTE_COLOR, - 'weight': 3, - 'opacity': 0.65, - }, - }); + if (opts.actual_route_points !== null && opts.actual_route_points.features.length > 0) { + const route_points = leaflet.geoJSON(opts.actual_route_points, { + onEachFeature: onFeaturePointClick, + pointToLayer, + style: { + color: ACTUAL_ROUTE_COLOR, + weight: 3, + opacity: 0.65, + }, + }); - route_points.addTo(map) - } + route_points.addTo(map); + } - /** + /** * */ - const liveFlight = () => { - const uri = opts.pirep_uri; - const live_route = $.ajax({ - url: uri, - dataType: 'json', - error: console.log - }); + const liveFlight = () => { + request({ url: opts.pirep_uri }).then((response) => { + const routeJson = response.data.data; + layerLiveFlight = leaflet.geoJSON(routeJson, { + pointToLayer(feature, latlon) { + return leaflet.marker(latlon, { + icon: aircraftIcon, + rotationAngle: feature.properties.heading, + }); + }, + }); - $.when(live_route).done((routeJson) => { - layerLiveFlight = leaflet.geoJSON(routeJson, { - pointToLayer: function (feature, latlon) { - return leaflet.marker(latlon, { - icon: aircraftIcon, - rotationAngle: feature.properties.heading - }) - } - }); + layerLiveFlight.addTo(map); + }); + }; - layerLiveFlight.addTo(map) - }); - }; - - setInterval(liveFlight, 10000); + setInterval(liveFlight, opts.refresh_interval * 1000); }; diff --git a/resources/js/request.js b/resources/js/request.js new file mode 100644 index 00000000..f5f227ac --- /dev/null +++ b/resources/js/request.js @@ -0,0 +1,29 @@ + +import config from './config'; + +const axios = require('axios'); + +/** + * Run an API request, with some common options + * + * @param {Object|String} _opts Axios request options, or pass a URL + * @param {String} _opts.url + */ +export default async (_opts) => { + if (typeof _opts === 'string' || _opts instanceof String) { + // eslint-disable-next-line no-param-reassign + _opts = { + url: _opts, + }; + } + + const opts = Object.assign({}, { + baseURL: config.base_url, + headers: { + 'X-API-KEY': config.api_key, + 'X-CSRF-TOKEN': config.csrf_token, + }, + }, _opts); + + return axios.request(opts); +}; diff --git a/resources/js/storage.js b/resources/js/storage.js index 33950676..942e343f 100644 --- a/resources/js/storage.js +++ b/resources/js/storage.js @@ -1,77 +1,76 @@ -'use strict'; /** * Simple browser storage interface */ export default class Storage { - constructor(name, default_value) { - this.name = name; + constructor(name, default_value) { + this.name = name; - // Read the object from storage; if it doesn't exist, set - // it to the default value - const st = window.localStorage.getItem(this.name); - if (!st) { - console.log('Nothing found in storage, starting from default'); - this.data = default_value; - } else { - console.log('Found in storage: ', st); - this.data = JSON.parse(st); - } + // Read the object from storage; if it doesn't exist, set + // it to the default value + const st = window.localStorage.getItem(this.name); + if (!st) { + console.log('Nothing found in storage, starting from default'); + this.data = default_value; + } else { + console.log('Found in storage: ', st); + this.data = JSON.parse(st); } + } - /** + /** * Save to local storage */ - save() { - window.localStorage.setItem(this.name, JSON.stringify(this.data)); - } + save() { + window.localStorage.setItem(this.name, JSON.stringify(this.data)); + } - /** + /** * Return a list from a given key * * @param {String} key * * @returns {Array|*} */ - getList(key) { - if (!(key in this.data)) { - return []; - } - - return this.data[key]; + getList(key) { + if (!(key in this.data)) { + return []; } - /** + return this.data[key]; + } + + /** * Add `value` to a given `key` * * @param {string} key * @param {*} value */ - addToList(key, value) { - if (!(key in this.data)) { - this.data[key] = []; - } - - const index = this.data[key].indexOf(value); - if (index === -1) { - this.data[key].push(value); - } + addToList(key, value) { + if (!(key in this.data)) { + this.data[key] = []; } - /** + const index = this.data[key].indexOf(value); + if (index === -1) { + this.data[key].push(value); + } + } + + /** * Remove `value` from the given `key` * * @param {String} key * @param {*} value */ - removeFromList(key, value) { - if (!(key in this.data)) { - return; - } - - const index = this.data[key].indexOf(value); - if (index !== -1) { - this.data[key].splice(index, 1); - } + removeFromList(key, value) { + if (!(key in this.data)) { + return; } + + const index = this.data[key].indexOf(value); + if (index !== -1) { + this.data[key].splice(index, 1); + } + } } diff --git a/resources/views/admin/aircraft/script.blade.php b/resources/views/admin/aircraft/script.blade.php index b0455f35..61fa37dc 100644 --- a/resources/views/admin/aircraft/script.blade.php +++ b/resources/views/admin/aircraft/script.blade.php @@ -1,7 +1,6 @@ @section('scripts') @endsection diff --git a/resources/views/admin/pireps/fares.blade.php b/resources/views/admin/pireps/fares.blade.php index 96ecd776..6bac7c01 100644 --- a/resources/views/admin/pireps/fares.blade.php +++ b/resources/views/admin/pireps/fares.blade.php @@ -11,7 +11,7 @@ {{ $fare->name }} ({{ $fare->code }})
- @if($pirep->read_only) + @if(isset($pirep) && $pirep->read_only)

{{ $pirep->{'fare_'.$fare->id} }}

{{ Form::hidden('fare_'.$fare->id) }} @else @@ -19,7 +19,7 @@ 'class' => 'form-control', 'min' => 0, 'step' => '0.01', - 'readonly' => $pirep->read_only]) }} + ]) }} @endif
diff --git a/resources/views/admin/pireps/scripts.blade.php b/resources/views/admin/pireps/scripts.blade.php index 04dfd68c..fd7e50ae 100644 --- a/resources/views/admin/pireps/scripts.blade.php +++ b/resources/views/admin/pireps/scripts.blade.php @@ -1,53 +1,29 @@ @section('scripts')