24 lines
490 KiB
JavaScript
24 lines
490 KiB
JavaScript
/*
|
|
* ATTENTION: An "eval-source-map" devtool has been used.
|
|
* This devtool is neither made for production nor for readable output files.
|
|
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
|
|
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
|
* or disable the default devtool with "devtool: false".
|
|
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
|
*/
|
|
exports.id = "vendor-chunks/gsap";
|
|
exports.ids = ["vendor-chunks/gsap"];
|
|
exports.modules = {
|
|
|
|
/***/ "(ssr)/./node_modules/gsap/dist/gsap.js":
|
|
/*!****************************************!*\
|
|
!*** ./node_modules/gsap/dist/gsap.js ***!
|
|
\****************************************/
|
|
/***/ (function(__unused_webpack_module, exports) {
|
|
|
|
eval("(function (global, factory) {\r\n true ? factory(exports) :\r\n 0;\r\n}(this, (function (exports) { 'use strict';\r\n\r\n function _inheritsLoose(subClass, superClass) {\r\n subClass.prototype = Object.create(superClass.prototype);\r\n subClass.prototype.constructor = subClass;\r\n subClass.__proto__ = superClass;\r\n }\r\n\r\n function _assertThisInitialized(self) {\r\n if (self === void 0) {\r\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\r\n }\r\n\r\n return self;\r\n }\r\n\r\n /*!\r\n * GSAP 3.13.0\r\n * https://gsap.com\r\n *\r\n * @license Copyright 2008-2025, GreenSock. All rights reserved.\r\n * Subject to the terms at https://gsap.com/standard-license\r\n * @author: Jack Doyle, jack@greensock.com\r\n */\r\n var _config = {\r\n autoSleep: 120,\r\n force3D: \"auto\",\r\n nullTargetWarn: 1,\r\n units: {\r\n lineHeight: \"\"\r\n }\r\n },\r\n _defaults = {\r\n duration: .5,\r\n overwrite: false,\r\n delay: 0\r\n },\r\n _suppressOverwrites,\r\n _reverting,\r\n _context,\r\n _bigNum = 1e8,\r\n _tinyNum = 1 / _bigNum,\r\n _2PI = Math.PI * 2,\r\n _HALF_PI = _2PI / 4,\r\n _gsID = 0,\r\n _sqrt = Math.sqrt,\r\n _cos = Math.cos,\r\n _sin = Math.sin,\r\n _isString = function _isString(value) {\r\n return typeof value === \"string\";\r\n },\r\n _isFunction = function _isFunction(value) {\r\n return typeof value === \"function\";\r\n },\r\n _isNumber = function _isNumber(value) {\r\n return typeof value === \"number\";\r\n },\r\n _isUndefined = function _isUndefined(value) {\r\n return typeof value === \"undefined\";\r\n },\r\n _isObject = function _isObject(value) {\r\n return typeof value === \"object\";\r\n },\r\n _isNotFalse = function _isNotFalse(value) {\r\n return value !== false;\r\n },\r\n _windowExists = function _windowExists() {\r\n return typeof window !== \"undefined\";\r\n },\r\n _isFuncOrString = function _isFuncOrString(value) {\r\n return _isFunction(value) || _isString(value);\r\n },\r\n _isTypedArray = typeof ArrayBuffer === \"function\" && ArrayBuffer.isView || function () {},\r\n _isArray = Array.isArray,\r\n _strictNumExp = /(?:-?\\.?\\d|\\.)+/gi,\r\n _numExp = /[-+=.]*\\d+[.e\\-+]*\\d*[e\\-+]*\\d*/g,\r\n _numWithUnitExp = /[-+=.]*\\d+[.e-]*\\d*[a-z%]*/g,\r\n _complexStringNumExp = /[-+=.]*\\d+\\.?\\d*(?:e-|e\\+)?\\d*/gi,\r\n _relExp = /[+-]=-?[.\\d]+/,\r\n _delimitedValueExp = /[^,'\"\\[\\]\\s]+/gi,\r\n _unitExp = /^[+\\-=e\\s\\d]*\\d+[.\\d]*([a-z]*|%)\\s*$/i,\r\n _globalTimeline,\r\n _win,\r\n _coreInitted,\r\n _doc,\r\n _globals = {},\r\n _installScope = {},\r\n _coreReady,\r\n _install = function _install(scope) {\r\n return (_installScope = _merge(scope, _globals)) && gsap;\r\n },\r\n _missingPlugin = function _missingPlugin(property, value) {\r\n return console.warn(\"Invalid property\", property, \"set to\", value, \"Missing plugin? gsap.registerPlugin()\");\r\n },\r\n _warn = function _warn(message, suppress) {\r\n return !suppress && console.warn(message);\r\n },\r\n _addGlobal = function _addGlobal(name, obj) {\r\n return name && (_globals[name] = obj) && _installScope && (_installScope[name] = obj) || _globals;\r\n },\r\n _emptyFunc = function _emptyFunc() {\r\n return 0;\r\n },\r\n _startAtRevertConfig = {\r\n suppressEvents: true,\r\n isStart: true,\r\n kill: false\r\n },\r\n _revertConfigNoKill = {\r\n suppressEvents: true,\r\n kill: false\r\n },\r\n _revertConfig = {\r\n suppressEvents: true\r\n },\r\n _reservedProps = {},\r\n _lazyTweens = [],\r\n _lazyLookup = {},\r\n _lastRenderedFrame,\r\n _plugins = {},\r\n _effects = {},\r\n _nextGCFrame = 30,\r\n _harnessPlugins = [],\r\n _callbackNames = \"\",\r\n _harness = function _harness(targets) {\r\n var target = targets[0],\r\n harnessPlugin,\r\n i;\r\n _isObject(target) || _isFunction(target) || (targets = [targets]);\r\n\r\n if (!(harnessPlugin = (target._gsap || {}).harness)) {\r\n i = _harnessPlugins.length;\r\n\r\n while (i-- && !_harnessPlugins[i].targetTest(target)) {}\r\n\r\n harnessPlugin = _harnessPlugins[i];\r\n }\r\n\r\n i = targets.length;\r\n\r\n while (i--) {\r\n targets[i] && (targets[i]._gsap || (targets[i]._gsap = new GSCache(targets[i], harnessPlugin))) || targets.splice(i, 1);\r\n }\r\n\r\n return targets;\r\n },\r\n _getCache = function _getCache(target) {\r\n return target._gsap || _harness(toArray(target))[0]._gsap;\r\n },\r\n _getProperty = function _getProperty(target, property, v) {\r\n return (v = target[property]) && _isFunction(v) ? target[property]() : _isUndefined(v) && target.getAttribute && target.getAttribute(property) || v;\r\n },\r\n _forEachName = function _forEachName(names, func) {\r\n return (names = names.split(\",\")).forEach(func) || names;\r\n },\r\n _round = function _round(value) {\r\n return Math.round(value * 100000) / 100000 || 0;\r\n },\r\n _roundPrecise = function _roundPrecise(value) {\r\n return Math.round(value * 10000000) / 10000000 || 0;\r\n },\r\n _parseRelative = function _parseRelative(start, value) {\r\n var operator = value.charAt(0),\r\n end = parseFloat(value.substr(2));\r\n start = parseFloat(start);\r\n return operator === \"+\" ? start + end : operator === \"-\" ? start - end : operator === \"*\" ? start * end : start / end;\r\n },\r\n _arrayContainsAny = function _arrayContainsAny(toSearch, toFind) {\r\n var l = toFind.length,\r\n i = 0;\r\n\r\n for (; toSearch.indexOf(toFind[i]) < 0 && ++i < l;) {}\r\n\r\n return i < l;\r\n },\r\n _lazyRender = function _lazyRender() {\r\n var l = _lazyTweens.length,\r\n a = _lazyTweens.slice(0),\r\n i,\r\n tween;\r\n\r\n _lazyLookup = {};\r\n _lazyTweens.length = 0;\r\n\r\n for (i = 0; i < l; i++) {\r\n tween = a[i];\r\n tween && tween._lazy && (tween.render(tween._lazy[0], tween._lazy[1], true)._lazy = 0);\r\n }\r\n },\r\n _isRevertWorthy = function _isRevertWorthy(animation) {\r\n return !!(animation._initted || animation._startAt || animation.add);\r\n },\r\n _lazySafeRender = function _lazySafeRender(animation, time, suppressEvents, force) {\r\n _lazyTweens.length && !_reverting && _lazyRender();\r\n animation.render(time, suppressEvents, force || !!(_reverting && time < 0 && _isRevertWorthy(animation)));\r\n _lazyTweens.length && !_reverting && _lazyRender();\r\n },\r\n _numericIfPossible = function _numericIfPossible(value) {\r\n var n = parseFloat(value);\r\n return (n || n === 0) && (value + \"\").match(_delimitedValueExp).length < 2 ? n : _isString(value) ? value.trim() : value;\r\n },\r\n _passThrough = function _passThrough(p) {\r\n return p;\r\n },\r\n _setDefaults = function _setDefaults(obj, defaults) {\r\n for (var p in defaults) {\r\n p in obj || (obj[p] = defaults[p]);\r\n }\r\n\r\n return obj;\r\n },\r\n _setKeyframeDefaults = function _setKeyframeDefaults(excludeDuration) {\r\n return function (obj, defaults) {\r\n for (var p in defaults) {\r\n p in obj || p === \"duration\" && excludeDuration || p === \"ease\" || (obj[p] = defaults[p]);\r\n }\r\n };\r\n },\r\n _merge = function _merge(base, toMerge) {\r\n for (var p in toMerge) {\r\n base[p] = toMerge[p];\r\n }\r\n\r\n return base;\r\n },\r\n _mergeDeep = function _mergeDeep(base, toMerge) {\r\n for (var p in toMerge) {\r\n p !== \"__proto__\" && p !== \"constructor\" && p !== \"prototype\" && (base[p] = _isObject(toMerge[p]) ? _mergeDeep(base[p] || (base[p] = {}), toMerge[p]) : toMerge[p]);\r\n }\r\n\r\n return base;\r\n },\r\n _copyExcluding = function _copyExcluding(obj, excluding) {\r\n var copy = {},\r\n p;\r\n\r\n for (p in obj) {\r\n p in excluding || (copy[p] = obj[p]);\r\n }\r\n\r\n return copy;\r\n },\r\n _inheritDefaults = function _inheritDefaults(vars) {\r\n var parent = vars.parent || _globalTimeline,\r\n func = vars.keyframes ? _setKeyframeDefaults(_isArray(vars.keyframes)) : _setDefaults;\r\n\r\n if (_isNotFalse(vars.inherit)) {\r\n while (parent) {\r\n func(vars, parent.vars.defaults);\r\n parent = parent.parent || parent._dp;\r\n }\r\n }\r\n\r\n return vars;\r\n },\r\n _arraysMatch = function _arraysMatch(a1, a2) {\r\n var i = a1.length,\r\n match = i === a2.length;\r\n\r\n while (match && i-- && a1[i] === a2[i]) {}\r\n\r\n return i < 0;\r\n },\r\n _addLinkedListItem = function _addLinkedListItem(parent, child, firstProp, lastProp, sortBy) {\r\n if (firstProp === void 0) {\r\n firstProp = \"_first\";\r\n }\r\n\r\n if (lastProp === void 0) {\r\n lastProp = \"_last\";\r\n }\r\n\r\n var prev = parent[lastProp],\r\n t;\r\n\r\n if (sortBy) {\r\n t = child[sortBy];\r\n\r\n while (prev && prev[sortBy] > t) {\r\n prev = prev._prev;\r\n }\r\n }\r\n\r\n if (prev) {\r\n child._next = prev._next;\r\n prev._next = child;\r\n } else {\r\n child._next = parent[firstProp];\r\n parent[firstProp] = child;\r\n }\r\n\r\n if (child._next) {\r\n child._next._prev = child;\r\n } else {\r\n parent[lastProp] = child;\r\n }\r\n\r\n child._prev = prev;\r\n child.parent = child._dp = parent;\r\n return child;\r\n },\r\n _removeLinkedListItem = function _removeLinkedListItem(parent, child, firstProp, lastProp) {\r\n if (firstProp === void 0) {\r\n firstProp = \"_first\";\r\n }\r\n\r\n if (lastProp === void 0) {\r\n lastProp = \"_last\";\r\n }\r\n\r\n var prev = child._prev,\r\n next = child._next;\r\n\r\n if (prev) {\r\n prev._next = next;\r\n } else if (parent[firstProp] === child) {\r\n parent[firstProp] = next;\r\n }\r\n\r\n if (next) {\r\n next._prev = prev;\r\n } else if (parent[lastProp] === child) {\r\n parent[lastProp] = prev;\r\n }\r\n\r\n child._next = child._prev = child.parent = null;\r\n },\r\n _removeFromParent = function _removeFromParent(child, onlyIfParentHasAutoRemove) {\r\n child.parent && (!onlyIfParentHasAutoRemove || child.parent.autoRemoveChildren) && child.parent.remove && child.parent.remove(child);\r\n child._act = 0;\r\n },\r\n _uncache = function _uncache(animation, child) {\r\n if (animation && (!child || child._end > animation._dur || child._start < 0)) {\r\n var a = animation;\r\n\r\n while (a) {\r\n a._dirty = 1;\r\n a = a.parent;\r\n }\r\n }\r\n\r\n return animation;\r\n },\r\n _recacheAncestors = function _recacheAncestors(animation) {\r\n var parent = animation.parent;\r\n\r\n while (parent && parent.parent) {\r\n parent._dirty = 1;\r\n parent.totalDuration();\r\n parent = parent.parent;\r\n }\r\n\r\n return animation;\r\n },\r\n _rewindStartAt = function _rewindStartAt(tween, totalTime, suppressEvents, force) {\r\n return tween._startAt && (_reverting ? tween._startAt.revert(_revertConfigNoKill) : tween.vars.immediateRender && !tween.vars.autoRevert || tween._startAt.render(totalTime, true, force));\r\n },\r\n _hasNoPausedAncestors = function _hasNoPausedAncestors(animation) {\r\n return !animation || animation._ts && _hasNoPausedAncestors(animation.parent);\r\n },\r\n _elapsedCycleDuration = function _elapsedCycleDuration(animation) {\r\n return animation._repeat ? _animationCycle(animation._tTime, animation = animation.duration() + animation._rDelay) * animation : 0;\r\n },\r\n _animationCycle = function _animationCycle(tTime, cycleDuration) {\r\n var whole = Math.floor(tTime = _roundPrecise(tTime / cycleDuration));\r\n return tTime && whole === tTime ? whole - 1 : whole;\r\n },\r\n _parentToChildTotalTime = function _parentToChildTotalTime(parentTime, child) {\r\n return (parentTime - child._start) * child._ts + (child._ts >= 0 ? 0 : child._dirty ? child.totalDuration() : child._tDur);\r\n },\r\n _setEnd = function _setEnd(animation) {\r\n return animation._end = _roundPrecise(animation._start + (animation._tDur / Math.abs(animation._ts || animation._rts || _tinyNum) || 0));\r\n },\r\n _alignPlayhead = function _alignPlayhead(animation, totalTime) {\r\n var parent = animation._dp;\r\n\r\n if (parent && parent.smoothChildTiming && animation._ts) {\r\n animation._start = _roundPrecise(parent._time - (animation._ts > 0 ? totalTime / animation._ts : ((animation._dirty ? animation.totalDuration() : animation._tDur) - totalTime) / -animation._ts));\r\n\r\n _setEnd(animation);\r\n\r\n parent._dirty || _uncache(parent, animation);\r\n }\r\n\r\n return animation;\r\n },\r\n _postAddChecks = function _postAddChecks(timeline, child) {\r\n var t;\r\n\r\n if (child._time || !child._dur && child._initted || child._start < timeline._time && (child._dur || !child.add)) {\r\n t = _parentToChildTotalTime(timeline.rawTime(), child);\r\n\r\n if (!child._dur || _clamp(0, child.totalDuration(), t) - child._tTime > _tinyNum) {\r\n child.render(t, true);\r\n }\r\n }\r\n\r\n if (_uncache(timeline, child)._dp && timeline._initted && timeline._time >= timeline._dur && timeline._ts) {\r\n if (timeline._dur < timeline.duration()) {\r\n t = timeline;\r\n\r\n while (t._dp) {\r\n t.rawTime() >= 0 && t.totalTime(t._tTime);\r\n t = t._dp;\r\n }\r\n }\r\n\r\n timeline._zTime = -_tinyNum;\r\n }\r\n },\r\n _addToTimeline = function _addToTimeline(timeline, child, position, skipChecks) {\r\n child.parent && _removeFromParent(child);\r\n child._start = _roundPrecise((_isNumber(position) ? position : position || timeline !== _globalTimeline ? _parsePosition(timeline, position, child) : timeline._time) + child._delay);\r\n child._end = _roundPrecise(child._start + (child.totalDuration() / Math.abs(child.timeScale()) || 0));\r\n\r\n _addLinkedListItem(timeline, child, \"_first\", \"_last\", timeline._sort ? \"_start\" : 0);\r\n\r\n _isFromOrFromStart(child) || (timeline._recent = child);\r\n skipChecks || _postAddChecks(timeline, child);\r\n timeline._ts < 0 && _alignPlayhead(timeline, timeline._tTime);\r\n return timeline;\r\n },\r\n _scrollTrigger = function _scrollTrigger(animation, trigger) {\r\n return (_globals.ScrollTrigger || _missingPlugin(\"scrollTrigger\", trigger)) && _globals.ScrollTrigger.create(trigger, animation);\r\n },\r\n _attemptInitTween = function _attemptInitTween(tween, time, force, suppressEvents, tTime) {\r\n _initTween(tween, time, tTime);\r\n\r\n if (!tween._initted) {\r\n return 1;\r\n }\r\n\r\n if (!force && tween._pt && !_reverting && (tween._dur && tween.vars.lazy !== false || !tween._dur && tween.vars.lazy) && _lastRenderedFrame !== _ticker.frame) {\r\n _lazyTweens.push(tween);\r\n\r\n tween._lazy = [tTime, suppressEvents];\r\n return 1;\r\n }\r\n },\r\n _parentPlayheadIsBeforeStart = function _parentPlayheadIsBeforeStart(_ref) {\r\n var parent = _ref.parent;\r\n return parent && parent._ts && parent._initted && !parent._lock && (parent.rawTime() < 0 || _parentPlayheadIsBeforeStart(parent));\r\n },\r\n _isFromOrFromStart = function _isFromOrFromStart(_ref2) {\r\n var data = _ref2.data;\r\n return data === \"isFromStart\" || data === \"isStart\";\r\n },\r\n _renderZeroDurationTween = function _renderZeroDurationTween(tween, totalTime, suppressEvents, force) {\r\n var prevRatio = tween.ratio,\r\n ratio = totalTime < 0 || !totalTime && (!tween._start && _parentPlayheadIsBeforeStart(tween) && !(!tween._initted && _isFromOrFromStart(tween)) || (tween._ts < 0 || tween._dp._ts < 0) && !_isFromOrFromStart(tween)) ? 0 : 1,\r\n repeatDelay = tween._rDelay,\r\n tTime = 0,\r\n pt,\r\n iteration,\r\n prevIteration;\r\n\r\n if (repeatDelay && tween._repeat) {\r\n tTime = _clamp(0, tween._tDur, totalTime);\r\n iteration = _animationCycle(tTime, repeatDelay);\r\n tween._yoyo && iteration & 1 && (ratio = 1 - ratio);\r\n\r\n if (iteration !== _animationCycle(tween._tTime, repeatDelay)) {\r\n prevRatio = 1 - ratio;\r\n tween.vars.repeatRefresh && tween._initted && tween.invalidate();\r\n }\r\n }\r\n\r\n if (ratio !== prevRatio || _reverting || force || tween._zTime === _tinyNum || !totalTime && tween._zTime) {\r\n if (!tween._initted && _attemptInitTween(tween, totalTime, force, suppressEvents, tTime)) {\r\n return;\r\n }\r\n\r\n prevIteration = tween._zTime;\r\n tween._zTime = totalTime || (suppressEvents ? _tinyNum : 0);\r\n suppressEvents || (suppressEvents = totalTime && !prevIteration);\r\n tween.ratio = ratio;\r\n tween._from && (ratio = 1 - ratio);\r\n tween._time = 0;\r\n tween._tTime = tTime;\r\n pt = tween._pt;\r\n\r\n while (pt) {\r\n pt.r(ratio, pt.d);\r\n pt = pt._next;\r\n }\r\n\r\n totalTime < 0 && _rewindStartAt(tween, totalTime, suppressEvents, true);\r\n tween._onUpdate && !suppressEvents && _callback(tween, \"onUpdate\");\r\n tTime && tween._repeat && !suppressEvents && tween.parent && _callback(tween, \"onRepeat\");\r\n\r\n if ((totalTime >= tween._tDur || totalTime < 0) && tween.ratio === ratio) {\r\n ratio && _removeFromParent(tween, 1);\r\n\r\n if (!suppressEvents && !_reverting) {\r\n _callback(tween, ratio ? \"onComplete\" : \"onReverseComplete\", true);\r\n\r\n tween._prom && tween._prom();\r\n }\r\n }\r\n } else if (!tween._zTime) {\r\n tween._zTime = totalTime;\r\n }\r\n },\r\n _findNextPauseTween = function _findNextPauseTween(animation, prevTime, time) {\r\n var child;\r\n\r\n if (time > prevTime) {\r\n child = animation._first;\r\n\r\n while (child && child._start <= time) {\r\n if (child.data === \"isPause\" && child._start > prevTime) {\r\n return child;\r\n }\r\n\r\n child = child._next;\r\n }\r\n } else {\r\n child = animation._last;\r\n\r\n while (child && child._start >= time) {\r\n if (child.data === \"isPause\" && child._start < prevTime) {\r\n return child;\r\n }\r\n\r\n child = child._prev;\r\n }\r\n }\r\n },\r\n _setDuration = function _setDuration(animation, duration, skipUncache, leavePlayhead) {\r\n var repeat = animation._repeat,\r\n dur = _roundPrecise(duration) || 0,\r\n totalProgress = animation._tTime / animation._tDur;\r\n totalProgress && !leavePlayhead && (animation._time *= dur / animation._dur);\r\n animation._dur = dur;\r\n animation._tDur = !repeat ? dur : repeat < 0 ? 1e10 : _roundPrecise(dur * (repeat + 1) + animation._rDelay * repeat);\r\n totalProgress > 0 && !leavePlayhead && _alignPlayhead(animation, animation._tTime = animation._tDur * totalProgress);\r\n animation.parent && _setEnd(animation);\r\n skipUncache || _uncache(animation.parent, animation);\r\n return animation;\r\n },\r\n _onUpdateTotalDuration = function _onUpdateTotalDuration(animation) {\r\n return animation instanceof Timeline ? _uncache(animation) : _setDuration(animation, animation._dur);\r\n },\r\n _zeroPosition = {\r\n _start: 0,\r\n endTime: _emptyFunc,\r\n totalDuration: _emptyFunc\r\n },\r\n _parsePosition = function _parsePosition(animation, position, percentAnimation) {\r\n var labels = animation.labels,\r\n recent = animation._recent || _zeroPosition,\r\n clippedDuration = animation.duration() >= _bigNum ? recent.endTime(false) : animation._dur,\r\n i,\r\n offset,\r\n isPercent;\r\n\r\n if (_isString(position) && (isNaN(position) || position in labels)) {\r\n offset = position.charAt(0);\r\n isPercent = position.substr(-1) === \"%\";\r\n i = position.indexOf(\"=\");\r\n\r\n if (offset === \"<\" || offset === \">\") {\r\n i >= 0 && (position = position.replace(/=/, \"\"));\r\n return (offset === \"<\" ? recent._start : recent.endTime(recent._repeat >= 0)) + (parseFloat(position.substr(1)) || 0) * (isPercent ? (i < 0 ? recent : percentAnimation).totalDuration() / 100 : 1);\r\n }\r\n\r\n if (i < 0) {\r\n position in labels || (labels[position] = clippedDuration);\r\n return labels[position];\r\n }\r\n\r\n offset = parseFloat(position.charAt(i - 1) + position.substr(i + 1));\r\n\r\n if (isPercent && percentAnimation) {\r\n offset = offset / 100 * (_isArray(percentAnimation) ? percentAnimation[0] : percentAnimation).totalDuration();\r\n }\r\n\r\n return i > 1 ? _parsePosition(animation, position.substr(0, i - 1), percentAnimation) + offset : clippedDuration + offset;\r\n }\r\n\r\n return position == null ? clippedDuration : +position;\r\n },\r\n _createTweenType = function _createTweenType(type, params, timeline) {\r\n var isLegacy = _isNumber(params[1]),\r\n varsIndex = (isLegacy ? 2 : 1) + (type < 2 ? 0 : 1),\r\n vars = params[varsIndex],\r\n irVars,\r\n parent;\r\n\r\n isLegacy && (vars.duration = params[1]);\r\n vars.parent = timeline;\r\n\r\n if (type) {\r\n irVars = vars;\r\n parent = timeline;\r\n\r\n while (parent && !(\"immediateRender\" in irVars)) {\r\n irVars = parent.vars.defaults || {};\r\n parent = _isNotFalse(parent.vars.inherit) && parent.parent;\r\n }\r\n\r\n vars.immediateRender = _isNotFalse(irVars.immediateRender);\r\n type < 2 ? vars.runBackwards = 1 : vars.startAt = params[varsIndex - 1];\r\n }\r\n\r\n return new Tween(params[0], vars, params[varsIndex + 1]);\r\n },\r\n _conditionalReturn = function _conditionalReturn(value, func) {\r\n return value || value === 0 ? func(value) : func;\r\n },\r\n _clamp = function _clamp(min, max, value) {\r\n return value < min ? min : value > max ? max : value;\r\n },\r\n getUnit = function getUnit(value, v) {\r\n return !_isString(value) || !(v = _unitExp.exec(value)) ? \"\" : v[1];\r\n },\r\n clamp = function clamp(min, max, value) {\r\n return _conditionalReturn(value, function (v) {\r\n return _clamp(min, max, v);\r\n });\r\n },\r\n _slice = [].slice,\r\n _isArrayLike = function _isArrayLike(value, nonEmpty) {\r\n return value && _isObject(value) && \"length\" in value && (!nonEmpty && !value.length || value.length - 1 in value && _isObject(value[0])) && !value.nodeType && value !== _win;\r\n },\r\n _flatten = function _flatten(ar, leaveStrings, accumulator) {\r\n if (accumulator === void 0) {\r\n accumulator = [];\r\n }\r\n\r\n return ar.forEach(function (value) {\r\n var _accumulator;\r\n\r\n return _isString(value) && !leaveStrings || _isArrayLike(value, 1) ? (_accumulator = accumulator).push.apply(_accumulator, toArray(value)) : accumulator.push(value);\r\n }) || accumulator;\r\n },\r\n toArray = function toArray(value, scope, leaveStrings) {\r\n return _context && !scope && _context.selector ? _context.selector(value) : _isString(value) && !leaveStrings && (_coreInitted || !_wake()) ? _slice.call((scope || _doc).querySelectorAll(value), 0) : _isArray(value) ? _flatten(value, leaveStrings) : _isArrayLike(value) ? _slice.call(value, 0) : value ? [value] : [];\r\n },\r\n selector = function selector(value) {\r\n value = toArray(value)[0] || _warn(\"Invalid scope\") || {};\r\n return function (v) {\r\n var el = value.current || value.nativeElement || value;\r\n return toArray(v, el.querySelectorAll ? el : el === value ? _warn(\"Invalid scope\") || _doc.createElement(\"div\") : value);\r\n };\r\n },\r\n shuffle = function shuffle(a) {\r\n return a.sort(function () {\r\n return .5 - Math.random();\r\n });\r\n },\r\n distribute = function distribute(v) {\r\n if (_isFunction(v)) {\r\n return v;\r\n }\r\n\r\n var vars = _isObject(v) ? v : {\r\n each: v\r\n },\r\n ease = _parseEase(vars.ease),\r\n from = vars.from || 0,\r\n base = parseFloat(vars.base) || 0,\r\n cache = {},\r\n isDecimal = from > 0 && from < 1,\r\n ratios = isNaN(from) || isDecimal,\r\n axis = vars.axis,\r\n ratioX = from,\r\n ratioY = from;\r\n\r\n if (_isString(from)) {\r\n ratioX = ratioY = {\r\n center: .5,\r\n edges: .5,\r\n end: 1\r\n }[from] || 0;\r\n } else if (!isDecimal && ratios) {\r\n ratioX = from[0];\r\n ratioY = from[1];\r\n }\r\n\r\n return function (i, target, a) {\r\n var l = (a || vars).length,\r\n distances = cache[l],\r\n originX,\r\n originY,\r\n x,\r\n y,\r\n d,\r\n j,\r\n max,\r\n min,\r\n wrapAt;\r\n\r\n if (!distances) {\r\n wrapAt = vars.grid === \"auto\" ? 0 : (vars.grid || [1, _bigNum])[1];\r\n\r\n if (!wrapAt) {\r\n max = -_bigNum;\r\n\r\n while (max < (max = a[wrapAt++].getBoundingClientRect().left) && wrapAt < l) {}\r\n\r\n wrapAt < l && wrapAt--;\r\n }\r\n\r\n distances = cache[l] = [];\r\n originX = ratios ? Math.min(wrapAt, l) * ratioX - .5 : from % wrapAt;\r\n originY = wrapAt === _bigNum ? 0 : ratios ? l * ratioY / wrapAt - .5 : from / wrapAt | 0;\r\n max = 0;\r\n min = _bigNum;\r\n\r\n for (j = 0; j < l; j++) {\r\n x = j % wrapAt - originX;\r\n y = originY - (j / wrapAt | 0);\r\n distances[j] = d = !axis ? _sqrt(x * x + y * y) : Math.abs(axis === \"y\" ? y : x);\r\n d > max && (max = d);\r\n d < min && (min = d);\r\n }\r\n\r\n from === \"random\" && shuffle(distances);\r\n distances.max = max - min;\r\n distances.min = min;\r\n distances.v = l = (parseFloat(vars.amount) || parseFloat(vars.each) * (wrapAt > l ? l - 1 : !axis ? Math.max(wrapAt, l / wrapAt) : axis === \"y\" ? l / wrapAt : wrapAt) || 0) * (from === \"edges\" ? -1 : 1);\r\n distances.b = l < 0 ? base - l : base;\r\n distances.u = getUnit(vars.amount || vars.each) || 0;\r\n ease = ease && l < 0 ? _invertEase(ease) : ease;\r\n }\r\n\r\n l = (distances[i] - distances.min) / distances.max || 0;\r\n return _roundPrecise(distances.b + (ease ? ease(l) : l) * distances.v) + distances.u;\r\n };\r\n },\r\n _roundModifier = function _roundModifier(v) {\r\n var p = Math.pow(10, ((v + \"\").split(\".\")[1] || \"\").length);\r\n return function (raw) {\r\n var n = _roundPrecise(Math.round(parseFloat(raw) / v) * v * p);\r\n\r\n return (n - n % 1) / p + (_isNumber(raw) ? 0 : getUnit(raw));\r\n };\r\n },\r\n snap = function snap(snapTo, value) {\r\n var isArray = _isArray(snapTo),\r\n radius,\r\n is2D;\r\n\r\n if (!isArray && _isObject(snapTo)) {\r\n radius = isArray = snapTo.radius || _bigNum;\r\n\r\n if (snapTo.values) {\r\n snapTo = toArray(snapTo.values);\r\n\r\n if (is2D = !_isNumber(snapTo[0])) {\r\n radius *= radius;\r\n }\r\n } else {\r\n snapTo = _roundModifier(snapTo.increment);\r\n }\r\n }\r\n\r\n return _conditionalReturn(value, !isArray ? _roundModifier(snapTo) : _isFunction(snapTo) ? function (raw) {\r\n is2D = snapTo(raw);\r\n return Math.abs(is2D - raw) <= radius ? is2D : raw;\r\n } : function (raw) {\r\n var x = parseFloat(is2D ? raw.x : raw),\r\n y = parseFloat(is2D ? raw.y : 0),\r\n min = _bigNum,\r\n closest = 0,\r\n i = snapTo.length,\r\n dx,\r\n dy;\r\n\r\n while (i--) {\r\n if (is2D) {\r\n dx = snapTo[i].x - x;\r\n dy = snapTo[i].y - y;\r\n dx = dx * dx + dy * dy;\r\n } else {\r\n dx = Math.abs(snapTo[i] - x);\r\n }\r\n\r\n if (dx < min) {\r\n min = dx;\r\n closest = i;\r\n }\r\n }\r\n\r\n closest = !radius || min <= radius ? snapTo[closest] : raw;\r\n return is2D || closest === raw || _isNumber(raw) ? closest : closest + getUnit(raw);\r\n });\r\n },\r\n random = function random(min, max, roundingIncrement, returnFunction) {\r\n return _conditionalReturn(_isArray(min) ? !max : roundingIncrement === true ? !!(roundingIncrement = 0) : !returnFunction, function () {\r\n return _isArray(min) ? min[~~(Math.random() * min.length)] : (roundingIncrement = roundingIncrement || 1e-5) && (returnFunction = roundingIncrement < 1 ? Math.pow(10, (roundingIncrement + \"\").length - 2) : 1) && Math.floor(Math.round((min - roundingIncrement / 2 + Math.random() * (max - min + roundingIncrement * .99)) / roundingIncrement) * roundingIncrement * returnFunction) / returnFunction;\r\n });\r\n },\r\n pipe = function pipe() {\r\n for (var _len = arguments.length, functions = new Array(_len), _key = 0; _key < _len; _key++) {\r\n functions[_key] = arguments[_key];\r\n }\r\n\r\n return function (value) {\r\n return functions.reduce(function (v, f) {\r\n return f(v);\r\n }, value);\r\n };\r\n },\r\n unitize = function unitize(func, unit) {\r\n return function (value) {\r\n return func(parseFloat(value)) + (unit || getUnit(value));\r\n };\r\n },\r\n normalize = function normalize(min, max, value) {\r\n return mapRange(min, max, 0, 1, value);\r\n },\r\n _wrapArray = function _wrapArray(a, wrapper, value) {\r\n return _conditionalReturn(value, function (index) {\r\n return a[~~wrapper(index)];\r\n });\r\n },\r\n wrap = function wrap(min, max, value) {\r\n var range = max - min;\r\n return _isArray(min) ? _wrapArray(min, wrap(0, min.length), max) : _conditionalReturn(value, function (value) {\r\n return (range + (value - min) % range) % range + min;\r\n });\r\n },\r\n wrapYoyo = function wrapYoyo(min, max, value) {\r\n var range = max - min,\r\n total = range * 2;\r\n return _isArray(min) ? _wrapArray(min, wrapYoyo(0, min.length - 1), max) : _conditionalReturn(value, function (value) {\r\n value = (total + (value - min) % total) % total || 0;\r\n return min + (value > range ? total - value : value);\r\n });\r\n },\r\n _replaceRandom = function _replaceRandom(value) {\r\n var prev = 0,\r\n s = \"\",\r\n i,\r\n nums,\r\n end,\r\n isArray;\r\n\r\n while (~(i = value.indexOf(\"random(\", prev))) {\r\n end = value.indexOf(\")\", i);\r\n isArray = value.charAt(i + 7) === \"[\";\r\n nums = value.substr(i + 7, end - i - 7).match(isArray ? _delimitedValueExp : _strictNumExp);\r\n s += value.substr(prev, i - prev) + random(isArray ? nums : +nums[0], isArray ? 0 : +nums[1], +nums[2] || 1e-5);\r\n prev = end + 1;\r\n }\r\n\r\n return s + value.substr(prev, value.length - prev);\r\n },\r\n mapRange = function mapRange(inMin, inMax, outMin, outMax, value) {\r\n var inRange = inMax - inMin,\r\n outRange = outMax - outMin;\r\n return _conditionalReturn(value, function (value) {\r\n return outMin + ((value - inMin) / inRange * outRange || 0);\r\n });\r\n },\r\n interpolate = function interpolate(start, end, progress, mutate) {\r\n var func = isNaN(start + end) ? 0 : function (p) {\r\n return (1 - p) * start + p * end;\r\n };\r\n\r\n if (!func) {\r\n var isString = _isString(start),\r\n master = {},\r\n p,\r\n i,\r\n interpolators,\r\n l,\r\n il;\r\n\r\n progress === true && (mutate = 1) && (progress = null);\r\n\r\n if (isString) {\r\n start = {\r\n p: start\r\n };\r\n end = {\r\n p: end\r\n };\r\n } else if (_isArray(start) && !_isArray(end)) {\r\n interpolators = [];\r\n l = start.length;\r\n il = l - 2;\r\n\r\n for (i = 1; i < l; i++) {\r\n interpolators.push(interpolate(start[i - 1], start[i]));\r\n }\r\n\r\n l--;\r\n\r\n func = function func(p) {\r\n p *= l;\r\n var i = Math.min(il, ~~p);\r\n return interpolators[i](p - i);\r\n };\r\n\r\n progress = end;\r\n } else if (!mutate) {\r\n start = _merge(_isArray(start) ? [] : {}, start);\r\n }\r\n\r\n if (!interpolators) {\r\n for (p in end) {\r\n _addPropTween.call(master, start, p, \"get\", end[p]);\r\n }\r\n\r\n func = function func(p) {\r\n return _renderPropTweens(p, master) || (isString ? start.p : start);\r\n };\r\n }\r\n }\r\n\r\n return _conditionalReturn(progress, func);\r\n },\r\n _getLabelInDirection = function _getLabelInDirection(timeline, fromTime, backward) {\r\n var labels = timeline.labels,\r\n min = _bigNum,\r\n p,\r\n distance,\r\n label;\r\n\r\n for (p in labels) {\r\n distance = labels[p] - fromTime;\r\n\r\n if (distance < 0 === !!backward && distance && min > (distance = Math.abs(distance))) {\r\n label = p;\r\n min = distance;\r\n }\r\n }\r\n\r\n return label;\r\n },\r\n _callback = function _callback(animation, type, executeLazyFirst) {\r\n var v = animation.vars,\r\n callback = v[type],\r\n prevContext = _context,\r\n context = animation._ctx,\r\n params,\r\n scope,\r\n result;\r\n\r\n if (!callback) {\r\n return;\r\n }\r\n\r\n params = v[type + \"Params\"];\r\n scope = v.callbackScope || animation;\r\n executeLazyFirst && _lazyTweens.length && _lazyRender();\r\n context && (_context = context);\r\n result = params ? callback.apply(scope, params) : callback.call(scope);\r\n _context = prevContext;\r\n return result;\r\n },\r\n _interrupt = function _interrupt(animation) {\r\n _removeFromParent(animation);\r\n\r\n animation.scrollTrigger && animation.scrollTrigger.kill(!!_reverting);\r\n animation.progress() < 1 && _callback(animation, \"onInterrupt\");\r\n return animation;\r\n },\r\n _quickTween,\r\n _registerPluginQueue = [],\r\n _createPlugin = function _createPlugin(config) {\r\n if (!config) return;\r\n config = !config.name && config[\"default\"] || config;\r\n\r\n if (_windowExists() || config.headless) {\r\n var name = config.name,\r\n isFunc = _isFunction(config),\r\n Plugin = name && !isFunc && config.init ? function () {\r\n this._props = [];\r\n } : config,\r\n instanceDefaults = {\r\n init: _emptyFunc,\r\n render: _renderPropTweens,\r\n add: _addPropTween,\r\n kill: _killPropTweensOf,\r\n modifier: _addPluginModifier,\r\n rawVars: 0\r\n },\r\n statics = {\r\n targetTest: 0,\r\n get: 0,\r\n getSetter: _getSetter,\r\n aliases: {},\r\n register: 0\r\n };\r\n\r\n _wake();\r\n\r\n if (config !== Plugin) {\r\n if (_plugins[name]) {\r\n return;\r\n }\r\n\r\n _setDefaults(Plugin, _setDefaults(_copyExcluding(config, instanceDefaults), statics));\r\n\r\n _merge(Plugin.prototype, _merge(instanceDefaults, _copyExcluding(config, statics)));\r\n\r\n _plugins[Plugin.prop = name] = Plugin;\r\n\r\n if (config.targetTest) {\r\n _harnessPlugins.push(Plugin);\r\n\r\n _reservedProps[name] = 1;\r\n }\r\n\r\n name = (name === \"css\" ? \"CSS\" : name.charAt(0).toUpperCase() + name.substr(1)) + \"Plugin\";\r\n }\r\n\r\n _addGlobal(name, Plugin);\r\n\r\n config.register && config.register(gsap, Plugin, PropTween);\r\n } else {\r\n _registerPluginQueue.push(config);\r\n }\r\n },\r\n _255 = 255,\r\n _colorLookup = {\r\n aqua: [0, _255, _255],\r\n lime: [0, _255, 0],\r\n silver: [192, 192, 192],\r\n black: [0, 0, 0],\r\n maroon: [128, 0, 0],\r\n teal: [0, 128, 128],\r\n blue: [0, 0, _255],\r\n navy: [0, 0, 128],\r\n white: [_255, _255, _255],\r\n olive: [128, 128, 0],\r\n yellow: [_255, _255, 0],\r\n orange: [_255, 165, 0],\r\n gray: [128, 128, 128],\r\n purple: [128, 0, 128],\r\n green: [0, 128, 0],\r\n red: [_255, 0, 0],\r\n pink: [_255, 192, 203],\r\n cyan: [0, _255, _255],\r\n transparent: [_255, _255, _255, 0]\r\n },\r\n _hue = function _hue(h, m1, m2) {\r\n h += h < 0 ? 1 : h > 1 ? -1 : 0;\r\n return (h * 6 < 1 ? m1 + (m2 - m1) * h * 6 : h < .5 ? m2 : h * 3 < 2 ? m1 + (m2 - m1) * (2 / 3 - h) * 6 : m1) * _255 + .5 | 0;\r\n },\r\n splitColor = function splitColor(v, toHSL, forceAlpha) {\r\n var a = !v ? _colorLookup.black : _isNumber(v) ? [v >> 16, v >> 8 & _255, v & _255] : 0,\r\n r,\r\n g,\r\n b,\r\n h,\r\n s,\r\n l,\r\n max,\r\n min,\r\n d,\r\n wasHSL;\r\n\r\n if (!a) {\r\n if (v.substr(-1) === \",\") {\r\n v = v.substr(0, v.length - 1);\r\n }\r\n\r\n if (_colorLookup[v]) {\r\n a = _colorLookup[v];\r\n } else if (v.charAt(0) === \"#\") {\r\n if (v.length < 6) {\r\n r = v.charAt(1);\r\n g = v.charAt(2);\r\n b = v.charAt(3);\r\n v = \"#\" + r + r + g + g + b + b + (v.length === 5 ? v.charAt(4) + v.charAt(4) : \"\");\r\n }\r\n\r\n if (v.length === 9) {\r\n a = parseInt(v.substr(1, 6), 16);\r\n return [a >> 16, a >> 8 & _255, a & _255, parseInt(v.substr(7), 16) / 255];\r\n }\r\n\r\n v = parseInt(v.substr(1), 16);\r\n a = [v >> 16, v >> 8 & _255, v & _255];\r\n } else if (v.substr(0, 3) === \"hsl\") {\r\n a = wasHSL = v.match(_strictNumExp);\r\n\r\n if (!toHSL) {\r\n h = +a[0] % 360 / 360;\r\n s = +a[1] / 100;\r\n l = +a[2] / 100;\r\n g = l <= .5 ? l * (s + 1) : l + s - l * s;\r\n r = l * 2 - g;\r\n a.length > 3 && (a[3] *= 1);\r\n a[0] = _hue(h + 1 / 3, r, g);\r\n a[1] = _hue(h, r, g);\r\n a[2] = _hue(h - 1 / 3, r, g);\r\n } else if (~v.indexOf(\"=\")) {\r\n a = v.match(_numExp);\r\n forceAlpha && a.length < 4 && (a[3] = 1);\r\n return a;\r\n }\r\n } else {\r\n a = v.match(_strictNumExp) || _colorLookup.transparent;\r\n }\r\n\r\n a = a.map(Number);\r\n }\r\n\r\n if (toHSL && !wasHSL) {\r\n r = a[0] / _255;\r\n g = a[1] / _255;\r\n b = a[2] / _255;\r\n max = Math.max(r, g, b);\r\n min = Math.min(r, g, b);\r\n l = (max + min) / 2;\r\n\r\n if (max === min) {\r\n h = s = 0;\r\n } else {\r\n d = max - min;\r\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\r\n h = max === r ? (g - b) / d + (g < b ? 6 : 0) : max === g ? (b - r) / d + 2 : (r - g) / d + 4;\r\n h *= 60;\r\n }\r\n\r\n a[0] = ~~(h + .5);\r\n a[1] = ~~(s * 100 + .5);\r\n a[2] = ~~(l * 100 + .5);\r\n }\r\n\r\n forceAlpha && a.length < 4 && (a[3] = 1);\r\n return a;\r\n },\r\n _colorOrderData = function _colorOrderData(v) {\r\n var values = [],\r\n c = [],\r\n i = -1;\r\n v.split(_colorExp).forEach(function (v) {\r\n var a = v.match(_numWithUnitExp) || [];\r\n values.push.apply(values, a);\r\n c.push(i += a.length + 1);\r\n });\r\n values.c = c;\r\n return values;\r\n },\r\n _formatColors = function _formatColors(s, toHSL, orderMatchData) {\r\n var result = \"\",\r\n colors = (s + result).match(_colorExp),\r\n type = toHSL ? \"hsla(\" : \"rgba(\",\r\n i = 0,\r\n c,\r\n shell,\r\n d,\r\n l;\r\n\r\n if (!colors) {\r\n return s;\r\n }\r\n\r\n colors = colors.map(function (color) {\r\n return (color = splitColor(color, toHSL, 1)) && type + (toHSL ? color[0] + \",\" + color[1] + \"%,\" + color[2] + \"%,\" + color[3] : color.join(\",\")) + \")\";\r\n });\r\n\r\n if (orderMatchData) {\r\n d = _colorOrderData(s);\r\n c = orderMatchData.c;\r\n\r\n if (c.join(result) !== d.c.join(result)) {\r\n shell = s.replace(_colorExp, \"1\").split(_numWithUnitExp);\r\n l = shell.length - 1;\r\n\r\n for (; i < l; i++) {\r\n result += shell[i] + (~c.indexOf(i) ? colors.shift() || type + \"0,0,0,0)\" : (d.length ? d : colors.length ? colors : orderMatchData).shift());\r\n }\r\n }\r\n }\r\n\r\n if (!shell) {\r\n shell = s.split(_colorExp);\r\n l = shell.length - 1;\r\n\r\n for (; i < l; i++) {\r\n result += shell[i] + colors[i];\r\n }\r\n }\r\n\r\n return result + shell[l];\r\n },\r\n _colorExp = function () {\r\n var s = \"(?:\\\\b(?:(?:rgb|rgba|hsl|hsla)\\\\(.+?\\\\))|\\\\B#(?:[0-9a-f]{3,4}){1,2}\\\\b\",\r\n p;\r\n\r\n for (p in _colorLookup) {\r\n s += \"|\" + p + \"\\\\b\";\r\n }\r\n\r\n return new RegExp(s + \")\", \"gi\");\r\n }(),\r\n _hslExp = /hsl[a]?\\(/,\r\n _colorStringFilter = function _colorStringFilter(a) {\r\n var combined = a.join(\" \"),\r\n toHSL;\r\n _colorExp.lastIndex = 0;\r\n\r\n if (_colorExp.test(combined)) {\r\n toHSL = _hslExp.test(combined);\r\n a[1] = _formatColors(a[1], toHSL);\r\n a[0] = _formatColors(a[0], toHSL, _colorOrderData(a[1]));\r\n return true;\r\n }\r\n },\r\n _tickerActive,\r\n _ticker = function () {\r\n var _getTime = Date.now,\r\n _lagThreshold = 500,\r\n _adjustedLag = 33,\r\n _startTime = _getTime(),\r\n _lastUpdate = _startTime,\r\n _gap = 1000 / 240,\r\n _nextTime = _gap,\r\n _listeners = [],\r\n _id,\r\n _req,\r\n _raf,\r\n _self,\r\n _delta,\r\n _i,\r\n _tick = function _tick(v) {\r\n var elapsed = _getTime() - _lastUpdate,\r\n manual = v === true,\r\n overlap,\r\n dispatch,\r\n time,\r\n frame;\r\n\r\n (elapsed > _lagThreshold || elapsed < 0) && (_startTime += elapsed - _adjustedLag);\r\n _lastUpdate += elapsed;\r\n time = _lastUpdate - _startTime;\r\n overlap = time - _nextTime;\r\n\r\n if (overlap > 0 || manual) {\r\n frame = ++_self.frame;\r\n _delta = time - _self.time * 1000;\r\n _self.time = time = time / 1000;\r\n _nextTime += overlap + (overlap >= _gap ? 4 : _gap - overlap);\r\n dispatch = 1;\r\n }\r\n\r\n manual || (_id = _req(_tick));\r\n\r\n if (dispatch) {\r\n for (_i = 0; _i < _listeners.length; _i++) {\r\n _listeners[_i](time, _delta, frame, v);\r\n }\r\n }\r\n };\r\n\r\n _self = {\r\n time: 0,\r\n frame: 0,\r\n tick: function tick() {\r\n _tick(true);\r\n },\r\n deltaRatio: function deltaRatio(fps) {\r\n return _delta / (1000 / (fps || 60));\r\n },\r\n wake: function wake() {\r\n if (_coreReady) {\r\n if (!_coreInitted && _windowExists()) {\r\n _win = _coreInitted = window;\r\n _doc = _win.document || {};\r\n _globals.gsap = gsap;\r\n (_win.gsapVersions || (_win.gsapVersions = [])).push(gsap.version);\r\n\r\n _install(_installScope || _win.GreenSockGlobals || !_win.gsap && _win || {});\r\n\r\n _registerPluginQueue.forEach(_createPlugin);\r\n }\r\n\r\n _raf = typeof requestAnimationFrame !== \"undefined\" && requestAnimationFrame;\r\n _id && _self.sleep();\r\n\r\n _req = _raf || function (f) {\r\n return setTimeout(f, _nextTime - _self.time * 1000 + 1 | 0);\r\n };\r\n\r\n _tickerActive = 1;\r\n\r\n _tick(2);\r\n }\r\n },\r\n sleep: function sleep() {\r\n (_raf ? cancelAnimationFrame : clearTimeout)(_id);\r\n _tickerActive = 0;\r\n _req = _emptyFunc;\r\n },\r\n lagSmoothing: function lagSmoothing(threshold, adjustedLag) {\r\n _lagThreshold = threshold || Infinity;\r\n _adjustedLag = Math.min(adjustedLag || 33, _lagThreshold);\r\n },\r\n fps: function fps(_fps) {\r\n _gap = 1000 / (_fps || 240);\r\n _nextTime = _self.time * 1000 + _gap;\r\n },\r\n add: function add(callback, once, prioritize) {\r\n var func = once ? function (t, d, f, v) {\r\n callback(t, d, f, v);\r\n\r\n _self.remove(func);\r\n } : callback;\r\n\r\n _self.remove(callback);\r\n\r\n _listeners[prioritize ? \"unshift\" : \"push\"](func);\r\n\r\n _wake();\r\n\r\n return func;\r\n },\r\n remove: function remove(callback, i) {\r\n ~(i = _listeners.indexOf(callback)) && _listeners.splice(i, 1) && _i >= i && _i--;\r\n },\r\n _listeners: _listeners\r\n };\r\n return _self;\r\n }(),\r\n _wake = function _wake() {\r\n return !_tickerActive && _ticker.wake();\r\n },\r\n _easeMap = {},\r\n _customEaseExp = /^[\\d.\\-M][\\d.\\-,\\s]/,\r\n _quotesExp = /[\"']/g,\r\n _parseObjectInString = function _parseObjectInString(value) {\r\n var obj = {},\r\n split = value.substr(1, value.length - 3).split(\":\"),\r\n key = split[0],\r\n i = 1,\r\n l = split.length,\r\n index,\r\n val,\r\n parsedVal;\r\n\r\n for (; i < l; i++) {\r\n val = split[i];\r\n index = i !== l - 1 ? val.lastIndexOf(\",\") : val.length;\r\n parsedVal = val.substr(0, index);\r\n obj[key] = isNaN(parsedVal) ? parsedVal.replace(_quotesExp, \"\").trim() : +parsedVal;\r\n key = val.substr(index + 1).trim();\r\n }\r\n\r\n return obj;\r\n },\r\n _valueInParentheses = function _valueInParentheses(value) {\r\n var open = value.indexOf(\"(\") + 1,\r\n close = value.indexOf(\")\"),\r\n nested = value.indexOf(\"(\", open);\r\n return value.substring(open, ~nested && nested < close ? value.indexOf(\")\", close + 1) : close);\r\n },\r\n _configEaseFromString = function _configEaseFromString(name) {\r\n var split = (name + \"\").split(\"(\"),\r\n ease = _easeMap[split[0]];\r\n return ease && split.length > 1 && ease.config ? ease.config.apply(null, ~name.indexOf(\"{\") ? [_parseObjectInString(split[1])] : _valueInParentheses(name).split(\",\").map(_numericIfPossible)) : _easeMap._CE && _customEaseExp.test(name) ? _easeMap._CE(\"\", name) : ease;\r\n },\r\n _invertEase = function _invertEase(ease) {\r\n return function (p) {\r\n return 1 - ease(1 - p);\r\n };\r\n },\r\n _propagateYoyoEase = function _propagateYoyoEase(timeline, isYoyo) {\r\n var child = timeline._first,\r\n ease;\r\n\r\n while (child) {\r\n if (child instanceof Timeline) {\r\n _propagateYoyoEase(child, isYoyo);\r\n } else if (child.vars.yoyoEase && (!child._yoyo || !child._repeat) && child._yoyo !== isYoyo) {\r\n if (child.timeline) {\r\n _propagateYoyoEase(child.timeline, isYoyo);\r\n } else {\r\n ease = child._ease;\r\n child._ease = child._yEase;\r\n child._yEase = ease;\r\n child._yoyo = isYoyo;\r\n }\r\n }\r\n\r\n child = child._next;\r\n }\r\n },\r\n _parseEase = function _parseEase(ease, defaultEase) {\r\n return !ease ? defaultEase : (_isFunction(ease) ? ease : _easeMap[ease] || _configEaseFromString(ease)) || defaultEase;\r\n },\r\n _insertEase = function _insertEase(names, easeIn, easeOut, easeInOut) {\r\n if (easeOut === void 0) {\r\n easeOut = function easeOut(p) {\r\n return 1 - easeIn(1 - p);\r\n };\r\n }\r\n\r\n if (easeInOut === void 0) {\r\n easeInOut = function easeInOut(p) {\r\n return p < .5 ? easeIn(p * 2) / 2 : 1 - easeIn((1 - p) * 2) / 2;\r\n };\r\n }\r\n\r\n var ease = {\r\n easeIn: easeIn,\r\n easeOut: easeOut,\r\n easeInOut: easeInOut\r\n },\r\n lowercaseName;\r\n\r\n _forEachName(names, function (name) {\r\n _easeMap[name] = _globals[name] = ease;\r\n _easeMap[lowercaseName = name.toLowerCase()] = easeOut;\r\n\r\n for (var p in ease) {\r\n _easeMap[lowercaseName + (p === \"easeIn\" ? \".in\" : p === \"easeOut\" ? \".out\" : \".inOut\")] = _easeMap[name + \".\" + p] = ease[p];\r\n }\r\n });\r\n\r\n return ease;\r\n },\r\n _easeInOutFromOut = function _easeInOutFromOut(easeOut) {\r\n return function (p) {\r\n return p < .5 ? (1 - easeOut(1 - p * 2)) / 2 : .5 + easeOut((p - .5) * 2) / 2;\r\n };\r\n },\r\n _configElastic = function _configElastic(type, amplitude, period) {\r\n var p1 = amplitude >= 1 ? amplitude : 1,\r\n p2 = (period || (type ? .3 : .45)) / (amplitude < 1 ? amplitude : 1),\r\n p3 = p2 / _2PI * (Math.asin(1 / p1) || 0),\r\n easeOut = function easeOut(p) {\r\n return p === 1 ? 1 : p1 * Math.pow(2, -10 * p) * _sin((p - p3) * p2) + 1;\r\n },\r\n ease = type === \"out\" ? easeOut : type === \"in\" ? function (p) {\r\n return 1 - easeOut(1 - p);\r\n } : _easeInOutFromOut(easeOut);\r\n\r\n p2 = _2PI / p2;\r\n\r\n ease.config = function (amplitude, period) {\r\n return _configElastic(type, amplitude, period);\r\n };\r\n\r\n return ease;\r\n },\r\n _configBack = function _configBack(type, overshoot) {\r\n if (overshoot === void 0) {\r\n overshoot = 1.70158;\r\n }\r\n\r\n var easeOut = function easeOut(p) {\r\n return p ? --p * p * ((overshoot + 1) * p + overshoot) + 1 : 0;\r\n },\r\n ease = type === \"out\" ? easeOut : type === \"in\" ? function (p) {\r\n return 1 - easeOut(1 - p);\r\n } : _easeInOutFromOut(easeOut);\r\n\r\n ease.config = function (overshoot) {\r\n return _configBack(type, overshoot);\r\n };\r\n\r\n return ease;\r\n };\r\n\r\n _forEachName(\"Linear,Quad,Cubic,Quart,Quint,Strong\", function (name, i) {\r\n var power = i < 5 ? i + 1 : i;\r\n\r\n _insertEase(name + \",Power\" + (power - 1), i ? function (p) {\r\n return Math.pow(p, power);\r\n } : function (p) {\r\n return p;\r\n }, function (p) {\r\n return 1 - Math.pow(1 - p, power);\r\n }, function (p) {\r\n return p < .5 ? Math.pow(p * 2, power) / 2 : 1 - Math.pow((1 - p) * 2, power) / 2;\r\n });\r\n });\r\n\r\n _easeMap.Linear.easeNone = _easeMap.none = _easeMap.Linear.easeIn;\r\n\r\n _insertEase(\"Elastic\", _configElastic(\"in\"), _configElastic(\"out\"), _configElastic());\r\n\r\n (function (n, c) {\r\n var n1 = 1 / c,\r\n n2 = 2 * n1,\r\n n3 = 2.5 * n1,\r\n easeOut = function easeOut(p) {\r\n return p < n1 ? n * p * p : p < n2 ? n * Math.pow(p - 1.5 / c, 2) + .75 : p < n3 ? n * (p -= 2.25 / c) * p + .9375 : n * Math.pow(p - 2.625 / c, 2) + .984375;\r\n };\r\n\r\n _insertEase(\"Bounce\", function (p) {\r\n return 1 - easeOut(1 - p);\r\n }, easeOut);\r\n })(7.5625, 2.75);\r\n\r\n _insertEase(\"Expo\", function (p) {\r\n return Math.pow(2, 10 * (p - 1)) * p + p * p * p * p * p * p * (1 - p);\r\n });\r\n\r\n _insertEase(\"Circ\", function (p) {\r\n return -(_sqrt(1 - p * p) - 1);\r\n });\r\n\r\n _insertEase(\"Sine\", function (p) {\r\n return p === 1 ? 1 : -_cos(p * _HALF_PI) + 1;\r\n });\r\n\r\n _insertEase(\"Back\", _configBack(\"in\"), _configBack(\"out\"), _configBack());\r\n\r\n _easeMap.SteppedEase = _easeMap.steps = _globals.SteppedEase = {\r\n config: function config(steps, immediateStart) {\r\n if (steps === void 0) {\r\n steps = 1;\r\n }\r\n\r\n var p1 = 1 / steps,\r\n p2 = steps + (immediateStart ? 0 : 1),\r\n p3 = immediateStart ? 1 : 0,\r\n max = 1 - _tinyNum;\r\n return function (p) {\r\n return ((p2 * _clamp(0, max, p) | 0) + p3) * p1;\r\n };\r\n }\r\n };\r\n _defaults.ease = _easeMap[\"quad.out\"];\r\n\r\n _forEachName(\"onComplete,onUpdate,onStart,onRepeat,onReverseComplete,onInterrupt\", function (name) {\r\n return _callbackNames += name + \",\" + name + \"Params,\";\r\n });\r\n\r\n var GSCache = function GSCache(target, harness) {\r\n this.id = _gsID++;\r\n target._gsap = this;\r\n this.target = target;\r\n this.harness = harness;\r\n this.get = harness ? harness.get : _getProperty;\r\n this.set = harness ? harness.getSetter : _getSetter;\r\n };\r\n var Animation = function () {\r\n function Animation(vars) {\r\n this.vars = vars;\r\n this._delay = +vars.delay || 0;\r\n\r\n if (this._repeat = vars.repeat === Infinity ? -2 : vars.repeat || 0) {\r\n this._rDelay = vars.repeatDelay || 0;\r\n this._yoyo = !!vars.yoyo || !!vars.yoyoEase;\r\n }\r\n\r\n this._ts = 1;\r\n\r\n _setDuration(this, +vars.duration, 1, 1);\r\n\r\n this.data = vars.data;\r\n\r\n if (_context) {\r\n this._ctx = _context;\r\n\r\n _context.data.push(this);\r\n }\r\n\r\n _tickerActive || _ticker.wake();\r\n }\r\n\r\n var _proto = Animation.prototype;\r\n\r\n _proto.delay = function delay(value) {\r\n if (value || value === 0) {\r\n this.parent && this.parent.smoothChildTiming && this.startTime(this._start + value - this._delay);\r\n this._delay = value;\r\n return this;\r\n }\r\n\r\n return this._delay;\r\n };\r\n\r\n _proto.duration = function duration(value) {\r\n return arguments.length ? this.totalDuration(this._repeat > 0 ? value + (value + this._rDelay) * this._repeat : value) : this.totalDuration() && this._dur;\r\n };\r\n\r\n _proto.totalDuration = function totalDuration(value) {\r\n if (!arguments.length) {\r\n return this._tDur;\r\n }\r\n\r\n this._dirty = 0;\r\n return _setDuration(this, this._repeat < 0 ? value : (value - this._repeat * this._rDelay) / (this._repeat + 1));\r\n };\r\n\r\n _proto.totalTime = function totalTime(_totalTime, suppressEvents) {\r\n _wake();\r\n\r\n if (!arguments.length) {\r\n return this._tTime;\r\n }\r\n\r\n var parent = this._dp;\r\n\r\n if (parent && parent.smoothChildTiming && this._ts) {\r\n _alignPlayhead(this, _totalTime);\r\n\r\n !parent._dp || parent.parent || _postAddChecks(parent, this);\r\n\r\n while (parent && parent.parent) {\r\n if (parent.parent._time !== parent._start + (parent._ts >= 0 ? parent._tTime / parent._ts : (parent.totalDuration() - parent._tTime) / -parent._ts)) {\r\n parent.totalTime(parent._tTime, true);\r\n }\r\n\r\n parent = parent.parent;\r\n }\r\n\r\n if (!this.parent && this._dp.autoRemoveChildren && (this._ts > 0 && _totalTime < this._tDur || this._ts < 0 && _totalTime > 0 || !this._tDur && !_totalTime)) {\r\n _addToTimeline(this._dp, this, this._start - this._delay);\r\n }\r\n }\r\n\r\n if (this._tTime !== _totalTime || !this._dur && !suppressEvents || this._initted && Math.abs(this._zTime) === _tinyNum || !_totalTime && !this._initted && (this.add || this._ptLookup)) {\r\n this._ts || (this._pTime = _totalTime);\r\n\r\n _lazySafeRender(this, _totalTime, suppressEvents);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n _proto.time = function time(value, suppressEvents) {\r\n return arguments.length ? this.totalTime(Math.min(this.totalDuration(), value + _elapsedCycleDuration(this)) % (this._dur + this._rDelay) || (value ? this._dur : 0), suppressEvents) : this._time;\r\n };\r\n\r\n _proto.totalProgress = function totalProgress(value, suppressEvents) {\r\n return arguments.length ? this.totalTime(this.totalDuration() * value, suppressEvents) : this.totalDuration() ? Math.min(1, this._tTime / this._tDur) : this.rawTime() >= 0 && this._initted ? 1 : 0;\r\n };\r\n\r\n _proto.progress = function progress(value, suppressEvents) {\r\n return arguments.length ? this.totalTime(this.duration() * (this._yoyo && !(this.iteration() & 1) ? 1 - value : value) + _elapsedCycleDuration(this), suppressEvents) : this.duration() ? Math.min(1, this._time / this._dur) : this.rawTime() > 0 ? 1 : 0;\r\n };\r\n\r\n _proto.iteration = function iteration(value, suppressEvents) {\r\n var cycleDuration = this.duration() + this._rDelay;\r\n\r\n return arguments.length ? this.totalTime(this._time + (value - 1) * cycleDuration, suppressEvents) : this._repeat ? _animationCycle(this._tTime, cycleDuration) + 1 : 1;\r\n };\r\n\r\n _proto.timeScale = function timeScale(value, suppressEvents) {\r\n if (!arguments.length) {\r\n return this._rts === -_tinyNum ? 0 : this._rts;\r\n }\r\n\r\n if (this._rts === value) {\r\n return this;\r\n }\r\n\r\n var tTime = this.parent && this._ts ? _parentToChildTotalTime(this.parent._time, this) : this._tTime;\r\n this._rts = +value || 0;\r\n this._ts = this._ps || value === -_tinyNum ? 0 : this._rts;\r\n this.totalTime(_clamp(-Math.abs(this._delay), this.totalDuration(), tTime), suppressEvents !== false);\r\n\r\n _setEnd(this);\r\n\r\n return _recacheAncestors(this);\r\n };\r\n\r\n _proto.paused = function paused(value) {\r\n if (!arguments.length) {\r\n return this._ps;\r\n }\r\n\r\n if (this._ps !== value) {\r\n this._ps = value;\r\n\r\n if (value) {\r\n this._pTime = this._tTime || Math.max(-this._delay, this.rawTime());\r\n this._ts = this._act = 0;\r\n } else {\r\n _wake();\r\n\r\n this._ts = this._rts;\r\n this.totalTime(this.parent && !this.parent.smoothChildTiming ? this.rawTime() : this._tTime || this._pTime, this.progress() === 1 && Math.abs(this._zTime) !== _tinyNum && (this._tTime -= _tinyNum));\r\n }\r\n }\r\n\r\n return this;\r\n };\r\n\r\n _proto.startTime = function startTime(value) {\r\n if (arguments.length) {\r\n this._start = value;\r\n var parent = this.parent || this._dp;\r\n parent && (parent._sort || !this.parent) && _addToTimeline(parent, this, value - this._delay);\r\n return this;\r\n }\r\n\r\n return this._start;\r\n };\r\n\r\n _proto.endTime = function endTime(includeRepeats) {\r\n return this._start + (_isNotFalse(includeRepeats) ? this.totalDuration() : this.duration()) / Math.abs(this._ts || 1);\r\n };\r\n\r\n _proto.rawTime = function rawTime(wrapRepeats) {\r\n var parent = this.parent || this._dp;\r\n return !parent ? this._tTime : wrapRepeats && (!this._ts || this._repeat && this._time && this.totalProgress() < 1) ? this._tTime % (this._dur + this._rDelay) : !this._ts ? this._tTime : _parentToChildTotalTime(parent.rawTime(wrapRepeats), this);\r\n };\r\n\r\n _proto.revert = function revert(config) {\r\n if (config === void 0) {\r\n config = _revertConfig;\r\n }\r\n\r\n var prevIsReverting = _reverting;\r\n _reverting = config;\r\n\r\n if (_isRevertWorthy(this)) {\r\n this.timeline && this.timeline.revert(config);\r\n this.totalTime(-0.01, config.suppressEvents);\r\n }\r\n\r\n this.data !== \"nested\" && config.kill !== false && this.kill();\r\n _reverting = prevIsReverting;\r\n return this;\r\n };\r\n\r\n _proto.globalTime = function globalTime(rawTime) {\r\n var animation = this,\r\n time = arguments.length ? rawTime : animation.rawTime();\r\n\r\n while (animation) {\r\n time = animation._start + time / (Math.abs(animation._ts) || 1);\r\n animation = animation._dp;\r\n }\r\n\r\n return !this.parent && this._sat ? this._sat.globalTime(rawTime) : time;\r\n };\r\n\r\n _proto.repeat = function repeat(value) {\r\n if (arguments.length) {\r\n this._repeat = value === Infinity ? -2 : value;\r\n return _onUpdateTotalDuration(this);\r\n }\r\n\r\n return this._repeat === -2 ? Infinity : this._repeat;\r\n };\r\n\r\n _proto.repeatDelay = function repeatDelay(value) {\r\n if (arguments.length) {\r\n var time = this._time;\r\n this._rDelay = value;\r\n\r\n _onUpdateTotalDuration(this);\r\n\r\n return time ? this.time(time) : this;\r\n }\r\n\r\n return this._rDelay;\r\n };\r\n\r\n _proto.yoyo = function yoyo(value) {\r\n if (arguments.length) {\r\n this._yoyo = value;\r\n return this;\r\n }\r\n\r\n return this._yoyo;\r\n };\r\n\r\n _proto.seek = function seek(position, suppressEvents) {\r\n return this.totalTime(_parsePosition(this, position), _isNotFalse(suppressEvents));\r\n };\r\n\r\n _proto.restart = function restart(includeDelay, suppressEvents) {\r\n this.play().totalTime(includeDelay ? -this._delay : 0, _isNotFalse(suppressEvents));\r\n this._dur || (this._zTime = -_tinyNum);\r\n return this;\r\n };\r\n\r\n _proto.play = function play(from, suppressEvents) {\r\n from != null && this.seek(from, suppressEvents);\r\n return this.reversed(false).paused(false);\r\n };\r\n\r\n _proto.reverse = function reverse(from, suppressEvents) {\r\n from != null && this.seek(from || this.totalDuration(), suppressEvents);\r\n return this.reversed(true).paused(false);\r\n };\r\n\r\n _proto.pause = function pause(atTime, suppressEvents) {\r\n atTime != null && this.seek(atTime, suppressEvents);\r\n return this.paused(true);\r\n };\r\n\r\n _proto.resume = function resume() {\r\n return this.paused(false);\r\n };\r\n\r\n _proto.reversed = function reversed(value) {\r\n if (arguments.length) {\r\n !!value !== this.reversed() && this.timeScale(-this._rts || (value ? -_tinyNum : 0));\r\n return this;\r\n }\r\n\r\n return this._rts < 0;\r\n };\r\n\r\n _proto.invalidate = function invalidate() {\r\n this._initted = this._act = 0;\r\n this._zTime = -_tinyNum;\r\n return this;\r\n };\r\n\r\n _proto.isActive = function isActive() {\r\n var parent = this.parent || this._dp,\r\n start = this._start,\r\n rawTime;\r\n return !!(!parent || this._ts && this._initted && parent.isActive() && (rawTime = parent.rawTime(true)) >= start && rawTime < this.endTime(true) - _tinyNum);\r\n };\r\n\r\n _proto.eventCallback = function eventCallback(type, callback, params) {\r\n var vars = this.vars;\r\n\r\n if (arguments.length > 1) {\r\n if (!callback) {\r\n delete vars[type];\r\n } else {\r\n vars[type] = callback;\r\n params && (vars[type + \"Params\"] = params);\r\n type === \"onUpdate\" && (this._onUpdate = callback);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n return vars[type];\r\n };\r\n\r\n _proto.then = function then(onFulfilled) {\r\n var self = this;\r\n return new Promise(function (resolve) {\r\n var f = _isFunction(onFulfilled) ? onFulfilled : _passThrough,\r\n _resolve = function _resolve() {\r\n var _then = self.then;\r\n self.then = null;\r\n _isFunction(f) && (f = f(self)) && (f.then || f === self) && (self.then = _then);\r\n resolve(f);\r\n self.then = _then;\r\n };\r\n\r\n if (self._initted && self.totalProgress() === 1 && self._ts >= 0 || !self._tTime && self._ts < 0) {\r\n _resolve();\r\n } else {\r\n self._prom = _resolve;\r\n }\r\n });\r\n };\r\n\r\n _proto.kill = function kill() {\r\n _interrupt(this);\r\n };\r\n\r\n return Animation;\r\n }();\r\n\r\n _setDefaults(Animation.prototype, {\r\n _time: 0,\r\n _start: 0,\r\n _end: 0,\r\n _tTime: 0,\r\n _tDur: 0,\r\n _dirty: 0,\r\n _repeat: 0,\r\n _yoyo: false,\r\n parent: null,\r\n _initted: false,\r\n _rDelay: 0,\r\n _ts: 1,\r\n _dp: 0,\r\n ratio: 0,\r\n _zTime: -_tinyNum,\r\n _prom: 0,\r\n _ps: false,\r\n _rts: 1\r\n });\r\n\r\n var Timeline = function (_Animation) {\r\n _inheritsLoose(Timeline, _Animation);\r\n\r\n function Timeline(vars, position) {\r\n var _this;\r\n\r\n if (vars === void 0) {\r\n vars = {};\r\n }\r\n\r\n _this = _Animation.call(this, vars) || this;\r\n _this.labels = {};\r\n _this.smoothChildTiming = !!vars.smoothChildTiming;\r\n _this.autoRemoveChildren = !!vars.autoRemoveChildren;\r\n _this._sort = _isNotFalse(vars.sortChildren);\r\n _globalTimeline && _addToTimeline(vars.parent || _globalTimeline, _assertThisInitialized(_this), position);\r\n vars.reversed && _this.reverse();\r\n vars.paused && _this.paused(true);\r\n vars.scrollTrigger && _scrollTrigger(_assertThisInitialized(_this), vars.scrollTrigger);\r\n return _this;\r\n }\r\n\r\n var _proto2 = Timeline.prototype;\r\n\r\n _proto2.to = function to(targets, vars, position) {\r\n _createTweenType(0, arguments, this);\r\n\r\n return this;\r\n };\r\n\r\n _proto2.from = function from(targets, vars, position) {\r\n _createTweenType(1, arguments, this);\r\n\r\n return this;\r\n };\r\n\r\n _proto2.fromTo = function fromTo(targets, fromVars, toVars, position) {\r\n _createTweenType(2, arguments, this);\r\n\r\n return this;\r\n };\r\n\r\n _proto2.set = function set(targets, vars, position) {\r\n vars.duration = 0;\r\n vars.parent = this;\r\n _inheritDefaults(vars).repeatDelay || (vars.repeat = 0);\r\n vars.immediateRender = !!vars.immediateRender;\r\n new Tween(targets, vars, _parsePosition(this, position), 1);\r\n return this;\r\n };\r\n\r\n _proto2.call = function call(callback, params, position) {\r\n return _addToTimeline(this, Tween.delayedCall(0, callback, params), position);\r\n };\r\n\r\n _proto2.staggerTo = function staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams) {\r\n vars.duration = duration;\r\n vars.stagger = vars.stagger || stagger;\r\n vars.onComplete = onCompleteAll;\r\n vars.onCompleteParams = onCompleteAllParams;\r\n vars.parent = this;\r\n new Tween(targets, vars, _parsePosition(this, position));\r\n return this;\r\n };\r\n\r\n _proto2.staggerFrom = function staggerFrom(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams) {\r\n vars.runBackwards = 1;\r\n _inheritDefaults(vars).immediateRender = _isNotFalse(vars.immediateRender);\r\n return this.staggerTo(targets, duration, vars, stagger, position, onCompleteAll, onCompleteAllParams);\r\n };\r\n\r\n _proto2.staggerFromTo = function staggerFromTo(targets, duration, fromVars, toVars, stagger, position, onCompleteAll, onCompleteAllParams) {\r\n toVars.startAt = fromVars;\r\n _inheritDefaults(toVars).immediateRender = _isNotFalse(toVars.immediateRender);\r\n return this.staggerTo(targets, duration, toVars, stagger, position, onCompleteAll, onCompleteAllParams);\r\n };\r\n\r\n _proto2.render = function render(totalTime, suppressEvents, force) {\r\n var prevTime = this._time,\r\n tDur = this._dirty ? this.totalDuration() : this._tDur,\r\n dur = this._dur,\r\n tTime = totalTime <= 0 ? 0 : _roundPrecise(totalTime),\r\n crossingStart = this._zTime < 0 !== totalTime < 0 && (this._initted || !dur),\r\n time,\r\n child,\r\n next,\r\n iteration,\r\n cycleDuration,\r\n prevPaused,\r\n pauseTween,\r\n timeScale,\r\n prevStart,\r\n prevIteration,\r\n yoyo,\r\n isYoyo;\r\n this !== _globalTimeline && tTime > tDur && totalTime >= 0 && (tTime = tDur);\r\n\r\n if (tTime !== this._tTime || force || crossingStart) {\r\n if (prevTime !== this._time && dur) {\r\n tTime += this._time - prevTime;\r\n totalTime += this._time - prevTime;\r\n }\r\n\r\n time = tTime;\r\n prevStart = this._start;\r\n timeScale = this._ts;\r\n prevPaused = !timeScale;\r\n\r\n if (crossingStart) {\r\n dur || (prevTime = this._zTime);\r\n (totalTime || !suppressEvents) && (this._zTime = totalTime);\r\n }\r\n\r\n if (this._repeat) {\r\n yoyo = this._yoyo;\r\n cycleDuration = dur + this._rDelay;\r\n\r\n if (this._repeat < -1 && totalTime < 0) {\r\n return this.totalTime(cycleDuration * 100 + totalTime, suppressEvents, force);\r\n }\r\n\r\n time = _roundPrecise(tTime % cycleDuration);\r\n\r\n if (tTime === tDur) {\r\n iteration = this._repeat;\r\n time = dur;\r\n } else {\r\n prevIteration = _roundPrecise(tTime / cycleDuration);\r\n iteration = ~~prevIteration;\r\n\r\n if (iteration && iteration === prevIteration) {\r\n time = dur;\r\n iteration--;\r\n }\r\n\r\n time > dur && (time = dur);\r\n }\r\n\r\n prevIteration = _animationCycle(this._tTime, cycleDuration);\r\n !prevTime && this._tTime && prevIteration !== iteration && this._tTime - prevIteration * cycleDuration - this._dur <= 0 && (prevIteration = iteration);\r\n\r\n if (yoyo && iteration & 1) {\r\n time = dur - time;\r\n isYoyo = 1;\r\n }\r\n\r\n if (iteration !== prevIteration && !this._lock) {\r\n var rewinding = yoyo && prevIteration & 1,\r\n doesWrap = rewinding === (yoyo && iteration & 1);\r\n iteration < prevIteration && (rewinding = !rewinding);\r\n prevTime = rewinding ? 0 : tTime % dur ? dur : tTime;\r\n this._lock = 1;\r\n this.render(prevTime || (isYoyo ? 0 : _roundPrecise(iteration * cycleDuration)), suppressEvents, !dur)._lock = 0;\r\n this._tTime = tTime;\r\n !suppressEvents && this.parent && _callback(this, \"onRepeat\");\r\n this.vars.repeatRefresh && !isYoyo && (this.invalidate()._lock = 1);\r\n\r\n if (prevTime && prevTime !== this._time || prevPaused !== !this._ts || this.vars.onRepeat && !this.parent && !this._act) {\r\n return this;\r\n }\r\n\r\n dur = this._dur;\r\n tDur = this._tDur;\r\n\r\n if (doesWrap) {\r\n this._lock = 2;\r\n prevTime = rewinding ? dur : -0.0001;\r\n this.render(prevTime, true);\r\n this.vars.repeatRefresh && !isYoyo && this.invalidate();\r\n }\r\n\r\n this._lock = 0;\r\n\r\n if (!this._ts && !prevPaused) {\r\n return this;\r\n }\r\n\r\n _propagateYoyoEase(this, isYoyo);\r\n }\r\n }\r\n\r\n if (this._hasPause && !this._forcing && this._lock < 2) {\r\n pauseTween = _findNextPauseTween(this, _roundPrecise(prevTime), _roundPrecise(time));\r\n\r\n if (pauseTween) {\r\n tTime -= time - (time = pauseTween._start);\r\n }\r\n }\r\n\r\n this._tTime = tTime;\r\n this._time = time;\r\n this._act = !timeScale;\r\n\r\n if (!this._initted) {\r\n this._onUpdate = this.vars.onUpdate;\r\n this._initted = 1;\r\n this._zTime = totalTime;\r\n prevTime = 0;\r\n }\r\n\r\n if (!prevTime && tTime && !suppressEvents && !prevIteration) {\r\n _callback(this, \"onStart\");\r\n\r\n if (this._tTime !== tTime) {\r\n return this;\r\n }\r\n }\r\n\r\n if (time >= prevTime && totalTime >= 0) {\r\n child = this._first;\r\n\r\n while (child) {\r\n next = child._next;\r\n\r\n if ((child._act || time >= child._start) && child._ts && pauseTween !== child) {\r\n if (child.parent !== this) {\r\n return this.render(totalTime, suppressEvents, force);\r\n }\r\n\r\n child.render(child._ts > 0 ? (time - child._start) * child._ts : (child._dirty ? child.totalDuration() : child._tDur) + (time - child._start) * child._ts, suppressEvents, force);\r\n\r\n if (time !== this._time || !this._ts && !prevPaused) {\r\n pauseTween = 0;\r\n next && (tTime += this._zTime = -_tinyNum);\r\n break;\r\n }\r\n }\r\n\r\n child = next;\r\n }\r\n } else {\r\n child = this._last;\r\n var adjustedTime = totalTime < 0 ? totalTime : time;\r\n\r\n while (child) {\r\n next = child._prev;\r\n\r\n if ((child._act || adjustedTime <= child._end) && child._ts && pauseTween !== child) {\r\n if (child.parent !== this) {\r\n return this.render(totalTime, suppressEvents, force);\r\n }\r\n\r\n child.render(child._ts > 0 ? (adjustedTime - child._start) * child._ts : (child._dirty ? child.totalDuration() : child._tDur) + (adjustedTime - child._start) * child._ts, suppressEvents, force || _reverting && _isRevertWorthy(child));\r\n\r\n if (time !== this._time || !this._ts && !prevPaused) {\r\n pauseTween = 0;\r\n next && (tTime += this._zTime = adjustedTime ? -_tinyNum : _tinyNum);\r\n break;\r\n }\r\n }\r\n\r\n child = next;\r\n }\r\n }\r\n\r\n if (pauseTween && !suppressEvents) {\r\n this.pause();\r\n pauseTween.render(time >= prevTime ? 0 : -_tinyNum)._zTime = time >= prevTime ? 1 : -1;\r\n\r\n if (this._ts) {\r\n this._start = prevStart;\r\n\r\n _setEnd(this);\r\n\r\n return this.render(totalTime, suppressEvents, force);\r\n }\r\n }\r\n\r\n this._onUpdate && !suppressEvents && _callback(this, \"onUpdate\", true);\r\n if (tTime === tDur && this._tTime >= this.totalDuration() || !tTime && prevTime) if (prevStart === this._start || Math.abs(timeScale) !== Math.abs(this._ts)) if (!this._lock) {\r\n (totalTime || !dur) && (tTime === tDur && this._ts > 0 || !tTime && this._ts < 0) && _removeFromParent(this, 1);\r\n\r\n if (!suppressEvents && !(totalTime < 0 && !prevTime) && (tTime || prevTime || !tDur)) {\r\n _callback(this, tTime === tDur && totalTime >= 0 ? \"onComplete\" : \"onReverseComplete\", true);\r\n\r\n this._prom && !(tTime < tDur && this.timeScale() > 0) && this._prom();\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n };\r\n\r\n _proto2.add = function add(child, position) {\r\n var _this2 = this;\r\n\r\n _isNumber(position) || (position = _parsePosition(this, position, child));\r\n\r\n if (!(child instanceof Animation)) {\r\n if (_isArray(child)) {\r\n child.forEach(function (obj) {\r\n return _this2.add(obj, position);\r\n });\r\n return this;\r\n }\r\n\r\n if (_isString(child)) {\r\n return this.addLabel(child, position);\r\n }\r\n\r\n if (_isFunction(child)) {\r\n child = Tween.delayedCall(0, child);\r\n } else {\r\n return this;\r\n }\r\n }\r\n\r\n return this !== child ? _addToTimeline(this, child, position) : this;\r\n };\r\n\r\n _proto2.getChildren = function getChildren(nested, tweens, timelines, ignoreBeforeTime) {\r\n if (nested === void 0) {\r\n nested = true;\r\n }\r\n\r\n if (tweens === void 0) {\r\n tweens = true;\r\n }\r\n\r\n if (timelines === void 0) {\r\n timelines = true;\r\n }\r\n\r\n if (ignoreBeforeTime === void 0) {\r\n ignoreBeforeTime = -_bigNum;\r\n }\r\n\r\n var a = [],\r\n child = this._first;\r\n\r\n while (child) {\r\n if (child._start >= ignoreBeforeTime) {\r\n if (child instanceof Tween) {\r\n tweens && a.push(child);\r\n } else {\r\n timelines && a.push(child);\r\n nested && a.push.apply(a, child.getChildren(true, tweens, timelines));\r\n }\r\n }\r\n\r\n child = child._next;\r\n }\r\n\r\n return a;\r\n };\r\n\r\n _proto2.getById = function getById(id) {\r\n var animations = this.getChildren(1, 1, 1),\r\n i = animations.length;\r\n\r\n while (i--) {\r\n if (animations[i].vars.id === id) {\r\n return animations[i];\r\n }\r\n }\r\n };\r\n\r\n _proto2.remove = function remove(child) {\r\n if (_isString(child)) {\r\n return this.removeLabel(child);\r\n }\r\n\r\n if (_isFunction(child)) {\r\n return this.killTweensOf(child);\r\n }\r\n\r\n child.parent === this && _removeLinkedListItem(this, child);\r\n\r\n if (child === this._recent) {\r\n this._recent = this._last;\r\n }\r\n\r\n return _uncache(this);\r\n };\r\n\r\n _proto2.totalTime = function totalTime(_totalTime2, suppressEvents) {\r\n if (!arguments.length) {\r\n return this._tTime;\r\n }\r\n\r\n this._forcing = 1;\r\n\r\n if (!this._dp && this._ts) {\r\n this._start = _roundPrecise(_ticker.time - (this._ts > 0 ? _totalTime2 / this._ts : (this.totalDuration() - _totalTime2) / -this._ts));\r\n }\r\n\r\n _Animation.prototype.totalTime.call(this, _totalTime2, suppressEvents);\r\n\r\n this._forcing = 0;\r\n return this;\r\n };\r\n\r\n _proto2.addLabel = function addLabel(label, position) {\r\n this.labels[label] = _parsePosition(this, position);\r\n return this;\r\n };\r\n\r\n _proto2.removeLabel = function removeLabel(label) {\r\n delete this.labels[label];\r\n return this;\r\n };\r\n\r\n _proto2.addPause = function addPause(position, callback, params) {\r\n var t = Tween.delayedCall(0, callback || _emptyFunc, params);\r\n t.data = \"isPause\";\r\n this._hasPause = 1;\r\n return _addToTimeline(this, t, _parsePosition(this, position));\r\n };\r\n\r\n _proto2.removePause = function removePause(position) {\r\n var child = this._first;\r\n position = _parsePosition(this, position);\r\n\r\n while (child) {\r\n if (child._start === position && child.data === \"isPause\") {\r\n _removeFromParent(child);\r\n }\r\n\r\n child = child._next;\r\n }\r\n };\r\n\r\n _proto2.killTweensOf = function killTweensOf(targets, props, onlyActive) {\r\n var tweens = this.getTweensOf(targets, onlyActive),\r\n i = tweens.length;\r\n\r\n while (i--) {\r\n _overwritingTween !== tweens[i] && tweens[i].kill(targets, props);\r\n }\r\n\r\n return this;\r\n };\r\n\r\n _proto2.getTweensOf = function getTweensOf(targets, onlyActive) {\r\n var a = [],\r\n parsedTargets = toArray(targets),\r\n child = this._first,\r\n isGlobalTime = _isNumber(onlyActive),\r\n children;\r\n\r\n while (child) {\r\n if (child instanceof Tween) {\r\n if (_arrayContainsAny(child._targets, parsedTargets) && (isGlobalTime ? (!_overwritingTween || child._initted && child._ts) && child.globalTime(0) <= onlyActive && child.globalTime(child.totalDuration()) > onlyActive : !onlyActive || child.isActive())) {\r\n a.push(child);\r\n }\r\n } else if ((children = child.getTweensOf(parsedTargets, onlyActive)).length) {\r\n a.push.apply(a, children);\r\n }\r\n\r\n child = child._next;\r\n }\r\n\r\n return a;\r\n };\r\n\r\n _proto2.tweenTo = function tweenTo(position, vars) {\r\n vars = vars || {};\r\n\r\n var tl = this,\r\n endTime = _parsePosition(tl, position),\r\n _vars = vars,\r\n startAt = _vars.startAt,\r\n _onStart = _vars.onStart,\r\n onStartParams = _vars.onStartParams,\r\n immediateRender = _vars.immediateRender,\r\n initted,\r\n tween = Tween.to(tl, _setDefaults({\r\n ease: vars.ease || \"none\",\r\n lazy: false,\r\n immediateRender: false,\r\n time: endTime,\r\n overwrite: \"auto\",\r\n duration: vars.duration || Math.abs((endTime - (startAt && \"time\" in startAt ? startAt.time : tl._time)) / tl.timeScale()) || _tinyNum,\r\n onStart: function onStart() {\r\n tl.pause();\r\n\r\n if (!initted) {\r\n var duration = vars.duration || Math.abs((endTime - (startAt && \"time\" in startAt ? startAt.time : tl._time)) / tl.timeScale());\r\n tween._dur !== duration && _setDuration(tween, duration, 0, 1).render(tween._time, true, true);\r\n initted = 1;\r\n }\r\n\r\n _onStart && _onStart.apply(tween, onStartParams || []);\r\n }\r\n }, vars));\r\n\r\n return immediateRender ? tween.render(0) : tween;\r\n };\r\n\r\n _proto2.tweenFromTo = function tweenFromTo(fromPosition, toPosition, vars) {\r\n return this.tweenTo(toPosition, _setDefaults({\r\n startAt: {\r\n time: _parsePosition(this, fromPosition)\r\n }\r\n }, vars));\r\n };\r\n\r\n _proto2.recent = function recent() {\r\n return this._recent;\r\n };\r\n\r\n _proto2.nextLabel = function nextLabel(afterTime) {\r\n if (afterTime === void 0) {\r\n afterTime = this._time;\r\n }\r\n\r\n return _getLabelInDirection(this, _parsePosition(this, afterTime));\r\n };\r\n\r\n _proto2.previousLabel = function previousLabel(beforeTime) {\r\n if (beforeTime === void 0) {\r\n beforeTime = this._time;\r\n }\r\n\r\n return _getLabelInDirection(this, _parsePosition(this, beforeTime), 1);\r\n };\r\n\r\n _proto2.currentLabel = function currentLabel(value) {\r\n return arguments.length ? this.seek(value, true) : this.previousLabel(this._time + _tinyNum);\r\n };\r\n\r\n _proto2.shiftChildren = function shiftChildren(amount, adjustLabels, ignoreBeforeTime) {\r\n if (ignoreBeforeTime === void 0) {\r\n ignoreBeforeTime = 0;\r\n }\r\n\r\n var child = this._first,\r\n labels = this.labels,\r\n p;\r\n\r\n while (child) {\r\n if (child._start >= ignoreBeforeTime) {\r\n child._start += amount;\r\n child._end += amount;\r\n }\r\n\r\n child = child._next;\r\n }\r\n\r\n if (adjustLabels) {\r\n for (p in labels) {\r\n if (labels[p] >= ignoreBeforeTime) {\r\n labels[p] += amount;\r\n }\r\n }\r\n }\r\n\r\n return _uncache(this);\r\n };\r\n\r\n _proto2.invalidate = function invalidate(soft) {\r\n var child = this._first;\r\n this._lock = 0;\r\n\r\n while (child) {\r\n child.invalidate(soft);\r\n child = child._next;\r\n }\r\n\r\n return _Animation.prototype.invalidate.call(this, soft);\r\n };\r\n\r\n _proto2.clear = function clear(includeLabels) {\r\n if (includeLabels === void 0) {\r\n includeLabels = true;\r\n }\r\n\r\n var child = this._first,\r\n next;\r\n\r\n while (child) {\r\n next = child._next;\r\n this.remove(child);\r\n child = next;\r\n }\r\n\r\n this._dp && (this._time = this._tTime = this._pTime = 0);\r\n includeLabels && (this.labels = {});\r\n return _uncache(this);\r\n };\r\n\r\n _proto2.totalDuration = function totalDuration(value) {\r\n var max = 0,\r\n self = this,\r\n child = self._last,\r\n prevStart = _bigNum,\r\n prev,\r\n start,\r\n parent;\r\n\r\n if (arguments.length) {\r\n return self.timeScale((self._repeat < 0 ? self.duration() : self.totalDuration()) / (self.reversed() ? -value : value));\r\n }\r\n\r\n if (self._dirty) {\r\n parent = self.parent;\r\n\r\n while (child) {\r\n prev = child._prev;\r\n child._dirty && child.totalDuration();\r\n start = child._start;\r\n\r\n if (start > prevStart && self._sort && child._ts && !self._lock) {\r\n self._lock = 1;\r\n _addToTimeline(self, child, start - child._delay, 1)._lock = 0;\r\n } else {\r\n prevStart = start;\r\n }\r\n\r\n if (start < 0 && child._ts) {\r\n max -= start;\r\n\r\n if (!parent && !self._dp || parent && parent.smoothChildTiming) {\r\n self._start += start / self._ts;\r\n self._time -= start;\r\n self._tTime -= start;\r\n }\r\n\r\n self.shiftChildren(-start, false, -1e999);\r\n prevStart = 0;\r\n }\r\n\r\n child._end > max && child._ts && (max = child._end);\r\n child = prev;\r\n }\r\n\r\n _setDuration(self, self === _globalTimeline && self._time > max ? self._time : max, 1, 1);\r\n\r\n self._dirty = 0;\r\n }\r\n\r\n return self._tDur;\r\n };\r\n\r\n Timeline.updateRoot = function updateRoot(time) {\r\n if (_globalTimeline._ts) {\r\n _lazySafeRender(_globalTimeline, _parentToChildTotalTime(time, _globalTimeline));\r\n\r\n _lastRenderedFrame = _ticker.frame;\r\n }\r\n\r\n if (_ticker.frame >= _nextGCFrame) {\r\n _nextGCFrame += _config.autoSleep || 120;\r\n var child = _globalTimeline._first;\r\n if (!child || !child._ts) if (_config.autoSleep && _ticker._listeners.length < 2) {\r\n while (child && !child._ts) {\r\n child = child._next;\r\n }\r\n\r\n child || _ticker.sleep();\r\n }\r\n }\r\n };\r\n\r\n return Timeline;\r\n }(Animation);\r\n\r\n _setDefaults(Timeline.prototype, {\r\n _lock: 0,\r\n _hasPause: 0,\r\n _forcing: 0\r\n });\r\n\r\n var _addComplexStringPropTween = function _addComplexStringPropTween(target, prop, start, end, setter, stringFilter, funcParam) {\r\n var pt = new PropTween(this._pt, target, prop, 0, 1, _renderComplexString, null, setter),\r\n index = 0,\r\n matchIndex = 0,\r\n result,\r\n startNums,\r\n color,\r\n endNum,\r\n chunk,\r\n startNum,\r\n hasRandom,\r\n a;\r\n pt.b = start;\r\n pt.e = end;\r\n start += \"\";\r\n end += \"\";\r\n\r\n if (hasRandom = ~end.indexOf(\"random(\")) {\r\n end = _replaceRandom(end);\r\n }\r\n\r\n if (stringFilter) {\r\n a = [start, end];\r\n stringFilter(a, target, prop);\r\n start = a[0];\r\n end = a[1];\r\n }\r\n\r\n startNums = start.match(_complexStringNumExp) || [];\r\n\r\n while (result = _complexStringNumExp.exec(end)) {\r\n endNum = result[0];\r\n chunk = end.substring(index, result.index);\r\n\r\n if (color) {\r\n color = (color + 1) % 5;\r\n } else if (chunk.substr(-5) === \"rgba(\") {\r\n color = 1;\r\n }\r\n\r\n if (endNum !== startNums[matchIndex++]) {\r\n startNum = parseFloat(startNums[matchIndex - 1]) || 0;\r\n pt._pt = {\r\n _next: pt._pt,\r\n p: chunk || matchIndex === 1 ? chunk : \",\",\r\n s: startNum,\r\n c: endNum.charAt(1) === \"=\" ? _parseRelative(startNum, endNum) - startNum : parseFloat(endNum) - startNum,\r\n m: color && color < 4 ? Math.round : 0\r\n };\r\n index = _complexStringNumExp.lastIndex;\r\n }\r\n }\r\n\r\n pt.c = index < end.length ? end.substring(index, end.length) : \"\";\r\n pt.fp = funcParam;\r\n\r\n if (_relExp.test(end) || hasRandom) {\r\n pt.e = 0;\r\n }\r\n\r\n this._pt = pt;\r\n return pt;\r\n },\r\n _addPropTween = function _addPropTween(target, prop, start, end, index, targets, modifier, stringFilter, funcParam, optional) {\r\n _isFunction(end) && (end = end(index || 0, target, targets));\r\n var currentValue = target[prop],\r\n parsedStart = start !== \"get\" ? start : !_isFunction(currentValue) ? currentValue : funcParam ? target[prop.indexOf(\"set\") || !_isFunction(target[\"get\" + prop.substr(3)]) ? prop : \"get\" + prop.substr(3)](funcParam) : target[prop](),\r\n setter = !_isFunction(currentValue) ? _setterPlain : funcParam ? _setterFuncWithParam : _setterFunc,\r\n pt;\r\n\r\n if (_isString(end)) {\r\n if (~end.indexOf(\"random(\")) {\r\n end = _replaceRandom(end);\r\n }\r\n\r\n if (end.charAt(1) === \"=\") {\r\n pt = _parseRelative(parsedStart, end) + (getUnit(parsedStart) || 0);\r\n\r\n if (pt || pt === 0) {\r\n end = pt;\r\n }\r\n }\r\n }\r\n\r\n if (!optional || parsedStart !== end || _forceAllPropTweens) {\r\n if (!isNaN(parsedStart * end) && end !== \"\") {\r\n pt = new PropTween(this._pt, target, prop, +parsedStart || 0, end - (parsedStart || 0), typeof currentValue === \"boolean\" ? _renderBoolean : _renderPlain, 0, setter);\r\n funcParam && (pt.fp = funcParam);\r\n modifier && pt.modifier(modifier, this, target);\r\n return this._pt = pt;\r\n }\r\n\r\n !currentValue && !(prop in target) && _missingPlugin(prop, end);\r\n return _addComplexStringPropTween.call(this, target, prop, parsedStart, end, setter, stringFilter || _config.stringFilter, funcParam);\r\n }\r\n },\r\n _processVars = function _processVars(vars, index, target, targets, tween) {\r\n _isFunction(vars) && (vars = _parseFuncOrString(vars, tween, index, target, targets));\r\n\r\n if (!_isObject(vars) || vars.style && vars.nodeType || _isArray(vars) || _isTypedArray(vars)) {\r\n return _isString(vars) ? _parseFuncOrString(vars, tween, index, target, targets) : vars;\r\n }\r\n\r\n var copy = {},\r\n p;\r\n\r\n for (p in vars) {\r\n copy[p] = _parseFuncOrString(vars[p], tween, index, target, targets);\r\n }\r\n\r\n return copy;\r\n },\r\n _checkPlugin = function _checkPlugin(property, vars, tween, index, target, targets) {\r\n var plugin, pt, ptLookup, i;\r\n\r\n if (_plugins[property] && (plugin = new _plugins[property]()).init(target, plugin.rawVars ? vars[property] : _processVars(vars[property], index, target, targets, tween), tween, index, targets) !== false) {\r\n tween._pt = pt = new PropTween(tween._pt, target, property, 0, 1, plugin.render, plugin, 0, plugin.priority);\r\n\r\n if (tween !== _quickTween) {\r\n ptLookup = tween._ptLookup[tween._targets.indexOf(target)];\r\n i = plugin._props.length;\r\n\r\n while (i--) {\r\n ptLookup[plugin._props[i]] = pt;\r\n }\r\n }\r\n }\r\n\r\n return plugin;\r\n },\r\n _overwritingTween,\r\n _forceAllPropTweens,\r\n _initTween = function _initTween(tween, time, tTime) {\r\n var vars = tween.vars,\r\n ease = vars.ease,\r\n startAt = vars.startAt,\r\n immediateRender = vars.immediateRender,\r\n lazy = vars.lazy,\r\n onUpdate = vars.onUpdate,\r\n runBackwards = vars.runBackwards,\r\n yoyoEase = vars.yoyoEase,\r\n keyframes = vars.keyframes,\r\n autoRevert = vars.autoRevert,\r\n dur = tween._dur,\r\n prevStartAt = tween._startAt,\r\n targets = tween._targets,\r\n parent = tween.parent,\r\n fullTargets = parent && parent.data === \"nested\" ? parent.vars.targets : targets,\r\n autoOverwrite = tween._overwrite === \"auto\" && !_suppressOverwrites,\r\n tl = tween.timeline,\r\n cleanVars,\r\n i,\r\n p,\r\n pt,\r\n target,\r\n hasPriority,\r\n gsData,\r\n harness,\r\n plugin,\r\n ptLookup,\r\n index,\r\n harnessVars,\r\n overwritten;\r\n tl && (!keyframes || !ease) && (ease = \"none\");\r\n tween._ease = _parseEase(ease, _defaults.ease);\r\n tween._yEase = yoyoEase ? _invertEase(_parseEase(yoyoEase === true ? ease : yoyoEase, _defaults.ease)) : 0;\r\n\r\n if (yoyoEase && tween._yoyo && !tween._repeat) {\r\n yoyoEase = tween._yEase;\r\n tween._yEase = tween._ease;\r\n tween._ease = yoyoEase;\r\n }\r\n\r\n tween._from = !tl && !!vars.runBackwards;\r\n\r\n if (!tl || keyframes && !vars.stagger) {\r\n harness = targets[0] ? _getCache(targets[0]).harness : 0;\r\n harnessVars = harness && vars[harness.prop];\r\n cleanVars = _copyExcluding(vars, _reservedProps);\r\n\r\n if (prevStartAt) {\r\n prevStartAt._zTime < 0 && prevStartAt.progress(1);\r\n time < 0 && runBackwards && immediateRender && !autoRevert ? prevStartAt.render(-1, true) : prevStartAt.revert(runBackwards && dur ? _revertConfigNoKill : _startAtRevertConfig);\r\n prevStartAt._lazy = 0;\r\n }\r\n\r\n if (startAt) {\r\n _removeFromParent(tween._startAt = Tween.set(targets, _setDefaults({\r\n data: \"isStart\",\r\n overwrite: false,\r\n parent: parent,\r\n immediateRender: true,\r\n lazy: !prevStartAt && _isNotFalse(lazy),\r\n startAt: null,\r\n delay: 0,\r\n onUpdate: onUpdate && function () {\r\n return _callback(tween, \"onUpdate\");\r\n },\r\n stagger: 0\r\n }, startAt)));\r\n\r\n tween._startAt._dp = 0;\r\n tween._startAt._sat = tween;\r\n time < 0 && (_reverting || !immediateRender && !autoRevert) && tween._startAt.revert(_revertConfigNoKill);\r\n\r\n if (immediateRender) {\r\n if (dur && time <= 0 && tTime <= 0) {\r\n time && (tween._zTime = time);\r\n return;\r\n }\r\n }\r\n } else if (runBackwards && dur) {\r\n if (!prevStartAt) {\r\n time && (immediateRender = false);\r\n p = _setDefaults({\r\n overwrite: false,\r\n data: \"isFromStart\",\r\n lazy: immediateRender && !prevStartAt && _isNotFalse(lazy),\r\n immediateRender: immediateRender,\r\n stagger: 0,\r\n parent: parent\r\n }, cleanVars);\r\n harnessVars && (p[harness.prop] = harnessVars);\r\n\r\n _removeFromParent(tween._startAt = Tween.set(targets, p));\r\n\r\n tween._startAt._dp = 0;\r\n tween._startAt._sat = tween;\r\n time < 0 && (_reverting ? tween._startAt.revert(_revertConfigNoKill) : tween._startAt.render(-1, true));\r\n tween._zTime = time;\r\n\r\n if (!immediateRender) {\r\n _initTween(tween._startAt, _tinyNum, _tinyNum);\r\n } else if (!time) {\r\n return;\r\n }\r\n }\r\n }\r\n\r\n tween._pt = tween._ptCache = 0;\r\n lazy = dur && _isNotFalse(lazy) || lazy && !dur;\r\n\r\n for (i = 0; i < targets.length; i++) {\r\n target = targets[i];\r\n gsData = target._gsap || _harness(targets)[i]._gsap;\r\n tween._ptLookup[i] = ptLookup = {};\r\n _lazyLookup[gsData.id] && _lazyTweens.length && _lazyRender();\r\n index = fullTargets === targets ? i : fullTargets.indexOf(target);\r\n\r\n if (harness && (plugin = new harness()).init(target, harnessVars || cleanVars, tween, index, fullTargets) !== false) {\r\n tween._pt = pt = new PropTween(tween._pt, target, plugin.name, 0, 1, plugin.render, plugin, 0, plugin.priority);\r\n\r\n plugin._props.forEach(function (name) {\r\n ptLookup[name] = pt;\r\n });\r\n\r\n plugin.priority && (hasPriority = 1);\r\n }\r\n\r\n if (!harness || harnessVars) {\r\n for (p in cleanVars) {\r\n if (_plugins[p] && (plugin = _checkPlugin(p, cleanVars, tween, index, target, fullTargets))) {\r\n plugin.priority && (hasPriority = 1);\r\n } else {\r\n ptLookup[p] = pt = _addPropTween.call(tween, target, p, \"get\", cleanVars[p], index, fullTargets, 0, vars.stringFilter);\r\n }\r\n }\r\n }\r\n\r\n tween._op && tween._op[i] && tween.kill(target, tween._op[i]);\r\n\r\n if (autoOverwrite && tween._pt) {\r\n _overwritingTween = tween;\r\n\r\n _globalTimeline.killTweensOf(target, ptLookup, tween.globalTime(time));\r\n\r\n overwritten = !tween.parent;\r\n _overwritingTween = 0;\r\n }\r\n\r\n tween._pt && lazy && (_lazyLookup[gsData.id] = 1);\r\n }\r\n\r\n hasPriority && _sortPropTweensByPriority(tween);\r\n tween._onInit && tween._onInit(tween);\r\n }\r\n\r\n tween._onUpdate = onUpdate;\r\n tween._initted = (!tween._op || tween._pt) && !overwritten;\r\n keyframes && time <= 0 && tl.render(_bigNum, true, true);\r\n },\r\n _updatePropTweens = function _updatePropTweens(tween, property, value, start, startIsRelative, ratio, time, skipRecursion) {\r\n var ptCache = (tween._pt && tween._ptCache || (tween._ptCache = {}))[property],\r\n pt,\r\n rootPT,\r\n lookup,\r\n i;\r\n\r\n if (!ptCache) {\r\n ptCache = tween._ptCache[property] = [];\r\n lookup = tween._ptLookup;\r\n i = tween._targets.length;\r\n\r\n while (i--) {\r\n pt = lookup[i][property];\r\n\r\n if (pt && pt.d && pt.d._pt) {\r\n pt = pt.d._pt;\r\n\r\n while (pt && pt.p !== property && pt.fp !== property) {\r\n pt = pt._next;\r\n }\r\n }\r\n\r\n if (!pt) {\r\n _forceAllPropTweens = 1;\r\n tween.vars[property] = \"+=0\";\r\n\r\n _initTween(tween, time);\r\n\r\n _forceAllPropTweens = 0;\r\n return skipRecursion ? _warn(property + \" not eligible for reset\") : 1;\r\n }\r\n\r\n ptCache.push(pt);\r\n }\r\n }\r\n\r\n i = ptCache.length;\r\n\r\n while (i--) {\r\n rootPT = ptCache[i];\r\n pt = rootPT._pt || rootPT;\r\n pt.s = (start || start === 0) && !startIsRelative ? start : pt.s + (start || 0) + ratio * pt.c;\r\n pt.c = value - pt.s;\r\n rootPT.e && (rootPT.e = _round(value) + getUnit(rootPT.e));\r\n rootPT.b && (rootPT.b = pt.s + getUnit(rootPT.b));\r\n }\r\n },\r\n _addAliasesToVars = function _addAliasesToVars(targets, vars) {\r\n var harness = targets[0] ? _getCache(targets[0]).harness : 0,\r\n propertyAliases = harness && harness.aliases,\r\n copy,\r\n p,\r\n i,\r\n aliases;\r\n\r\n if (!propertyAliases) {\r\n return vars;\r\n }\r\n\r\n copy = _merge({}, vars);\r\n\r\n for (p in propertyAliases) {\r\n if (p in copy) {\r\n aliases = propertyAliases[p].split(\",\");\r\n i = aliases.length;\r\n\r\n while (i--) {\r\n copy[aliases[i]] = copy[p];\r\n }\r\n }\r\n }\r\n\r\n return copy;\r\n },\r\n _parseKeyframe = function _parseKeyframe(prop, obj, allProps, easeEach) {\r\n var ease = obj.ease || easeEach || \"power1.inOut\",\r\n p,\r\n a;\r\n\r\n if (_isArray(obj)) {\r\n a = allProps[prop] || (allProps[prop] = []);\r\n obj.forEach(function (value, i) {\r\n return a.push({\r\n t: i / (obj.length - 1) * 100,\r\n v: value,\r\n e: ease\r\n });\r\n });\r\n } else {\r\n for (p in obj) {\r\n a = allProps[p] || (allProps[p] = []);\r\n p === \"ease\" || a.push({\r\n t: parseFloat(prop),\r\n v: obj[p],\r\n e: ease\r\n });\r\n }\r\n }\r\n },\r\n _parseFuncOrString = function _parseFuncOrString(value, tween, i, target, targets) {\r\n return _isFunction(value) ? value.call(tween, i, target, targets) : _isString(value) && ~value.indexOf(\"random(\") ? _replaceRandom(value) : value;\r\n },\r\n _staggerTweenProps = _callbackNames + \"repeat,repeatDelay,yoyo,repeatRefresh,yoyoEase,autoRevert\",\r\n _staggerPropsToSkip = {};\r\n\r\n _forEachName(_staggerTweenProps + \",id,stagger,delay,duration,paused,scrollTrigger\", function (name) {\r\n return _staggerPropsToSkip[name] = 1;\r\n });\r\n\r\n var Tween = function (_Animation2) {\r\n _inheritsLoose(Tween, _Animation2);\r\n\r\n function Tween(targets, vars, position, skipInherit) {\r\n var _this3;\r\n\r\n if (typeof vars === \"number\") {\r\n position.duration = vars;\r\n vars = position;\r\n position = null;\r\n }\r\n\r\n _this3 = _Animation2.call(this, skipInherit ? vars : _inheritDefaults(vars)) || this;\r\n var _this3$vars = _this3.vars,\r\n duration = _this3$vars.duration,\r\n delay = _this3$vars.delay,\r\n immediateRender = _this3$vars.immediateRender,\r\n stagger = _this3$vars.stagger,\r\n overwrite = _this3$vars.overwrite,\r\n keyframes = _this3$vars.keyframes,\r\n defaults = _this3$vars.defaults,\r\n scrollTrigger = _this3$vars.scrollTrigger,\r\n yoyoEase = _this3$vars.yoyoEase,\r\n parent = vars.parent || _globalTimeline,\r\n parsedTargets = (_isArray(targets) || _isTypedArray(targets) ? _isNumber(targets[0]) : \"length\" in vars) ? [targets] : toArray(targets),\r\n tl,\r\n i,\r\n copy,\r\n l,\r\n p,\r\n curTarget,\r\n staggerFunc,\r\n staggerVarsToMerge;\r\n _this3._targets = parsedTargets.length ? _harness(parsedTargets) : _warn(\"GSAP target \" + targets + \" not found. https://gsap.com\", !_config.nullTargetWarn) || [];\r\n _this3._ptLookup = [];\r\n _this3._overwrite = overwrite;\r\n\r\n if (keyframes || stagger || _isFuncOrString(duration) || _isFuncOrString(delay)) {\r\n vars = _this3.vars;\r\n tl = _this3.timeline = new Timeline({\r\n data: \"nested\",\r\n defaults: defaults || {},\r\n targets: parent && parent.data === \"nested\" ? parent.vars.targets : parsedTargets\r\n });\r\n tl.kill();\r\n tl.parent = tl._dp = _assertThisInitialized(_this3);\r\n tl._start = 0;\r\n\r\n if (stagger || _isFuncOrString(duration) || _isFuncOrString(delay)) {\r\n l = parsedTargets.length;\r\n staggerFunc = stagger && distribute(stagger);\r\n\r\n if (_isObject(stagger)) {\r\n for (p in stagger) {\r\n if (~_staggerTweenProps.indexOf(p)) {\r\n staggerVarsToMerge || (staggerVarsToMerge = {});\r\n staggerVarsToMerge[p] = stagger[p];\r\n }\r\n }\r\n }\r\n\r\n for (i = 0; i < l; i++) {\r\n copy = _copyExcluding(vars, _staggerPropsToSkip);\r\n copy.stagger = 0;\r\n yoyoEase && (copy.yoyoEase = yoyoEase);\r\n staggerVarsToMerge && _merge(copy, staggerVarsToMerge);\r\n curTarget = parsedTargets[i];\r\n copy.duration = +_parseFuncOrString(duration, _assertThisInitialized(_this3), i, curTarget, parsedTargets);\r\n copy.delay = (+_parseFuncOrString(delay, _assertThisInitialized(_this3), i, curTarget, parsedTargets) || 0) - _this3._delay;\r\n\r\n if (!stagger && l === 1 && copy.delay) {\r\n _this3._delay = delay = copy.delay;\r\n _this3._start += delay;\r\n copy.delay = 0;\r\n }\r\n\r\n tl.to(curTarget, copy, staggerFunc ? staggerFunc(i, curTarget, parsedTargets) : 0);\r\n tl._ease = _easeMap.none;\r\n }\r\n\r\n tl.duration() ? duration = delay = 0 : _this3.timeline = 0;\r\n } else if (keyframes) {\r\n _inheritDefaults(_setDefaults(tl.vars.defaults, {\r\n ease: \"none\"\r\n }));\r\n\r\n tl._ease = _parseEase(keyframes.ease || vars.ease || \"none\");\r\n var time = 0,\r\n a,\r\n kf,\r\n v;\r\n\r\n if (_isArray(keyframes)) {\r\n keyframes.forEach(function (frame) {\r\n return tl.to(parsedTargets, frame, \">\");\r\n });\r\n tl.duration();\r\n } else {\r\n copy = {};\r\n\r\n for (p in keyframes) {\r\n p === \"ease\" || p === \"easeEach\" || _parseKeyframe(p, keyframes[p], copy, keyframes.easeEach);\r\n }\r\n\r\n for (p in copy) {\r\n a = copy[p].sort(function (a, b) {\r\n return a.t - b.t;\r\n });\r\n time = 0;\r\n\r\n for (i = 0; i < a.length; i++) {\r\n kf = a[i];\r\n v = {\r\n ease: kf.e,\r\n duration: (kf.t - (i ? a[i - 1].t : 0)) / 100 * duration\r\n };\r\n v[p] = kf.v;\r\n tl.to(parsedTargets, v, time);\r\n time += v.duration;\r\n }\r\n }\r\n\r\n tl.duration() < duration && tl.to({}, {\r\n duration: duration - tl.duration()\r\n });\r\n }\r\n }\r\n\r\n duration || _this3.duration(duration = tl.duration());\r\n } else {\r\n _this3.timeline = 0;\r\n }\r\n\r\n if (overwrite === true && !_suppressOverwrites) {\r\n _overwritingTween = _assertThisInitialized(_this3);\r\n\r\n _globalTimeline.killTweensOf(parsedTargets);\r\n\r\n _overwritingTween = 0;\r\n }\r\n\r\n _addToTimeline(parent, _assertThisInitialized(_this3), position);\r\n\r\n vars.reversed && _this3.reverse();\r\n vars.paused && _this3.paused(true);\r\n\r\n if (immediateRender || !duration && !keyframes && _this3._start === _roundPrecise(parent._time) && _isNotFalse(immediateRender) && _hasNoPausedAncestors(_assertThisInitialized(_this3)) && parent.data !== \"nested\") {\r\n _this3._tTime = -_tinyNum;\r\n\r\n _this3.render(Math.max(0, -delay) || 0);\r\n }\r\n\r\n scrollTrigger && _scrollTrigger(_assertThisInitialized(_this3), scrollTrigger);\r\n return _this3;\r\n }\r\n\r\n var _proto3 = Tween.prototype;\r\n\r\n _proto3.render = function render(totalTime, suppressEvents, force) {\r\n var prevTime = this._time,\r\n tDur = this._tDur,\r\n dur = this._dur,\r\n isNegative = totalTime < 0,\r\n tTime = totalTime > tDur - _tinyNum && !isNegative ? tDur : totalTime < _tinyNum ? 0 : totalTime,\r\n time,\r\n pt,\r\n iteration,\r\n cycleDuration,\r\n prevIteration,\r\n isYoyo,\r\n ratio,\r\n timeline,\r\n yoyoEase;\r\n\r\n if (!dur) {\r\n _renderZeroDurationTween(this, totalTime, suppressEvents, force);\r\n } else if (tTime !== this._tTime || !totalTime || force || !this._initted && this._tTime || this._startAt && this._zTime < 0 !== isNegative || this._lazy) {\r\n time = tTime;\r\n timeline = this.timeline;\r\n\r\n if (this._repeat) {\r\n cycleDuration = dur + this._rDelay;\r\n\r\n if (this._repeat < -1 && isNegative) {\r\n return this.totalTime(cycleDuration * 100 + totalTime, suppressEvents, force);\r\n }\r\n\r\n time = _roundPrecise(tTime % cycleDuration);\r\n\r\n if (tTime === tDur) {\r\n iteration = this._repeat;\r\n time = dur;\r\n } else {\r\n prevIteration = _roundPrecise(tTime / cycleDuration);\r\n iteration = ~~prevIteration;\r\n\r\n if (iteration && iteration === prevIteration) {\r\n time = dur;\r\n iteration--;\r\n } else if (time > dur) {\r\n time = dur;\r\n }\r\n }\r\n\r\n isYoyo = this._yoyo && iteration & 1;\r\n\r\n if (isYoyo) {\r\n yoyoEase = this._yEase;\r\n time = dur - time;\r\n }\r\n\r\n prevIteration = _animationCycle(this._tTime, cycleDuration);\r\n\r\n if (time === prevTime && !force && this._initted && iteration === prevIteration) {\r\n this._tTime = tTime;\r\n return this;\r\n }\r\n\r\n if (iteration !== prevIteration) {\r\n timeline && this._yEase && _propagateYoyoEase(timeline, isYoyo);\r\n\r\n if (this.vars.repeatRefresh && !isYoyo && !this._lock && time !== cycleDuration && this._initted) {\r\n this._lock = force = 1;\r\n this.render(_roundPrecise(cycleDuration * iteration), true).invalidate()._lock = 0;\r\n }\r\n }\r\n }\r\n\r\n if (!this._initted) {\r\n if (_attemptInitTween(this, isNegative ? totalTime : time, force, suppressEvents, tTime)) {\r\n this._tTime = 0;\r\n return this;\r\n }\r\n\r\n if (prevTime !== this._time && !(force && this.vars.repeatRefresh && iteration !== prevIteration)) {\r\n return this;\r\n }\r\n\r\n if (dur !== this._dur) {\r\n return this.render(totalTime, suppressEvents, force);\r\n }\r\n }\r\n\r\n this._tTime = tTime;\r\n this._time = time;\r\n\r\n if (!this._act && this._ts) {\r\n this._act = 1;\r\n this._lazy = 0;\r\n }\r\n\r\n this.ratio = ratio = (yoyoEase || this._ease)(time / dur);\r\n\r\n if (this._from) {\r\n this.ratio = ratio = 1 - ratio;\r\n }\r\n\r\n if (!prevTime && tTime && !suppressEvents && !prevIteration) {\r\n _callback(this, \"onStart\");\r\n\r\n if (this._tTime !== tTime) {\r\n return this;\r\n }\r\n }\r\n\r\n pt = this._pt;\r\n\r\n while (pt) {\r\n pt.r(ratio, pt.d);\r\n pt = pt._next;\r\n }\r\n\r\n timeline && timeline.render(totalTime < 0 ? totalTime : timeline._dur * timeline._ease(time / this._dur), suppressEvents, force) || this._startAt && (this._zTime = totalTime);\r\n\r\n if (this._onUpdate && !suppressEvents) {\r\n isNegative && _rewindStartAt(this, totalTime, suppressEvents, force);\r\n\r\n _callback(this, \"onUpdate\");\r\n }\r\n\r\n this._repeat && iteration !== prevIteration && this.vars.onRepeat && !suppressEvents && this.parent && _callback(this, \"onRepeat\");\r\n\r\n if ((tTime === this._tDur || !tTime) && this._tTime === tTime) {\r\n isNegative && !this._onUpdate && _rewindStartAt(this, totalTime, true, true);\r\n (totalTime || !dur) && (tTime === this._tDur && this._ts > 0 || !tTime && this._ts < 0) && _removeFromParent(this, 1);\r\n\r\n if (!suppressEvents && !(isNegative && !prevTime) && (tTime || prevTime || isYoyo)) {\r\n _callback(this, tTime === tDur ? \"onComplete\" : \"onReverseComplete\", true);\r\n\r\n this._prom && !(tTime < tDur && this.timeScale() > 0) && this._prom();\r\n }\r\n }\r\n }\r\n\r\n return this;\r\n };\r\n\r\n _proto3.targets = function targets() {\r\n return this._targets;\r\n };\r\n\r\n _proto3.invalidate = function invalidate(soft) {\r\n (!soft || !this.vars.runBackwards) && (this._startAt = 0);\r\n this._pt = this._op = this._onUpdate = this._lazy = this.ratio = 0;\r\n this._ptLookup = [];\r\n this.timeline && this.timeline.invalidate(soft);\r\n return _Animation2.prototype.invalidate.call(this, soft);\r\n };\r\n\r\n _proto3.resetTo = function resetTo(property, value, start, startIsRelative, skipRecursion) {\r\n _tickerActive || _ticker.wake();\r\n this._ts || this.play();\r\n var time = Math.min(this._dur, (this._dp._time - this._start) * this._ts),\r\n ratio;\r\n this._initted || _initTween(this, time);\r\n ratio = this._ease(time / this._dur);\r\n\r\n if (_updatePropTweens(this, property, value, start, startIsRelative, ratio, time, skipRecursion)) {\r\n return this.resetTo(property, value, start, startIsRelative, 1);\r\n }\r\n\r\n _alignPlayhead(this, 0);\r\n\r\n this.parent || _addLinkedListItem(this._dp, this, \"_first\", \"_last\", this._dp._sort ? \"_start\" : 0);\r\n return this.render(0);\r\n };\r\n\r\n _proto3.kill = function kill(targets, vars) {\r\n if (vars === void 0) {\r\n vars = \"all\";\r\n }\r\n\r\n if (!targets && (!vars || vars === \"all\")) {\r\n this._lazy = this._pt = 0;\r\n this.parent ? _interrupt(this) : this.scrollTrigger && this.scrollTrigger.kill(!!_reverting);\r\n return this;\r\n }\r\n\r\n if (this.timeline) {\r\n var tDur = this.timeline.totalDuration();\r\n this.timeline.killTweensOf(targets, vars, _overwritingTween && _overwritingTween.vars.overwrite !== true)._first || _interrupt(this);\r\n this.parent && tDur !== this.timeline.totalDuration() && _setDuration(this, this._dur * this.timeline._tDur / tDur, 0, 1);\r\n return this;\r\n }\r\n\r\n var parsedTargets = this._targets,\r\n killingTargets = targets ? toArray(targets) : parsedTargets,\r\n propTweenLookup = this._ptLookup,\r\n firstPT = this._pt,\r\n overwrittenProps,\r\n curLookup,\r\n curOverwriteProps,\r\n props,\r\n p,\r\n pt,\r\n i;\r\n\r\n if ((!vars || vars === \"all\") && _arraysMatch(parsedTargets, killingTargets)) {\r\n vars === \"all\" && (this._pt = 0);\r\n return _interrupt(this);\r\n }\r\n\r\n overwrittenProps = this._op = this._op || [];\r\n\r\n if (vars !== \"all\") {\r\n if (_isString(vars)) {\r\n p = {};\r\n\r\n _forEachName(vars, function (name) {\r\n return p[name] = 1;\r\n });\r\n\r\n vars = p;\r\n }\r\n\r\n vars = _addAliasesToVars(parsedTargets, vars);\r\n }\r\n\r\n i = parsedTargets.length;\r\n\r\n while (i--) {\r\n if (~killingTargets.indexOf(parsedTargets[i])) {\r\n curLookup = propTweenLookup[i];\r\n\r\n if (vars === \"all\") {\r\n overwrittenProps[i] = vars;\r\n props = curLookup;\r\n curOverwriteProps = {};\r\n } else {\r\n curOverwriteProps = overwrittenProps[i] = overwrittenProps[i] || {};\r\n props = vars;\r\n }\r\n\r\n for (p in props) {\r\n pt = curLookup && curLookup[p];\r\n\r\n if (pt) {\r\n if (!(\"kill\" in pt.d) || pt.d.kill(p) === true) {\r\n _removeLinkedListItem(this, pt, \"_pt\");\r\n }\r\n\r\n delete curLookup[p];\r\n }\r\n\r\n if (curOverwriteProps !== \"all\") {\r\n curOverwriteProps[p] = 1;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._initted && !this._pt && firstPT && _interrupt(this);\r\n return this;\r\n };\r\n\r\n Tween.to = function to(targets, vars) {\r\n return new Tween(targets, vars, arguments[2]);\r\n };\r\n\r\n Tween.from = function from(targets, vars) {\r\n return _createTweenType(1, arguments);\r\n };\r\n\r\n Tween.delayedCall = function delayedCall(delay, callback, params, scope) {\r\n return new Tween(callback, 0, {\r\n immediateRender: false,\r\n lazy: false,\r\n overwrite: false,\r\n delay: delay,\r\n onComplete: callback,\r\n onReverseComplete: callback,\r\n onCompleteParams: params,\r\n onReverseCompleteParams: params,\r\n callbackScope: scope\r\n });\r\n };\r\n\r\n Tween.fromTo = function fromTo(targets, fromVars, toVars) {\r\n return _createTweenType(2, arguments);\r\n };\r\n\r\n Tween.set = function set(targets, vars) {\r\n vars.duration = 0;\r\n vars.repeatDelay || (vars.repeat = 0);\r\n return new Tween(targets, vars);\r\n };\r\n\r\n Tween.killTweensOf = function killTweensOf(targets, props, onlyActive) {\r\n return _globalTimeline.killTweensOf(targets, props, onlyActive);\r\n };\r\n\r\n return Tween;\r\n }(Animation);\r\n\r\n _setDefaults(Tween.prototype, {\r\n _targets: [],\r\n _lazy: 0,\r\n _startAt: 0,\r\n _op: 0,\r\n _onInit: 0\r\n });\r\n\r\n _forEachName(\"staggerTo,staggerFrom,staggerFromTo\", function (name) {\r\n Tween[name] = function () {\r\n var tl = new Timeline(),\r\n params = _slice.call(arguments, 0);\r\n\r\n params.splice(name === \"staggerFromTo\" ? 5 : 4, 0, 0);\r\n return tl[name].apply(tl, params);\r\n };\r\n });\r\n\r\n var _setterPlain = function _setterPlain(target, property, value) {\r\n return target[property] = value;\r\n },\r\n _setterFunc = function _setterFunc(target, property, value) {\r\n return target[property](value);\r\n },\r\n _setterFuncWithParam = function _setterFuncWithParam(target, property, value, data) {\r\n return target[property](data.fp, value);\r\n },\r\n _setterAttribute = function _setterAttribute(target, property, value) {\r\n return target.setAttribute(property, value);\r\n },\r\n _getSetter = function _getSetter(target, property) {\r\n return _isFunction(target[property]) ? _setterFunc : _isUndefined(target[property]) && target.setAttribute ? _setterAttribute : _setterPlain;\r\n },\r\n _renderPlain = function _renderPlain(ratio, data) {\r\n return data.set(data.t, data.p, Math.round((data.s + data.c * ratio) * 1000000) / 1000000, data);\r\n },\r\n _renderBoolean = function _renderBoolean(ratio, data) {\r\n return data.set(data.t, data.p, !!(data.s + data.c * ratio), data);\r\n },\r\n _renderComplexString = function _renderComplexString(ratio, data) {\r\n var pt = data._pt,\r\n s = \"\";\r\n\r\n if (!ratio && data.b) {\r\n s = data.b;\r\n } else if (ratio === 1 && data.e) {\r\n s = data.e;\r\n } else {\r\n while (pt) {\r\n s = pt.p + (pt.m ? pt.m(pt.s + pt.c * ratio) : Math.round((pt.s + pt.c * ratio) * 10000) / 10000) + s;\r\n pt = pt._next;\r\n }\r\n\r\n s += data.c;\r\n }\r\n\r\n data.set(data.t, data.p, s, data);\r\n },\r\n _renderPropTweens = function _renderPropTweens(ratio, data) {\r\n var pt = data._pt;\r\n\r\n while (pt) {\r\n pt.r(ratio, pt.d);\r\n pt = pt._next;\r\n }\r\n },\r\n _addPluginModifier = function _addPluginModifier(modifier, tween, target, property) {\r\n var pt = this._pt,\r\n next;\r\n\r\n while (pt) {\r\n next = pt._next;\r\n pt.p === property && pt.modifier(modifier, tween, target);\r\n pt = next;\r\n }\r\n },\r\n _killPropTweensOf = function _killPropTweensOf(property) {\r\n var pt = this._pt,\r\n hasNonDependentRemaining,\r\n next;\r\n\r\n while (pt) {\r\n next = pt._next;\r\n\r\n if (pt.p === property && !pt.op || pt.op === property) {\r\n _removeLinkedListItem(this, pt, \"_pt\");\r\n } else if (!pt.dep) {\r\n hasNonDependentRemaining = 1;\r\n }\r\n\r\n pt = next;\r\n }\r\n\r\n return !hasNonDependentRemaining;\r\n },\r\n _setterWithModifier = function _setterWithModifier(target, property, value, data) {\r\n data.mSet(target, property, data.m.call(data.tween, value, data.mt), data);\r\n },\r\n _sortPropTweensByPriority = function _sortPropTweensByPriority(parent) {\r\n var pt = parent._pt,\r\n next,\r\n pt2,\r\n first,\r\n last;\r\n\r\n while (pt) {\r\n next = pt._next;\r\n pt2 = first;\r\n\r\n while (pt2 && pt2.pr > pt.pr) {\r\n pt2 = pt2._next;\r\n }\r\n\r\n if (pt._prev = pt2 ? pt2._prev : last) {\r\n pt._prev._next = pt;\r\n } else {\r\n first = pt;\r\n }\r\n\r\n if (pt._next = pt2) {\r\n pt2._prev = pt;\r\n } else {\r\n last = pt;\r\n }\r\n\r\n pt = next;\r\n }\r\n\r\n parent._pt = first;\r\n };\r\n\r\n var PropTween = function () {\r\n function PropTween(next, target, prop, start, change, renderer, data, setter, priority) {\r\n this.t = target;\r\n this.s = start;\r\n this.c = change;\r\n this.p = prop;\r\n this.r = renderer || _renderPlain;\r\n this.d = data || this;\r\n this.set = setter || _setterPlain;\r\n this.pr = priority || 0;\r\n this._next = next;\r\n\r\n if (next) {\r\n next._prev = this;\r\n }\r\n }\r\n\r\n var _proto4 = PropTween.prototype;\r\n\r\n _proto4.modifier = function modifier(func, tween, target) {\r\n this.mSet = this.mSet || this.set;\r\n this.set = _setterWithModifier;\r\n this.m = func;\r\n this.mt = target;\r\n this.tween = tween;\r\n };\r\n\r\n return PropTween;\r\n }();\r\n\r\n _forEachName(_callbackNames + \"parent,duration,ease,delay,overwrite,runBackwards,startAt,yoyo,immediateRender,repeat,repeatDelay,data,paused,reversed,lazy,callbackScope,stringFilter,id,yoyoEase,stagger,inherit,repeatRefresh,keyframes,autoRevert,scrollTrigger\", function (name) {\r\n return _reservedProps[name] = 1;\r\n });\r\n\r\n _globals.TweenMax = _globals.TweenLite = Tween;\r\n _globals.TimelineLite = _globals.TimelineMax = Timeline;\r\n _globalTimeline = new Timeline({\r\n sortChildren: false,\r\n defaults: _defaults,\r\n autoRemoveChildren: true,\r\n id: \"root\",\r\n smoothChildTiming: true\r\n });\r\n _config.stringFilter = _colorStringFilter;\r\n\r\n var _media = [],\r\n _listeners = {},\r\n _emptyArray = [],\r\n _lastMediaTime = 0,\r\n _contextID = 0,\r\n _dispatch = function _dispatch(type) {\r\n return (_listeners[type] || _emptyArray).map(function (f) {\r\n return f();\r\n });\r\n },\r\n _onMediaChange = function _onMediaChange() {\r\n var time = Date.now(),\r\n matches = [];\r\n\r\n if (time - _lastMediaTime > 2) {\r\n _dispatch(\"matchMediaInit\");\r\n\r\n _media.forEach(function (c) {\r\n var queries = c.queries,\r\n conditions = c.conditions,\r\n match,\r\n p,\r\n anyMatch,\r\n toggled;\r\n\r\n for (p in queries) {\r\n match = _win.matchMedia(queries[p]).matches;\r\n match && (anyMatch = 1);\r\n\r\n if (match !== conditions[p]) {\r\n conditions[p] = match;\r\n toggled = 1;\r\n }\r\n }\r\n\r\n if (toggled) {\r\n c.revert();\r\n anyMatch && matches.push(c);\r\n }\r\n });\r\n\r\n _dispatch(\"matchMediaRevert\");\r\n\r\n matches.forEach(function (c) {\r\n return c.onMatch(c, function (func) {\r\n return c.add(null, func);\r\n });\r\n });\r\n _lastMediaTime = time;\r\n\r\n _dispatch(\"matchMedia\");\r\n }\r\n };\r\n\r\n var Context = function () {\r\n function Context(func, scope) {\r\n this.selector = scope && selector(scope);\r\n this.data = [];\r\n this._r = [];\r\n this.isReverted = false;\r\n this.id = _contextID++;\r\n func && this.add(func);\r\n }\r\n\r\n var _proto5 = Context.prototype;\r\n\r\n _proto5.add = function add(name, func, scope) {\r\n if (_isFunction(name)) {\r\n scope = func;\r\n func = name;\r\n name = _isFunction;\r\n }\r\n\r\n var self = this,\r\n f = function f() {\r\n var prev = _context,\r\n prevSelector = self.selector,\r\n result;\r\n prev && prev !== self && prev.data.push(self);\r\n scope && (self.selector = selector(scope));\r\n _context = self;\r\n result = func.apply(self, arguments);\r\n _isFunction(result) && self._r.push(result);\r\n _context = prev;\r\n self.selector = prevSelector;\r\n self.isReverted = false;\r\n return result;\r\n };\r\n\r\n self.last = f;\r\n return name === _isFunction ? f(self, function (func) {\r\n return self.add(null, func);\r\n }) : name ? self[name] = f : f;\r\n };\r\n\r\n _proto5.ignore = function ignore(func) {\r\n var prev = _context;\r\n _context = null;\r\n func(this);\r\n _context = prev;\r\n };\r\n\r\n _proto5.getTweens = function getTweens() {\r\n var a = [];\r\n this.data.forEach(function (e) {\r\n return e instanceof Context ? a.push.apply(a, e.getTweens()) : e instanceof Tween && !(e.parent && e.parent.data === \"nested\") && a.push(e);\r\n });\r\n return a;\r\n };\r\n\r\n _proto5.clear = function clear() {\r\n this._r.length = this.data.length = 0;\r\n };\r\n\r\n _proto5.kill = function kill(revert, matchMedia) {\r\n var _this4 = this;\r\n\r\n if (revert) {\r\n (function () {\r\n var tweens = _this4.getTweens(),\r\n i = _this4.data.length,\r\n t;\r\n\r\n while (i--) {\r\n t = _this4.data[i];\r\n\r\n if (t.data === \"isFlip\") {\r\n t.revert();\r\n t.getChildren(true, true, false).forEach(function (tween) {\r\n return tweens.splice(tweens.indexOf(tween), 1);\r\n });\r\n }\r\n }\r\n\r\n tweens.map(function (t) {\r\n return {\r\n g: t._dur || t._delay || t._sat && !t._sat.vars.immediateRender ? t.globalTime(0) : -Infinity,\r\n t: t\r\n };\r\n }).sort(function (a, b) {\r\n return b.g - a.g || -Infinity;\r\n }).forEach(function (o) {\r\n return o.t.revert(revert);\r\n });\r\n i = _this4.data.length;\r\n\r\n while (i--) {\r\n t = _this4.data[i];\r\n\r\n if (t instanceof Timeline) {\r\n if (t.data !== \"nested\") {\r\n t.scrollTrigger && t.scrollTrigger.revert();\r\n t.kill();\r\n }\r\n } else {\r\n !(t instanceof Tween) && t.revert && t.revert(revert);\r\n }\r\n }\r\n\r\n _this4._r.forEach(function (f) {\r\n return f(revert, _this4);\r\n });\r\n\r\n _this4.isReverted = true;\r\n })();\r\n } else {\r\n this.data.forEach(function (e) {\r\n return e.kill && e.kill();\r\n });\r\n }\r\n\r\n this.clear();\r\n\r\n if (matchMedia) {\r\n var i = _media.length;\r\n\r\n while (i--) {\r\n _media[i].id === this.id && _media.splice(i, 1);\r\n }\r\n }\r\n };\r\n\r\n _proto5.revert = function revert(config) {\r\n this.kill(config || {});\r\n };\r\n\r\n return Context;\r\n }();\r\n\r\n var MatchMedia = function () {\r\n function MatchMedia(scope) {\r\n this.contexts = [];\r\n this.scope = scope;\r\n _context && _context.data.push(this);\r\n }\r\n\r\n var _proto6 = MatchMedia.prototype;\r\n\r\n _proto6.add = function add(conditions, func, scope) {\r\n _isObject(conditions) || (conditions = {\r\n matches: conditions\r\n });\r\n var context = new Context(0, scope || this.scope),\r\n cond = context.conditions = {},\r\n mq,\r\n p,\r\n active;\r\n _context && !context.selector && (context.selector = _context.selector);\r\n this.contexts.push(context);\r\n func = context.add(\"onMatch\", func);\r\n context.queries = conditions;\r\n\r\n for (p in conditions) {\r\n if (p === \"all\") {\r\n active = 1;\r\n } else {\r\n mq = _win.matchMedia(conditions[p]);\r\n\r\n if (mq) {\r\n _media.indexOf(context) < 0 && _media.push(context);\r\n (cond[p] = mq.matches) && (active = 1);\r\n mq.addListener ? mq.addListener(_onMediaChange) : mq.addEventListener(\"change\", _onMediaChange);\r\n }\r\n }\r\n }\r\n\r\n active && func(context, function (f) {\r\n return context.add(null, f);\r\n });\r\n return this;\r\n };\r\n\r\n _proto6.revert = function revert(config) {\r\n this.kill(config || {});\r\n };\r\n\r\n _proto6.kill = function kill(revert) {\r\n this.contexts.forEach(function (c) {\r\n return c.kill(revert, true);\r\n });\r\n };\r\n\r\n return MatchMedia;\r\n }();\r\n\r\n var _gsap = {\r\n registerPlugin: function registerPlugin() {\r\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\r\n args[_key2] = arguments[_key2];\r\n }\r\n\r\n args.forEach(function (config) {\r\n return _createPlugin(config);\r\n });\r\n },\r\n timeline: function timeline(vars) {\r\n return new Timeline(vars);\r\n },\r\n getTweensOf: function getTweensOf(targets, onlyActive) {\r\n return _globalTimeline.getTweensOf(targets, onlyActive);\r\n },\r\n getProperty: function getProperty(target, property, unit, uncache) {\r\n _isString(target) && (target = toArray(target)[0]);\r\n\r\n var getter = _getCache(target || {}).get,\r\n format = unit ? _passThrough : _numericIfPossible;\r\n\r\n unit === \"native\" && (unit = \"\");\r\n return !target ? target : !property ? function (property, unit, uncache) {\r\n return format((_plugins[property] && _plugins[property].get || getter)(target, property, unit, uncache));\r\n } : format((_plugins[property] && _plugins[property].get || getter)(target, property, unit, uncache));\r\n },\r\n quickSetter: function quickSetter(target, property, unit) {\r\n target = toArray(target);\r\n\r\n if (target.length > 1) {\r\n var setters = target.map(function (t) {\r\n return gsap.quickSetter(t, property, unit);\r\n }),\r\n l = setters.length;\r\n return function (value) {\r\n var i = l;\r\n\r\n while (i--) {\r\n setters[i](value);\r\n }\r\n };\r\n }\r\n\r\n target = target[0] || {};\r\n\r\n var Plugin = _plugins[property],\r\n cache = _getCache(target),\r\n p = cache.harness && (cache.harness.aliases || {})[property] || property,\r\n setter = Plugin ? function (value) {\r\n var p = new Plugin();\r\n _quickTween._pt = 0;\r\n p.init(target, unit ? value + unit : value, _quickTween, 0, [target]);\r\n p.render(1, p);\r\n _quickTween._pt && _renderPropTweens(1, _quickTween);\r\n } : cache.set(target, p);\r\n\r\n return Plugin ? setter : function (value) {\r\n return setter(target, p, unit ? value + unit : value, cache, 1);\r\n };\r\n },\r\n quickTo: function quickTo(target, property, vars) {\r\n var _setDefaults2;\r\n\r\n var tween = gsap.to(target, _setDefaults((_setDefaults2 = {}, _setDefaults2[property] = \"+=0.1\", _setDefaults2.paused = true, _setDefaults2.stagger = 0, _setDefaults2), vars || {})),\r\n func = function func(value, start, startIsRelative) {\r\n return tween.resetTo(property, value, start, startIsRelative);\r\n };\r\n\r\n func.tween = tween;\r\n return func;\r\n },\r\n isTweening: function isTweening(targets) {\r\n return _globalTimeline.getTweensOf(targets, true).length > 0;\r\n },\r\n defaults: function defaults(value) {\r\n value && value.ease && (value.ease = _parseEase(value.ease, _defaults.ease));\r\n return _mergeDeep(_defaults, value || {});\r\n },\r\n config: function config(value) {\r\n return _mergeDeep(_config, value || {});\r\n },\r\n registerEffect: function registerEffect(_ref3) {\r\n var name = _ref3.name,\r\n effect = _ref3.effect,\r\n plugins = _ref3.plugins,\r\n defaults = _ref3.defaults,\r\n extendTimeline = _ref3.extendTimeline;\r\n (plugins || \"\").split(\",\").forEach(function (pluginName) {\r\n return pluginName && !_plugins[pluginName] && !_globals[pluginName] && _warn(name + \" effect requires \" + pluginName + \" plugin.\");\r\n });\r\n\r\n _effects[name] = function (targets, vars, tl) {\r\n return effect(toArray(targets), _setDefaults(vars || {}, defaults), tl);\r\n };\r\n\r\n if (extendTimeline) {\r\n Timeline.prototype[name] = function (targets, vars, position) {\r\n return this.add(_effects[name](targets, _isObject(vars) ? vars : (position = vars) && {}, this), position);\r\n };\r\n }\r\n },\r\n registerEase: function registerEase(name, ease) {\r\n _easeMap[name] = _parseEase(ease);\r\n },\r\n parseEase: function parseEase(ease, defaultEase) {\r\n return arguments.length ? _parseEase(ease, defaultEase) : _easeMap;\r\n },\r\n getById: function getById(id) {\r\n return _globalTimeline.getById(id);\r\n },\r\n exportRoot: function exportRoot(vars, includeDelayedCalls) {\r\n if (vars === void 0) {\r\n vars = {};\r\n }\r\n\r\n var tl = new Timeline(vars),\r\n child,\r\n next;\r\n tl.smoothChildTiming = _isNotFalse(vars.smoothChildTiming);\r\n\r\n _globalTimeline.remove(tl);\r\n\r\n tl._dp = 0;\r\n tl._time = tl._tTime = _globalTimeline._time;\r\n child = _globalTimeline._first;\r\n\r\n while (child) {\r\n next = child._next;\r\n\r\n if (includeDelayedCalls || !(!child._dur && child instanceof Tween && child.vars.onComplete === child._targets[0])) {\r\n _addToTimeline(tl, child, child._start - child._delay);\r\n }\r\n\r\n child = next;\r\n }\r\n\r\n _addToTimeline(_globalTimeline, tl, 0);\r\n\r\n return tl;\r\n },\r\n context: function context(func, scope) {\r\n return func ? new Context(func, scope) : _context;\r\n },\r\n matchMedia: function matchMedia(scope) {\r\n return new MatchMedia(scope);\r\n },\r\n matchMediaRefresh: function matchMediaRefresh() {\r\n return _media.forEach(function (c) {\r\n var cond = c.conditions,\r\n found,\r\n p;\r\n\r\n for (p in cond) {\r\n if (cond[p]) {\r\n cond[p] = false;\r\n found = 1;\r\n }\r\n }\r\n\r\n found && c.revert();\r\n }) || _onMediaChange();\r\n },\r\n addEventListener: function addEventListener(type, callback) {\r\n var a = _listeners[type] || (_listeners[type] = []);\r\n ~a.indexOf(callback) || a.push(callback);\r\n },\r\n removeEventListener: function removeEventListener(type, callback) {\r\n var a = _listeners[type],\r\n i = a && a.indexOf(callback);\r\n i >= 0 && a.splice(i, 1);\r\n },\r\n utils: {\r\n wrap: wrap,\r\n wrapYoyo: wrapYoyo,\r\n distribute: distribute,\r\n random: random,\r\n snap: snap,\r\n normalize: normalize,\r\n getUnit: getUnit,\r\n clamp: clamp,\r\n splitColor: splitColor,\r\n toArray: toArray,\r\n selector: selector,\r\n mapRange: mapRange,\r\n pipe: pipe,\r\n unitize: unitize,\r\n interpolate: interpolate,\r\n shuffle: shuffle\r\n },\r\n install: _install,\r\n effects: _effects,\r\n ticker: _ticker,\r\n updateRoot: Timeline.updateRoot,\r\n plugins: _plugins,\r\n globalTimeline: _globalTimeline,\r\n core: {\r\n PropTween: PropTween,\r\n globals: _addGlobal,\r\n Tween: Tween,\r\n Timeline: Timeline,\r\n Animation: Animation,\r\n getCache: _getCache,\r\n _removeLinkedListItem: _removeLinkedListItem,\r\n reverting: function reverting() {\r\n return _reverting;\r\n },\r\n context: function context(toAdd) {\r\n if (toAdd && _context) {\r\n _context.data.push(toAdd);\r\n\r\n toAdd._ctx = _context;\r\n }\r\n\r\n return _context;\r\n },\r\n suppressOverwrites: function suppressOverwrites(value) {\r\n return _suppressOverwrites = value;\r\n }\r\n }\r\n };\r\n\r\n _forEachName(\"to,from,fromTo,delayedCall,set,killTweensOf\", function (name) {\r\n return _gsap[name] = Tween[name];\r\n });\r\n\r\n _ticker.add(Timeline.updateRoot);\r\n\r\n _quickTween = _gsap.to({}, {\r\n duration: 0\r\n });\r\n\r\n var _getPluginPropTween = function _getPluginPropTween(plugin, prop) {\r\n var pt = plugin._pt;\r\n\r\n while (pt && pt.p !== prop && pt.op !== prop && pt.fp !== prop) {\r\n pt = pt._next;\r\n }\r\n\r\n return pt;\r\n },\r\n _addModifiers = function _addModifiers(tween, modifiers) {\r\n var targets = tween._targets,\r\n p,\r\n i,\r\n pt;\r\n\r\n for (p in modifiers) {\r\n i = targets.length;\r\n\r\n while (i--) {\r\n pt = tween._ptLookup[i][p];\r\n\r\n if (pt && (pt = pt.d)) {\r\n if (pt._pt) {\r\n pt = _getPluginPropTween(pt, p);\r\n }\r\n\r\n pt && pt.modifier && pt.modifier(modifiers[p], tween, targets[i], p);\r\n }\r\n }\r\n }\r\n },\r\n _buildModifierPlugin = function _buildModifierPlugin(name, modifier) {\r\n return {\r\n name: name,\r\n headless: 1,\r\n rawVars: 1,\r\n init: function init(target, vars, tween) {\r\n tween._onInit = function (tween) {\r\n var temp, p;\r\n\r\n if (_isString(vars)) {\r\n temp = {};\r\n\r\n _forEachName(vars, function (name) {\r\n return temp[name] = 1;\r\n });\r\n\r\n vars = temp;\r\n }\r\n\r\n if (modifier) {\r\n temp = {};\r\n\r\n for (p in vars) {\r\n temp[p] = modifier(vars[p]);\r\n }\r\n\r\n vars = temp;\r\n }\r\n\r\n _addModifiers(tween, vars);\r\n };\r\n }\r\n };\r\n };\r\n\r\n var gsap = _gsap.registerPlugin({\r\n name: \"attr\",\r\n init: function init(target, vars, tween, index, targets) {\r\n var p, pt, v;\r\n this.tween = tween;\r\n\r\n for (p in vars) {\r\n v = target.getAttribute(p) || \"\";\r\n pt = this.add(target, \"setAttribute\", (v || 0) + \"\", vars[p], index, targets, 0, 0, p);\r\n pt.op = p;\r\n pt.b = v;\r\n\r\n this._props.push(p);\r\n }\r\n },\r\n render: function render(ratio, data) {\r\n var pt = data._pt;\r\n\r\n while (pt) {\r\n _reverting ? pt.set(pt.t, pt.p, pt.b, pt) : pt.r(ratio, pt.d);\r\n pt = pt._next;\r\n }\r\n }\r\n }, {\r\n name: \"endArray\",\r\n headless: 1,\r\n init: function init(target, value) {\r\n var i = value.length;\r\n\r\n while (i--) {\r\n this.add(target, i, target[i] || 0, value[i], 0, 0, 0, 0, 0, 1);\r\n }\r\n }\r\n }, _buildModifierPlugin(\"roundProps\", _roundModifier), _buildModifierPlugin(\"modifiers\"), _buildModifierPlugin(\"snap\", snap)) || _gsap;\r\n Tween.version = Timeline.version = gsap.version = \"3.13.0\";\r\n _coreReady = 1;\r\n _windowExists() && _wake();\r\n var Power0 = _easeMap.Power0,\r\n Power1 = _easeMap.Power1,\r\n Power2 = _easeMap.Power2,\r\n Power3 = _easeMap.Power3,\r\n Power4 = _easeMap.Power4,\r\n Linear = _easeMap.Linear,\r\n Quad = _easeMap.Quad,\r\n Cubic = _easeMap.Cubic,\r\n Quart = _easeMap.Quart,\r\n Quint = _easeMap.Quint,\r\n Strong = _easeMap.Strong,\r\n Elastic = _easeMap.Elastic,\r\n Back = _easeMap.Back,\r\n SteppedEase = _easeMap.SteppedEase,\r\n Bounce = _easeMap.Bounce,\r\n Sine = _easeMap.Sine,\r\n Expo = _easeMap.Expo,\r\n Circ = _easeMap.Circ;\r\n\r\n var _win$1,\r\n _doc$1,\r\n _docElement,\r\n _pluginInitted,\r\n _tempDiv,\r\n _tempDivStyler,\r\n _recentSetterPlugin,\r\n _reverting$1,\r\n _windowExists$1 = function _windowExists() {\r\n return typeof window !== \"undefined\";\r\n },\r\n _transformProps = {},\r\n _RAD2DEG = 180 / Math.PI,\r\n _DEG2RAD = Math.PI / 180,\r\n _atan2 = Math.atan2,\r\n _bigNum$1 = 1e8,\r\n _capsExp = /([A-Z])/g,\r\n _horizontalExp = /(left|right|width|margin|padding|x)/i,\r\n _complexExp = /[\\s,\\(]\\S/,\r\n _propertyAliases = {\r\n autoAlpha: \"opacity,visibility\",\r\n scale: \"scaleX,scaleY\",\r\n alpha: \"opacity\"\r\n },\r\n _renderCSSProp = function _renderCSSProp(ratio, data) {\r\n return data.set(data.t, data.p, Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u, data);\r\n },\r\n _renderPropWithEnd = function _renderPropWithEnd(ratio, data) {\r\n return data.set(data.t, data.p, ratio === 1 ? data.e : Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u, data);\r\n },\r\n _renderCSSPropWithBeginning = function _renderCSSPropWithBeginning(ratio, data) {\r\n return data.set(data.t, data.p, ratio ? Math.round((data.s + data.c * ratio) * 10000) / 10000 + data.u : data.b, data);\r\n },\r\n _renderRoundedCSSProp = function _renderRoundedCSSProp(ratio, data) {\r\n var value = data.s + data.c * ratio;\r\n data.set(data.t, data.p, ~~(value + (value < 0 ? -.5 : .5)) + data.u, data);\r\n },\r\n _renderNonTweeningValue = function _renderNonTweeningValue(ratio, data) {\r\n return data.set(data.t, data.p, ratio ? data.e : data.b, data);\r\n },\r\n _renderNonTweeningValueOnlyAtEnd = function _renderNonTweeningValueOnlyAtEnd(ratio, data) {\r\n return data.set(data.t, data.p, ratio !== 1 ? data.b : data.e, data);\r\n },\r\n _setterCSSStyle = function _setterCSSStyle(target, property, value) {\r\n return target.style[property] = value;\r\n },\r\n _setterCSSProp = function _setterCSSProp(target, property, value) {\r\n return target.style.setProperty(property, value);\r\n },\r\n _setterTransform = function _setterTransform(target, property, value) {\r\n return target._gsap[property] = value;\r\n },\r\n _setterScale = function _setterScale(target, property, value) {\r\n return target._gsap.scaleX = target._gsap.scaleY = value;\r\n },\r\n _setterScaleWithRender = function _setterScaleWithRender(target, property, value, data, ratio) {\r\n var cache = target._gsap;\r\n cache.scaleX = cache.scaleY = value;\r\n cache.renderTransform(ratio, cache);\r\n },\r\n _setterTransformWithRender = function _setterTransformWithRender(target, property, value, data, ratio) {\r\n var cache = target._gsap;\r\n cache[property] = value;\r\n cache.renderTransform(ratio, cache);\r\n },\r\n _transformProp = \"transform\",\r\n _transformOriginProp = _transformProp + \"Origin\",\r\n _saveStyle = function _saveStyle(property, isNotCSS) {\r\n var _this = this;\r\n\r\n var target = this.target,\r\n style = target.style,\r\n cache = target._gsap;\r\n\r\n if (property in _transformProps && style) {\r\n this.tfm = this.tfm || {};\r\n\r\n if (property !== \"transform\") {\r\n property = _propertyAliases[property] || property;\r\n ~property.indexOf(\",\") ? property.split(\",\").forEach(function (a) {\r\n return _this.tfm[a] = _get(target, a);\r\n }) : this.tfm[property] = cache.x ? cache[property] : _get(target, property);\r\n property === _transformOriginProp && (this.tfm.zOrigin = cache.zOrigin);\r\n } else {\r\n return _propertyAliases.transform.split(\",\").forEach(function (p) {\r\n return _saveStyle.call(_this, p, isNotCSS);\r\n });\r\n }\r\n\r\n if (this.props.indexOf(_transformProp) >= 0) {\r\n return;\r\n }\r\n\r\n if (cache.svg) {\r\n this.svgo = target.getAttribute(\"data-svg-origin\");\r\n this.props.push(_transformOriginProp, isNotCSS, \"\");\r\n }\r\n\r\n property = _transformProp;\r\n }\r\n\r\n (style || isNotCSS) && this.props.push(property, isNotCSS, style[property]);\r\n },\r\n _removeIndependentTransforms = function _removeIndependentTransforms(style) {\r\n if (style.translate) {\r\n style.removeProperty(\"translate\");\r\n style.removeProperty(\"scale\");\r\n style.removeProperty(\"rotate\");\r\n }\r\n },\r\n _revertStyle = function _revertStyle() {\r\n var props = this.props,\r\n target = this.target,\r\n style = target.style,\r\n cache = target._gsap,\r\n i,\r\n p;\r\n\r\n for (i = 0; i < props.length; i += 3) {\r\n if (!props[i + 1]) {\r\n props[i + 2] ? style[props[i]] = props[i + 2] : style.removeProperty(props[i].substr(0, 2) === \"--\" ? props[i] : props[i].replace(_capsExp, \"-$1\").toLowerCase());\r\n } else if (props[i + 1] === 2) {\r\n target[props[i]](props[i + 2]);\r\n } else {\r\n target[props[i]] = props[i + 2];\r\n }\r\n }\r\n\r\n if (this.tfm) {\r\n for (p in this.tfm) {\r\n cache[p] = this.tfm[p];\r\n }\r\n\r\n if (cache.svg) {\r\n cache.renderTransform();\r\n target.setAttribute(\"data-svg-origin\", this.svgo || \"\");\r\n }\r\n\r\n i = _reverting$1();\r\n\r\n if ((!i || !i.isStart) && !style[_transformProp]) {\r\n _removeIndependentTransforms(style);\r\n\r\n if (cache.zOrigin && style[_transformOriginProp]) {\r\n style[_transformOriginProp] += \" \" + cache.zOrigin + \"px\";\r\n cache.zOrigin = 0;\r\n cache.renderTransform();\r\n }\r\n\r\n cache.uncache = 1;\r\n }\r\n }\r\n },\r\n _getStyleSaver = function _getStyleSaver(target, properties) {\r\n var saver = {\r\n target: target,\r\n props: [],\r\n revert: _revertStyle,\r\n save: _saveStyle\r\n };\r\n target._gsap || gsap.core.getCache(target);\r\n properties && target.style && target.nodeType && properties.split(\",\").forEach(function (p) {\r\n return saver.save(p);\r\n });\r\n return saver;\r\n },\r\n _supports3D,\r\n _createElement = function _createElement(type, ns) {\r\n var e = _doc$1.createElementNS ? _doc$1.createElementNS((ns || \"http://www.w3.org/1999/xhtml\").replace(/^https/, \"http\"), type) : _doc$1.createElement(type);\r\n return e && e.style ? e : _doc$1.createElement(type);\r\n },\r\n _getComputedProperty = function _getComputedProperty(target, property, skipPrefixFallback) {\r\n var cs = getComputedStyle(target);\r\n return cs[property] || cs.getPropertyValue(property.replace(_capsExp, \"-$1\").toLowerCase()) || cs.getPropertyValue(property) || !skipPrefixFallback && _getComputedProperty(target, _checkPropPrefix(property) || property, 1) || \"\";\r\n },\r\n _prefixes = \"O,Moz,ms,Ms,Webkit\".split(\",\"),\r\n _checkPropPrefix = function _checkPropPrefix(property, element, preferPrefix) {\r\n var e = element || _tempDiv,\r\n s = e.style,\r\n i = 5;\r\n\r\n if (property in s && !preferPrefix) {\r\n return property;\r\n }\r\n\r\n property = property.charAt(0).toUpperCase() + property.substr(1);\r\n\r\n while (i-- && !(_prefixes[i] + property in s)) {}\r\n\r\n return i < 0 ? null : (i === 3 ? \"ms\" : i >= 0 ? _prefixes[i] : \"\") + property;\r\n },\r\n _initCore = function _initCore() {\r\n if (_windowExists$1() && window.document) {\r\n _win$1 = window;\r\n _doc$1 = _win$1.document;\r\n _docElement = _doc$1.documentElement;\r\n _tempDiv = _createElement(\"div\") || {\r\n style: {}\r\n };\r\n _tempDivStyler = _createElement(\"div\");\r\n _transformProp = _checkPropPrefix(_transformProp);\r\n _transformOriginProp = _transformProp + \"Origin\";\r\n _tempDiv.style.cssText = \"border-width:0;line-height:0;position:absolute;padding:0\";\r\n _supports3D = !!_checkPropPrefix(\"perspective\");\r\n _reverting$1 = gsap.core.reverting;\r\n _pluginInitted = 1;\r\n }\r\n },\r\n _getReparentedCloneBBox = function _getReparentedCloneBBox(target) {\r\n var owner = target.ownerSVGElement,\r\n svg = _createElement(\"svg\", owner && owner.getAttribute(\"xmlns\") || \"http://www.w3.org/2000/svg\"),\r\n clone = target.cloneNode(true),\r\n bbox;\r\n\r\n clone.style.display = \"block\";\r\n svg.appendChild(clone);\r\n\r\n _docElement.appendChild(svg);\r\n\r\n try {\r\n bbox = clone.getBBox();\r\n } catch (e) {}\r\n\r\n svg.removeChild(clone);\r\n\r\n _docElement.removeChild(svg);\r\n\r\n return bbox;\r\n },\r\n _getAttributeFallbacks = function _getAttributeFallbacks(target, attributesArray) {\r\n var i = attributesArray.length;\r\n\r\n while (i--) {\r\n if (target.hasAttribute(attributesArray[i])) {\r\n return target.getAttribute(attributesArray[i]);\r\n }\r\n }\r\n },\r\n _getBBox = function _getBBox(target) {\r\n var bounds, cloned;\r\n\r\n try {\r\n bounds = target.getBBox();\r\n } catch (error) {\r\n bounds = _getReparentedCloneBBox(target);\r\n cloned = 1;\r\n }\r\n\r\n bounds && (bounds.width || bounds.height) || cloned || (bounds = _getReparentedCloneBBox(target));\r\n return bounds && !bounds.width && !bounds.x && !bounds.y ? {\r\n x: +_getAttributeFallbacks(target, [\"x\", \"cx\", \"x1\"]) || 0,\r\n y: +_getAttributeFallbacks(target, [\"y\", \"cy\", \"y1\"]) || 0,\r\n width: 0,\r\n height: 0\r\n } : bounds;\r\n },\r\n _isSVG = function _isSVG(e) {\r\n return !!(e.getCTM && (!e.parentNode || e.ownerSVGElement) && _getBBox(e));\r\n },\r\n _removeProperty = function _removeProperty(target, property) {\r\n if (property) {\r\n var style = target.style,\r\n first2Chars;\r\n\r\n if (property in _transformProps && property !== _transformOriginProp) {\r\n property = _transformProp;\r\n }\r\n\r\n if (style.removeProperty) {\r\n first2Chars = property.substr(0, 2);\r\n\r\n if (first2Chars === \"ms\" || property.substr(0, 6) === \"webkit\") {\r\n property = \"-\" + property;\r\n }\r\n\r\n style.removeProperty(first2Chars === \"--\" ? property : property.replace(_capsExp, \"-$1\").toLowerCase());\r\n } else {\r\n style.removeAttribute(property);\r\n }\r\n }\r\n },\r\n _addNonTweeningPT = function _addNonTweeningPT(plugin, target, property, beginning, end, onlySetAtEnd) {\r\n var pt = new PropTween(plugin._pt, target, property, 0, 1, onlySetAtEnd ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue);\r\n plugin._pt = pt;\r\n pt.b = beginning;\r\n pt.e = end;\r\n\r\n plugin._props.push(property);\r\n\r\n return pt;\r\n },\r\n _nonConvertibleUnits = {\r\n deg: 1,\r\n rad: 1,\r\n turn: 1\r\n },\r\n _nonStandardLayouts = {\r\n grid: 1,\r\n flex: 1\r\n },\r\n _convertToUnit = function _convertToUnit(target, property, value, unit) {\r\n var curValue = parseFloat(value) || 0,\r\n curUnit = (value + \"\").trim().substr((curValue + \"\").length) || \"px\",\r\n style = _tempDiv.style,\r\n horizontal = _horizontalExp.test(property),\r\n isRootSVG = target.tagName.toLowerCase() === \"svg\",\r\n measureProperty = (isRootSVG ? \"client\" : \"offset\") + (horizontal ? \"Width\" : \"Height\"),\r\n amount = 100,\r\n toPixels = unit === \"px\",\r\n toPercent = unit === \"%\",\r\n px,\r\n parent,\r\n cache,\r\n isSVG;\r\n\r\n if (unit === curUnit || !curValue || _nonConvertibleUnits[unit] || _nonConvertibleUnits[curUnit]) {\r\n return curValue;\r\n }\r\n\r\n curUnit !== \"px\" && !toPixels && (curValue = _convertToUnit(target, property, value, \"px\"));\r\n isSVG = target.getCTM && _isSVG(target);\r\n\r\n if ((toPercent || curUnit === \"%\") && (_transformProps[property] || ~property.indexOf(\"adius\"))) {\r\n px = isSVG ? target.getBBox()[horizontal ? \"width\" : \"height\"] : target[measureProperty];\r\n return _round(toPercent ? curValue / px * amount : curValue / 100 * px);\r\n }\r\n\r\n style[horizontal ? \"width\" : \"height\"] = amount + (toPixels ? curUnit : unit);\r\n parent = unit !== \"rem\" && ~property.indexOf(\"adius\") || unit === \"em\" && target.appendChild && !isRootSVG ? target : target.parentNode;\r\n\r\n if (isSVG) {\r\n parent = (target.ownerSVGElement || {}).parentNode;\r\n }\r\n\r\n if (!parent || parent === _doc$1 || !parent.appendChild) {\r\n parent = _doc$1.body;\r\n }\r\n\r\n cache = parent._gsap;\r\n\r\n if (cache && toPercent && cache.width && horizontal && cache.time === _ticker.time && !cache.uncache) {\r\n return _round(curValue / cache.width * amount);\r\n } else {\r\n if (toPercent && (property === \"height\" || property === \"width\")) {\r\n var v = target.style[property];\r\n target.style[property] = amount + unit;\r\n px = target[measureProperty];\r\n v ? target.style[property] = v : _removeProperty(target, property);\r\n } else {\r\n (toPercent || curUnit === \"%\") && !_nonStandardLayouts[_getComputedProperty(parent, \"display\")] && (style.position = _getComputedProperty(target, \"position\"));\r\n parent === target && (style.position = \"static\");\r\n parent.appendChild(_tempDiv);\r\n px = _tempDiv[measureProperty];\r\n parent.removeChild(_tempDiv);\r\n style.position = \"absolute\";\r\n }\r\n\r\n if (horizontal && toPercent) {\r\n cache = _getCache(parent);\r\n cache.time = _ticker.time;\r\n cache.width = parent[measureProperty];\r\n }\r\n }\r\n\r\n return _round(toPixels ? px * curValue / amount : px && curValue ? amount / px * curValue : 0);\r\n },\r\n _get = function _get(target, property, unit, uncache) {\r\n var value;\r\n _pluginInitted || _initCore();\r\n\r\n if (property in _propertyAliases && property !== \"transform\") {\r\n property = _propertyAliases[property];\r\n\r\n if (~property.indexOf(\",\")) {\r\n property = property.split(\",\")[0];\r\n }\r\n }\r\n\r\n if (_transformProps[property] && property !== \"transform\") {\r\n value = _parseTransform(target, uncache);\r\n value = property !== \"transformOrigin\" ? value[property] : value.svg ? value.origin : _firstTwoOnly(_getComputedProperty(target, _transformOriginProp)) + \" \" + value.zOrigin + \"px\";\r\n } else {\r\n value = target.style[property];\r\n\r\n if (!value || value === \"auto\" || uncache || ~(value + \"\").indexOf(\"calc(\")) {\r\n value = _specialProps[property] && _specialProps[property](target, property, unit) || _getComputedProperty(target, property) || _getProperty(target, property) || (property === \"opacity\" ? 1 : 0);\r\n }\r\n }\r\n\r\n return unit && !~(value + \"\").trim().indexOf(\" \") ? _convertToUnit(target, property, value, unit) + unit : value;\r\n },\r\n _tweenComplexCSSString = function _tweenComplexCSSString(target, prop, start, end) {\r\n if (!start || start === \"none\") {\r\n var p = _checkPropPrefix(prop, target, 1),\r\n s = p && _getComputedProperty(target, p, 1);\r\n\r\n if (s && s !== start) {\r\n prop = p;\r\n start = s;\r\n } else if (prop === \"borderColor\") {\r\n start = _getComputedProperty(target, \"borderTopColor\");\r\n }\r\n }\r\n\r\n var pt = new PropTween(this._pt, target.style, prop, 0, 1, _renderComplexString),\r\n index = 0,\r\n matchIndex = 0,\r\n a,\r\n result,\r\n startValues,\r\n startNum,\r\n color,\r\n startValue,\r\n endValue,\r\n endNum,\r\n chunk,\r\n endUnit,\r\n startUnit,\r\n endValues;\r\n pt.b = start;\r\n pt.e = end;\r\n start += \"\";\r\n end += \"\";\r\n\r\n if (end.substring(0, 6) === \"var(--\") {\r\n end = _getComputedProperty(target, end.substring(4, end.indexOf(\")\")));\r\n }\r\n\r\n if (end === \"auto\") {\r\n startValue = target.style[prop];\r\n target.style[prop] = end;\r\n end = _getComputedProperty(target, prop) || end;\r\n startValue ? target.style[prop] = startValue : _removeProperty(target, prop);\r\n }\r\n\r\n a = [start, end];\r\n\r\n _colorStringFilter(a);\r\n\r\n start = a[0];\r\n end = a[1];\r\n startValues = start.match(_numWithUnitExp) || [];\r\n endValues = end.match(_numWithUnitExp) || [];\r\n\r\n if (endValues.length) {\r\n while (result = _numWithUnitExp.exec(end)) {\r\n endValue = result[0];\r\n chunk = end.substring(index, result.index);\r\n\r\n if (color) {\r\n color = (color + 1) % 5;\r\n } else if (chunk.substr(-5) === \"rgba(\" || chunk.substr(-5) === \"hsla(\") {\r\n color = 1;\r\n }\r\n\r\n if (endValue !== (startValue = startValues[matchIndex++] || \"\")) {\r\n startNum = parseFloat(startValue) || 0;\r\n startUnit = startValue.substr((startNum + \"\").length);\r\n endValue.charAt(1) === \"=\" && (endValue = _parseRelative(startNum, endValue) + startUnit);\r\n endNum = parseFloat(endValue);\r\n endUnit = endValue.substr((endNum + \"\").length);\r\n index = _numWithUnitExp.lastIndex - endUnit.length;\r\n\r\n if (!endUnit) {\r\n endUnit = endUnit || _config.units[prop] || startUnit;\r\n\r\n if (index === end.length) {\r\n end += endUnit;\r\n pt.e += endUnit;\r\n }\r\n }\r\n\r\n if (startUnit !== endUnit) {\r\n startNum = _convertToUnit(target, prop, startValue, endUnit) || 0;\r\n }\r\n\r\n pt._pt = {\r\n _next: pt._pt,\r\n p: chunk || matchIndex === 1 ? chunk : \",\",\r\n s: startNum,\r\n c: endNum - startNum,\r\n m: color && color < 4 || prop === \"zIndex\" ? Math.round : 0\r\n };\r\n }\r\n }\r\n\r\n pt.c = index < end.length ? end.substring(index, end.length) : \"\";\r\n } else {\r\n pt.r = prop === \"display\" && end === \"none\" ? _renderNonTweeningValueOnlyAtEnd : _renderNonTweeningValue;\r\n }\r\n\r\n _relExp.test(end) && (pt.e = 0);\r\n this._pt = pt;\r\n return pt;\r\n },\r\n _keywordToPercent = {\r\n top: \"0%\",\r\n bottom: \"100%\",\r\n left: \"0%\",\r\n right: \"100%\",\r\n center: \"50%\"\r\n },\r\n _convertKeywordsToPercentages = function _convertKeywordsToPercentages(value) {\r\n var split = value.split(\" \"),\r\n x = split[0],\r\n y = split[1] || \"50%\";\r\n\r\n if (x === \"top\" || x === \"bottom\" || y === \"left\" || y === \"right\") {\r\n value = x;\r\n x = y;\r\n y = value;\r\n }\r\n\r\n split[0] = _keywordToPercent[x] || x;\r\n split[1] = _keywordToPercent[y] || y;\r\n return split.join(\" \");\r\n },\r\n _renderClearProps = function _renderClearProps(ratio, data) {\r\n if (data.tween && data.tween._time === data.tween._dur) {\r\n var target = data.t,\r\n style = target.style,\r\n props = data.u,\r\n cache = target._gsap,\r\n prop,\r\n clearTransforms,\r\n i;\r\n\r\n if (props === \"all\" || props === true) {\r\n style.cssText = \"\";\r\n clearTransforms = 1;\r\n } else {\r\n props = props.split(\",\");\r\n i = props.length;\r\n\r\n while (--i > -1) {\r\n prop = props[i];\r\n\r\n if (_transformProps[prop]) {\r\n clearTransforms = 1;\r\n prop = prop === \"transformOrigin\" ? _transformOriginProp : _transformProp;\r\n }\r\n\r\n _removeProperty(target, prop);\r\n }\r\n }\r\n\r\n if (clearTransforms) {\r\n _removeProperty(target, _transformProp);\r\n\r\n if (cache) {\r\n cache.svg && target.removeAttribute(\"transform\");\r\n style.scale = style.rotate = style.translate = \"none\";\r\n\r\n _parseTransform(target, 1);\r\n\r\n cache.uncache = 1;\r\n\r\n _removeIndependentTransforms(style);\r\n }\r\n }\r\n }\r\n },\r\n _specialProps = {\r\n clearProps: function clearProps(plugin, target, property, endValue, tween) {\r\n if (tween.data !== \"isFromStart\") {\r\n var pt = plugin._pt = new PropTween(plugin._pt, target, property, 0, 0, _renderClearProps);\r\n pt.u = endValue;\r\n pt.pr = -10;\r\n pt.tween = tween;\r\n\r\n plugin._props.push(property);\r\n\r\n return 1;\r\n }\r\n }\r\n },\r\n _identity2DMatrix = [1, 0, 0, 1, 0, 0],\r\n _rotationalProperties = {},\r\n _isNullTransform = function _isNullTransform(value) {\r\n return value === \"matrix(1, 0, 0, 1, 0, 0)\" || value === \"none\" || !value;\r\n },\r\n _getComputedTransformMatrixAsArray = function _getComputedTransformMatrixAsArray(target) {\r\n var matrixString = _getComputedProperty(target, _transformProp);\r\n\r\n return _isNullTransform(matrixString) ? _identity2DMatrix : matrixString.substr(7).match(_numExp).map(_round);\r\n },\r\n _getMatrix = function _getMatrix(target, force2D) {\r\n var cache = target._gsap || _getCache(target),\r\n style = target.style,\r\n matrix = _getComputedTransformMatrixAsArray(target),\r\n parent,\r\n nextSibling,\r\n temp,\r\n addedToDOM;\r\n\r\n if (cache.svg && target.getAttribute(\"transform\")) {\r\n temp = target.transform.baseVal.consolidate().matrix;\r\n matrix = [temp.a, temp.b, temp.c, temp.d, temp.e, temp.f];\r\n return matrix.join(\",\") === \"1,0,0,1,0,0\" ? _identity2DMatrix : matrix;\r\n } else if (matrix === _identity2DMatrix && !target.offsetParent && target !== _docElement && !cache.svg) {\r\n temp = style.display;\r\n style.display = \"block\";\r\n parent = target.parentNode;\r\n\r\n if (!parent || !target.offsetParent && !target.getBoundingClientRect().width) {\r\n addedToDOM = 1;\r\n nextSibling = target.nextElementSibling;\r\n\r\n _docElement.appendChild(target);\r\n }\r\n\r\n matrix = _getComputedTransformMatrixAsArray(target);\r\n temp ? style.display = temp : _removeProperty(target, \"display\");\r\n\r\n if (addedToDOM) {\r\n nextSibling ? parent.insertBefore(target, nextSibling) : parent ? parent.appendChild(target) : _docElement.removeChild(target);\r\n }\r\n }\r\n\r\n return force2D && matrix.length > 6 ? [matrix[0], matrix[1], matrix[4], matrix[5], matrix[12], matrix[13]] : matrix;\r\n },\r\n _applySVGOrigin = function _applySVGOrigin(target, origin, originIsAbsolute, smooth, matrixArray, pluginToAddPropTweensTo) {\r\n var cache = target._gsap,\r\n matrix = matrixArray || _getMatrix(target, true),\r\n xOriginOld = cache.xOrigin || 0,\r\n yOriginOld = cache.yOrigin || 0,\r\n xOffsetOld = cache.xOffset || 0,\r\n yOffsetOld = cache.yOffset || 0,\r\n a = matrix[0],\r\n b = matrix[1],\r\n c = matrix[2],\r\n d = matrix[3],\r\n tx = matrix[4],\r\n ty = matrix[5],\r\n originSplit = origin.split(\" \"),\r\n xOrigin = parseFloat(originSplit[0]) || 0,\r\n yOrigin = parseFloat(originSplit[1]) || 0,\r\n bounds,\r\n determinant,\r\n x,\r\n y;\r\n\r\n if (!originIsAbsolute) {\r\n bounds = _getBBox(target);\r\n xOrigin = bounds.x + (~originSplit[0].indexOf(\"%\") ? xOrigin / 100 * bounds.width : xOrigin);\r\n yOrigin = bounds.y + (~(originSplit[1] || originSplit[0]).indexOf(\"%\") ? yOrigin / 100 * bounds.height : yOrigin);\r\n } else if (matrix !== _identity2DMatrix && (determinant = a * d - b * c)) {\r\n x = xOrigin * (d / determinant) + yOrigin * (-c / determinant) + (c * ty - d * tx) / determinant;\r\n y = xOrigin * (-b / determinant) + yOrigin * (a / determinant) - (a * ty - b * tx) / determinant;\r\n xOrigin = x;\r\n yOrigin = y;\r\n }\r\n\r\n if (smooth || smooth !== false && cache.smooth) {\r\n tx = xOrigin - xOriginOld;\r\n ty = yOrigin - yOriginOld;\r\n cache.xOffset = xOffsetOld + (tx * a + ty * c) - tx;\r\n cache.yOffset = yOffsetOld + (tx * b + ty * d) - ty;\r\n } else {\r\n cache.xOffset = cache.yOffset = 0;\r\n }\r\n\r\n cache.xOrigin = xOrigin;\r\n cache.yOrigin = yOrigin;\r\n cache.smooth = !!smooth;\r\n cache.origin = origin;\r\n cache.originIsAbsolute = !!originIsAbsolute;\r\n target.style[_transformOriginProp] = \"0px 0px\";\r\n\r\n if (pluginToAddPropTweensTo) {\r\n _addNonTweeningPT(pluginToAddPropTweensTo, cache, \"xOrigin\", xOriginOld, xOrigin);\r\n\r\n _addNonTweeningPT(pluginToAddPropTweensTo, cache, \"yOrigin\", yOriginOld, yOrigin);\r\n\r\n _addNonTweeningPT(pluginToAddPropTweensTo, cache, \"xOffset\", xOffsetOld, cache.xOffset);\r\n\r\n _addNonTweeningPT(pluginToAddPropTweensTo, cache, \"yOffset\", yOffsetOld, cache.yOffset);\r\n }\r\n\r\n target.setAttribute(\"data-svg-origin\", xOrigin + \" \" + yOrigin);\r\n },\r\n _parseTransform = function _parseTransform(target, uncache) {\r\n var cache = target._gsap || new GSCache(target);\r\n\r\n if (\"x\" in cache && !uncache && !cache.uncache) {\r\n return cache;\r\n }\r\n\r\n var style = target.style,\r\n invertedScaleX = cache.scaleX < 0,\r\n px = \"px\",\r\n deg = \"deg\",\r\n cs = getComputedStyle(target),\r\n origin = _getComputedProperty(target, _transformOriginProp) || \"0\",\r\n x,\r\n y,\r\n z,\r\n scaleX,\r\n scaleY,\r\n rotation,\r\n rotationX,\r\n rotationY,\r\n skewX,\r\n skewY,\r\n perspective,\r\n xOrigin,\r\n yOrigin,\r\n matrix,\r\n angle,\r\n cos,\r\n sin,\r\n a,\r\n b,\r\n c,\r\n d,\r\n a12,\r\n a22,\r\n t1,\r\n t2,\r\n t3,\r\n a13,\r\n a23,\r\n a33,\r\n a42,\r\n a43,\r\n a32;\r\n x = y = z = rotation = rotationX = rotationY = skewX = skewY = perspective = 0;\r\n scaleX = scaleY = 1;\r\n cache.svg = !!(target.getCTM && _isSVG(target));\r\n\r\n if (cs.translate) {\r\n if (cs.translate !== \"none\" || cs.scale !== \"none\" || cs.rotate !== \"none\") {\r\n style[_transformProp] = (cs.translate !== \"none\" ? \"translate3d(\" + (cs.translate + \" 0 0\").split(\" \").slice(0, 3).join(\", \") + \") \" : \"\") + (cs.rotate !== \"none\" ? \"rotate(\" + cs.rotate + \") \" : \"\") + (cs.scale !== \"none\" ? \"scale(\" + cs.scale.split(\" \").join(\",\") + \") \" : \"\") + (cs[_transformProp] !== \"none\" ? cs[_transformProp] : \"\");\r\n }\r\n\r\n style.scale = style.rotate = style.translate = \"none\";\r\n }\r\n\r\n matrix = _getMatrix(target, cache.svg);\r\n\r\n if (cache.svg) {\r\n if (cache.uncache) {\r\n t2 = target.getBBox();\r\n origin = cache.xOrigin - t2.x + \"px \" + (cache.yOrigin - t2.y) + \"px\";\r\n t1 = \"\";\r\n } else {\r\n t1 = !uncache && target.getAttribute(\"data-svg-origin\");\r\n }\r\n\r\n _applySVGOrigin(target, t1 || origin, !!t1 || cache.originIsAbsolute, cache.smooth !== false, matrix);\r\n }\r\n\r\n xOrigin = cache.xOrigin || 0;\r\n yOrigin = cache.yOrigin || 0;\r\n\r\n if (matrix !== _identity2DMatrix) {\r\n a = matrix[0];\r\n b = matrix[1];\r\n c = matrix[2];\r\n d = matrix[3];\r\n x = a12 = matrix[4];\r\n y = a22 = matrix[5];\r\n\r\n if (matrix.length === 6) {\r\n scaleX = Math.sqrt(a * a + b * b);\r\n scaleY = Math.sqrt(d * d + c * c);\r\n rotation = a || b ? _atan2(b, a) * _RAD2DEG : 0;\r\n skewX = c || d ? _atan2(c, d) * _RAD2DEG + rotation : 0;\r\n skewX && (scaleY *= Math.abs(Math.cos(skewX * _DEG2RAD)));\r\n\r\n if (cache.svg) {\r\n x -= xOrigin - (xOrigin * a + yOrigin * c);\r\n y -= yOrigin - (xOrigin * b + yOrigin * d);\r\n }\r\n } else {\r\n a32 = matrix[6];\r\n a42 = matrix[7];\r\n a13 = matrix[8];\r\n a23 = matrix[9];\r\n a33 = matrix[10];\r\n a43 = matrix[11];\r\n x = matrix[12];\r\n y = matrix[13];\r\n z = matrix[14];\r\n angle = _atan2(a32, a33);\r\n rotationX = angle * _RAD2DEG;\r\n\r\n if (angle) {\r\n cos = Math.cos(-angle);\r\n sin = Math.sin(-angle);\r\n t1 = a12 * cos + a13 * sin;\r\n t2 = a22 * cos + a23 * sin;\r\n t3 = a32 * cos + a33 * sin;\r\n a13 = a12 * -sin + a13 * cos;\r\n a23 = a22 * -sin + a23 * cos;\r\n a33 = a32 * -sin + a33 * cos;\r\n a43 = a42 * -sin + a43 * cos;\r\n a12 = t1;\r\n a22 = t2;\r\n a32 = t3;\r\n }\r\n\r\n angle = _atan2(-c, a33);\r\n rotationY = angle * _RAD2DEG;\r\n\r\n if (angle) {\r\n cos = Math.cos(-angle);\r\n sin = Math.sin(-angle);\r\n t1 = a * cos - a13 * sin;\r\n t2 = b * cos - a23 * sin;\r\n t3 = c * cos - a33 * sin;\r\n a43 = d * sin + a43 * cos;\r\n a = t1;\r\n b = t2;\r\n c = t3;\r\n }\r\n\r\n angle = _atan2(b, a);\r\n rotation = angle * _RAD2DEG;\r\n\r\n if (angle) {\r\n cos = Math.cos(angle);\r\n sin = Math.sin(angle);\r\n t1 = a * cos + b * sin;\r\n t2 = a12 * cos + a22 * sin;\r\n b = b * cos - a * sin;\r\n a22 = a22 * cos - a12 * sin;\r\n a = t1;\r\n a12 = t2;\r\n }\r\n\r\n if (rotationX && Math.abs(rotationX) + Math.abs(rotation) > 359.9) {\r\n rotationX = rotation = 0;\r\n rotationY = 180 - rotationY;\r\n }\r\n\r\n scaleX = _round(Math.sqrt(a * a + b * b + c * c));\r\n scaleY = _round(Math.sqrt(a22 * a22 + a32 * a32));\r\n angle = _atan2(a12, a22);\r\n skewX = Math.abs(angle) > 0.0002 ? angle * _RAD2DEG : 0;\r\n perspective = a43 ? 1 / (a43 < 0 ? -a43 : a43) : 0;\r\n }\r\n\r\n if (cache.svg) {\r\n t1 = target.getAttribute(\"transform\");\r\n cache.forceCSS = target.setAttribute(\"transform\", \"\") || !_isNullTransform(_getComputedProperty(target, _transformProp));\r\n t1 && target.setAttribute(\"transform\", t1);\r\n }\r\n }\r\n\r\n if (Math.abs(skewX) > 90 && Math.abs(skewX) < 270) {\r\n if (invertedScaleX) {\r\n scaleX *= -1;\r\n skewX += rotation <= 0 ? 180 : -180;\r\n rotation += rotation <= 0 ? 180 : -180;\r\n } else {\r\n scaleY *= -1;\r\n skewX += skewX <= 0 ? 180 : -180;\r\n }\r\n }\r\n\r\n uncache = uncache || cache.uncache;\r\n cache.x = x - ((cache.xPercent = x && (!uncache && cache.xPercent || (Math.round(target.offsetWidth / 2) === Math.round(-x) ? -50 : 0))) ? target.offsetWidth * cache.xPercent / 100 : 0) + px;\r\n cache.y = y - ((cache.yPercent = y && (!uncache && cache.yPercent || (Math.round(target.offsetHeight / 2) === Math.round(-y) ? -50 : 0))) ? target.offsetHeight * cache.yPercent / 100 : 0) + px;\r\n cache.z = z + px;\r\n cache.scaleX = _round(scaleX);\r\n cache.scaleY = _round(scaleY);\r\n cache.rotation = _round(rotation) + deg;\r\n cache.rotationX = _round(rotationX) + deg;\r\n cache.rotationY = _round(rotationY) + deg;\r\n cache.skewX = skewX + deg;\r\n cache.skewY = skewY + deg;\r\n cache.transformPerspective = perspective + px;\r\n\r\n if (cache.zOrigin = parseFloat(origin.split(\" \")[2]) || !uncache && cache.zOrigin || 0) {\r\n style[_transformOriginProp] = _firstTwoOnly(origin);\r\n }\r\n\r\n cache.xOffset = cache.yOffset = 0;\r\n cache.force3D = _config.force3D;\r\n cache.renderTransform = cache.svg ? _renderSVGTransforms : _supports3D ? _renderCSSTransforms : _renderNon3DTransforms;\r\n cache.uncache = 0;\r\n return cache;\r\n },\r\n _firstTwoOnly = function _firstTwoOnly(value) {\r\n return (value = value.split(\" \"))[0] + \" \" + value[1];\r\n },\r\n _addPxTranslate = function _addPxTranslate(target, start, value) {\r\n var unit = getUnit(start);\r\n return _round(parseFloat(start) + parseFloat(_convertToUnit(target, \"x\", value + \"px\", unit))) + unit;\r\n },\r\n _renderNon3DTransforms = function _renderNon3DTransforms(ratio, cache) {\r\n cache.z = \"0px\";\r\n cache.rotationY = cache.rotationX = \"0deg\";\r\n cache.force3D = 0;\r\n\r\n _renderCSSTransforms(ratio, cache);\r\n },\r\n _zeroDeg = \"0deg\",\r\n _zeroPx = \"0px\",\r\n _endParenthesis = \") \",\r\n _renderCSSTransforms = function _renderCSSTransforms(ratio, cache) {\r\n var _ref = cache || this,\r\n xPercent = _ref.xPercent,\r\n yPercent = _ref.yPercent,\r\n x = _ref.x,\r\n y = _ref.y,\r\n z = _ref.z,\r\n rotation = _ref.rotation,\r\n rotationY = _ref.rotationY,\r\n rotationX = _ref.rotationX,\r\n skewX = _ref.skewX,\r\n skewY = _ref.skewY,\r\n scaleX = _ref.scaleX,\r\n scaleY = _ref.scaleY,\r\n transformPerspective = _ref.transformPerspective,\r\n force3D = _ref.force3D,\r\n target = _ref.target,\r\n zOrigin = _ref.zOrigin,\r\n transforms = \"\",\r\n use3D = force3D === \"auto\" && ratio && ratio !== 1 || force3D === true;\r\n\r\n if (zOrigin && (rotationX !== _zeroDeg || rotationY !== _zeroDeg)) {\r\n var angle = parseFloat(rotationY) * _DEG2RAD,\r\n a13 = Math.sin(angle),\r\n a33 = Math.cos(angle),\r\n cos;\r\n\r\n angle = parseFloat(rotationX) * _DEG2RAD;\r\n cos = Math.cos(angle);\r\n x = _addPxTranslate(target, x, a13 * cos * -zOrigin);\r\n y = _addPxTranslate(target, y, -Math.sin(angle) * -zOrigin);\r\n z = _addPxTranslate(target, z, a33 * cos * -zOrigin + zOrigin);\r\n }\r\n\r\n if (transformPerspective !== _zeroPx) {\r\n transforms += \"perspective(\" + transformPerspective + _endParenthesis;\r\n }\r\n\r\n if (xPercent || yPercent) {\r\n transforms += \"translate(\" + xPercent + \"%, \" + yPercent + \"%) \";\r\n }\r\n\r\n if (use3D || x !== _zeroPx || y !== _zeroPx || z !== _zeroPx) {\r\n transforms += z !== _zeroPx || use3D ? \"translate3d(\" + x + \", \" + y + \", \" + z + \") \" : \"translate(\" + x + \", \" + y + _endParenthesis;\r\n }\r\n\r\n if (rotation !== _zeroDeg) {\r\n transforms += \"rotate(\" + rotation + _endParenthesis;\r\n }\r\n\r\n if (rotationY !== _zeroDeg) {\r\n transforms += \"rotateY(\" + rotationY + _endParenthesis;\r\n }\r\n\r\n if (rotationX !== _zeroDeg) {\r\n transforms += \"rotateX(\" + rotationX + _endParenthesis;\r\n }\r\n\r\n if (skewX !== _zeroDeg || skewY !== _zeroDeg) {\r\n transforms += \"skew(\" + skewX + \", \" + skewY + _endParenthesis;\r\n }\r\n\r\n if (scaleX !== 1 || scaleY !== 1) {\r\n transforms += \"scale(\" + scaleX + \", \" + scaleY + _endParenthesis;\r\n }\r\n\r\n target.style[_transformProp] = transforms || \"translate(0, 0)\";\r\n },\r\n _renderSVGTransforms = function _renderSVGTransforms(ratio, cache) {\r\n var _ref2 = cache || this,\r\n xPercent = _ref2.xPercent,\r\n yPercent = _ref2.yPercent,\r\n x = _ref2.x,\r\n y = _ref2.y,\r\n rotation = _ref2.rotation,\r\n skewX = _ref2.skewX,\r\n skewY = _ref2.skewY,\r\n scaleX = _ref2.scaleX,\r\n scaleY = _ref2.scaleY,\r\n target = _ref2.target,\r\n xOrigin = _ref2.xOrigin,\r\n yOrigin = _ref2.yOrigin,\r\n xOffset = _ref2.xOffset,\r\n yOffset = _ref2.yOffset,\r\n forceCSS = _ref2.forceCSS,\r\n tx = parseFloat(x),\r\n ty = parseFloat(y),\r\n a11,\r\n a21,\r\n a12,\r\n a22,\r\n temp;\r\n\r\n rotation = parseFloat(rotation);\r\n skewX = parseFloat(skewX);\r\n skewY = parseFloat(skewY);\r\n\r\n if (skewY) {\r\n skewY = parseFloat(skewY);\r\n skewX += skewY;\r\n rotation += skewY;\r\n }\r\n\r\n if (rotation || skewX) {\r\n rotation *= _DEG2RAD;\r\n skewX *= _DEG2RAD;\r\n a11 = Math.cos(rotation) * scaleX;\r\n a21 = Math.sin(rotation) * scaleX;\r\n a12 = Math.sin(rotation - skewX) * -scaleY;\r\n a22 = Math.cos(rotation - skewX) * scaleY;\r\n\r\n if (skewX) {\r\n skewY *= _DEG2RAD;\r\n temp = Math.tan(skewX - skewY);\r\n temp = Math.sqrt(1 + temp * temp);\r\n a12 *= temp;\r\n a22 *= temp;\r\n\r\n if (skewY) {\r\n temp = Math.tan(skewY);\r\n temp = Math.sqrt(1 + temp * temp);\r\n a11 *= temp;\r\n a21 *= temp;\r\n }\r\n }\r\n\r\n a11 = _round(a11);\r\n a21 = _round(a21);\r\n a12 = _round(a12);\r\n a22 = _round(a22);\r\n } else {\r\n a11 = scaleX;\r\n a22 = scaleY;\r\n a21 = a12 = 0;\r\n }\r\n\r\n if (tx && !~(x + \"\").indexOf(\"px\") || ty && !~(y + \"\").indexOf(\"px\")) {\r\n tx = _convertToUnit(target, \"x\", x, \"px\");\r\n ty = _convertToUnit(target, \"y\", y, \"px\");\r\n }\r\n\r\n if (xOrigin || yOrigin || xOffset || yOffset) {\r\n tx = _round(tx + xOrigin - (xOrigin * a11 + yOrigin * a12) + xOffset);\r\n ty = _round(ty + yOrigin - (xOrigin * a21 + yOrigin * a22) + yOffset);\r\n }\r\n\r\n if (xPercent || yPercent) {\r\n temp = target.getBBox();\r\n tx = _round(tx + xPercent / 100 * temp.width);\r\n ty = _round(ty + yPercent / 100 * temp.height);\r\n }\r\n\r\n temp = \"matrix(\" + a11 + \",\" + a21 + \",\" + a12 + \",\" + a22 + \",\" + tx + \",\" + ty + \")\";\r\n target.setAttribute(\"transform\", temp);\r\n forceCSS && (target.style[_transformProp] = temp);\r\n },\r\n _addRotationalPropTween = function _addRotationalPropTween(plugin, target, property, startNum, endValue) {\r\n var cap = 360,\r\n isString = _isString(endValue),\r\n endNum = parseFloat(endValue) * (isString && ~endValue.indexOf(\"rad\") ? _RAD2DEG : 1),\r\n change = endNum - startNum,\r\n finalValue = startNum + change + \"deg\",\r\n direction,\r\n pt;\r\n\r\n if (isString) {\r\n direction = endValue.split(\"_\")[1];\r\n\r\n if (direction === \"short\") {\r\n change %= cap;\r\n\r\n if (change !== change % (cap / 2)) {\r\n change += change < 0 ? cap : -cap;\r\n }\r\n }\r\n\r\n if (direction === \"cw\" && change < 0) {\r\n change = (change + cap * _bigNum$1) % cap - ~~(change / cap) * cap;\r\n } else if (direction === \"ccw\" && change > 0) {\r\n change = (change - cap * _bigNum$1) % cap - ~~(change / cap) * cap;\r\n }\r\n }\r\n\r\n plugin._pt = pt = new PropTween(plugin._pt, target, property, startNum, change, _renderPropWithEnd);\r\n pt.e = finalValue;\r\n pt.u = \"deg\";\r\n\r\n plugin._props.push(property);\r\n\r\n return pt;\r\n },\r\n _assign = function _assign(target, source) {\r\n for (var p in source) {\r\n target[p] = source[p];\r\n }\r\n\r\n return target;\r\n },\r\n _addRawTransformPTs = function _addRawTransformPTs(plugin, transforms, target) {\r\n var startCache = _assign({}, target._gsap),\r\n exclude = \"perspective,force3D,transformOrigin,svgOrigin\",\r\n style = target.style,\r\n endCache,\r\n p,\r\n startValue,\r\n endValue,\r\n startNum,\r\n endNum,\r\n startUnit,\r\n endUnit;\r\n\r\n if (startCache.svg) {\r\n startValue = target.getAttribute(\"transform\");\r\n target.setAttribute(\"transform\", \"\");\r\n style[_transformProp] = transforms;\r\n endCache = _parseTransform(target, 1);\r\n\r\n _removeProperty(target, _transformProp);\r\n\r\n target.setAttribute(\"transform\", startValue);\r\n } else {\r\n startValue = getComputedStyle(target)[_transformProp];\r\n style[_transformProp] = transforms;\r\n endCache = _parseTransform(target, 1);\r\n style[_transformProp] = startValue;\r\n }\r\n\r\n for (p in _transformProps) {\r\n startValue = startCache[p];\r\n endValue = endCache[p];\r\n\r\n if (startValue !== endValue && exclude.indexOf(p) < 0) {\r\n startUnit = getUnit(startValue);\r\n endUnit = getUnit(endValue);\r\n startNum = startUnit !== endUnit ? _convertToUnit(target, p, startValue, endUnit) : parseFloat(startValue);\r\n endNum = parseFloat(endValue);\r\n plugin._pt = new PropTween(plugin._pt, endCache, p, startNum, endNum - startNum, _renderCSSProp);\r\n plugin._pt.u = endUnit || 0;\r\n\r\n plugin._props.push(p);\r\n }\r\n }\r\n\r\n _assign(endCache, startCache);\r\n };\r\n\r\n _forEachName(\"padding,margin,Width,Radius\", function (name, index) {\r\n var t = \"Top\",\r\n r = \"Right\",\r\n b = \"Bottom\",\r\n l = \"Left\",\r\n props = (index < 3 ? [t, r, b, l] : [t + l, t + r, b + r, b + l]).map(function (side) {\r\n return index < 2 ? name + side : \"border\" + side + name;\r\n });\r\n\r\n _specialProps[index > 1 ? \"border\" + name : name] = function (plugin, target, property, endValue, tween) {\r\n var a, vars;\r\n\r\n if (arguments.length < 4) {\r\n a = props.map(function (prop) {\r\n return _get(plugin, prop, property);\r\n });\r\n vars = a.join(\" \");\r\n return vars.split(a[0]).length === 5 ? a[0] : vars;\r\n }\r\n\r\n a = (endValue + \"\").split(\" \");\r\n vars = {};\r\n props.forEach(function (prop, i) {\r\n return vars[prop] = a[i] = a[i] || a[(i - 1) / 2 | 0];\r\n });\r\n plugin.init(target, vars, tween);\r\n };\r\n });\r\n\r\n var CSSPlugin = {\r\n name: \"css\",\r\n register: _initCore,\r\n targetTest: function targetTest(target) {\r\n return target.style && target.nodeType;\r\n },\r\n init: function init(target, vars, tween, index, targets) {\r\n var props = this._props,\r\n style = target.style,\r\n startAt = tween.vars.startAt,\r\n startValue,\r\n endValue,\r\n endNum,\r\n startNum,\r\n type,\r\n specialProp,\r\n p,\r\n startUnit,\r\n endUnit,\r\n relative,\r\n isTransformRelated,\r\n transformPropTween,\r\n cache,\r\n smooth,\r\n hasPriority,\r\n inlineProps;\r\n _pluginInitted || _initCore();\r\n this.styles = this.styles || _getStyleSaver(target);\r\n inlineProps = this.styles.props;\r\n this.tween = tween;\r\n\r\n for (p in vars) {\r\n if (p === \"autoRound\") {\r\n continue;\r\n }\r\n\r\n endValue = vars[p];\r\n\r\n if (_plugins[p] && _checkPlugin(p, vars, tween, index, target, targets)) {\r\n continue;\r\n }\r\n\r\n type = typeof endValue;\r\n specialProp = _specialProps[p];\r\n\r\n if (type === \"function\") {\r\n endValue = endValue.call(tween, index, target, targets);\r\n type = typeof endValue;\r\n }\r\n\r\n if (type === \"string\" && ~endValue.indexOf(\"random(\")) {\r\n endValue = _replaceRandom(endValue);\r\n }\r\n\r\n if (specialProp) {\r\n specialProp(this, target, p, endValue, tween) && (hasPriority = 1);\r\n } else if (p.substr(0, 2) === \"--\") {\r\n startValue = (getComputedStyle(target).getPropertyValue(p) + \"\").trim();\r\n endValue += \"\";\r\n _colorExp.lastIndex = 0;\r\n\r\n if (!_colorExp.test(startValue)) {\r\n startUnit = getUnit(startValue);\r\n endUnit = getUnit(endValue);\r\n }\r\n\r\n endUnit ? startUnit !== endUnit && (startValue = _convertToUnit(target, p, startValue, endUnit) + endUnit) : startUnit && (endValue += startUnit);\r\n this.add(style, \"setProperty\", startValue, endValue, index, targets, 0, 0, p);\r\n props.push(p);\r\n inlineProps.push(p, 0, style[p]);\r\n } else if (type !== \"undefined\") {\r\n if (startAt && p in startAt) {\r\n startValue = typeof startAt[p] === \"function\" ? startAt[p].call(tween, index, target, targets) : startAt[p];\r\n _isString(startValue) && ~startValue.indexOf(\"random(\") && (startValue = _replaceRandom(startValue));\r\n getUnit(startValue + \"\") || startValue === \"auto\" || (startValue += _config.units[p] || getUnit(_get(target, p)) || \"\");\r\n (startValue + \"\").charAt(1) === \"=\" && (startValue = _get(target, p));\r\n } else {\r\n startValue = _get(target, p);\r\n }\r\n\r\n startNum = parseFloat(startValue);\r\n relative = type === \"string\" && endValue.charAt(1) === \"=\" && endValue.substr(0, 2);\r\n relative && (endValue = endValue.substr(2));\r\n endNum = parseFloat(endValue);\r\n\r\n if (p in _propertyAliases) {\r\n if (p === \"autoAlpha\") {\r\n if (startNum === 1 && _get(target, \"visibility\") === \"hidden\" && endNum) {\r\n startNum = 0;\r\n }\r\n\r\n inlineProps.push(\"visibility\", 0, style.visibility);\r\n\r\n _addNonTweeningPT(this, style, \"visibility\", startNum ? \"inherit\" : \"hidden\", endNum ? \"inherit\" : \"hidden\", !endNum);\r\n }\r\n\r\n if (p !== \"scale\" && p !== \"transform\") {\r\n p = _propertyAliases[p];\r\n ~p.indexOf(\",\") && (p = p.split(\",\")[0]);\r\n }\r\n }\r\n\r\n isTransformRelated = p in _transformProps;\r\n\r\n if (isTransformRelated) {\r\n this.styles.save(p);\r\n\r\n if (type === \"string\" && endValue.substring(0, 6) === \"var(--\") {\r\n endValue = _getComputedProperty(target, endValue.substring(4, endValue.indexOf(\")\")));\r\n endNum = parseFloat(endValue);\r\n }\r\n\r\n if (!transformPropTween) {\r\n cache = target._gsap;\r\n cache.renderTransform && !vars.parseTransform || _parseTransform(target, vars.parseTransform);\r\n smooth = vars.smoothOrigin !== false && cache.smooth;\r\n transformPropTween = this._pt = new PropTween(this._pt, style, _transformProp, 0, 1, cache.renderTransform, cache, 0, -1);\r\n transformPropTween.dep = 1;\r\n }\r\n\r\n if (p === \"scale\") {\r\n this._pt = new PropTween(this._pt, cache, \"scaleY\", cache.scaleY, (relative ? _parseRelative(cache.scaleY, relative + endNum) : endNum) - cache.scaleY || 0, _renderCSSProp);\r\n this._pt.u = 0;\r\n props.push(\"scaleY\", p);\r\n p += \"X\";\r\n } else if (p === \"transformOrigin\") {\r\n inlineProps.push(_transformOriginProp, 0, style[_transformOriginProp]);\r\n endValue = _convertKeywordsToPercentages(endValue);\r\n\r\n if (cache.svg) {\r\n _applySVGOrigin(target, endValue, 0, smooth, 0, this);\r\n } else {\r\n endUnit = parseFloat(endValue.split(\" \")[2]) || 0;\r\n endUnit !== cache.zOrigin && _addNonTweeningPT(this, cache, \"zOrigin\", cache.zOrigin, endUnit);\r\n\r\n _addNonTweeningPT(this, style, p, _firstTwoOnly(startValue), _firstTwoOnly(endValue));\r\n }\r\n\r\n continue;\r\n } else if (p === \"svgOrigin\") {\r\n _applySVGOrigin(target, endValue, 1, smooth, 0, this);\r\n\r\n continue;\r\n } else if (p in _rotationalProperties) {\r\n _addRotationalPropTween(this, cache, p, startNum, relative ? _parseRelative(startNum, relative + endValue) : endValue);\r\n\r\n continue;\r\n } else if (p === \"smoothOrigin\") {\r\n _addNonTweeningPT(this, cache, \"smooth\", cache.smooth, endValue);\r\n\r\n continue;\r\n } else if (p === \"force3D\") {\r\n cache[p] = endValue;\r\n continue;\r\n } else if (p === \"transform\") {\r\n _addRawTransformPTs(this, endValue, target);\r\n\r\n continue;\r\n }\r\n } else if (!(p in style)) {\r\n p = _checkPropPrefix(p) || p;\r\n }\r\n\r\n if (isTransformRelated || (endNum || endNum === 0) && (startNum || startNum === 0) && !_complexExp.test(endValue) && p in style) {\r\n startUnit = (startValue + \"\").substr((startNum + \"\").length);\r\n endNum || (endNum = 0);\r\n endUnit = getUnit(endValue) || (p in _config.units ? _config.units[p] : startUnit);\r\n startUnit !== endUnit && (startNum = _convertToUnit(target, p, startValue, endUnit));\r\n this._pt = new PropTween(this._pt, isTransformRelated ? cache : style, p, startNum, (relative ? _parseRelative(startNum, relative + endNum) : endNum) - startNum, !isTransformRelated && (endUnit === \"px\" || p === \"zIndex\") && vars.autoRound !== false ? _renderRoundedCSSProp : _renderCSSProp);\r\n this._pt.u = endUnit || 0;\r\n\r\n if (startUnit !== endUnit && endUnit !== \"%\") {\r\n this._pt.b = startValue;\r\n this._pt.r = _renderCSSPropWithBeginning;\r\n }\r\n } else if (!(p in style)) {\r\n if (p in target) {\r\n this.add(target, p, startValue || target[p], relative ? relative + endValue : endValue, index, targets);\r\n } else if (p !== \"parseTransform\") {\r\n _missingPlugin(p, endValue);\r\n\r\n continue;\r\n }\r\n } else {\r\n _tweenComplexCSSString.call(this, target, p, startValue, relative ? relative + endValue : endValue);\r\n }\r\n\r\n isTransformRelated || (p in style ? inlineProps.push(p, 0, style[p]) : typeof target[p] === \"function\" ? inlineProps.push(p, 2, target[p]()) : inlineProps.push(p, 1, startValue || target[p]));\r\n props.push(p);\r\n }\r\n }\r\n\r\n hasPriority && _sortPropTweensByPriority(this);\r\n },\r\n render: function render(ratio, data) {\r\n if (data.tween._time || !_reverting$1()) {\r\n var pt = data._pt;\r\n\r\n while (pt) {\r\n pt.r(ratio, pt.d);\r\n pt = pt._next;\r\n }\r\n } else {\r\n data.styles.revert();\r\n }\r\n },\r\n get: _get,\r\n aliases: _propertyAliases,\r\n getSetter: function getSetter(target, property, plugin) {\r\n var p = _propertyAliases[property];\r\n p && p.indexOf(\",\") < 0 && (property = p);\r\n return property in _transformProps && property !== _transformOriginProp && (target._gsap.x || _get(target, \"x\")) ? plugin && _recentSetterPlugin === plugin ? property === \"scale\" ? _setterScale : _setterTransform : (_recentSetterPlugin = plugin || {}) && (property === \"scale\" ? _setterScaleWithRender : _setterTransformWithRender) : target.style && !_isUndefined(target.style[property]) ? _setterCSSStyle : ~property.indexOf(\"-\") ? _setterCSSProp : _getSetter(target, property);\r\n },\r\n core: {\r\n _removeProperty: _removeProperty,\r\n _getMatrix: _getMatrix\r\n }\r\n };\r\n gsap.utils.checkPrefix = _checkPropPrefix;\r\n gsap.core.getStyleSaver = _getStyleSaver;\r\n\r\n (function (positionAndScale, rotation, others, aliases) {\r\n var all = _forEachName(positionAndScale + \",\" + rotation + \",\" + others, function (name) {\r\n _transformProps[name] = 1;\r\n });\r\n\r\n _forEachName(rotation, function (name) {\r\n _config.units[name] = \"deg\";\r\n _rotationalProperties[name] = 1;\r\n });\r\n\r\n _propertyAliases[all[13]] = positionAndScale + \",\" + rotation;\r\n\r\n _forEachName(aliases, function (name) {\r\n var split = name.split(\":\");\r\n _propertyAliases[split[1]] = all[split[0]];\r\n });\r\n })(\"x,y,z,scale,scaleX,scaleY,xPercent,yPercent\", \"rotation,rotationX,rotationY,skewX,skewY\", \"transform,transformOrigin,svgOrigin,force3D,smoothOrigin,transformPerspective\", \"0:translateX,1:translateY,2:translateZ,8:rotate,8:rotationZ,8:rotateZ,9:rotateX,10:rotateY\");\r\n\r\n _forEachName(\"x,y,z,top,right,bottom,left,width,height,fontSize,padding,margin,perspective\", function (name) {\r\n _config.units[name] = \"px\";\r\n });\r\n\r\n gsap.registerPlugin(CSSPlugin);\r\n\r\n var gsapWithCSS = gsap.registerPlugin(CSSPlugin) || gsap,\r\n TweenMaxWithCSS = gsapWithCSS.core.Tween;\r\n\r\n exports.Back = Back;\r\n exports.Bounce = Bounce;\r\n exports.CSSPlugin = CSSPlugin;\r\n exports.Circ = Circ;\r\n exports.Cubic = Cubic;\r\n exports.Elastic = Elastic;\r\n exports.Expo = Expo;\r\n exports.Linear = Linear;\r\n exports.Power0 = Power0;\r\n exports.Power1 = Power1;\r\n exports.Power2 = Power2;\r\n exports.Power3 = Power3;\r\n exports.Power4 = Power4;\r\n exports.Quad = Quad;\r\n exports.Quart = Quart;\r\n exports.Quint = Quint;\r\n exports.Sine = Sine;\r\n exports.SteppedEase = SteppedEase;\r\n exports.Strong = Strong;\r\n exports.TimelineLite = Timeline;\r\n exports.TimelineMax = Timeline;\r\n exports.TweenLite = Tween;\r\n exports.TweenMax = TweenMaxWithCSS;\r\n exports.default = gsapWithCSS;\r\n exports.gsap = gsapWithCSS;\r\n\r\n if (typeof(window) === 'undefined' || window !== exports) {Object.defineProperty(exports, '__esModule', { value: true });} else {delete window.default;}\r\n\r\n})));\r\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvZ3NhcC9kaXN0L2dzYXAuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSxFQUFFLEtBQTREO0FBQzlELEVBQUUsQ0FDdUU7QUFDekUsQ0FBQyw2QkFBNkI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsK0ZBQStGO0FBQy9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQix3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0gseUJBQXlCO0FBQ3pCO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0EsbUJBQW1CO0FBQ25CLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsMkNBQTJDO0FBQ3REO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLE9BQU87QUFDdkI7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLDZJQUE2STtBQUM3STtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQSw2RUFBNkUsYUFBYTtBQUMxRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxPQUFPO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsT0FBTztBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0Esc0VBQXNFLElBQUksRUFBRSxJQUFJO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQix3QkFBd0I7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUZBQXVGO0FBQ3ZGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNILG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsNkZBQTZGO0FBQzdGLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isb0JBQW9CO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0Esc0VBQXNFO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQztBQUNsQztBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOERBQThEO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsT0FBTztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0EsMEJBQTBCLGNBQWM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVztBQUNYO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsU0FBUztBQUNULFFBQVE7QUFDUjtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLDZFQUE2RSxlQUFlO0FBQzVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQ7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLGtFQUFrRSx1SEFBdUg7QUFDekw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLDhDQUE4QztBQUM5QyxLQUFLO0FBQ0w7QUFDQSw0Q0FBNEM7QUFDNUMsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLCtEQUErRDtBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtHQUFrRztBQUNsRztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGtCQUFrQjtBQUNsQztBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxjQUFjLGtCQUFrQjtBQUMvRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnUUFBZ1E7QUFDaFEsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RCwrQ0FBK0MsYUFBYSxJQUFJLE1BQU07QUFDbkk7QUFDQSxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbmV4dGpzLy4vbm9kZV9tb2R1bGVzL2dzYXAvZGlzdC9nc2FwLmpzPzAzM2MiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcclxuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDpcclxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDpcclxuICAoZ2xvYmFsID0gZ2xvYmFsIHx8IHNlbGYsIGZhY3RvcnkoZ2xvYmFsLndpbmRvdyA9IGdsb2JhbC53aW5kb3cgfHwge30pKTtcclxufSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMpIHsgJ3VzZSBzdHJpY3QnO1xyXG5cclxuICBmdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcywgc3VwZXJDbGFzcykge1xyXG4gICAgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7XHJcbiAgICBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzcztcclxuICAgIHN1YkNsYXNzLl9fcHJvdG9fXyA9IHN1cGVyQ2xhc3M7XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKHNlbGYpIHtcclxuICAgIGlmIChzZWxmID09PSB2b2lkIDApIHtcclxuICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKFwidGhpcyBoYXNuJ3QgYmVlbiBpbml0aWFsaXNlZCAtIHN1cGVyKCkgaGFzbid0IGJlZW4gY2FsbGVkXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzZWxmO1xyXG4gIH1cclxuXHJcbiAgLyohXHJcbiAgICogR1NBUCAzLjEzLjBcclxuICAgKiBodHRwczovL2dzYXAuY29tXHJcbiAgICpcclxuICAgKiBAbGljZW5zZSBDb3B5cmlnaHQgMjAwOC0yMDI1LCBHcmVlblNvY2suIEFsbCByaWdodHMgcmVzZXJ2ZWQuXHJcbiAgICogU3ViamVjdCB0byB0aGUgdGVybXMgYXQgaHR0cHM6Ly9nc2FwLmNvbS9zdGFuZGFyZC1saWNlbnNlXHJcbiAgICogQGF1dGhvcjogSmFjayBEb3lsZSwgamFja0BncmVlbnNvY2suY29tXHJcbiAgKi9cclxuICB2YXIgX2NvbmZpZyA9IHtcclxuICAgIGF1dG9TbGVlcDogMTIwLFxyXG4gICAgZm9yY2UzRDogXCJhdXRvXCIsXHJcbiAgICBudWxsVGFyZ2V0V2FybjogMSxcclxuICAgIHVuaXRzOiB7XHJcbiAgICAgIGxpbmVIZWlnaHQ6IFwiXCJcclxuICAgIH1cclxuICB9LFxyXG4gICAgICBfZGVmYXVsdHMgPSB7XHJcbiAgICBkdXJhdGlvbjogLjUsXHJcbiAgICBvdmVyd3JpdGU6IGZhbHNlLFxyXG4gICAgZGVsYXk6IDBcclxuICB9LFxyXG4gICAgICBfc3VwcHJlc3NPdmVyd3JpdGVzLFxyXG4gICAgICBfcmV2ZXJ0aW5nLFxyXG4gICAgICBfY29udGV4dCxcclxuICAgICAgX2JpZ051bSA9IDFlOCxcclxuICAgICAgX3RpbnlOdW0gPSAxIC8gX2JpZ051bSxcclxuICAgICAgXzJQSSA9IE1hdGguUEkgKiAyLFxyXG4gICAgICBfSEFMRl9QSSA9IF8yUEkgLyA0LFxyXG4gICAgICBfZ3NJRCA9IDAsXHJcbiAgICAgIF9zcXJ0ID0gTWF0aC5zcXJ0LFxyXG4gICAgICBfY29zID0gTWF0aC5jb3MsXHJcbiAgICAgIF9zaW4gPSBNYXRoLnNpbixcclxuICAgICAgX2lzU3RyaW5nID0gZnVuY3Rpb24gX2lzU3RyaW5nKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiO1xyXG4gIH0sXHJcbiAgICAgIF9pc0Z1bmN0aW9uID0gZnVuY3Rpb24gX2lzRnVuY3Rpb24odmFsdWUpIHtcclxuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIjtcclxuICB9LFxyXG4gICAgICBfaXNOdW1iZXIgPSBmdW5jdGlvbiBfaXNOdW1iZXIodmFsdWUpIHtcclxuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCI7XHJcbiAgfSxcclxuICAgICAgX2lzVW5kZWZpbmVkID0gZnVuY3Rpb24gX2lzVW5kZWZpbmVkKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiO1xyXG4gIH0sXHJcbiAgICAgIF9pc09iamVjdCA9IGZ1bmN0aW9uIF9pc09iamVjdCh2YWx1ZSkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIjtcclxuICB9LFxyXG4gICAgICBfaXNOb3RGYWxzZSA9IGZ1bmN0aW9uIF9pc05vdEZhbHNlKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gdmFsdWUgIT09IGZhbHNlO1xyXG4gIH0sXHJcbiAgICAgIF93aW5kb3dFeGlzdHMgPSBmdW5jdGlvbiBfd2luZG93RXhpc3RzKCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCI7XHJcbiAgfSxcclxuICAgICAgX2lzRnVuY09yU3RyaW5nID0gZnVuY3Rpb24gX2lzRnVuY09yU3RyaW5nKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gX2lzRnVuY3Rpb24odmFsdWUpIHx8IF9pc1N0cmluZyh2YWx1ZSk7XHJcbiAgfSxcclxuICAgICAgX2lzVHlwZWRBcnJheSA9IHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gXCJmdW5jdGlvblwiICYmIEFycmF5QnVmZmVyLmlzVmlldyB8fCBmdW5jdGlvbiAoKSB7fSxcclxuICAgICAgX2lzQXJyYXkgPSBBcnJheS5pc0FycmF5LFxyXG4gICAgICBfc3RyaWN0TnVtRXhwID0gLyg/Oi0/XFwuP1xcZHxcXC4pKy9naSxcclxuICAgICAgX251bUV4cCA9IC9bLSs9Ll0qXFxkK1suZVxcLStdKlxcZCpbZVxcLStdKlxcZCovZyxcclxuICAgICAgX251bVdpdGhVbml0RXhwID0gL1stKz0uXSpcXGQrWy5lLV0qXFxkKlthLXolXSovZyxcclxuICAgICAgX2NvbXBsZXhTdHJpbmdOdW1FeHAgPSAvWy0rPS5dKlxcZCtcXC4/XFxkKig/OmUtfGVcXCspP1xcZCovZ2ksXHJcbiAgICAgIF9yZWxFeHAgPSAvWystXT0tP1suXFxkXSsvLFxyXG4gICAgICBfZGVsaW1pdGVkVmFsdWVFeHAgPSAvW14sJ1wiXFxbXFxdXFxzXSsvZ2ksXHJcbiAgICAgIF91bml0RXhwID0gL15bK1xcLT1lXFxzXFxkXSpcXGQrWy5cXGRdKihbYS16XSp8JSlcXHMqJC9pLFxyXG4gICAgICBfZ2xvYmFsVGltZWxpbmUsXHJcbiAgICAgIF93aW4sXHJcbiAgICAgIF9jb3JlSW5pdHRlZCxcclxuICAgICAgX2RvYyxcclxuICAgICAgX2dsb2JhbHMgPSB7fSxcclxuICAgICAgX2luc3RhbGxTY29wZSA9IHt9LFxyXG4gICAgICBfY29yZVJlYWR5LFxyXG4gICAgICBfaW5zdGFsbCA9IGZ1bmN0aW9uIF9pbnN0YWxsKHNjb3BlKSB7XHJcbiAgICByZXR1cm4gKF9pbnN0YWxsU2NvcGUgPSBfbWVyZ2Uoc2NvcGUsIF9nbG9iYWxzKSkgJiYgZ3NhcDtcclxuICB9LFxyXG4gICAgICBfbWlzc2luZ1BsdWdpbiA9IGZ1bmN0aW9uIF9taXNzaW5nUGx1Z2luKHByb3BlcnR5LCB2YWx1ZSkge1xyXG4gICAgcmV0dXJuIGNvbnNvbGUud2FybihcIkludmFsaWQgcHJvcGVydHlcIiwgcHJvcGVydHksIFwic2V0IHRvXCIsIHZhbHVlLCBcIk1pc3NpbmcgcGx1Z2luPyBnc2FwLnJlZ2lzdGVyUGx1Z2luKClcIik7XHJcbiAgfSxcclxuICAgICAgX3dhcm4gPSBmdW5jdGlvbiBfd2FybihtZXNzYWdlLCBzdXBwcmVzcykge1xyXG4gICAgcmV0dXJuICFzdXBwcmVzcyAmJiBjb25zb2xlLndhcm4obWVzc2FnZSk7XHJcbiAgfSxcclxuICAgICAgX2FkZEdsb2JhbCA9IGZ1bmN0aW9uIF9hZGRHbG9iYWwobmFtZSwgb2JqKSB7XHJcbiAgICByZXR1cm4gbmFtZSAmJiAoX2dsb2JhbHNbbmFtZV0gPSBvYmopICYmIF9pbnN0YWxsU2NvcGUgJiYgKF9pbnN0YWxsU2NvcGVbbmFtZV0gPSBvYmopIHx8IF9nbG9iYWxzO1xyXG4gIH0sXHJcbiAgICAgIF9lbXB0eUZ1bmMgPSBmdW5jdGlvbiBfZW1wdHlGdW5jKCkge1xyXG4gICAgcmV0dXJuIDA7XHJcbiAgfSxcclxuICAgICAgX3N0YXJ0QXRSZXZlcnRDb25maWcgPSB7XHJcbiAgICBzdXBwcmVzc0V2ZW50czogdHJ1ZSxcclxuICAgIGlzU3RhcnQ6IHRydWUsXHJcbiAgICBraWxsOiBmYWxzZVxyXG4gIH0sXHJcbiAgICAgIF9yZXZlcnRDb25maWdOb0tpbGwgPSB7XHJcbiAgICBzdXBwcmVzc0V2ZW50czogdHJ1ZSxcclxuICAgIGtpbGw6IGZhbHNlXHJcbiAgfSxcclxuICAgICAgX3JldmVydENvbmZpZyA9IHtcclxuICAgIHN1cHByZXNzRXZlbnRzOiB0cnVlXHJcbiAgfSxcclxuICAgICAgX3Jlc2VydmVkUHJvcHMgPSB7fSxcclxuICAgICAgX2xhenlUd2VlbnMgPSBbXSxcclxuICAgICAgX2xhenlMb29rdXAgPSB7fSxcclxuICAgICAgX2xhc3RSZW5kZXJlZEZyYW1lLFxyXG4gICAgICBfcGx1Z2lucyA9IHt9LFxyXG4gICAgICBfZWZmZWN0cyA9IHt9LFxyXG4gICAgICBfbmV4dEdDRnJhbWUgPSAzMCxcclxuICAgICAgX2hhcm5lc3NQbHVnaW5zID0gW10sXHJcbiAgICAgIF9jYWxsYmFja05hbWVzID0gXCJcIixcclxuICAgICAgX2hhcm5lc3MgPSBmdW5jdGlvbiBfaGFybmVzcyh0YXJnZXRzKSB7XHJcbiAgICB2YXIgdGFyZ2V0ID0gdGFyZ2V0c1swXSxcclxuICAgICAgICBoYXJuZXNzUGx1Z2luLFxyXG4gICAgICAgIGk7XHJcbiAgICBfaXNPYmplY3QodGFyZ2V0KSB8fCBfaXNGdW5jdGlvbih0YXJnZXQpIHx8ICh0YXJnZXRzID0gW3RhcmdldHNdKTtcclxuXHJcbiAgICBpZiAoIShoYXJuZXNzUGx1Z2luID0gKHRhcmdldC5fZ3NhcCB8fCB7fSkuaGFybmVzcykpIHtcclxuICAgICAgaSA9IF9oYXJuZXNzUGx1Z2lucy5sZW5ndGg7XHJcblxyXG4gICAgICB3aGlsZSAoaS0tICYmICFfaGFybmVzc1BsdWdpbnNbaV0udGFyZ2V0VGVzdCh0YXJnZXQpKSB7fVxyXG5cclxuICAgICAgaGFybmVzc1BsdWdpbiA9IF9oYXJuZXNzUGx1Z2luc1tpXTtcclxuICAgIH1cclxuXHJcbiAgICBpID0gdGFyZ2V0cy5sZW5ndGg7XHJcblxyXG4gICAgd2hpbGUgKGktLSkge1xyXG4gICAgICB0YXJnZXRzW2ldICYmICh0YXJnZXRzW2ldLl9nc2FwIHx8ICh0YXJnZXRzW2ldLl9nc2FwID0gbmV3IEdTQ2FjaGUodGFyZ2V0c1tpXSwgaGFybmVzc1BsdWdpbikpKSB8fCB0YXJnZXRzLnNwbGljZShpLCAxKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGFyZ2V0cztcclxuICB9LFxyXG4gICAgICBfZ2V0Q2FjaGUgPSBmdW5jdGlvbiBfZ2V0Q2FjaGUodGFyZ2V0KSB7XHJcbiAgICByZXR1cm4gdGFyZ2V0Ll9nc2FwIHx8IF9oYXJuZXNzKHRvQXJyYXkodGFyZ2V0KSlbMF0uX2dzYXA7XHJcbiAgfSxcclxuICAgICAgX2dldFByb3BlcnR5ID0gZnVuY3Rpb24gX2dldFByb3BlcnR5KHRhcmdldCwgcHJvcGVydHksIHYpIHtcclxuICAgIHJldHVybiAodiA9IHRhcmdldFtwcm9wZXJ0eV0pICYmIF9pc0Z1bmN0aW9uKHYpID8gdGFyZ2V0W3Byb3BlcnR5XSgpIDogX2lzVW5kZWZpbmVkKHYpICYmIHRhcmdldC5nZXRBdHRyaWJ1dGUgJiYgdGFyZ2V0LmdldEF0dHJpYnV0ZShwcm9wZXJ0eSkgfHwgdjtcclxuICB9LFxyXG4gICAgICBfZm9yRWFjaE5hbWUgPSBmdW5jdGlvbiBfZm9yRWFjaE5hbWUobmFtZXMsIGZ1bmMpIHtcclxuICAgIHJldHVybiAobmFtZXMgPSBuYW1lcy5zcGxpdChcIixcIikpLmZvckVhY2goZnVuYykgfHwgbmFtZXM7XHJcbiAgfSxcclxuICAgICAgX3JvdW5kID0gZnVuY3Rpb24gX3JvdW5kKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSAqIDEwMDAwMCkgLyAxMDAwMDAgfHwgMDtcclxuICB9LFxyXG4gICAgICBfcm91bmRQcmVjaXNlID0gZnVuY3Rpb24gX3JvdW5kUHJlY2lzZSh2YWx1ZSkge1xyXG4gICAgcmV0dXJuIE1hdGgucm91bmQodmFsdWUgKiAxMDAwMDAwMCkgLyAxMDAwMDAwMCB8fCAwO1xyXG4gIH0sXHJcbiAgICAgIF9wYXJzZVJlbGF0aXZlID0gZnVuY3Rpb24gX3BhcnNlUmVsYXRpdmUoc3RhcnQsIHZhbHVlKSB7XHJcbiAgICB2YXIgb3BlcmF0b3IgPSB2YWx1ZS5jaGFyQXQoMCksXHJcbiAgICAgICAgZW5kID0gcGFyc2VGbG9hdCh2YWx1ZS5zdWJzdHIoMikpO1xyXG4gICAgc3RhcnQgPSBwYXJzZUZsb2F0KHN0YXJ0KTtcclxuICAgIHJldHVybiBvcGVyYXRvciA9PT0gXCIrXCIgPyBzdGFydCArIGVuZCA6IG9wZXJhdG9yID09PSBcIi1cIiA/IHN0YXJ0IC0gZW5kIDogb3BlcmF0b3IgPT09IFwiKlwiID8gc3RhcnQgKiBlbmQgOiBzdGFydCAvIGVuZDtcclxuICB9LFxyXG4gICAgICBfYXJyYXlDb250YWluc0FueSA9IGZ1bmN0aW9uIF9hcnJheUNvbnRhaW5zQW55KHRvU2VhcmNoLCB0b0ZpbmQpIHtcclxuICAgIHZhciBsID0gdG9GaW5kLmxlbmd0aCxcclxuICAgICAgICBpID0gMDtcclxuXHJcbiAgICBmb3IgKDsgdG9TZWFyY2guaW5kZXhPZih0b0ZpbmRbaV0pIDwgMCAmJiArK2kgPCBsOykge31cclxuXHJcbiAgICByZXR1cm4gaSA8IGw7XHJcbiAgfSxcclxuICAgICAgX2xhenlSZW5kZXIgPSBmdW5jdGlvbiBfbGF6eVJlbmRlcigpIHtcclxuICAgIHZhciBsID0gX2xhenlUd2VlbnMubGVuZ3RoLFxyXG4gICAgICAgIGEgPSBfbGF6eVR3ZWVucy5zbGljZSgwKSxcclxuICAgICAgICBpLFxyXG4gICAgICAgIHR3ZWVuO1xyXG5cclxuICAgIF9sYXp5TG9va3VwID0ge307XHJcbiAgICBfbGF6eVR3ZWVucy5sZW5ndGggPSAwO1xyXG5cclxuICAgIGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcclxuICAgICAgdHdlZW4gPSBhW2ldO1xyXG4gICAgICB0d2VlbiAmJiB0d2Vlbi5fbGF6eSAmJiAodHdlZW4ucmVuZGVyKHR3ZWVuLl9sYXp5WzBdLCB0d2Vlbi5fbGF6eVsxXSwgdHJ1ZSkuX2xhenkgPSAwKTtcclxuICAgIH1cclxuICB9LFxyXG4gICAgICBfaXNSZXZlcnRXb3J0aHkgPSBmdW5jdGlvbiBfaXNSZXZlcnRXb3J0aHkoYW5pbWF0aW9uKSB7XHJcbiAgICByZXR1cm4gISEoYW5pbWF0aW9uLl9pbml0dGVkIHx8IGFuaW1hdGlvbi5fc3RhcnRBdCB8fCBhbmltYXRpb24uYWRkKTtcclxuICB9LFxyXG4gICAgICBfbGF6eVNhZmVSZW5kZXIgPSBmdW5jdGlvbiBfbGF6eVNhZmVSZW5kZXIoYW5pbWF0aW9uLCB0aW1lLCBzdXBwcmVzc0V2ZW50cywgZm9yY2UpIHtcclxuICAgIF9sYXp5VHdlZW5zLmxlbmd0aCAmJiAhX3JldmVydGluZyAmJiBfbGF6eVJlbmRlcigpO1xyXG4gICAgYW5pbWF0aW9uLnJlbmRlcih0aW1lLCBzdXBwcmVzc0V2ZW50cywgZm9yY2UgfHwgISEoX3JldmVydGluZyAmJiB0aW1lIDwgMCAmJiBfaXNSZXZlcnRXb3J0aHkoYW5pbWF0aW9uKSkpO1xyXG4gICAgX2xhenlUd2VlbnMubGVuZ3RoICYmICFfcmV2ZXJ0aW5nICYmIF9sYXp5UmVuZGVyKCk7XHJcbiAgfSxcclxuICAgICAgX251bWVyaWNJZlBvc3NpYmxlID0gZnVuY3Rpb24gX251bWVyaWNJZlBvc3NpYmxlKHZhbHVlKSB7XHJcbiAgICB2YXIgbiA9IHBhcnNlRmxvYXQodmFsdWUpO1xyXG4gICAgcmV0dXJuIChuIHx8IG4gPT09IDApICYmICh2YWx1ZSArIFwiXCIpLm1hdGNoKF9kZWxpbWl0ZWRWYWx1ZUV4cCkubGVuZ3RoIDwgMiA/IG4gOiBfaXNTdHJpbmcodmFsdWUpID8gdmFsdWUudHJpbSgpIDogdmFsdWU7XHJcbiAgfSxcclxuICAgICAgX3Bhc3NUaHJvdWdoID0gZnVuY3Rpb24gX3Bhc3NUaHJvdWdoKHApIHtcclxuICAgIHJldHVybiBwO1xyXG4gIH0sXHJcbiAgICAgIF9zZXREZWZhdWx0cyA9IGZ1bmN0aW9uIF9zZXREZWZhdWx0cyhvYmosIGRlZmF1bHRzKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIGRlZmF1bHRzKSB7XHJcbiAgICAgIHAgaW4gb2JqIHx8IChvYmpbcF0gPSBkZWZhdWx0c1twXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG9iajtcclxuICB9LFxyXG4gICAgICBfc2V0S2V5ZnJhbWVEZWZhdWx0cyA9IGZ1bmN0aW9uIF9zZXRLZXlmcmFtZURlZmF1bHRzKGV4Y2x1ZGVEdXJhdGlvbikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChvYmosIGRlZmF1bHRzKSB7XHJcbiAgICAgIGZvciAodmFyIHAgaW4gZGVmYXVsdHMpIHtcclxuICAgICAgICBwIGluIG9iaiB8fCBwID09PSBcImR1cmF0aW9uXCIgJiYgZXhjbHVkZUR1cmF0aW9uIHx8IHAgPT09IFwiZWFzZVwiIHx8IChvYmpbcF0gPSBkZWZhdWx0c1twXSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfSxcclxuICAgICAgX21lcmdlID0gZnVuY3Rpb24gX21lcmdlKGJhc2UsIHRvTWVyZ2UpIHtcclxuICAgIGZvciAodmFyIHAgaW4gdG9NZXJnZSkge1xyXG4gICAgICBiYXNlW3BdID0gdG9NZXJnZVtwXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYmFzZTtcclxuICB9LFxyXG4gICAgICBfbWVyZ2VEZWVwID0gZnVuY3Rpb24gX21lcmdlRGVlcChiYXNlLCB0b01lcmdlKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIHRvTWVyZ2UpIHtcclxuICAgICAgcCAhPT0gXCJfX3Byb3RvX19cIiAmJiBwICE9PSBcImNvbnN0cnVjdG9yXCIgJiYgcCAhPT0gXCJwcm90b3R5cGVcIiAmJiAoYmFzZVtwXSA9IF9pc09iamVjdCh0b01lcmdlW3BdKSA/IF9tZXJnZURlZXAoYmFzZVtwXSB8fCAoYmFzZVtwXSA9IHt9KSwgdG9NZXJnZVtwXSkgOiB0b01lcmdlW3BdKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYmFzZTtcclxuICB9LFxyXG4gICAgICBfY29weUV4Y2x1ZGluZyA9IGZ1bmN0aW9uIF9jb3B5RXhjbHVkaW5nKG9iaiwgZXhjbHVkaW5nKSB7XHJcbiAgICB2YXIgY29weSA9IHt9LFxyXG4gICAgICAgIHA7XHJcblxyXG4gICAgZm9yIChwIGluIG9iaikge1xyXG4gICAgICBwIGluIGV4Y2x1ZGluZyB8fCAoY29weVtwXSA9IG9ialtwXSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvcHk7XHJcbiAgfSxcclxuICAgICAgX2luaGVyaXREZWZhdWx0cyA9IGZ1bmN0aW9uIF9pbmhlcml0RGVmYXVsdHModmFycykge1xyXG4gICAgdmFyIHBhcmVudCA9IHZhcnMucGFyZW50IHx8IF9nbG9iYWxUaW1lbGluZSxcclxuICAgICAgICBmdW5jID0gdmFycy5rZXlmcmFtZXMgPyBfc2V0S2V5ZnJhbWVEZWZhdWx0cyhfaXNBcnJheSh2YXJzLmtleWZyYW1lcykpIDogX3NldERlZmF1bHRzO1xyXG5cclxuICAgIGlmIChfaXNOb3RGYWxzZSh2YXJzLmluaGVyaXQpKSB7XHJcbiAgICAgIHdoaWxlIChwYXJlbnQpIHtcclxuICAgICAgICBmdW5jKHZhcnMsIHBhcmVudC52YXJzLmRlZmF1bHRzKTtcclxuICAgICAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50IHx8IHBhcmVudC5fZHA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdmFycztcclxuICB9LFxyXG4gICAgICBfYXJyYXlzTWF0Y2ggPSBmdW5jdGlvbiBfYXJyYXlzTWF0Y2goYTEsIGEyKSB7XHJcbiAgICB2YXIgaSA9IGExLmxlbmd0aCxcclxuICAgICAgICBtYXRjaCA9IGkgPT09IGEyLmxlbmd0aDtcclxuXHJcbiAgICB3aGlsZSAobWF0Y2ggJiYgaS0tICYmIGExW2ldID09PSBhMltpXSkge31cclxuXHJcbiAgICByZXR1cm4gaSA8IDA7XHJcbiAgfSxcclxuICAgICAgX2FkZExpbmtlZExpc3RJdGVtID0gZnVuY3Rpb24gX2FkZExpbmtlZExpc3RJdGVtKHBhcmVudCwgY2hpbGQsIGZpcnN0UHJvcCwgbGFzdFByb3AsIHNvcnRCeSkge1xyXG4gICAgaWYgKGZpcnN0UHJvcCA9PT0gdm9pZCAwKSB7XHJcbiAgICAgIGZpcnN0UHJvcCA9IFwiX2ZpcnN0XCI7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGxhc3RQcm9wID09PSB2b2lkIDApIHtcclxuICAgICAgbGFzdFByb3AgPSBcIl9sYXN0XCI7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHByZXYgPSBwYXJlbnRbbGFzdFByb3BdLFxyXG4gICAgICAgIHQ7XHJcblxyXG4gICAgaWYgKHNvcnRCeSkge1xyXG4gICAgICB0ID0gY2hpbGRbc29ydEJ5XTtcclxuXHJcbiAgICAgIHdoaWxlIChwcmV2ICYmIHByZXZbc29ydEJ5XSA+IHQpIHtcclxuICAgICAgICBwcmV2ID0gcHJldi5fcHJldjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChwcmV2KSB7XHJcbiAgICAgIGNoaWxkLl9uZXh0ID0gcHJldi5fbmV4dDtcclxuICAgICAgcHJldi5fbmV4dCA9IGNoaWxkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2hpbGQuX25leHQgPSBwYXJlbnRbZmlyc3RQcm9wXTtcclxuICAgICAgcGFyZW50W2ZpcnN0UHJvcF0gPSBjaGlsZDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2hpbGQuX25leHQpIHtcclxuICAgICAgY2hpbGQuX25leHQuX3ByZXYgPSBjaGlsZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHBhcmVudFtsYXN0UHJvcF0gPSBjaGlsZDtcclxuICAgIH1cclxuXHJcbiAgICBjaGlsZC5fcHJldiA9IHByZXY7XHJcbiAgICBjaGlsZC5wYXJlbnQgPSBjaGlsZC5fZHAgPSBwYXJlbnQ7XHJcbiAgICByZXR1cm4gY2hpbGQ7XHJcbiAgfSxcclxuICAgICAgX3JlbW92ZUxpbmtlZExpc3RJdGVtID0gZnVuY3Rpb24gX3JlbW92ZUxpbmtlZExpc3RJdGVtKHBhcmVudCwgY2hpbGQsIGZpcnN0UHJvcCwgbGFzdFByb3ApIHtcclxuICAgIGlmIChmaXJzdFByb3AgPT09IHZvaWQgMCkge1xyXG4gICAgICBmaXJzdFByb3AgPSBcIl9maXJzdFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChsYXN0UHJvcCA9PT0gdm9pZCAwKSB7XHJcbiAgICAgIGxhc3RQcm9wID0gXCJfbGFzdFwiO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBwcmV2ID0gY2hpbGQuX3ByZXYsXHJcbiAgICAgICAgbmV4dCA9IGNoaWxkLl9uZXh0O1xyXG5cclxuICAgIGlmIChwcmV2KSB7XHJcbiAgICAgIHByZXYuX25leHQgPSBuZXh0O1xyXG4gICAgfSBlbHNlIGlmIChwYXJlbnRbZmlyc3RQcm9wXSA9PT0gY2hpbGQpIHtcclxuICAgICAgcGFyZW50W2ZpcnN0UHJvcF0gPSBuZXh0O1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChuZXh0KSB7XHJcbiAgICAgIG5leHQuX3ByZXYgPSBwcmV2O1xyXG4gICAgfSBlbHNlIGlmIChwYXJlbnRbbGFzdFByb3BdID09PSBjaGlsZCkge1xyXG4gICAgICBwYXJlbnRbbGFzdFByb3BdID0gcHJldjtcclxuICAgIH1cclxuXHJcbiAgICBjaGlsZC5fbmV4dCA9IGNoaWxkLl9wcmV2ID0gY2hpbGQucGFyZW50ID0gbnVsbDtcclxuICB9LFxyXG4gICAgICBfcmVtb3ZlRnJvbVBhcmVudCA9IGZ1bmN0aW9uIF9yZW1vdmVGcm9tUGFyZW50KGNoaWxkLCBvbmx5SWZQYXJlbnRIYXNBdXRvUmVtb3ZlKSB7XHJcbiAgICBjaGlsZC5wYXJlbnQgJiYgKCFvbmx5SWZQYXJlbnRIYXNBdXRvUmVtb3ZlIHx8IGNoaWxkLnBhcmVudC5hdXRvUmVtb3ZlQ2hpbGRyZW4pICYmIGNoaWxkLnBhcmVudC5yZW1vdmUgJiYgY2hpbGQucGFyZW50LnJlbW92ZShjaGlsZCk7XHJcbiAgICBjaGlsZC5fYWN0ID0gMDtcclxuICB9LFxyXG4gICAgICBfdW5jYWNoZSA9IGZ1bmN0aW9uIF91bmNhY2hlKGFuaW1hdGlvbiwgY2hpbGQpIHtcclxuICAgIGlmIChhbmltYXRpb24gJiYgKCFjaGlsZCB8fCBjaGlsZC5fZW5kID4gYW5pbWF0aW9uLl9kdXIgfHwgY2hpbGQuX3N0YXJ0IDwgMCkpIHtcclxuICAgICAgdmFyIGEgPSBhbmltYXRpb247XHJcblxyXG4gICAgICB3aGlsZSAoYSkge1xyXG4gICAgICAgIGEuX2RpcnR5ID0gMTtcclxuICAgICAgICBhID0gYS5wYXJlbnQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYW5pbWF0aW9uO1xyXG4gIH0sXHJcbiAgICAgIF9yZWNhY2hlQW5jZXN0b3JzID0gZnVuY3Rpb24gX3JlY2FjaGVBbmNlc3RvcnMoYW5pbWF0aW9uKSB7XHJcbiAgICB2YXIgcGFyZW50ID0gYW5pbWF0aW9uLnBhcmVudDtcclxuXHJcbiAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudC5wYXJlbnQpIHtcclxuICAgICAgcGFyZW50Ll9kaXJ0eSA9IDE7XHJcbiAgICAgIHBhcmVudC50b3RhbER1cmF0aW9uKCk7XHJcbiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFuaW1hdGlvbjtcclxuICB9LFxyXG4gICAgICBfcmV3aW5kU3RhcnRBdCA9IGZ1bmN0aW9uIF9yZXdpbmRTdGFydEF0KHR3ZWVuLCB0b3RhbFRpbWUsIHN1cHByZXNzRXZlbnRzLCBmb3JjZSkge1xyXG4gICAgcmV0dXJuIHR3ZWVuLl9zdGFydEF0ICYmIChfcmV2ZXJ0aW5nID8gdHdlZW4uX3N0YXJ0QXQucmV2ZXJ0KF9yZXZlcnRDb25maWdOb0tpbGwpIDogdHdlZW4udmFycy5pbW1lZGlhdGVSZW5kZXIgJiYgIXR3ZWVuLnZhcnMuYXV0b1JldmVydCB8fCB0d2Vlbi5fc3RhcnRBdC5yZW5kZXIodG90YWxUaW1lLCB0cnVlLCBmb3JjZSkpO1xyXG4gIH0sXHJcbiAgICAgIF9oYXNOb1BhdXNlZEFuY2VzdG9ycyA9IGZ1bmN0aW9uIF9oYXNOb1BhdXNlZEFuY2VzdG9ycyhhbmltYXRpb24pIHtcclxuICAgIHJldHVybiAhYW5pbWF0aW9uIHx8IGFuaW1hdGlvbi5fdHMgJiYgX2hhc05vUGF1c2VkQW5jZXN0b3JzKGFuaW1hdGlvbi5wYXJlbnQpO1xyXG4gIH0sXHJcbiAgICAgIF9lbGFwc2VkQ3ljbGVEdXJhdGlvbiA9IGZ1bmN0aW9uIF9lbGFwc2VkQ3ljbGVEdXJhdGlvbihhbmltYXRpb24pIHtcclxuICAgIHJldHVybiBhbmltYXRpb24uX3JlcGVhdCA/IF9hbmltYXRpb25DeWNsZShhbmltYXRpb24uX3RUaW1lLCBhbmltYXRpb24gPSBhbmltYXRpb24uZHVyYXRpb24oKSArIGFuaW1hdGlvbi5fckRlbGF5KSAqIGFuaW1hdGlvbiA6IDA7XHJcbiAgfSxcclxuICAgICAgX2FuaW1hdGlvbkN5Y2xlID0gZnVuY3Rpb24gX2FuaW1hdGlvbkN5Y2xlKHRUaW1lLCBjeWNsZUR1cmF0aW9uKSB7XHJcbiAgICB2YXIgd2hvbGUgPSBNYXRoLmZsb29yKHRUaW1lID0gX3JvdW5kUHJlY2lzZSh0VGltZSAvIGN5Y2xlRHVyYXRpb24pKTtcclxuICAgIHJldHVybiB0VGltZSAmJiB3aG9sZSA9PT0gdFRpbWUgPyB3aG9sZSAtIDEgOiB3aG9sZTtcclxuICB9LFxyXG4gICAgICBfcGFyZW50VG9DaGlsZFRvdGFsVGltZSA9IGZ1bmN0aW9uIF9wYXJlbnRUb0NoaWxkVG90YWxUaW1lKHBhcmVudFRpbWUsIGNoaWxkKSB7XHJcbiAgICByZXR1cm4gKHBhcmVudFRpbWUgLSBjaGlsZC5fc3RhcnQpICogY2hpbGQuX3RzICsgKGNoaWxkLl90cyA+PSAwID8gMCA6IGNoaWxkLl9kaXJ0eSA/IGNoaWxkLnRvdGFsRHVyYXRpb24oKSA6IGNoaWxkLl90RHVyKTtcclxuICB9LFxyXG4gICAgICBfc2V0RW5kID0gZnVuY3Rpb24gX3NldEVuZChhbmltYXRpb24pIHtcclxuICAgIHJldHVybiBhbmltYXRpb24uX2VuZCA9IF9yb3VuZFByZWNpc2UoYW5pbWF0aW9uLl9zdGFydCArIChhbmltYXRpb24uX3REdXIgLyBNYXRoLmFicyhhbmltYXRpb24uX3RzIHx8IGFuaW1hdGlvbi5fcnRzIHx8IF90aW55TnVtKSB8fCAwKSk7XHJcbiAgfSxcclxuICAgICAgX2FsaWduUGxheWhlYWQgPSBmdW5jdGlvbiBfYWxpZ25QbGF5aGVhZChhbmltYXRpb24sIHRvdGFsVGltZSkge1xyXG4gICAgdmFyIHBhcmVudCA9IGFuaW1hdGlvbi5fZHA7XHJcblxyXG4gICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuc21vb3RoQ2hpbGRUaW1pbmcgJiYgYW5pbWF0aW9uLl90cykge1xyXG4gICAgICBhbmltYXRpb24uX3N0YXJ0ID0gX3JvdW5kUHJlY2lzZShwYXJlbnQuX3RpbWUgLSAoYW5pbWF0aW9uLl90cyA+IDAgPyB0b3RhbFRpbWUgLyBhbmltYXRpb24uX3RzIDogKChhbmltYXRpb24uX2RpcnR5ID8gYW5pbWF0aW9uLnRvdGFsRHVyYXRpb24oKSA6IGFuaW1hdGlvbi5fdER1cikgLSB0b3RhbFRpbWUpIC8gLWFuaW1hdGlvbi5fdHMpKTtcclxuXHJcbiAgICAgIF9zZXRFbmQoYW5pbWF0aW9uKTtcclxuXHJcbiAgICAgIHBhcmVudC5fZGlydHkgfHwgX3VuY2FjaGUocGFyZW50LCBhbmltYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhbmltYXRpb247XHJcbiAgfSxcclxuICAgICAgX3Bvc3RBZGRDaGVja3MgPSBmdW5jdGlvbiBfcG9zdEFkZENoZWNrcyh0aW1lbGluZSwgY2hpbGQpIHtcclxuICAgIHZhciB0O1xyXG5cclxuICAgIGlmIChjaGlsZC5fdGltZSB8fCAhY2hpbGQuX2R1ciAmJiBjaGlsZC5faW5pdHRlZCB8fCBjaGlsZC5fc3RhcnQgPCB0aW1lbGluZS5fdGltZSAmJiAoY2hpbGQuX2R1ciB8fCAhY2hpbGQuYWRkKSkge1xyXG4gICAgICB0ID0gX3BhcmVudFRvQ2hpbGRUb3RhbFRpbWUodGltZWxpbmUucmF3VGltZSgpLCBjaGlsZCk7XHJcblxyXG4gICAgICBpZiAoIWNoaWxkLl9kdXIgfHwgX2NsYW1wKDAsIGNoaWxkLnRvdGFsRHVyYXRpb24oKSwgdCkgLSBjaGlsZC5fdFRpbWUgPiBfdGlueU51bSkge1xyXG4gICAgICAgIGNoaWxkLnJlbmRlcih0LCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChfdW5jYWNoZSh0aW1lbGluZSwgY2hpbGQpLl9kcCAmJiB0aW1lbGluZS5faW5pdHRlZCAmJiB0aW1lbGluZS5fdGltZSA+PSB0aW1lbGluZS5fZHVyICYmIHRpbWVsaW5lLl90cykge1xyXG4gICAgICBpZiAodGltZWxpbmUuX2R1ciA8IHRpbWVsaW5lLmR1cmF0aW9uKCkpIHtcclxuICAgICAgICB0ID0gdGltZWxpbmU7XHJcblxyXG4gICAgICAgIHdoaWxlICh0Ll9kcCkge1xyXG4gICAgICAgICAgdC5yYXdUaW1lKCkgPj0gMCAmJiB0LnRvdGFsVGltZSh0Ll90VGltZSk7XHJcbiAgICAgICAgICB0ID0gdC5fZHA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aW1lbGluZS5felRpbWUgPSAtX3RpbnlOdW07XHJcbiAgICB9XHJcbiAgfSxcclxuICAgICAgX2FkZFRvVGltZWxpbmUgPSBmdW5jdGlvbiBfYWRkVG9UaW1lbGluZSh0aW1lbGluZSwgY2hpbGQsIHBvc2l0aW9uLCBza2lwQ2hlY2tzKSB7XHJcbiAgICBjaGlsZC5wYXJlbnQgJiYgX3JlbW92ZUZyb21QYXJlbnQoY2hpbGQpO1xyXG4gICAgY2hpbGQuX3N0YXJ0ID0gX3JvdW5kUHJlY2lzZSgoX2lzTnVtYmVyKHBvc2l0aW9uKSA/IHBvc2l0aW9uIDogcG9zaXRpb24gfHwgdGltZWxpbmUgIT09IF9nbG9iYWxUaW1lbGluZSA/IF9wYXJzZVBvc2l0aW9uKHRpbWVsaW5lLCBwb3NpdGlvbiwgY2hpbGQpIDogdGltZWxpbmUuX3RpbWUpICsgY2hpbGQuX2RlbGF5KTtcclxuICAgIGNoaWxkLl9lbmQgPSBfcm91bmRQcmVjaXNlKGNoaWxkLl9zdGFydCArIChjaGlsZC50b3RhbER1cmF0aW9uKCkgLyBNYXRoLmFicyhjaGlsZC50aW1lU2NhbGUoKSkgfHwgMCkpO1xyXG5cclxuICAgIF9hZGRMaW5rZWRMaXN0SXRlbSh0aW1lbGluZSwgY2hpbGQsIFwiX2ZpcnN0XCIsIFwiX2xhc3RcIiwgdGltZWxpbmUuX3NvcnQgPyBcIl9zdGFydFwiIDogMCk7XHJcblxyXG4gICAgX2lzRnJvbU9yRnJvbVN0YXJ0KGNoaWxkKSB8fCAodGltZWxpbmUuX3JlY2VudCA9IGNoaWxkKTtcclxuICAgIHNraXBDaGVja3MgfHwgX3Bvc3RBZGRDaGVja3ModGltZWxpbmUsIGNoaWxkKTtcclxuICAgIHRpbWVsaW5lLl90cyA8IDAgJiYgX2FsaWduUGxheWhlYWQodGltZWxpbmUsIHRpbWVsaW5lLl90VGltZSk7XHJcbiAgICByZXR1cm4gdGltZWxpbmU7XHJcbiAgfSxcclxuICAgICAgX3Njcm9sbFRyaWdnZXIgPSBmdW5jdGlvbiBfc2Nyb2xsVHJpZ2dlcihhbmltYXRpb24sIHRyaWdnZXIpIHtcclxuICAgIHJldHVybiAoX2dsb2JhbHMuU2Nyb2xsVHJpZ2dlciB8fCBfbWlzc2luZ1BsdWdpbihcInNjcm9sbFRyaWdnZXJcIiwgdHJpZ2dlcikpICYmIF9nbG9iYWxzLlNjcm9sbFRyaWdnZXIuY3JlYXRlKHRyaWdnZXIsIGFuaW1hdGlvbik7XHJcbiAgfSxcclxuICAgICAgX2F0dGVtcHRJbml0VHdlZW4gPSBmdW5jdGlvbiBfYXR0ZW1wdEluaXRUd2Vlbih0d2VlbiwgdGltZSwgZm9yY2UsIHN1cHByZXNzRXZlbnRzLCB0VGltZSkge1xyXG4gICAgX2luaXRUd2Vlbih0d2VlbiwgdGltZSwgdFRpbWUpO1xyXG5cclxuICAgIGlmICghdHdlZW4uX2luaXR0ZWQpIHtcclxuICAgICAgcmV0dXJuIDE7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFmb3JjZSAmJiB0d2Vlbi5fcHQgJiYgIV9yZXZlcnRpbmcgJiYgKHR3ZWVuLl9kdXIgJiYgdHdlZW4udmFycy5sYXp5ICE9PSBmYWxzZSB8fCAhdHdlZW4uX2R1ciAmJiB0d2Vlbi52YXJzLmxhenkpICYmIF9sYXN0UmVuZGVyZWRGcmFtZSAhPT0gX3RpY2tlci5mcmFtZSkge1xyXG4gICAgICBfbGF6eVR3ZWVucy5wdXNoKHR3ZWVuKTtcclxuXHJcbiAgICAgIHR3ZWVuLl9sYXp5ID0gW3RUaW1lLCBzdXBwcmVzc0V2ZW50c107XHJcbiAgICAgIHJldHVybiAxO1xyXG4gICAgfVxyXG4gIH0sXHJcbiAgICAgIF9wYXJlbnRQbGF5aGVhZElzQmVmb3JlU3RhcnQgPSBmdW5jdGlvbiBfcGFyZW50UGxheWhlYWRJc0JlZm9yZVN0YXJ0KF9yZWYpIHtcclxuICAgIHZhciBwYXJlbnQgPSBfcmVmLnBhcmVudDtcclxuICAgIHJldHVybiBwYXJlbnQgJiYgcGFyZW50Ll90cyAmJiBwYXJlbnQuX2luaXR0ZWQgJiYgIXBhcmVudC5fbG9jayAmJiAocGFyZW50LnJhd1RpbWUoKSA8IDAgfHwgX3BhcmVudFBsYXloZWFkSXNCZWZvcmVTdGFydChwYXJlbnQpKTtcclxuICB9LFxyXG4gICAgICBfaXNGcm9tT3JGcm9tU3RhcnQgPSBmdW5jdGlvbiBfaXNGcm9tT3JGcm9tU3RhcnQoX3JlZjIpIHtcclxuICAgIHZhciBkYXRhID0gX3JlZjIuZGF0YTtcclxuICAgIHJldHVybiBkYXRhID09PSBcImlzRnJvbVN0YXJ0XCIgfHwgZGF0YSA9PT0gXCJpc1N0YXJ0XCI7XHJcbiAgfSxcclxuICAgICAgX3JlbmRlclplcm9EdXJhdGlvblR3ZWVuID0gZnVuY3Rpb24gX3JlbmRlclplcm9EdXJhdGlvblR3ZWVuKHR3ZWVuLCB0b3RhbFRpbWUsIHN1cHByZXNzRXZlbnRzLCBmb3JjZSkge1xyXG4gICAgdmFyIHByZXZSYXRpbyA9IHR3ZWVuLnJhdGlvLFxyXG4gICAgICAgIHJhdGlvID0gdG90YWxUaW1lIDwgMCB8fCAhdG90YWxUaW1lICYmICghdHdlZW4uX3N0YXJ0ICYmIF9wYXJlbnRQbGF5aGVhZElzQmVmb3JlU3RhcnQodHdlZW4pICYmICEoIXR3ZWVuLl9pbml0dGVkICYmIF9pc0Zyb21PckZyb21TdGFydCh0d2VlbikpIHx8ICh0d2Vlbi5fdHMgPCAwIHx8IHR3ZWVuLl9kcC5fdHMgPCAwKSAmJiAhX2lzRnJvbU9yRnJvbVN0YXJ0KHR3ZWVuKSkgPyAwIDogMSxcclxuICAgICAgICByZXBlYXREZWxheSA9IHR3ZWVuLl9yRGVsYXksXHJcbiAgICAgICAgdFRpbWUgPSAwLFxyXG4gICAgICAgIHB0LFxyXG4gICAgICAgIGl0ZXJhdGlvbixcclxuICAgICAgICBwcmV2SXRlcmF0aW9uO1xyXG5cclxuICAgIGlmIChyZXBlYXREZWxheSAmJiB0d2Vlbi5fcmVwZWF0KSB7XHJcbiAgICAgIHRUaW1lID0gX2NsYW1wKDAsIHR3ZWVuLl90RHVyLCB0b3RhbFRpbWUpO1xyXG4gICAgICBpdGVyYXRpb24gPSBfYW5pbWF0aW9uQ3ljbGUodFRpbWUsIHJlcGVhdERlbGF5KTtcclxuICAgICAgdHdlZW4uX3lveW8gJiYgaXRlcmF0aW9uICYgMSAmJiAocmF0aW8gPSAxIC0gcmF0aW8pO1xyXG5cclxuICAgICAgaWYgKGl0ZXJhdGlvbiAhPT0gX2FuaW1hdGlvbkN5Y2xlKHR3ZWVuLl90VGltZSwgcmVwZWF0RGVsYXkpKSB7XHJcbiAgICAgICAgcHJldlJhdGlvID0gMSAtIHJhdGlvO1xyXG4gICAgICAgIHR3ZWVuLnZhcnMucmVwZWF0UmVmcmVzaCAmJiB0d2Vlbi5faW5pdHRlZCAmJiB0d2Vlbi5pbnZhbGlkYXRlKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAocmF0aW8gIT09IHByZXZSYXRpbyB8fCBfcmV2ZXJ0aW5nIHx8IGZvcmNlIHx8IHR3ZWVuLl96VGltZSA9PT0gX3RpbnlOdW0gfHwgIXRvdGFsVGltZSAmJiB0d2Vlbi5felRpbWUpIHtcclxuICAgICAgaWYgKCF0d2Vlbi5faW5pdHRlZCAmJiBfYXR0ZW1wdEluaXRUd2Vlbih0d2VlbiwgdG90YWxUaW1lLCBmb3JjZSwgc3VwcHJlc3NFdmVudHMsIHRUaW1lKSkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgcHJldkl0ZXJhdGlvbiA9IHR3ZWVuLl96VGltZTtcclxuICAgICAgdHdlZW4uX3pUaW1lID0gdG90YWxUaW1lIHx8IChzdXBwcmVzc0V2ZW50cyA/IF90aW55TnVtIDogMCk7XHJcbiAgICAgIHN1cHByZXNzRXZlbnRzIHx8IChzdXBwcmVzc0V2ZW50cyA9IHRvdGFsVGltZSAmJiAhcHJldkl0ZXJhdGlvbik7XHJcbiAgICAgIHR3ZWVuLnJhdGlvID0gcmF0aW87XHJcbiAgICAgIHR3ZWVuLl9mcm9tICYmIChyYXRpbyA9IDEgLSByYXRpbyk7XHJcbiAgICAgIHR3ZWVuLl90aW1lID0gMDtcclxuICAgICAgdHdlZW4uX3RUaW1lID0gdFRpbWU7XHJcbiAgICAgIHB0ID0gdHdlZW4uX3B0O1xyXG5cclxuICAgICAgd2hpbGUgKHB0KSB7XHJcbiAgICAgICAgcHQucihyYXRpbywgcHQuZCk7XHJcbiAgICAgICAgcHQgPSBwdC5fbmV4dDtcclxuICAgICAgfVxyXG5cclxuICAgICAgdG90YWxUaW1lIDwgMCAmJiBfcmV3aW5kU3RhcnRBdCh0d2VlbiwgdG90YWxUaW1lLCBzdXBwcmVzc0V2ZW50cywgdHJ1ZSk7XHJcbiAgICAgIHR3ZWVuLl9vblVwZGF0ZSAmJiAhc3VwcHJlc3NFdmVudHMgJiYgX2NhbGxiYWNrKHR3ZWVuLCBcIm9uVXBkYXRlXCIpO1xyXG4gICAgICB0VGltZSAmJiB0d2Vlbi5fcmVwZWF0ICYmICFzdXBwcmVzc0V2ZW50cyAmJiB0d2Vlbi5wYXJlbnQgJiYgX2NhbGxiYWNrKHR3ZWVuLCBcIm9uUmVwZWF0XCIpO1xyXG5cclxuICAgICAgaWYgKCh0b3RhbFRpbWUgPj0gdHdlZW4uX3REdXIgfHwgdG90YWxUaW1lIDwgMCkgJiYgdHdlZW4ucmF0aW8gPT09IHJhdGlvKSB7XHJcbiAgICAgICAgcmF0aW8gJiYgX3JlbW92ZUZyb21QYXJlbnQodHdlZW4sIDEpO1xyXG5cclxuICAgICAgICBpZiAoIXN1cHByZXNzRXZlbnRzICYmICFfcmV2ZXJ0aW5nKSB7XHJcbiAgICAgICAgICBfY2FsbGJhY2sodHdlZW4sIHJhdGlvID8gXCJvbkNvbXBsZXRlXCIgOiBcIm9uUmV2ZXJzZUNvbXBsZXRlXCIsIHRydWUpO1xyXG5cclxuICAgICAgICAgIHR3ZWVuLl9wcm9tICYmIHR3ZWVuLl9wcm9tKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKCF0d2Vlbi5felRpbWUpIHtcclxuICAgICAgdHdlZW4uX3pUaW1lID0gdG90YWxUaW1lO1xyXG4gICAgfVxyXG4gIH0sXHJcbiAgICAgIF9maW5kTmV4dFBhdXNlVHdlZW4gPSBmdW5jdGlvbiBfZmluZE5leHRQYXVzZVR3ZWVuKGFuaW1hdGlvbiwgcHJldlRpbWUsIHRpbWUpIHtcclxuICAgIHZhciBjaGlsZDtcclxuXHJcbiAgICBpZiAodGltZSA+IHByZXZUaW1lKSB7XHJcbiAgICAgIGNoaWxkID0gYW5pbWF0aW9uLl9maXJzdDtcclxuXHJcbiAgICAgIHdoaWxlIChjaGlsZCAmJiBjaGlsZC5fc3RhcnQgPD0gdGltZSkge1xyXG4gICAgICAgIGlmIChjaGlsZC5kYXRhID09PSBcImlzUGF1c2VcIiAmJiBjaGlsZC5fc3RhcnQgPiBwcmV2VGltZSkge1xyXG4gICAgICAgICAgcmV0dXJuIGNoaWxkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2hpbGQgPSBjaGlsZC5fbmV4dDtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY2hpbGQgPSBhbmltYXRpb24uX2xhc3Q7XHJcblxyXG4gICAgICB3aGlsZSAoY2hpbGQgJiYgY2hpbGQuX3N0YXJ0ID49IHRpbWUpIHtcclxuICAgICAgICBpZiAoY2hpbGQuZGF0YSA9PT0gXCJpc1BhdXNlXCIgJiYgY2hpbGQuX3N0YXJ0IDwgcHJldlRpbWUpIHtcclxuICAgICAgICAgIHJldHVybiBjaGlsZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNoaWxkID0gY2hpbGQuX3ByZXY7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9LFxyXG4gICAgICBfc2V0RHVyYXRpb24gPSBmdW5jdGlvbiBfc2V0RHVyYXRpb24oYW5pbWF0aW9uLCBkdXJhdGlvbiwgc2tpcFVuY2FjaGUsIGxlYXZlUGxheWhlYWQpIHtcclxuICAgIHZhciByZXBlYXQgPSBhbmltYXRpb24uX3JlcGVhdCxcclxuICAgICAgICBkdXIgPSBfcm91bmRQcmVjaXNlKGR1cmF0aW9uKSB8fCAwLFxyXG4gICAgICAgIHRvdGFsUHJvZ3Jlc3MgPSBhbmltYXRpb24uX3RUaW1lIC8gYW5pbWF0aW9uLl90RHVyO1xyXG4gICAgdG90YWxQcm9ncmVzcyAmJiAhbGVhdmVQbGF5aGVhZCAmJiAoYW5pbWF0aW9uLl90aW1lICo9IGR1ciAvIGFuaW1hdGlvbi5fZHVyKTtcclxuICAgIGFuaW1hdGlvbi5fZHVyID0gZHVyO1xyXG4gICAgYW5pbWF0aW9uLl90RHVyID0gIXJlcGVhdCA/IGR1ciA6IHJlcGVhdCA8IDAgPyAxZTEwIDogX3JvdW5kUHJlY2lzZShkdXIgKiAocmVwZWF0ICsgMSkgKyBhbmltYXRpb24uX3JEZWxheSAqIHJlcGVhdCk7XHJcbiAgICB0b3RhbFByb2dyZXNzID4gMCAmJiAhbGVhdmVQbGF5aGVhZCAmJiBfYWxpZ25QbGF5aGVhZChhbmltYXRpb24sIGFuaW1hdGlvbi5fdFRpbWUgPSBhbmltYXRpb24uX3REdXIgKiB0b3RhbFByb2dyZXNzKTtcclxuICAgIGFuaW1hdGlvbi5wYXJlbnQgJiYgX3NldEVuZChhbmltYXRpb24pO1xyXG4gICAgc2tpcFVuY2FjaGUgfHwgX3VuY2FjaGUoYW5pbWF0aW9uLnBhcmVudCwgYW5pbWF0aW9uKTtcclxuICAgIHJldHVybiBhbmltYXRpb247XHJcbiAgfSxcclxuICAgICAgX29uVXBkYXRlVG90YWxEdXJhdGlvbiA9IGZ1bmN0aW9uIF9vblVwZGF0ZVRvdGFsRHVyYXRpb24oYW5pbWF0aW9uKSB7XHJcbiAgICByZXR1cm4gYW5pbWF0aW9uIGluc3RhbmNlb2YgVGltZWxpbmUgPyBfdW5jYWNoZShhbmltYXRpb24pIDogX3NldER1cmF0aW9uKGFuaW1hdGlvbiwgYW5pbWF0aW9uLl9kdXIpO1xyXG4gIH0sXHJcbiAgICAgIF96ZXJvUG9zaXRpb24gPSB7XHJcbiAgICBfc3RhcnQ6IDAsXHJcbiAgICBlbmRUaW1lOiBfZW1wdHlGdW5jLFxyXG4gICAgdG90YWxEdXJhdGlvbjogX2VtcHR5RnVuY1xyXG4gIH0sXHJcbiAgICAgIF9wYXJzZVBvc2l0aW9uID0gZnVuY3Rpb24gX3BhcnNlUG9zaXRpb24oYW5pbWF0aW9uLCBwb3NpdGlvbiwgcGVyY2VudEFuaW1hdGlvbikge1xyXG4gICAgdmFyIGxhYmVscyA9IGFuaW1hdGlvbi5sYWJlbHMsXHJcbiAgICAgICAgcmVjZW50ID0gYW5pbWF0aW9uLl9yZWNlbnQgfHwgX3plcm9Qb3NpdGlvbixcclxuICAgICAgICBjbGlwcGVkRHVyYXRpb24gPSBhbmltYXRpb24uZHVyYXRpb24oKSA+PSBfYmlnTnVtID8gcmVjZW50LmVuZFRpbWUoZmFsc2UpIDogYW5pbWF0aW9uLl9kdXIsXHJcbiAgICAgICAgaSxcclxuICAgICAgICBvZmZzZXQsXHJcbiAgICAgICAgaXNQZXJjZW50O1xyXG5cclxuICAgIGlmIChfaXNTdHJpbmcocG9zaXRpb24pICYmIChpc05hTihwb3NpdGlvbikgfHwgcG9zaXRpb24gaW4gbGFiZWxzKSkge1xyXG4gICAgICBvZmZzZXQgPSBwb3NpdGlvbi5jaGFyQXQoMCk7XHJcbiAgICAgIGlzUGVyY2VudCA9IHBvc2l0aW9uLnN1YnN0cigtMSkgPT09IFwiJVwiO1xyXG4gICAgICBpID0gcG9zaXRpb24uaW5kZXhPZihcIj1cIik7XHJcblxyXG4gICAgICBpZiAob2Zmc2V0ID09PSBcIjxcIiB8fCBvZmZzZXQgPT09IFwiPlwiKSB7XHJcbiAgICAgICAgaSA+PSAwICYmIChwb3NpdGlvbiA9IHBvc2l0aW9uLnJlcGxhY2UoLz0vLCBcIlwiKSk7XHJcbiAgICAgICAgcmV0dXJuIChvZmZzZXQgPT09IFwiPFwiID8gcmVjZW50Ll9zdGFydCA6IHJlY2VudC5lbmRUaW1lKHJlY2VudC5fcmVwZWF0ID49IDApKSArIChwYXJzZUZsb2F0KHBvc2l0aW9uLnN1YnN0cigxKSkgfHwgMCkgKiAoaXNQZXJjZW50ID8gKGkgPCAwID8gcmVjZW50IDogcGVyY2VudEFuaW1hdGlvbikudG90YWxEdXJhdGlvbigpIC8gMTAwIDogMSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChpIDwgMCkge1xyXG4gICAgICAgIHBvc2l0aW9uIGluIGxhYmVscyB8fCAobGFiZWxzW3Bvc2l0aW9uXSA9IGNsaXBwZWREdXJhdGlvbik7XHJcbiAgICAgICAgcmV0dXJuIGxhYmVsc1twb3NpdGlvbl07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIG9mZnNldCA9IHBhcnNlRmxvYXQocG9zaXRpb24uY2hhckF0KGkgLSAxKSArIHBvc2l0aW9uLnN1YnN0cihpICsgMSkpO1xyXG5cclxuICAgICAgaWYgKGlzUGVyY2VudCAmJiBwZXJjZW50QW5pbWF0aW9uKSB7XHJcbiAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IC8gMTAwICogKF9pc0FycmF5KHBlcmNlbnRBbmltYXRpb24pID8gcGVyY2VudEFuaW1hdGlvblswXSA6IHBlcmNlbnRBbmltYXRpb24pLnRvdGFsRHVyYXRpb24oKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGkgPiAxID8gX3BhcnNlUG9zaXRpb24oYW5pbWF0aW9uLCBwb3NpdGlvbi5zdWJzdHIoMCwgaSAtIDEpLCBwZXJjZW50QW5pbWF0aW9uKSArIG9mZnNldCA6IGNsaXBwZWREdXJhdGlvbiArIG9mZnNldDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcG9zaXRpb24gPT0gbnVsbCA/IGNsaXBwZWREdXJhdGlvbiA6ICtwb3NpdGlvbjtcclxuICB9LFxyXG4gICAgICBfY3JlYXRlVHdlZW5UeXBlID0gZnVuY3Rpb24gX2NyZWF0ZVR3ZWVuVHlwZSh0eXBlLCBwYXJhbXMsIHRpbWVsaW5lKSB7XHJcbiAgICB2YXIgaXNMZWdhY3kgPSBfaXNOdW1iZXIocGFyYW1zWzFdKSxcclxuICAgICAgICB2YXJzSW5kZXggPSAoaXNMZWdhY3kgPyAyIDogMSkgKyAodHlwZSA8IDIgPyAwIDogMSksXHJcbiAgICAgICAgdmFycyA9IHBhcmFtc1t2YXJzSW5kZXhdLFxyXG4gICAgICAgIGlyVmFycyxcclxuICAgICAgICBwYXJlbnQ7XHJcblxyXG4gICAgaXNMZWdhY3kgJiYgKHZhcnMuZHVyYXRpb24gPSBwYXJhbXNbMV0pO1xyXG4gICAgdmFycy5wYXJlbnQgPSB0aW1lbGluZTtcclxuXHJcbiAgICBpZiAodHlwZSkge1xyXG4gICAgICBpclZhcnMgPSB2YXJzO1xyXG4gICAgICBwYXJlbnQgPSB0aW1lbGluZTtcclxuXHJcbiAgICAgIHdoaWxlIChwYXJlbnQgJiYgIShcImltbWVkaWF0ZVJlbmRlclwiIGluIGlyVmFycykpIHtcclxuICAgICAgICBpclZhcnMgPSBwYXJlbnQudmFycy5kZWZhdWx0cyB8fCB7fTtcclxuICAgICAgICBwYXJlbnQgPSBfaXNOb3RGYWxzZShwYXJlbnQudmFycy5pbmhlcml0KSAmJiBwYXJlbnQucGFyZW50O1xyXG4gICAgICB9XHJcblxyXG4gICAgICB2YXJzLmltbWVkaWF0ZVJlbmRlciA9IF9pc05vdEZhbHNlKGlyVmFycy5pbW1lZGlhdGVSZW5kZXIpO1xyXG4gICAgICB0eXBlIDwgMiA/IHZhcnMucnVuQmFja3dhcmRzID0gMSA6IHZhcnMuc3RhcnRBdCA9IHBhcmFtc1t2YXJzSW5kZXggLSAxXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IFR3ZWVuKHBhcmFtc1swXSwgdmFycywgcGFyYW1zW3ZhcnNJbmRleCArIDFdKTtcclxuICB9LFxyXG4gICAgICBfY29uZGl0aW9uYWxSZXR1cm4gPSBmdW5jdGlvbiBfY29uZGl0aW9uYWxSZXR1cm4odmFsdWUsIGZ1bmMpIHtcclxuICAgIHJldHVybiB2YWx1ZSB8fCB2YWx1ZSA9PT0gMCA/IGZ1bmModmFsdWUpIDogZnVuYztcclxuICB9LFxyXG4gICAgICBfY2xhbXAgPSBmdW5jdGlvbiBfY2xhbXAobWluLCBtYXgsIHZhbHVlKSB7XHJcbiAgICByZXR1cm4gdmFsdWUgPCBtaW4gPyBtaW4gOiB2YWx1ZSA+IG1heCA/IG1heCA6IHZhbHVlO1xyXG4gIH0sXHJcbiAgICAgIGdldFVuaXQgPSBmdW5jdGlvbiBnZXRVbml0KHZhbHVlLCB2KSB7XHJcbiAgICByZXR1cm4gIV9pc1N0cmluZyh2YWx1ZSkgfHwgISh2ID0gX3VuaXRFeHAuZXhlYyh2YWx1ZSkpID8gXCJcIiA6IHZbMV07XHJcbiAgfSxcclxuICAgICAgY2xhbXAgPSBmdW5jdGlvbiBjbGFtcChtaW4sIG1heCwgdmFsdWUpIHtcclxuICAgIHJldHVybiBfY29uZGl0aW9uYWxSZXR1cm4odmFsdWUsIGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgIHJldHVybiBfY2xhbXAobWluLCBtYXgsIHYpO1xyXG4gICAgfSk7XHJcbiAgfSxcclxuICAgICAgX3NsaWNlID0gW10uc2xpY2UsXHJcbiAgICAgIF9pc0FycmF5TGlrZSA9IGZ1bmN0aW9uIF9pc0FycmF5TGlrZSh2YWx1ZSwgbm9uRW1wdHkpIHtcclxuICAgIHJldHVybiB2YWx1ZSAmJiBfaXNPYmplY3QodmFsdWUpICYmIFwibGVuZ3RoXCIgaW4gdmFsdWUgJiYgKCFub25FbXB0eSAmJiAhdmFsdWUubGVuZ3RoIHx8IHZhbHVlLmxlbmd0aCAtIDEgaW4gdmFsdWUgJiYgX2lzT2JqZWN0KHZhbHVlWzBdKSkgJiYgIXZhbHVlLm5vZGVUeXBlICYmIHZhbHVlICE9PSBfd2luO1xyXG4gIH0sXHJcbiAgICAgIF9mbGF0dGVuID0gZnVuY3Rpb24gX2ZsYXR0ZW4oYXIsIGxlYXZlU3RyaW5ncywgYWNjdW11bGF0b3IpIHtcclxuICAgIGlmIChhY2N1bXVsYXRvciA9PT0gdm9pZCAwKSB7XHJcbiAgICAgIGFjY3VtdWxhdG9yID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGFyLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgIHZhciBfYWNjdW11bGF0b3I7XHJcblxyXG4gICAgICByZXR1cm4gX2lzU3RyaW5nKHZhbHVlKSAmJiAhbGVhdmVTdHJpbmdzIHx8IF9pc0FycmF5TGlrZSh2YWx1ZSwgMSkgPyAoX2FjY3VtdWxhdG9yID0gYWNjdW11bGF0b3IpLnB1c2guYXBwbHkoX2FjY3VtdWxhdG9yLCB0b0FycmF5KHZhbHVlKSkgOiBhY2N1bXVsYXRvci5wdXNoKHZhbHVlKTtcclxuICAgIH0pIHx8IGFjY3VtdWxhdG9yO1xyXG4gIH0sXHJcbiAgICAgIHRvQXJyYXkgPSBmdW5jdGlvbiB0b0FycmF5KHZhbHVlLCBzY29wZSwgbGVhdmVTdHJpbmdzKSB7XHJcbiAgICByZXR1cm4gX2NvbnRleHQgJiYgIXNjb3BlICYmIF9jb250ZXh0LnNlbGVjdG9yID8gX2NvbnRleHQuc2VsZWN0b3IodmFsdWUpIDogX2lzU3RyaW5nKHZhbHVlKSAmJiAhbGVhdmVTdHJpbmdzICYmIChfY29yZUluaXR0ZWQgfHwgIV93YWtlKCkpID8gX3NsaWNlLmNhbGwoKHNjb3BlIHx8IF9kb2MpLnF1ZXJ5U2VsZWN0b3JBbGwodmFsdWUpLCAwKSA6IF9pc0FycmF5KHZhbHVlKSA/IF9mbGF0dGVuKHZhbHVlLCBsZWF2ZVN0cmluZ3MpIDogX2lzQXJyYXlMaWtlKHZhbHVlKSA/IF9zbGljZS5jYWxsKHZhbHVlLCAwKSA6IHZhbHVlID8gW3ZhbHVlXSA6IFtdO1xyXG4gIH0sXHJcbiAgICAgIHNlbGVjdG9yID0gZnVuY3Rpb24gc2VsZWN0b3IodmFsdWUpIHtcclxuICAgIHZhbHVlID0gdG9BcnJheSh2YWx1ZSlbMF0gfHwgX3dhcm4oXCJJbnZhbGlkIHNjb3BlXCIpIHx8IHt9O1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh2KSB7XHJcbiAgICAgIHZhciBlbCA9IHZhbHVlLmN1cnJlbnQgfHwgdmFsdWUubmF0aXZlRWxlbWVudCB8fCB2YWx1ZTtcclxuICAgICAgcmV0dXJuIHRvQXJyYXkodiwgZWwucXVlcnlTZWxlY3RvckFsbCA/IGVsIDogZWwgPT09IHZhbHVlID8gX3dhcm4oXCJJbnZhbGlkIHNjb3BlXCIpIHx8IF9kb2MuY3JlYXRlRWxlbWVudChcImRpdlwiKSA6IHZhbHVlKTtcclxuICAgIH07XHJcbiAgfSxcclxuICAgICAgc2h1ZmZsZSA9IGZ1bmN0aW9uIHNodWZmbGUoYSkge1xyXG4gICAgcmV0dXJuIGEuc29ydChmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHJldHVybiAuNSAtIE1hdGgucmFuZG9tKCk7XHJcbiAgICB9KTtcclxuICB9LFxyXG4gICAgICBkaXN0cmlidXRlID0gZnVuY3Rpb24gZGlzdHJpYnV0ZSh2KSB7XHJcbiAgICBpZiAoX2lzRnVuY3Rpb24odikpIHtcclxuICAgICAgcmV0dXJuIHY7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHZhcnMgPSBfaXNPYmplY3QodikgPyB2IDoge1xyXG4gICAgICBlYWNoOiB2XHJcbiAgICB9LFxyXG4gICAgICAgIGVhc2UgPSBfcGFyc2VFYXNlKHZhcnMuZWFzZSksXHJcbiAgICAgICAgZnJvbSA9IHZhcnMuZnJvbSB8fCAwLFxyXG4gICAgICAgIGJhc2UgPSBwYXJzZUZsb2F0KHZhcnMuYmFzZSkgfHwgMCxcclxuICAgICAgICBjYWNoZSA9IHt9LFxyXG4gICAgICAgIGlzRGVjaW1hbCA9IGZyb20gPiAwICYmIGZyb20gPCAxLFxyXG4gICAgICAgIHJhdGlvcyA9IGlzTmFOKGZyb20pIHx8IGlzRGVjaW1hbCxcclxuICAgICAgICBheGlzID0gdmFycy5heGlzLFxyXG4gICAgICAgIHJhdGlvWCA9IGZyb20sXHJcbiAgICAgICAgcmF0aW9ZID0gZnJvbTtcclxuXHJcbiAgICBpZiAoX2lzU3RyaW5nKGZyb20pKSB7XHJcbiAgICAgIHJhdGlvWCA9IHJhdGlvWSA9IHtcclxuICAgICAgICBjZW50ZXI6IC41LFxyXG4gICAgICAgIGVkZ2VzOiAuNSxcclxuICAgICAgICBlbmQ6IDFcclxuICAgICAgfVtmcm9tXSB8fCAwO1xyXG4gICAgfSBlbHNlIGlmICghaXNEZWNpbWFsICYmIHJhdGlvcykge1xyXG4gICAgICByYXRpb1ggPSBmcm9tWzBdO1xyXG4gICAgICByYXRpb1kgPSBmcm9tWzFdO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmdW5jdGlvbiAoaSwgdGFyZ2V0LCBhKSB7XHJcbiAgICAgIHZhciBsID0gKGEgfHwgdmFycykubGVuZ3RoLFxyXG4gICAgICAgICAgZGlzdGFuY2VzID0gY2FjaGVbbF0sXHJcbiAgICAgICAgICBvcmlnaW5YLFxyXG4gICAgICAgICAgb3JpZ2luWSxcclxuICAgICAgICAgIHgsXHJcbiAgICAgICAgICB5LFxyXG4gICAgICAgICAgZCxcclxuICAgICAgICAgIGosXHJcbiAgICAgICAgICBtYXgsXHJcbiAgICAgICAgICBtaW4sXHJcbiAgICAgICAgICB3cmFwQXQ7XHJcblxyXG4gICAgICBpZiAoIWRpc3RhbmNlcykge1xyXG4gICAgICAgIHdyYXBBdCA9IHZhcnMuZ3JpZCA9PT0gXCJhdXRvXCIgPyAwIDogKHZhcnMuZ3JpZCB8fCBbMSwgX2JpZ051bV0pWzFdO1xyXG5cclxuICAgICAgICBpZiAoIXdyYXBBdCkge1xyXG4gICAgICAgICAgbWF4ID0gLV9iaWdOdW07XHJcblxyXG4gICAgICAgICAgd2hpbGUgKG1heCA8IChtYXggPSBhW3dyYXBBdCsrXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0KSAmJiB3cmFwQXQgPCBsKSB7fVxyXG5cclxuICAgICAgICAgIHdyYXBBdCA8IGwgJiYgd3JhcEF0LS07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkaXN0YW5jZXMgPSBjYWNoZVtsXSA9IFtdO1xyXG4gICAgICAgIG9yaWdpblggPSByYXRpb3MgPyBNYXRoLm1pbih3cmFwQXQsIGwpICogcmF0aW9YIC0gLjUgOiBmcm9tICUgd3JhcEF0O1xyXG4gICAgICAgIG9yaWdpblkgPSB3cmFwQXQgPT09IF9iaWdOdW0gPyAwIDogcmF0aW9zID8gbCAqIHJhdGlvWSAvIHdyYXBBdCAtIC41IDogZnJvbSAvIHdyYXBBdCB8IDA7XHJcbiAgICAgICAgbWF4ID0gMDtcclxuICAgICAgICBtaW4gPSBfYmlnTnVtO1xyXG5cclxuICAgICAgICBmb3IgKGogPSAwOyBqIDwgbDsgaisrKSB7XHJcbiAgICAgICAgICB4ID0gaiAlIHdyYXBBdCAtIG9yaWdpblg7XHJcbiAgICAgICAgICB5ID0gb3JpZ2luWSAtIChqIC8gd3JhcEF0IHwgMCk7XHJcbiAgICAgICAgICBkaXN0YW5jZXNbal0gPSBkID0gIWF4aXMgPyBfc3FydCh4ICogeCArIHkgKiB5KSA6IE1hdGguYWJzKGF4aXMgPT09IFwieVwiID8geSA6IHgpO1xyXG4gICAgICAgICAgZCA+IG1heCAmJiAobWF4ID0gZCk7XHJcbiAgICAgICAgICBkIDwgbWluICYmIChtaW4gPSBkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZyb20gPT09IFwicmFuZG9tXCIgJiYgc2h1ZmZsZShkaXN0YW5jZXMpO1xyXG4gICAgICAgIGRpc3RhbmNlcy5tYXggPSBtYXggLSBtaW47XHJcbiAgICAgICAgZGlzdGFuY2VzLm1pbiA9IG1pbjtcclxuICAgICAgICBkaXN0YW5jZXMudiA9IGwgPSAocGFyc2VGbG9hdCh2YXJzLmFtb3VudCkgfHwgcGFyc2VGbG9hdCh2YXJzLmVhY2gpICogKHdyYXBBdCA+IGwgPyBsIC0gMSA6ICFheGlzID8gTWF0aC5tYXgod3JhcEF0LCBsIC8gd3JhcEF0KSA6IGF4aXMgPT09IFwieVwiID8gbCAvIHdyYXBBdCA6IHdyYXBBdCkgfHwgMCkgKiAoZnJvbSA9PT0gXCJlZGdlc1wiID8gLTEgOiAxKTtcclxuICAgICAgICBkaXN0YW5jZXMuYiA9IGwgPCAwID8gYmFzZSAtIGwgOiBiYXNlO1xyXG4gICAgICAgIGRpc3RhbmNlcy51ID0gZ2V0VW5pdCh2YXJzLmFtb3VudCB8fCB2YXJzLmVhY2gpIHx8IDA7XHJcbiAgICAgICAgZWFzZSA9IGVhc2UgJiYgbCA8IDAgPyBfaW52ZXJ0RWFzZShlYXNlKSA6IGVhc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGwgPSAoZGlzdGFuY2VzW2ldIC0gZGlzdGFuY2VzLm1pbikgLyBkaXN0YW5jZXMubWF4IHx8IDA7XHJcbiAgICAgIHJldHVybiBfcm91bmRQcmVjaXNlKGRpc3RhbmNlcy5iICsgKGVhc2UgPyBlYXNlKGwpIDogbCkgKiBkaXN0YW5jZXMudikgKyBkaXN0YW5jZXMudTtcclxuICAgIH07XHJcbiAgfSxcclxuICAgICAgX3JvdW5kTW9kaWZpZXIgPSBmdW5jdGlvbiBfcm91bmRNb2RpZmllcih2KSB7XHJcbiAgICB2YXIgcCA9IE1hdGgucG93KDEwLCAoKHYgKyBcIlwiKS5zcGxpdChcIi5cIilbMV0gfHwgXCJcIikubGVuZ3RoKTtcclxuICAgIHJldHVybiBmdW5jdGlvbiAocmF3KSB7XHJcbiAgICAgIHZhciBuID0gX3JvdW5kUHJlY2lzZShNYXRoLnJvdW5kKHBhcnNlRmxvYXQocmF3KSAvIHYpICogdiAqIHApO1xyXG5cclxuICAgICAgcmV0dXJuIChuIC0gbiAlIDEpIC8gcCArIChfaXNOdW1iZXIocmF3KSA/IDAgOiBnZXRVbml0KHJhdykpO1xyXG4gICAgfTtcclxuICB9LFxyXG4gICAgICBzbmFwID0gZnVuY3Rpb24gc25hcChzbmFwVG8sIHZhbHVlKSB7XHJcbiAgICB2YXIgaXNBcnJheSA9IF9pc0FycmF5KHNuYXBUbyksXHJcbiAgICAgICAgcmFkaXVzLFxyXG4gICAgICAgIGlzMkQ7XHJcblxyXG4gICAgaWYgKCFpc0FycmF5ICYmIF9pc09iamVjdChzbmFwVG8pKSB7XHJcbiAgICAgIHJhZGl1cyA9IGlzQXJyYXkgPSBzbmFwVG8ucmFkaXVzIHx8IF9iaWdOdW07XHJcblxyXG4gICAgICBpZiAoc25hcFRvLnZhbHVlcykge1xyXG4gICAgICAgIHNuYXBUbyA9IHRvQXJyYXkoc25hcFRvLnZhbHVlcyk7XHJcblxyXG4gICAgICAgIGlmIChpczJEID0gIV9pc051bWJlcihzbmFwVG9bMF0pKSB7XHJcbiAgICAgICAgICByYWRpdXMgKj0gcmFkaXVzO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzbmFwVG8gPSBfcm91bmRNb2RpZmllcihzbmFwVG8uaW5jcmVtZW50KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBfY29uZGl0aW9uYWxSZXR1cm4odmFsdWUsICFpc0FycmF5ID8gX3JvdW5kTW9kaWZpZXIoc25hcFRvKSA6IF9pc0Z1bmN0aW9uKHNuYXBUbykgPyBmdW5jdGlvbiAocmF3KSB7XHJcbiAgICAgIGlzMkQgPSBzbmFwVG8ocmF3KTtcclxuICAgICAgcmV0dXJuIE1hdGguYWJzKGlzMkQgLSByYXcpIDw9IHJhZGl1cyA/IGlzMkQgOiByYXc7XHJcbiAgICB9IDogZnVuY3Rpb24gKHJhdykge1xyXG4gICAgICB2YXIgeCA9IHBhcnNlRmxvYXQoaXMyRCA/IHJhdy54IDogcmF3KSxcclxuICAgICAgICAgIHkgPSBwYXJzZUZsb2F0KGlzMkQgPyByYXcueSA6IDApLFxyXG4gICAgICAgICAgbWluID0gX2JpZ051bSxcclxuICAgICAgICAgIGNsb3Nlc3QgPSAwLFxyXG4gICAgICAgICAgaSA9IHNuYXBUby5sZW5ndGgsXHJcbiAgICAgICAgICBkeCxcclxuICAgICAgICAgIGR5O1xyXG5cclxuICAgICAgd2hpbGUgKGktLSkge1xyXG4gICAgICAgIGlmIChpczJEKSB7XHJcbiAgICAgICAgICBkeCA9IHNuYXBUb1tpXS54IC0geDtcclxuICAgICAgICAgIGR5ID0gc25hcFRvW2ldLnkgLSB5O1xyXG4gICAgICAgICAgZHggPSBkeCAqIGR4ICsgZHkgKiBkeTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZHggPSBNYXRoLmFicyhzbmFwVG9baV0gLSB4KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChkeCA8IG1pbikge1xyXG4gICAgICAgICAgbWluID0gZHg7XHJcbiAgICAgICAgICBjbG9zZXN0ID0gaTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNsb3Nlc3QgPSAhcmFkaXVzIHx8IG1pbiA8PSByYWRpdXMgPyBzbmFwVG9bY2xvc2VzdF0gOiByYXc7XHJcbiAgICAgIHJldHVybiBpczJEIHx8IGNsb3Nlc3QgPT09IHJhdyB8fCBfaXNOdW1iZXIocmF3KSA/IGNsb3Nlc3QgOiBjbG9zZXN0ICsgZ2V0VW5pdChyYXcpO1xyXG4gICAgfSk7XHJcbiAgfSxcclxuICAgICAgcmFuZG9tID0gZnVuY3Rpb24gcmFuZG9tKG1pbiwgbWF4LCByb3VuZGluZ0luY3JlbWVudCwgcmV0dXJuRnVuY3Rpb24pIHtcclxuICAgIHJldHVybiBfY29uZGl0aW9uYWxSZXR1cm4oX2lzQXJyYXkobWluKSA/ICFtYXggOiByb3VuZGluZ0luY3JlbWVudCA9PT0gdHJ1ZSA/ICEhKHJvdW5kaW5nSW5jcmVtZW50ID0gMCkgOiAhcmV0dXJuRnVuY3Rpb24sIGZ1bmN0aW9uICgpIHtcclxuICAgICAgcmV0dXJuIF9pc0FycmF5KG1pbikgPyBtaW5bfn4oTWF0aC5yYW5kb20oKSAqIG1pbi5sZW5ndGgpXSA6IChyb3VuZGluZ0luY3JlbWVudCA9IHJvdW5kaW5nSW5jcmVtZW50IHx8IDFlLTUpICYmIChyZXR1cm5GdW5jdGlvbiA9IHJvdW5kaW5nSW5jcmVtZW50IDwgMSA/IE1hdGgucG93KDEwLCAocm91bmRpbmdJbmNyZW1lbnQgKyBcIlwiKS5sZW5ndGggLSAyKSA6IDEpICYmIE1hdGguZmxvb3IoTWF0aC5yb3VuZCgobWluIC0gcm91bmRpbmdJbmNyZW1lbnQgLyAyICsgTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyByb3VuZGluZ0luY3JlbWVudCAqIC45OSkpIC8gcm91bmRpbmdJbmNyZW1lbnQpICogcm91bmRpbmdJbmNyZW1lbnQgKiByZXR1cm5GdW5jdGlvbikgLyByZXR1cm5GdW5jdGlvbjtcclxuICAgIH0pO1xyXG4gIH0sXHJcbiAgICAgIHBpcGUgPSBmdW5jdGlvbiBwaXBlKCkge1xyXG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGZ1bmN0aW9ucyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcclxuICAgICAgZnVuY3Rpb25zW19rZXldID0gYXJndW1lbnRzW19rZXldO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgcmV0dXJuIGZ1bmN0aW9ucy5yZWR1Y2UoZnVuY3Rpb24gKHYsIGYpIHtcclxuICAgICAgICByZXR1cm4gZih2KTtcclxuICAgICAgfSwgdmFsdWUpO1xyXG4gICAgfTtcclxuICB9LFxyXG4gICAgICB1bml0aXplID0gZnVuY3Rpb24gdW5pdGl6ZShmdW5jLCB1bml0KSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgIHJldHVybiBmdW5jKHBhcnNlRmxvYXQodmFsdWUpKSArICh1bml0IHx8IGdldFVuaXQodmFsdWUpKTtcclxuICAgIH07XHJcbiAgfSxcclxuICAgICAgbm9ybWFsaXplID0gZnVuY3Rpb24gbm9ybWFsaXplKG1pbiwgbWF4LCB2YWx1ZSkge1xyXG4gICAgcmV0dXJuIG1hcFJhbmdlKG1pbiwgbWF4LCAwLCAxLCB2YWx1ZSk7XHJcbiAgfSxcclxuICAgICAgX3dyYXBBcnJheSA9IGZ1bmN0aW9uIF93cmFwQXJyYXkoYSwgd3JhcHBlciwgdmFsdWUpIHtcclxuICAgIHJldHVybiBfY29uZGl0aW9uYWxSZXR1cm4odmFsdWUsIGZ1bmN0aW9uIChpbmRleCkge1xyXG4gICAgICByZXR1cm4gYVt+fndyYXBwZXIoaW5kZXgpXTtcclxuICAgIH0pO1xyXG4gIH0sXHJcbiAgICAgIHdyYXAgPSBmdW5jdGlvbiB3cmFwKG1pbiwgbWF4LCB2YWx1ZSkge1xyXG4gICAgdmFyIHJhbmdlID0gbWF4IC0gbWluO1xyXG4gICAgcmV0dXJuIF9pc0FycmF5KG1pbikgPyBfd3JhcEFycmF5KG1pbiwgd3JhcCgwLCBtaW4ubGVuZ3RoKSwgbWF4KSA6IF9jb25kaXRpb25hbFJldHVybih2YWx1ZSwgZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgIHJldHVybiAocmFuZ2UgKyAodmFsdWUgLSBtaW4pICUgcmFuZ2UpICUgcmFuZ2UgKyBtaW47XHJcbiAgICB9KTtcclxuICB9LFxyXG4gICAgICB3cmFwWW95byA9IGZ1bmN0aW9uIHdyYXBZb3lvKG1pbiwgbWF4LCB2YWx1ZSkge1xyXG4gICAgdmFyIHJhbmdlID0gbWF4IC0gbWluLFxyXG4gICAgICAgIHRvdGFsID0gcmFuZ2UgKiAyO1xyXG4gICAgcmV0dXJuIF9pc0FycmF5KG1pbikgPyBfd3JhcEFycmF5KG1pbiwgd3JhcFlveW8oMCwgbWluLmxlbmd0aCAtIDEpLCBtYXgpIDogX2NvbmRpdGlvbmFsUmV0dXJuKHZhbHVlLCBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgdmFsdWUgPSAodG90YWwgKyAodmFsdWUgLSBtaW4pICUgdG90YWwpICUgdG90YWwgfHwgMDtcclxuICAgICAgcmV0dXJuIG1pbiArICh2YWx1ZSA+IHJhbmdlID8gdG90YWwgLSB2YWx1ZSA6IHZhbHVlKTtcclxuICAgIH0pO1xyXG4gIH0sXHJcbiAgICAgIF9yZXBsYWNlUmFuZG9tID0gZnVuY3Rpb24gX3JlcGxhY2VSYW5kb20odmFsdWUpIHtcclxuICAgIHZhciBwcmV2ID0gMCxcclxuICAgICAgICBzID0gXCJcIixcclxuICAgICAgICBpLFxyXG4gICAgICAgIG51bXMsXHJcbiAgICAgICAgZW5kLFxyXG4gICAgICAgIGlzQXJyYXk7XHJcblxyXG4gICAgd2hpbGUgKH4oaSA9IHZhbHVlLmluZGV4T2YoXCJyYW5kb20oXCIsIHByZXYpKSkge1xyXG4gICAgICBlbmQgPSB2YWx1ZS5pbmRleE9mKFwiKVwiLCBpKTtcclxuICAgICAgaXNBcnJheSA9IHZhbHVlLmNoYXJBdChpICsgNykgPT09IFwiW1wiO1xyXG4gICAgICBudW1zID0gdmFsdWUuc3Vic3RyKGkgKyA3LCBlbmQgLSBpIC0gNykubWF0Y2goaXNBcnJheSA/IF9kZWxpbWl0ZWRWYWx1ZUV4cCA6IF9zdHJpY3ROdW1FeHApO1xyXG4gICAgICBzICs9IHZhbHVlLnN1YnN0cihwcmV2LCBpIC0gcHJldikgKyByYW5kb20oaXNBcnJheSA/IG51bXMgOiArbnVtc1swXSwgaXNBcnJheSA/IDAgOiArbnVtc1sxXSwgK251bXNbMl0gfHwgMWUtNSk7XHJcbiAgICAgIHByZXYgPSBlbmQgKyAxO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzICsgdmFsdWUuc3Vic3RyKHByZXYsIHZhbHVlLmxlbmd0aCAtIHByZXYpO1xyXG4gIH0sXHJcbiAgICAgIG1hcFJhbmdlID0gZnVuY3Rpb24gbWFwUmFuZ2UoaW5NaW4sIGluTWF4LCBvdXRNaW4sIG91dE1heCwgdmFsdWUpIHtcclxuICAgIHZhciBpblJhbmdlID0gaW5NYXggLSBpbk1pbixcclxuICAgICAgICBvdXRSYW5nZSA9IG91dE1heCAtIG91dE1pbjtcclxuICAgIHJldHVybiBfY29uZGl0aW9uYWxSZXR1cm4odmFsdWUsIGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICByZXR1cm4gb3V0TWluICsgKCh2YWx1ZSAtIGluTWluKSAvIGluUmFuZ2UgKiBvdXRSYW5nZSB8fCAwKTtcclxuICAgIH0pO1xyXG4gIH0sXHJcbiAgICAgIGludGVycG9sYXRlID0gZnVuY3Rpb24gaW50ZXJwb2xhdGUoc3RhcnQsIGVuZCwgcHJvZ3Jlc3MsIG11dGF0ZSkge1xyXG4gICAgdmFyIGZ1bmMgPSBpc05hTihzdGFydCArIGVuZCkgPyAwIDogZnVuY3Rpb24gKHApIHtcclxuICAgICAgcmV0dXJuICgxIC0gcCkgKiBzdGFydCArIHAgKiBlbmQ7XHJcbiAgICB9O1xyXG5cclxuICAgIGlmICghZnVuYykge1xyXG4gICAgICB2YXIgaXNTdHJpbmcgPSBfaXNTdHJpbmcoc3RhcnQpLFxyXG4gICAgICAgICAgbWFzdGVyID0ge30sXHJcbiAgICAgICAgICBwLFxyXG4gICAgICAgICAgaSxcclxuICAgICAgICAgIGludGVycG9sYXRvcnMsXHJcbiAgICAgICAgICBsLFxyXG4gICAgICAgICAgaWw7XHJcblxyXG4gICAgICBwcm9ncmVzcyA9PT0gdHJ1ZSAmJiAobXV0YXRlID0gMSkgJiYgKHByb2dyZXNzID0gbnVsbCk7XHJcblxyXG4gICAgICBpZiAoaXNTdHJpbmcpIHtcclxuICAgICAgICBzdGFydCA9IHtcclxuICAgICAgICAgIHA6IHN0YXJ0XHJcbiAgICAgICAgfTtcclxuICAgICAgICBlbmQgPSB7XHJcbiAgICAgICAgICBwOiBlbmRcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2UgaWYgKF9pc0FycmF5KHN0YXJ0KSAmJiAhX2lzQXJyYXkoZW5kKSkge1xyXG4gICAgICAgIGludGVycG9sYXRvcnMgPSBbXTtcclxuICAgICAgICBsID0gc3RhcnQubGVuZ3RoO1xyXG4gICAgICAgIGlsID0gbCAtIDI7XHJcblxyXG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgIGludGVycG9sYXRvcnMucHVzaChpbnRlcnBvbGF0ZShzdGFydFtpIC0gMV0sIHN0YXJ0W2ldKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsLS07XHJcblxyXG4gICAgICAgIGZ1bmMgPSBmdW5jdGlvbiBmdW5jKHApIHtcclxuICAgICAgICAgIHAgKj0gbDtcclxuICAgICAgICAgIHZhciBpID0gTWF0aC5taW4oaWwsIH5+cCk7XHJcbiAgICAgICAgICByZXR1cm4gaW50ZXJwb2xhdG9yc1tpXShwIC0gaSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcHJvZ3Jlc3MgPSBlbmQ7XHJcbiAgICAgIH0gZWxzZSBpZiAoIW11dGF0ZSkge1xyXG4gICAgICAgIHN0YXJ0ID0gX21lcmdlKF9pc0FycmF5KHN0YXJ0KSA/IFtdIDoge30sIHN0YXJ0KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFpbnRlcnBvbGF0b3JzKSB7XHJcbiAgICAgICAgZm9yIChwIGluIGVuZCkge1xyXG4gICAgICAgICAgX2FkZFByb3BUd2Vlbi5jYWxsKG1hc3Rlciwgc3RhcnQsIHAsIFwiZ2V0XCIsIGVuZFtwXSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmdW5jID0gZnVuY3Rpb24gZnVuYyhwKSB7XHJcbiAgICAgICAgICByZXR1cm4gX3JlbmRlclByb3BUd2VlbnMocCwgbWFzdGVyKSB8fCAoaXNTdHJpbmcgPyBzdGFydC5wIDogc3RhcnQpO1xyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gX2NvbmRpdGlvbmFsUmV0dXJuKHByb2dyZXNzLCBmdW5jKTtcclxuICB9LFxyXG4gICAgICBfZ2V0TGFiZWxJbkRpcmVjdGlvbiA9IGZ1bmN0aW9uIF9nZXRMYWJlbEluRGlyZWN0aW9uKHRpbWVsaW5lLCBmcm9tVGltZSwgYmFja3dhcmQpIHtcclxuICAgIHZhciBsYWJlbHMgPSB0aW1lbGluZS5sYWJlbHMsXHJcbiAgICAgICAgbWluID0gX2JpZ051bSxcclxuICAgICAgICBwLFxyXG4gICAgICAgIGRpc3RhbmNlLFxyXG4gICAgICAgIGxhYmVsO1xyXG5cclxuICAgIGZvciAocCBpbiBsYWJlbHMpIHtcclxuICAgICAgZGlzdGFuY2UgPSBsYWJlbHNbcF0gLSBmcm9tVGltZTtcclxuXHJcbiAgICAgIGlmIChkaXN0YW5jZSA8IDAgPT09ICEhYmFja3dhcmQgJiYgZGlzdGFuY2UgJiYgbWluID4gKGRpc3RhbmNlID0gTWF0aC5hYnMoZGlzdGFuY2UpKSkge1xyXG4gICAgICAgIGxhYmVsID0gcDtcclxuICAgICAgICBtaW4gPSBkaXN0YW5jZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsYWJlbDtcclxuICB9LFxyXG4gICAgICBfY2FsbGJhY2sgPSBmdW5jdGlvbiBfY2FsbGJhY2soYW5pbWF0aW9uLCB0eXBlLCBleGVjdXRlTGF6eUZpcnN0KSB7XHJcbiAgICB2YXIgdiA9IGFuaW1hdGlvbi52YXJzLFxyXG4gICAgICAgIGNhbGxiYWNrID0gdlt0eXBlXSxcclxuICAgICAgICBwcmV2Q29udGV4dCA9IF9jb250ZXh0LFxyXG4gICAgICAgIGNvbnRleHQgPSBhbmltYXRpb24uX2N0eCxcclxuICAgICAgICBwYXJhbXMsXHJcbiAgICAgICAgc2NvcGUsXHJcbiAgICAgICAgcmVzdWx0O1xyXG5cclxuICAgIGlmICghY2FsbGJhY2spIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHBhcmFtcyA9IHZbdHlwZSArIFwiUGFyYW1zXCJdO1xyXG4gICAgc2NvcGUgPSB2LmNhbGxiYWNrU2NvcGUgfHwgYW5pbWF0aW9uO1xyXG4gICAgZXhlY3V0ZUxhenlGaXJzdCAmJiBfbGF6eVR3ZWVucy5sZW5ndGggJiYgX2xhenlSZW5kZXIoKTtcclxuICAgIGNvbnRleHQgJiYgKF9jb250ZXh0ID0gY29udGV4dCk7XHJcbiAgICByZXN1bHQgPSBwYXJhbXMgPyBjYWxsYmFjay5hcHBseShzY29wZSwgcGFyYW1zKSA6IGNhbGxiYWNrLmNhbGwoc2NvcGUpO1xyXG4gICAgX2NvbnRleHQgPSBwcmV2Q29udGV4dDtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfSxcclxuICAgICAgX2ludGVycnVwdCA9IGZ1bmN0aW9uIF9pbnRlcnJ1cHQoYW5pbWF0aW9uKSB7XHJcbiAgICBfcmVtb3ZlRnJvbVBhcmVudChhbmltYXRpb24pO1xyXG5cclxuICAgIGFuaW1hdGlvbi5zY3JvbGxUcmlnZ2VyICYmIGFuaW1hdGlvbi5zY3JvbGxUcmlnZ2VyLmtpbGwoISFfcmV2ZXJ0aW5nKTtcclxuICAgIGFuaW1hdGlvbi5wcm9ncmVzcygpIDwgMSAmJiBfY2FsbGJhY2soYW5pbWF0aW9uLCBcIm9uSW50ZXJydXB0XCIpO1xyXG4gICAgcmV0dXJuIGFuaW1hdGlvbjtcclxuICB9LFxyXG4gICAgICBfcXVpY2tUd2VlbixcclxuICAgICAgX3JlZ2lzdGVyUGx1Z2luUXVldWUgPSBbXSxcclxuICAgICAgX2NyZWF0ZVBsdWdpbiA9IGZ1bmN0aW9uIF9jcmVhdGVQbHVnaW4oY29uZmlnKSB7XHJcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuO1xyXG4gICAgY29uZmlnID0gIWNvbmZpZy5uYW1lICYmIGNvbmZpZ1tcImRlZmF1bHRcIl0gfHwgY29uZmlnO1xyXG5cclxuICAgIGlmIChfd2luZG93RXhpc3RzKCkgfHwgY29uZmlnLmhlYWRsZXNzKSB7XHJcbiAgICAgIHZhciBuYW1lID0gY29uZmlnLm5hbWUsXHJcbiAgICAgICAgICBpc0Z1bmMgPSBfaXNGdW5jdGlvbihjb25maWcpLFxyXG4gICAgICAgICAgUGx1Z2luID0gbmFtZSAmJiAhaXNGdW5jICYmIGNvbmZpZy5pbml0ID8gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIHRoaXMuX3Byb3BzID0gW107XHJcbiAgICAgIH0gOiBjb25maWcsXHJcbiAgICAgICAgICBpbnN0YW5jZURlZmF1bHRzID0ge1xyXG4gICAgICAgIGluaXQ6IF9lbXB0eUZ1bmMsXHJcbiAgICAgICAgcmVuZGVyOiBfcmVuZGVyUHJvcFR3ZWVucyxcclxuICAgICAgICBhZGQ6IF9hZGRQcm9wVHdlZW4sXHJcbiAgICAgICAga2lsbDogX2tpbGxQcm9wVHdlZW5zT2YsXHJcbiAgICAgICAgbW9kaWZpZXI6IF9hZGRQbHVnaW5Nb2RpZmllcixcclxuICAgICAgICByYXdWYXJzOiAwXHJcbiAgICAgIH0sXHJcbiAgICAgICAgICBzdGF0aWNzID0ge1xyXG4gICAgICAgIHRhcmdldFRlc3Q6IDAsXHJcbiAgICAgICAgZ2V0OiAwLFxyXG4gICAgICAgIGdldFNldHRlcjogX2dldFNldHRlcixcclxuICAgICAgICBhbGlhc2VzOiB7fSxcclxuICAgICAgICByZWdpc3RlcjogMFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgX3dha2UoKTtcclxuXHJcbiAgICAgIGlmIChjb25maWcgIT09IFBsdWdpbikge1xyXG4gICAgICAgIGlmIChfcGx1Z2luc1tuYW1lXSkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgX3NldERlZmF1bHRzKFBsdWdpbiwgX3NldERlZmF1bHRzKF9jb3B5RXhjbHVkaW5nKGNvbmZpZywgaW5zdGFuY2VEZWZhdWx0cyksIHN0YXRpY3MpKTtcclxuXHJcbiAgICAgICAgX21lcmdlKFBsdWdpbi5wcm90b3R5cGUsIF9tZXJnZShpbnN0YW5jZURlZmF1bHRzLCBfY29weUV4Y2x1ZGluZyhjb25maWcsIHN0YXRpY3MpKSk7XHJcblxyXG4gICAgICAgIF9wbHVnaW5zW1BsdWdpbi5wcm9wID0gbmFtZV0gPSBQbHVnaW47XHJcblxyXG4gICAgICAgIGlmIChjb25maWcudGFyZ2V0VGVzdCkge1xyXG4gICAgICAgICAgX2hhcm5lc3NQbHVnaW5zLnB1c2goUGx1Z2luKTtcclxuXHJcbiAgICAgICAgICBfcmVzZXJ2ZWRQcm9wc1tuYW1lXSA9IDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBuYW1lID0gKG5hbWUgPT09IFwiY3NzXCIgPyBcIkNTU1wiIDogbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc3Vic3RyKDEpKSArIFwiUGx1Z2luXCI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIF9hZGRHbG9iYWwobmFtZSwgUGx1Z2luKTtcclxuXHJcbiAgICAgIGNvbmZpZy5yZWdpc3RlciAmJiBjb25maWcucmVnaXN0ZXIoZ3NhcCwgUGx1Z2luLCBQcm9wVHdlZW4pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgX3JlZ2lzdGVyUGx1Z2luUXVldWUucHVzaChjb25maWcpO1xyXG4gICAgfVxyXG4gIH0sXHJcbiAgICAgIF8yNTUgPSAyNTUsXHJcbiAgICAgIF9jb2xvckxvb2t1cCA9IHtcclxuICAgIGFxdWE6IFswLCBfMjU1LCBfMjU1XSxcclxuICAgIGxpbWU6IFswLCBfMjU1LCAwXSxcclxuICAgIHNpbHZlcjogWzE5MiwgMTkyLCAxOTJdLFxyXG4gICAgYmxhY2s6IFswLCAwLCAwXSxcclxuICAgIG1hcm9vbjogWzEyOCwgMCwgMF0sXHJcbiAgICB0ZWFsOiBbMCwgMTI4LCAxMjhdLFxyXG4gICAgYmx1ZTogWzAsIDAsIF8yNTVdLFxyXG4gICAgbmF2eTogWzAsIDAsIDEyOF0sXHJcbiAgICB3aGl0ZTogW18yNTUsIF8yNTUsIF8yNTVdLFxyXG4gICAgb2xpdmU6IFsxMjgsIDEyOCwgMF0sXHJcbiAgICB5ZWxsb3c6IFtfMjU1LCBfMjU1LCAwXSxcclxuICAgIG9yYW5nZTogW18yNTUsIDE2NSwgMF0sXHJcbiAgICBncmF5OiBbMTI4LCAxMjgsIDEyOF0sXHJcbiAgICBwdXJwbGU6IFsxMjgsIDAsIDEyOF0sXHJcbiAgICBncmVlbjogWzAsIDEyOCwgMF0sXHJcbiAgICByZWQ6IFtfMjU1LCAwLCAwXSxcclxuICAgIHBpbms6IFtfMjU1LCAxOTIsIDIwM10sXHJcbiAgICBjeWFuOiBbMCwgXzI1NSwgXzI1NV0sXHJcbiAgICB0cmFuc3BhcmVudDogW18yNTUsIF8yNTUsIF8yNTUsIDBdXHJcbiAgfSxcclxuICAgICAgX2h1ZSA9IGZ1bmN0aW9uIF9odWUoaCwgbTEsIG0yKSB7XHJcbiAgICBoICs9IGggPCAwID8gMSA6IGggPiAxID8gLTEgOiAwO1xyXG4gICAgcmV0dXJuIChoICogNiA8IDEgPyBtMSArIChtMiAtIG0xKSAqIGggKiA2IDogaCA8IC41ID8gbTIgOiBoICogMyA8IDIgPyBtMSArIChtMiAtIG0xKSAqICgyIC8gMyAtIGgpICogNiA6IG0xKSAqIF8yNTUgKyAuNSB8IDA7XHJcbiAgfSxcclxuICAgICAgc3BsaXRDb2xvciA9IGZ1bmN0aW9uIHNwbGl0Q29sb3IodiwgdG9IU0wsIGZvcmNlQWxwaGEpIHtcclxuICAgIHZhciBhID0gIXYgPyBfY29sb3JMb29rdXAuYmxhY2sgOiBfaXNOdW1iZXIodikgPyBbdiA+PiAxNiwgdiA+PiA4ICYgXzI1NSwgdiAmIF8yNTVdIDogMCxcclxuICAgICAgICByLFxyXG4gICAgICAgIGcsXHJcbiAgICAgICAgYixcclxuICAgICAgICBoLFxyXG4gICAgICAgIHMsXHJcbiAgICAgICAgbCxcclxuICAgICAgICBtYXgsXHJcbiAgICAgICAgbWluLFxyXG4gICAgICAgIGQsXHJcbiAgICAgICAgd2FzSFNMO1xyXG5cclxuICAgIGlmICghYSkge1xyXG4gICAgICBpZiAodi5zdWJzdHIoLTEpID09PSBcIixcIikge1xyXG4gICAgICAgIHYgPSB2LnN1YnN0cigwLCB2Lmxlbmd0aCAtIDEpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoX2NvbG9yTG9va3VwW3ZdKSB7XHJcbiAgICAgICAgYSA9IF9jb2xvckxvb2t1cFt2XTtcclxuICAgICAgfSBlbHNlIGlmICh2LmNoYXJBdCgwKSA9PT0gXCIjXCIpIHtcclxuICAgICAgICBpZiAodi5sZW5ndGggPCA2KSB7XHJcbiAgICAgICAgICByID0gdi5jaGFyQXQoMSk7XHJcbiAgICAgICAgICBnID0gdi5jaGFyQXQoMik7XHJcbiAgICAgICAgICBiID0gdi5jaGFyQXQoMyk7XHJcbiAgICAgICAgICB2ID0gXCIjXCIgKyByICsgciArIGcgKyBnICsgYiArIGIgKyAodi5sZW5ndGggPT09IDUgPyB2LmNoYXJBdCg0KSArIHYuY2hhckF0KDQpIDogXCJcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodi5sZW5ndGggPT09IDkpIHtcclxuICAgICAgICAgIGEgPSBwYXJzZUludCh2LnN1YnN0cigxLCA2KSwgMTYpO1xyXG4gICAgICAgICAgcmV0dXJuIFthID4+IDE2LCBhID4+IDggJiBfMjU1LCBhICYgXzI1NSwgcGFyc2VJbnQodi5zdWJzdHIoNyksIDE2KSAvIDI1NV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB2ID0gcGFyc2VJbnQodi5zdWJzdHIoMSksIDE2KTtcclxuICAgICAgICBhID0gW3YgPj4gMTYsIHYgPj4gOCAmIF8yNTUsIHYgJiBfMjU1XTtcclxuICAgICAgfSBlbHNlIGlmICh2LnN1YnN0cigwLCAzKSA9PT0gXCJoc2xcIikge1xyXG4gICAgICAgIGEgPSB3YXNIU0wgPSB2Lm1hdGNoKF9zdHJpY3ROdW1FeHApO1xyXG5cclxuICAgICAgICBpZiAoIXRvSFNMKSB7XHJcbiAgICAgICAgICBoID0gK2FbMF0gJSAzNjAgLyAzNjA7XHJcbiAgICAgICAgICBzID0gK2FbMV0gLyAxMDA7XHJcbiAgICAgICAgICBsID0gK2FbMl0gLyAxMDA7XHJcbiAgICAgICAgICBnID0gbCA8PSAuNSA/IGwgKiAocyArIDEpIDogbCArIHMgLSBsICogcztcclxuICAgICAgICAgIHIgPSBsICogMiAtIGc7XHJcbiAgICAgICAgICBhLmxlbmd0aCA+IDMgJiYgKGFbM10gKj0gMSk7XHJcbiAgICAgICAgICBhWzBdID0gX2h1ZShoICsgMSAvIDMsIHIsIGcpO1xyXG4gICAgICAgICAgYVsxXSA9IF9odWUoaCwgciwgZyk7XHJcbiAgICAgICAgICBhWzJdID0gX2h1ZShoIC0gMSAvIDMsIHIsIGcpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAofnYuaW5kZXhPZihcIj1cIikpIHtcclxuICAgICAgICAgIGEgPSB2Lm1hdGNoKF9udW1FeHApO1xyXG4gICAgICAgICAgZm9yY2VBbHBoYSAmJiBhLmxlbmd0aCA8IDQgJiYgKGFbM10gPSAxKTtcclxuICAgICAgICAgIHJldHVybiBhO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhID0gdi5tYXRjaChfc3RyaWN0TnVtRXhwKSB8fCBfY29sb3JMb29rdXAudHJhbnNwYXJlbnQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGEgPSBhLm1hcChOdW1iZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0b0hTTCAmJiAhd2FzSFNMKSB7XHJcbiAgICAgIHIgPSBhWzBdIC8gXzI1NTtcclxuICAgICAgZyA9IGFbMV0gLyBfMjU1O1xyXG4gICAgICBiID0gYVsyXSAvIF8yNTU7XHJcbiAgICAgIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpO1xyXG4gICAgICBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTtcclxuICAgICAgbCA9IChtYXggKyBtaW4pIC8gMjtcclxuXHJcbiAgICAgIGlmIChtYXggPT09IG1pbikge1xyXG4gICAgICAgIGggPSBzID0gMDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkID0gbWF4IC0gbWluO1xyXG4gICAgICAgIHMgPSBsID4gMC41ID8gZCAvICgyIC0gbWF4IC0gbWluKSA6IGQgLyAobWF4ICsgbWluKTtcclxuICAgICAgICBoID0gbWF4ID09PSByID8gKGcgLSBiKSAvIGQgKyAoZyA8IGIgPyA2IDogMCkgOiBtYXggPT09IGcgPyAoYiAtIHIpIC8gZCArIDIgOiAociAtIGcpIC8gZCArIDQ7XHJcbiAgICAgICAgaCAqPSA2MDtcclxuICAgICAgfVxyXG5cclxuICAgICAgYVswXSA9IH5+KGggKyAuNSk7XHJcbiAgICAgIGFbMV0gPSB+fihzICogMTAwICsgLjUpO1xyXG4gICAgICBhWzJdID0gfn4obCAqIDEwMCArIC41KTtcclxuICAgIH1cclxuXHJcbiAgICBmb3JjZUFscGhhICYmIGEubGVuZ3RoIDwgNCAmJiAoYVszXSA9IDEpO1xyXG4gICAgcmV0dXJuIGE7XHJcbiAgfSxcclxuICAgICAgX2NvbG9yT3JkZXJEYXRhID0gZnVuY3Rpb24gX2NvbG9yT3JkZXJEYXRhKHYpIHtcclxuICAgIHZhciB2YWx1ZXMgPSBbXSxcclxuICAgICAgICBjID0gW10sXHJcbiAgICAgICAgaSA9IC0xO1xyXG4gICAgdi5zcGxpdChfY29sb3JFeHApLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcclxuICAgICAgdmFyIGEgPSB2Lm1hdGNoKF9udW1XaXRoVW5pdEV4cCkgfHwgW107XHJcbiAgICAgIHZhbHVlcy5wdXNoLmFwcGx5KHZhbHVlcywgYSk7XHJcbiAgICAgIGMucHVzaChpICs9IGEubGVuZ3RoICsgMSk7XHJcbiAgICB9KTtcclxuICAgIHZhbHVlcy5jID0gYztcclxuICAgIHJldHVybiB2YWx1ZXM7XHJcbiAgfSxcclxuICAgICAgX2Zvcm1hdENvbG9ycyA9IGZ1bmN0aW9uIF9mb3JtYXRDb2xvcnMocywgdG9IU0wsIG9yZGVyTWF0Y2hEYXRhKSB7XHJcbiAgICB2YXIgcmVzdWx0ID0gXCJcIixcclxuICAgICAgICBjb2xvcnMgPSAocyArIHJlc3VsdCkubWF0Y2goX2NvbG9yRXhwKSxcclxuICAgICAgICB0eXBlID0gdG9IU0wgPyBcImhzbGEoXCIgOiBcInJnYmEoXCIsXHJcbiAgICAgICAgaSA9IDAsXHJcbiAgICAgICAgYyxcclxuICAgICAgICBzaGVsbCxcclxuICAgICAgICBkLFxyXG4gICAgICAgIGw7XHJcblxyXG4gICAgaWYgKCFjb2xvcnMpIHtcclxuICAgICAgcmV0dXJuIHM7XHJcbiAgICB9XHJcblxyXG4gICAgY29sb3JzID0gY29sb3JzLm1hcChmdW5jdGlvbiAoY29sb3IpIHtcclxuICAgICAgcmV0dXJuIChjb2xvciA9IHNwbGl0Q29sb3IoY29sb3IsIHRvSFNMLCAxKSkgJiYgdHlwZSArICh0b0hTTCA/IGNvbG9yWzBdICsgXCIsXCIgKyBjb2xvclsxXSArIFwiJSxcIiArIGNvbG9yWzJdICsgXCIlLFwiICsgY29sb3JbM10gOiBjb2xvci5qb2luKFwiLFwiKSkgKyBcIilcIjtcclxuICAgIH0pO1xyXG5cclxuICAgIGlmIChvcmRlck1hdGNoRGF0YSkge1xyXG4gICAgICBkID0gX2NvbG9yT3JkZXJEYXRhKHMpO1xyXG4gICAgICBjID0gb3JkZXJNYXRjaERhdGEuYztcclxuXHJcbiAgICAgIGlmIChjLmpvaW4ocmVzdWx0KSAhPT0gZC5jLmpvaW4ocmVzdWx0KSkge1xyXG4gICAgICAgIHNoZWxsID0gcy5yZXBsYWNlKF9jb2xvckV4cCwgXCIxXCIpLnNwbGl0KF9udW1XaXRoVW5pdEV4cCk7XHJcbiAgICAgICAgbCA9IHNoZWxsLmxlbmd0aCAtIDE7XHJcblxyXG4gICAgICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICByZXN1bHQgKz0gc2hlbGxbaV0gKyAofmMuaW5kZXhPZihpKSA/IGNvbG9ycy5zaGlmdCgpIHx8IHR5cGUgKyBcIjAsMCwwLDApXCIgOiAoZC5sZW5ndGggPyBkIDogY29sb3JzLmxlbmd0aCA/IGNvbG9ycyA6IG9yZGVyTWF0Y2hEYXRhKS5zaGlmdCgpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXNoZWxsKSB7XHJcbiAgICAgIHNoZWxsID0gcy5zcGxpdChfY29sb3JFeHApO1xyXG4gICAgICBsID0gc2hlbGwubGVuZ3RoIC0gMTtcclxuXHJcbiAgICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgcmVzdWx0ICs9IHNoZWxsW2ldICsgY29sb3JzW2ldO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdCArIHNoZWxsW2xdO1xyXG4gIH0sXHJcbiAgICAgIF9jb2xvckV4cCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIHZhciBzID0gXCIoPzpcXFxcYig/Oig/OnJnYnxyZ2JhfGhzbHxoc2xhKVxcXFwoLis/XFxcXCkpfFxcXFxCIyg/OlswLTlhLWZdezMsNH0pezEsMn1cXFxcYlwiLFxyXG4gICAgICAgIHA7XHJcblxyXG4gICAgZm9yIChwIGluIF9jb2xvckxvb2t1cCkge1xyXG4gICAgICBzICs9IFwifFwiICsgcCArIFwiXFxcXGJcIjtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChzICsgXCIpXCIsIFwiZ2lcIik7XHJcbiAgfSgpLFxyXG4gICAgICBfaHNsRXhwID0gL2hzbFthXT9cXCgvLFxyXG4gICAgICBfY29sb3JTdHJpbmdGaWx0ZXIgPSBmdW5jdGlvbiBfY29sb3JTdHJpbmdGaWx0ZXIoYSkge1xyXG4gICAgdmFyIGNvbWJpbmVkID0gYS5qb2luKFwiIFwiKSxcclxuICAgICAgICB0b0hTTDtcclxuICAgIF9jb2xvckV4cC5sYXN0SW5kZXggPSAwO1xyXG5cclxuICAgIGlmIChfY29sb3JFeHAudGVzdChjb21iaW5lZCkpIHtcclxuICAgICAgdG9IU0wgPSBfaHNsRXhwLnRlc3QoY29tYmluZWQpO1xyXG4gICAgICBhWzFdID0gX2Zvcm1hdENvbG9ycyhhWzFdLCB0b0hTTCk7XHJcbiAgICAgIGFbMF0gPSBfZm9ybWF0Q29sb3JzKGFbMF0sIHRvSFNMLCBfY29sb3JPcmRlckRhdGEoYVsxXSkpO1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICB9LFxyXG4gICAgICBfdGlja2VyQWN0aXZlLFxyXG4gICAgICBfdGlja2VyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIF9nZXRUaW1lID0gRGF0ZS5ub3csXHJcbiAgICAgICAgX2xhZ1RocmVzaG9sZCA9IDUwMCxcclxuICAgICAgICBfYWRqdXN0ZWRMYWcgPSAzMyxcclxuICAgICAgICBfc3RhcnRUaW1lID0gX2dldFRpbWUoKSxcclxuICAgICAgICBfbGFzdFVwZGF0ZSA9IF9zdGFydFRpbWUsXHJcbiAgICAgICAgX2dhcCA9IDEwMDAgLyAyNDAsXHJcbiAgICAgICAgX25leHRUaW1lID0gX2dhcCxcclxuICAgICAgICBfbGlzdGVuZXJzID0gW10sXHJcbiAgICAgICAgX2lkLFxyXG4gICAgICAgIF9yZXEsXHJcbiAgICAgICAgX3JhZixcclxuICAgICAgICBfc2VsZixcclxuICAgICAgICBfZGVsdGEsXHJcbiAgICAgICAgX2ksXHJcbiAgICAgICAgX3RpY2sgPSBmdW5jdGlvbiBfdGljayh2KSB7XHJcbiAgICAgIHZhciBlbGFwc2VkID0gX2dldFRpbWUoKSAtIF9sYXN0VXBkYXRlLFxyXG4gICAgICAgICAgbWFudWFsID0gdiA9PT0gdHJ1ZSxcclxuICAgICAgICAgIG92ZXJsYXAsXHJcbiAgICAgICAgICBkaXNwYXRjaCxcclxuICAgICAgICAgIHRpbWUsXHJcbiAgICAgICAgICBmcmFtZTtcclxuXHJcbiAgICAgIChlbGFwc2VkID4gX2xhZ1RocmVzaG9sZCB8fCBlbGFwc2VkIDwgMCkgJiYgKF9zdGFydFRpbWUgKz0gZWxhcHNlZCAtIF9hZGp1c3RlZExhZyk7XHJcbiAgICAgIF9sYXN0VXBkYXRlICs9IGVsYXBzZWQ7XHJcbiAgICAgIHRpbWUgPSBfbGFzdFVwZGF0ZSAtIF9zdGFydFRpbWU7XHJcbiAgICAgIG92ZXJsYXAgPSB0aW1lIC0gX25leHRUaW1lO1xyXG5cclxuICAgICAgaWYgKG92ZXJsYXAgPiAwIHx8IG1hbnVhbCkge1xyXG4gICAgICAgIGZyYW1lID0gKytfc2VsZi5mcmFtZTtcclxuICAgICAgICBfZGVsdGEgPSB0aW1lIC0gX3NlbGYudGltZSAqIDEwMDA7XHJcbiAgICAgICAgX3NlbGYudGltZSA9IHRpbWUgPSB0aW1lIC8gMTAwMDtcclxuICAgICAgICBfbmV4dFRpbWUgKz0gb3ZlcmxhcCArIChvdmVybGFwID49IF9nYXAgPyA0IDogX2dhcCAtIG92ZXJsYXApO1xyXG4gICAgICAgIGRpc3BhdGNoID0gMTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbWFudWFsIHx8IChfaWQgPSBfcmVxKF90aWNrKSk7XHJcblxyXG4gICAgICBpZiAoZGlzcGF0Y2gpIHtcclxuICAgICAgICBmb3IgKF9pID0gMDsgX2kgPCBfbGlzdGVuZXJzLmxlbmd0aDsgX2krKykge1xyXG4gICAgICAgICAgX2xpc3RlbmVyc1tfaV0odGltZSwgX2RlbHRhLCBmcmFtZSwgdik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIF9zZWxmID0ge1xyXG4gICAgICB0aW1lOiAwLFxyXG4gICAgICBmcmFtZTogMCxcclxuICAgICAgdGljazogZnVuY3Rpb24gdGljaygpIHtcclxuICAgICAgICBfdGljayh0cnVlKTtcclxuICAgICAgfSxcclxuICAgICAgZGVsdGFSYXRpbzogZnVuY3Rpb24gZGVsdGFSYXRpbyhmcHMpIHtcclxuICAgICAgICByZXR1cm4gX2RlbHRhIC8gKDEwMDAgLyAoZnBzIHx8IDYwKSk7XHJcbiAgICAgIH0sXHJcbiAgICAgIHdha2U6IGZ1bmN0aW9uIHdha2UoKSB7XHJcbiAgICAgICAgaWYgKF9jb3JlUmVhZHkpIHtcclxuICAgICAgICAgIGlmICghX2NvcmVJbml0dGVkICYmIF93aW5kb3dFeGlzdHMoKSkge1xyXG4gICAgICAgICAgICBfd2luID0gX2NvcmVJbml0dGVkID0gd2luZG93O1xyXG4gICAgICAgICAgICBfZG9jID0gX3dpbi5kb2N1bWVudCB8fCB7fTtcclxuICAgICAgICAgICAgX2dsb2JhbHMuZ3NhcCA9IGdzYXA7XHJcbiAgICAgICAgICAgIChfd2luLmdzYXBWZXJzaW9ucyB8fCAoX3dpbi5nc2FwVmVyc2lvbnMgPSBbXSkpLnB1c2goZ3NhcC52ZXJzaW9uKTtcclxuXHJcbiAgICAgICAgICAgIF9pbnN0YWxsKF9pbnN0YWxsU2NvcGUgfHwgX3dpbi5HcmVlblNvY2tHbG9iYWxzIHx8ICFfd2luLmdzYXAgJiYgX3dpbiB8fCB7fSk7XHJcblxyXG4gICAgICAgICAgICBfcmVnaXN0ZXJQbHVnaW5RdWV1ZS5mb3JFYWNoKF9jcmVhdGVQbHVnaW4pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIF9yYWYgPSB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIHJlcXVlc3RBbmltYXRpb25GcmFtZTtcclxuICAgICAgICAgIF9pZCAmJiBfc2VsZi5zbGVlcCgpO1xyXG5cclxuICAgICAgICAgIF9yZXEgPSBfcmFmIHx8IGZ1bmN0aW9uIChmKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGYsIF9uZXh0VGltZSAtIF9zZWxmLnRpbWUgKiAxMDAwICsgMSB8IDApO1xyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBfdGlja2VyQWN0aXZlID0gMTtcclxuXHJcbiAgICAgICAgICBfdGljaygyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIHNsZWVwOiBmdW5jdGlvbiBzbGVlcCgpIHtcclxuICAgICAgICAoX3JhZiA/IGNhbmNlbEFuaW1hdGlvbkZyYW1lIDogY2xlYXJUaW1lb3V0KShfaWQpO1xyXG4gICAgICAgIF90aWNrZXJBY3RpdmUgPSAwO1xyXG4gICAgICAgIF9yZXEgPSBfZW1wdHlGdW5jO1xyXG4gICAgICB9LFxyXG4gICAgICBsYWdTbW9vdGhpbmc6IGZ1bmN0aW9uIGxhZ1Ntb290aGluZyh0aHJlc2hvbGQsIGFkanVzdGVkTGFnKSB7XHJcbiAgICAgICAgX2xhZ1RocmVzaG9sZCA9IHRocmVzaG9sZCB8fCBJbmZpbml0eTtcclxuICAgICAgICBfYWRqdXN0ZWRMYWcgPSBNYXRoLm1pbihhZGp1c3RlZExhZyB8fCAzMywgX2xhZ1RocmVzaG9sZCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIGZwczogZnVuY3Rpb24gZnBzKF9mcHMpIHtcclxuICAgICAgICBfZ2FwID0gMTAwMCAvIChfZnBzIHx8IDI0MCk7XHJcbiAgICAgICAgX25leHRUaW1lID0gX3NlbGYudGltZSAqIDEwMDAgKyBfZ2FwO1xyXG4gICAgICB9LFxyXG4gICAgICBhZGQ6IGZ1bmN0aW9uIGFkZChjYWxsYmFjaywgb25jZSwgcHJpb3JpdGl6ZSkge1xyXG4gICAgICAgIHZhciBmdW5jID0gb25jZSA/IGZ1bmN0aW9uICh0LCBkLCBmLCB2KSB7XHJcbiAgICAgICAgICBjYWxsYmFjayh0LCBkLCBmLCB2KTtcclxuXHJcbiAgICAgICAgICBfc2VsZi5yZW1vdmUoZnVuYyk7XHJcbiAgICAgICAgfSA6IGNhbGxiYWNrO1xyXG5cclxuICAgICAgICBfc2VsZi5yZW1vdmUoY2FsbGJhY2spO1xyXG5cclxuICAgICAgICBfbGlzdGVuZXJzW3ByaW9yaXRpemUgPyBcInVuc2hpZnRcIiA6IFwicHVzaFwiXShmdW5jKTtcclxuXHJcbiAgICAgICAgX3dha2UoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGZ1bmM7XHJcbiAgICAgIH0sXHJcbiAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKGNhbGxiYWNrLCBpKSB7XHJcbiAgICAgICAgfihpID0gX2xpc3RlbmVycy5pbmRleE9mKGNhbGxiYWNrKSkgJiYgX2xpc3RlbmVycy5zcGxpY2UoaSwgMSkgJiYgX2kgPj0gaSAmJiBfaS0tO1xyXG4gICAgICB9LFxyXG4gICAgICBfbGlzdGVuZXJzOiBfbGlzdGVuZXJzXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIF9zZWxmO1xyXG4gIH0oKSxcclxuICAgICAgX3dha2UgPSBmdW5jdGlvbiBfd2FrZSgpIHtcclxuICAgIHJldHVybiAhX3RpY2tlckFjdGl2ZSAmJiBfdGlja2VyLndha2UoKTtcclxuICB9LFxyXG4gICAgICBfZWFzZU1hcCA9IHt9LFxyXG4gICAgICBfY3VzdG9tRWFzZUV4cCA9IC9eW1xcZC5cXC1NXVtcXGQuXFwtLFxcc10vLFxyXG4gICAgICBfcXVvdGVzRXhwID0gL1tcIiddL2csXHJcbiAgICAgIF9wYXJzZU9iamVjdEluU3RyaW5nID0gZnVuY3Rpb24gX3BhcnNlT2JqZWN0SW5TdHJpbmcodmFsdWUpIHtcclxuICAgIHZhciBvYmogPSB7fSxcclxuICAgICAgICBzcGxpdCA9IHZhbHVlLnN1YnN0cigxLCB2YWx1ZS5sZW5ndGggLSAzKS5zcGxpdChcIjpcIiksXHJcbiAgICAgICAga2V5ID0gc3BsaXRbMF0sXHJcbiAgICAgICAgaSA9IDEsXHJcbiAgICAgICAgbCA9IHNwbGl0Lmxlbmd0aCxcclxuICAgICAgICBpbmRleCxcclxuICAgICAgICB2YWwsXHJcbiAgICAgICAgcGFyc2VkVmFsO1xyXG5cclxuICAgIGZvciAoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgIHZhbCA9IHNwbGl0W2ldO1xyXG4gICAgICBpbmRleCA9IGkgIT09IGwgLSAxID8gdmFsLmxhc3RJbmRleE9mKFwiLFwiKSA6IHZhbC5sZW5ndGg7XHJcbiAgICAgIHBhcnNlZFZhbCA9IHZhbC5zdWJzdHIoMCwgaW5kZXgpO1xyXG4gICAgICBvYmpba2V5XSA9IGlzTmFOKHBhcnNlZFZhbCkgPyBwYXJzZWRWYWwucmVwbGFjZShfcXVvdGVzRXhwLCBcIlwiKS50cmltKCkgOiArcGFyc2VkVmFsO1xyXG4gICAgICBrZXkgPSB2YWwuc3Vic3RyKGluZGV4ICsgMSkudHJpbSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBvYmo7XHJcbiAgfSxcclxuICAgICAgX3ZhbHVlSW5QYXJlbnRoZXNlcyA9IGZ1bmN0aW9uIF92YWx1ZUluUGFyZW50aGVzZXModmFsdWUpIHtcclxuICAgIHZhciBvcGVuID0gdmFsdWUuaW5kZXhPZihcIihcIikgKyAxLFxyXG4gICAgICAgIGNsb3NlID0gdmFsdWUuaW5kZXhPZihcIilcIiksXHJcbiAgICAgICAgbmVzdGVkID0gdmFsdWUuaW5kZXhPZihcIihcIiwgb3Blbik7XHJcbiAgICByZXR1cm4gdmFsdWUuc3Vic3RyaW5nKG9wZW4sIH5uZXN0ZWQgJiYgbmVzdGVkIDwgY2xvc2UgPyB2YWx1ZS5pbmRleE9mKFwiKVwiLCBjbG9zZSArIDEpIDogY2xvc2UpO1xyXG4gIH0sXHJcbiAgICAgIF9jb25maWdFYXNlRnJvbVN0cmluZyA9IGZ1bmN0aW9uIF9jb25maWdFYXNlRnJvbVN0cmluZyhuYW1lKSB7XHJcbiAgICB2YXIgc3BsaXQgPSAobmFtZSArIFwiXCIpLnNwbGl0KFwiKFwiKSxcclxuICAgICAgICBlYXNlID0gX2Vhc2VNYXBbc3BsaXRbMF1dO1xyXG4gICAgcmV0dXJuIGVhc2UgJiYgc3BsaXQubGVuZ3RoID4gMSAmJiBlYXNlLmNvbmZpZyA/IGVhc2UuY29uZmlnLmFwcGx5KG51bGwsIH5uYW1lLmluZGV4T2YoXCJ7XCIpID8gW19wYXJzZU9iamVjdEluU3RyaW5nKHNwbGl0WzFdKV0gOiBfdmFsdWVJblBhcmVudGhlc2VzKG5hbWUpLnNwbGl0KFwiLFwiKS5tYXAoX251bWVyaWNJZlBvc3NpYmxlKSkgOiBfZWFzZU1hcC5fQ0UgJiYgX2N1c3RvbUVhc2VFeHAudGVzdChuYW1lKSA/IF9lYXNlTWFwLl9DRShcIlwiLCBuYW1lKSA6IGVhc2U7XHJcbiAgfSxcclxuICAgICAgX2ludmVydEVhc2UgPSBmdW5jdGlvbiBfaW52ZXJ0RWFzZShlYXNlKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHApIHtcclxuICAgICAgcmV0dXJuIDEgLSBlYXNlKDEgLSBwKTtcclxuICAgIH07XHJcbiAgfSxcclxuICAgICAgX3Byb3BhZ2F0ZVlveW9FYXNlID0gZnVuY3Rpb24gX3Byb3BhZ2F0ZVlveW9FYXNlKHRpbWVsaW5lLCBpc1lveW8pIHtcclxuICAgIHZhciBjaGlsZCA9IHRpbWVsaW5lLl9maXJzdCxcclxuICAgICAgICBlYXNlO1xyXG5cclxuICAgIHdoaWxlIChjaGlsZCkge1xyXG4gICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBUaW1lbGluZSkge1xyXG4gICAgICAgIF9wcm9wYWdhdGVZb3lvRWFzZShjaGlsZCwgaXNZb3lvKTtcclxuICAgICAgfSBlbHNlIGlmIChjaGlsZC52YXJzLnlveW9FYXNlICYmICghY2hpbGQuX3lveW8gfHwgIWNoaWxkLl9yZXBlYXQpICYmIGNoaWxkLl95b3lvICE9PSBpc1lveW8pIHtcclxuICAgICAgICBpZiAoY2hpbGQudGltZWxpbmUpIHtcclxuICAgICAgICAgIF9wcm9wYWdhdGVZb3lvRWFzZShjaGlsZC50aW1lbGluZSwgaXNZb3lvKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZWFzZSA9IGNoaWxkLl9lYXNlO1xyXG4gICAgICAgICAgY2hpbGQuX2Vhc2UgPSBjaGlsZC5feUVhc2U7XHJcbiAgICAgICAgICBjaGlsZC5feUVhc2UgPSBlYXNlO1xyXG4gICAgICAgICAgY2hpbGQuX3lveW8gPSBpc1lveW87XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBjaGlsZCA9IGNoaWxkLl9uZXh0O1xyXG4gICAgfVxyXG4gIH0sXHJcbiAgICAgIF9wYXJzZUVhc2UgPSBmdW5jdGlvbiBfcGFyc2VFYXNlKGVhc2UsIGRlZmF1bHRFYXNlKSB7XHJcbiAgICByZXR1cm4gIWVhc2UgPyBkZWZhdWx0RWFzZSA6IChfaXNGdW5jdGlvbihlYXNlKSA/IGVhc2UgOiBfZWFzZU1hcFtlYXNlXSB8fCBfY29uZmlnRWFzZUZyb21TdHJpbmcoZWFzZSkpIHx8IGRlZmF1bHRFYXNlO1xyXG4gIH0sXHJcbiAgICAgIF9pbnNlcnRFYXNlID0gZnVuY3Rpb24gX2luc2VydEVhc2UobmFtZXMsIGVhc2VJbiwgZWFzZU91dCwgZWFzZUluT3V0KSB7XHJcbiAgICBpZiAoZWFzZU91dCA9PT0gdm9pZCAwKSB7XHJcbiAgICAgIGVhc2VPdXQgPSBmdW5jdGlvbiBlYXNlT3V0KHApIHtcclxuICAgICAgICByZXR1cm4gMSAtIGVhc2VJbigxIC0gcCk7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGVhc2VJbk91dCA9PT0gdm9pZCAwKSB7XHJcbiAgICAgIGVhc2VJbk91dCA9IGZ1bmN0aW9uIGVhc2VJbk91dChwKSB7XHJcbiAgICAgICAgcmV0dXJuIHAgPCAuNSA/IGVhc2VJbihwICogMikgLyAyIDogMSAtIGVhc2VJbigoMSAtIHApICogMikgLyAyO1xyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBlYXNlID0ge1xyXG4gICAgICBlYXNlSW46IGVhc2VJbixcclxuICAgICAgZWFzZU91dDogZWFzZU91dCxcclxuICAgICAgZWFzZUluT3V0OiBlYXNlSW5PdXRcclxuICAgIH0sXHJcbiAgICAgICAgbG93ZXJjYXNlTmFtZTtcclxuXHJcbiAgICBfZm9yRWFjaE5hbWUobmFtZXMsIGZ1bmN0aW9uIChuYW1lKSB7XHJcbiAgICAgIF9lYXNlTWFwW25hbWVdID0gX2dsb2JhbHNbbmFtZV0gPSBlYXNlO1xyXG4gICAgICBfZWFzZU1hcFtsb3dlcmNhc2VOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpXSA9IGVhc2VPdXQ7XHJcblxyXG4gICAgICBmb3IgKHZhciBwIGluIGVhc2UpIHtcclxuICAgICAgICBfZWFzZU1hcFtsb3dlcmNhc2VOYW1lICsgKHAgPT09IFwiZWFzZUluXCIgPyBcIi5pblwiIDogcCA9PT0gXCJlYXNlT3V0XCIgPyBcIi5vdXRcIiA6IFwiLmluT3V0XCIpXSA9IF9lYXNlTWFwW25hbWUgKyBcIi5cIiArIHBdID0gZWFzZVtwXTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGVhc2U7XHJcbiAgfSxcclxuICAgICAgX2Vhc2VJbk91dEZyb21PdXQgPSBmdW5jdGlvbiBfZWFzZUluT3V0RnJvbU91dChlYXNlT3V0KSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHApIHtcclxuICAgICAgcmV0dXJuIHAgPCAuNSA/ICgxIC0gZWFzZU91dCgxIC0gcCAqIDIpKSAvIDIgOiAuNSArIGVhc2VPdXQoKHAgLSAuNSkgKiAyKSAvIDI7XHJcbiAgICB9O1xyXG4gIH0sXHJcbiAgICAgIF9jb25maWdFbGFzdGljID0gZnVuY3Rpb24gX2NvbmZpZ0VsYXN0aWModHlwZSwgYW1wbGl0dWRlLCBwZXJpb2QpIHtcclxuICAgIHZhciBwMSA9IGFtcGxpdHVkZSA+PSAxID8gYW1wbGl0dWRlIDogMSxcclxuICAgICAgICBwMiA9IChwZXJpb2QgfHwgKHR5cGUgPyAuMyA6IC40NSkpIC8gKGFtcGxpdHVkZSA8IDEgPyBhbXBsaXR1ZGUgOiAxKSxcclxuICAgICAgICBwMyA9IHAyIC8gXzJQSSAqIChNYXRoLmFzaW4oMSAvIHAxKSB8fCAwKSxcclxuICAgICAgICBlYXNlT3V0ID0gZnVuY3Rpb24gZWFzZU91dChwKSB7XHJcbiAgICAgIHJldHVybiBwID09PSAxID8gMSA6IHAxICogTWF0aC5wb3coMiwgLTEwICogcCkgKiBfc2luKChwIC0gcDMpICogcDIpICsgMTtcclxuICAgIH0sXHJcbiAgICAgICAgZWFzZSA9IHR5cGUgPT09IFwib3V0XCIgPyBlYXNlT3V0IDogdHlwZSA9PT0gXCJpblwiID8gZnVuY3Rpb24gKHApIHtcclxuICAgICAgcmV0dXJuIDEgLSBlYXNlT3V0KDEgLSBwKTtcclxuICAgIH0gOiBfZWFzZUluT3V0RnJvbU91dChlYXNlT3V0KTtcclxuXHJcbiAgICBwMiA9IF8yUEkgLyBwMjtcclxuXHJcbiAgICBlYXNlLmNvbmZpZyA9IGZ1bmN0aW9uIChhbXBsaXR1ZGUsIHBlcmlvZCkge1xyXG4gICAgICByZXR1cm4gX2NvbmZpZ0VsYXN0aWModHlwZSwgYW1wbGl0dWRlLCBwZXJpb2QpO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gZWFzZTtcclxuICB9LFxyXG4gICAgICBfY29uZmlnQmFjayA9IGZ1bmN0aW9uIF9jb25maWdCYWNrKHR5cGUsIG92ZXJzaG9vdCkge1xyXG4gICAgaWYgKG92ZXJzaG9vdCA9PT0gdm9pZCAwKSB7XHJcbiAgICAgIG92ZXJzaG9vdCA9IDEuNzAxNTg7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGVhc2VPdXQgPSBmdW5jdGlvbiBlYXNlT3V0KHApIHtcclxuICAgICAgcmV0dXJuIHAgPyAtLXAgKiBwICogKChvdmVyc2hvb3QgKyAxKSAqIHAgKyBvdmVyc2hvb3QpICsgMSA6IDA7XHJcbiAgICB9LFxyXG4gICAgICAgIGVhc2UgPSB0eXBlID09PSBcIm91dFwiID8gZWFzZU91dCA6IHR5cGUgPT09IFwiaW5cIiA/IGZ1bmN0aW9uIChwKSB7XHJcbiAgICAgIHJldHVybiAxIC0gZWFzZU91dCgxIC0gcCk7XHJcbiAgICB9IDogX2Vhc2VJbk91dEZyb21PdXQoZWFzZU91dCk7XHJcblxyXG4gICAgZWFzZS5jb25maWcgPSBmdW5jdGlvbiAob3ZlcnNob290KSB7XHJcbiAgICAgIHJldHVybiBfY29uZmlnQmFjayh0eXBlLCBvdmVyc2hvb3QpO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gZWFzZTtcclxuICB9O1xyXG5cclxuICBfZm9yRWFjaE5hbWUoXCJMaW5lYXIsUXVhZCxDdWJpYyxRdWFydCxRdWludCxTdHJvbmdcIiwgZnVuY3Rpb24gKG5hbWUsIGkpIHtcclxuICAgIHZhciBwb3dlciA9IGkgPCA1ID8gaSArIDEgOiBpO1xyXG5cclxuICAgIF9pbnNlcnRFYXNlKG5hbWUgKyBcIixQb3dlclwiICsgKHBvd2VyIC0gMSksIGkgPyBmdW5jdGlvbiAocCkge1xyXG4gICAgICByZXR1cm4gTWF0aC5wb3cocCwgcG93ZXIpO1xyXG4gICAgfSA6IGZ1bmN0aW9uIChwKSB7XHJcbiAgICAgIHJldHVybiBwO1xyXG4gICAgfSwgZnVuY3Rpb24gKHApIHtcclxuICAgICAgcmV0dXJuIDEgLSBNYXRoLnBvdygxIC0gcCwgcG93ZXIpO1xyXG4gICAgfSwgZnVuY3Rpb24gKHApIHtcclxuICAgICAgcmV0dXJuIHAgPCAuNSA/IE1hdGgucG93KHAgKiAyLCBwb3dlcikgLyAyIDogMSAtIE1hdGgucG93KCgxIC0gcCkgKiAyLCBwb3dlcikgLyAyO1xyXG4gICAgfSk7XHJcbiAgfSk7XHJcblxyXG4gIF9lYXNlTWFwLkxpbmVhci5lYXNlTm9uZSA9IF9lYXNlTWFwLm5vbmUgPSBfZWFzZU1hcC5MaW5lYXIuZWFzZUluO1xyXG5cclxuICBfaW5zZXJ0RWFzZShcIkVsYXN0aWNcIiwgX2NvbmZpZ0VsYXN0aWMoXCJpblwiKSwgX2NvbmZpZ0VsYXN0aWMoXCJvdXRcIiksIF9jb25maWdFbGFzdGljKCkpO1xyXG5cclxuICAoZnVuY3Rpb24gKG4sIGMpIHtcclxuICAgIHZhciBuMSA9IDEgLyBjLFxyXG4gICAgICAgIG4yID0gMiAqIG4xLFxyXG4gICAgICAgIG4zID0gMi41ICogbjEsXHJcbiAgICAgICAgZWFzZU91dCA9IGZ1bmN0aW9uIGVhc2VPdXQocCkge1xyXG4gICAgICByZXR1cm4gcCA8IG4xID8gbiAqIHAgKiBwIDogcCA8IG4yID8gbiAqIE1hdGgucG93KHAgLSAxLjUgLyBjLCAyKSArIC43NSA6IHAgPCBuMyA/IG4gKiAocCAtPSAyLjI1IC8gYykgKiBwICsgLjkzNzUgOiBuICogTWF0aC5wb3cocCAtIDIuNjI1IC8gYywgMikgKyAuOTg0Mzc1O1xyXG4gICAgfTtcclxuXHJcbiAgICBfaW5zZXJ0RWFzZShcIkJvdW5jZVwiLCBmdW5jdGlvbiAocCkge1xyXG4gICAgICByZXR1cm4gMSAtIGVhc2VPdXQoMSAtIHApO1xyXG4gICAgfSwgZWFzZU91dCk7XHJcbiAgfSkoNy41NjI1LCAyLjc1KTtcclxuXHJcbiAgX2luc2VydEVhc2UoXCJFeHBvXCIsIGZ1bmN0aW9uIChwKSB7XHJcbiAgICByZXR1cm4gTWF0aC5wb3coMiwgMTAgKiAocCAtIDEpKSAqIHAgKyBwICogcCAqIHAgKiBwICogcCAqIHAgKiAoMSAtIHApO1xyXG4gIH0pO1xyXG5cclxuICBfaW5zZXJ0RWFzZShcIkNpcmNcIiwgZnVuY3Rpb24gKHApIHtcclxuICAgIHJldHVybiAtKF9zcXJ0KDEgLSBwICogcCkgLSAxKTtcclxuICB9KTtcclxuXHJcbiAgX2luc2VydEVhc2UoXCJTaW5lXCIsIGZ1bmN0aW9uIChwKSB7XHJcbiAgICByZXR1cm4gcCA9PT0gMSA/IDEgOiAtX2NvcyhwICogX0hBTEZfUEkpICsgMTtcclxuICB9KTtcclxuXHJcbiAgX2luc2VydEVhc2UoXCJCYWNrXCIsIF9jb25maWdCYWNrKFwiaW5cIiksIF9jb25maWdCYWNrKFwib3V0XCIpLCBfY29uZmlnQmFjaygpKTtcclxuXHJcbiAgX2Vhc2VNYXAuU3RlcHBlZEVhc2UgPSBfZWFzZU1hcC5zdGVwcyA9IF9nbG9iYWxzLlN0ZXBwZWRFYXNlID0ge1xyXG4gICAgY29uZmlnOiBmdW5jdGlvbiBjb25maWcoc3RlcHMsIGltbWVkaWF0ZVN0YXJ0KSB7XHJcbiAgICAgIGlmIChzdGVwcyA9PT0gdm9pZCAwKSB7XHJcbiAgICAgICAgc3RlcHMgPSAxO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB2YXIgcDEgPSAxIC8gc3RlcHMsXHJcbiAgICAgICAgICBwMiA9IHN0ZXBzICsgKGltbWVkaWF0ZVN0YXJ0ID8gMCA6IDEpLFxyXG4gICAgICAgICAgcDMgPSBpbW1lZGlhdGVTdGFydCA/IDEgOiAwLFxyXG4gICAgICAgICAgbWF4ID0gMSAtIF90aW55TnVtO1xyXG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHApIHtcclxuICAgICAgICByZXR1cm4gKChwMiAqIF9jbGFtcCgwLCBtYXgsIHApIHwgMCkgKyBwMykgKiBwMTtcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9O1xyXG4gIF9kZWZhdWx0cy5lYXNlID0gX2Vhc2VNYXBbXCJxdWFkLm91dFwiXTtcclxuXHJcbiAgX2ZvckVhY2hOYW1lKFwib25Db21wbGV0ZSxvblVwZGF0ZSxvblN0YXJ0LG9uUmVwZWF0LG9uUmV2ZXJzZUNvbXBsZXRlLG9uSW50ZXJydXB0XCIsIGZ1bmN0aW9uIChuYW1lKSB7XHJcbiAgICByZXR1cm4gX2NhbGxiYWNrTmFtZXMgKz0gbmFtZSArIFwiLFwiICsgbmFtZSArIFwiUGFyYW1zLFwiO1xyXG4gIH0pO1xyXG5cclxuICB2YXIgR1NDYWNoZSA9IGZ1bmN0aW9uIEdTQ2FjaGUodGFyZ2V0LCBoYXJuZXNzKSB7XHJcbiAgICB0aGlzLmlkID0gX2dzSUQrKztcclxuICAgIHRhcmdldC5fZ3NhcCA9IHRoaXM7XHJcbiAgICB0aGlzLnRhcmdldCA9IHRhcmdldDtcclxuICAgIHRoaXMuaGFybmVzcyA9IGhhcm5lc3M7XHJcbiAgICB0aGlzLmdldCA9IGhhcm5lc3MgPyBoYXJuZXNzLmdldCA6IF9nZXRQcm9wZXJ0eTtcclxuICAgIHRoaXMuc2V0ID0gaGFybmVzcyA/IGhhcm5lc3MuZ2V0U2V0dGVyIDogX2dldFNldHRlcjtcclxuICB9O1xyXG4gIHZhciBBbmltYXRpb24gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBBbmltYXRpb24odmFycykge1xyXG4gICAgICB0aGlzLnZhcnMgPSB2YXJzO1xyXG4gICAgICB0aGlzLl9kZWxheSA9ICt2YXJzLmRlbGF5IHx8IDA7XHJcblxyXG4gICAgICBpZiAodGhpcy5fcmVwZWF0ID0gdmFycy5yZXBlYXQgPT09IEluZmluaXR5ID8gLTIgOiB2YXJzLnJlcGVhdCB8fCAwKSB7XHJcbiAgICAgICAgdGhpcy5fckRlbGF5ID0gdmFycy5yZXBlYXREZWxheSB8fCAwO1xyXG4gICAgICAgIHRoaXMuX3lveW8gPSAhIXZhcnMueW95byB8fCAhIXZhcnMueW95b0Vhc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX3RzID0gMTtcclxuXHJcbiAgICAgIF9zZXREdXJhdGlvbih0aGlzLCArdmFycy5kdXJhdGlvbiwgMSwgMSk7XHJcblxyXG4gICAgICB0aGlzLmRhdGEgPSB2YXJzLmRhdGE7XHJcblxyXG4gICAgICBpZiAoX2NvbnRleHQpIHtcclxuICAgICAgICB0aGlzLl9jdHggPSBfY29udGV4dDtcclxuXHJcbiAgICAgICAgX2NvbnRleHQuZGF0YS5wdXNoKHRoaXMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBfdGlja2VyQWN0aXZlIHx8IF90aWNrZXIud2FrZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBfcHJvdG8gPSBBbmltYXRpb24ucHJvdG90eXBlO1xyXG5cclxuICAgIF9wcm90by5kZWxheSA9IGZ1bmN0aW9uIGRlbGF5KHZhbHVlKSB7XHJcbiAgICAgIGlmICh2YWx1ZSB8fCB2YWx1ZSA9PT0gMCkge1xyXG4gICAgICAgIHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LnNtb290aENoaWxkVGltaW5nICYmIHRoaXMuc3RhcnRUaW1lKHRoaXMuX3N0YXJ0ICsgdmFsdWUgLSB0aGlzLl9kZWxheSk7XHJcbiAgICAgICAgdGhpcy5fZGVsYXkgPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuX2RlbGF5O1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8uZHVyYXRpb24gPSBmdW5jdGlvbiBkdXJhdGlvbih2YWx1ZSkge1xyXG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMudG90YWxEdXJhdGlvbih0aGlzLl9yZXBlYXQgPiAwID8gdmFsdWUgKyAodmFsdWUgKyB0aGlzLl9yRGVsYXkpICogdGhpcy5fcmVwZWF0IDogdmFsdWUpIDogdGhpcy50b3RhbER1cmF0aW9uKCkgJiYgdGhpcy5fZHVyO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8udG90YWxEdXJhdGlvbiA9IGZ1bmN0aW9uIHRvdGFsRHVyYXRpb24odmFsdWUpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3REdXI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX2RpcnR5ID0gMDtcclxuICAgICAgcmV0dXJuIF9zZXREdXJhdGlvbih0aGlzLCB0aGlzLl9yZXBlYXQgPCAwID8gdmFsdWUgOiAodmFsdWUgLSB0aGlzLl9yZXBlYXQgKiB0aGlzLl9yRGVsYXkpIC8gKHRoaXMuX3JlcGVhdCArIDEpKTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLnRvdGFsVGltZSA9IGZ1bmN0aW9uIHRvdGFsVGltZShfdG90YWxUaW1lLCBzdXBwcmVzc0V2ZW50cykge1xyXG4gICAgICBfd2FrZSgpO1xyXG5cclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RUaW1lO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB2YXIgcGFyZW50ID0gdGhpcy5fZHA7XHJcblxyXG4gICAgICBpZiAocGFyZW50ICYmIHBhcmVudC5zbW9vdGhDaGlsZFRpbWluZyAmJiB0aGlzLl90cykge1xyXG4gICAgICAgIF9hbGlnblBsYXloZWFkKHRoaXMsIF90b3RhbFRpbWUpO1xyXG5cclxuICAgICAgICAhcGFyZW50Ll9kcCB8fCBwYXJlbnQucGFyZW50IHx8IF9wb3N0QWRkQ2hlY2tzKHBhcmVudCwgdGhpcyk7XHJcblxyXG4gICAgICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50LnBhcmVudCkge1xyXG4gICAgICAgICAgaWYgKHBhcmVudC5wYXJlbnQuX3RpbWUgIT09IHBhcmVudC5fc3RhcnQgKyAocGFyZW50Ll90cyA+PSAwID8gcGFyZW50Ll90VGltZSAvIHBhcmVudC5fdHMgOiAocGFyZW50LnRvdGFsRHVyYXRpb24oKSAtIHBhcmVudC5fdFRpbWUpIC8gLXBhcmVudC5fdHMpKSB7XHJcbiAgICAgICAgICAgIHBhcmVudC50b3RhbFRpbWUocGFyZW50Ll90VGltZSwgdHJ1ZSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5wYXJlbnQgJiYgdGhpcy5fZHAuYXV0b1JlbW92ZUNoaWxkcmVuICYmICh0aGlzLl90cyA+IDAgJiYgX3RvdGFsVGltZSA8IHRoaXMuX3REdXIgfHwgdGhpcy5fdHMgPCAwICYmIF90b3RhbFRpbWUgPiAwIHx8ICF0aGlzLl90RHVyICYmICFfdG90YWxUaW1lKSkge1xyXG4gICAgICAgICAgX2FkZFRvVGltZWxpbmUodGhpcy5fZHAsIHRoaXMsIHRoaXMuX3N0YXJ0IC0gdGhpcy5fZGVsYXkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuX3RUaW1lICE9PSBfdG90YWxUaW1lIHx8ICF0aGlzLl9kdXIgJiYgIXN1cHByZXNzRXZlbnRzIHx8IHRoaXMuX2luaXR0ZWQgJiYgTWF0aC5hYnModGhpcy5felRpbWUpID09PSBfdGlueU51bSB8fCAhX3RvdGFsVGltZSAmJiAhdGhpcy5faW5pdHRlZCAmJiAodGhpcy5hZGQgfHwgdGhpcy5fcHRMb29rdXApKSB7XHJcbiAgICAgICAgdGhpcy5fdHMgfHwgKHRoaXMuX3BUaW1lID0gX3RvdGFsVGltZSk7XHJcblxyXG4gICAgICAgIF9sYXp5U2FmZVJlbmRlcih0aGlzLCBfdG90YWxUaW1lLCBzdXBwcmVzc0V2ZW50cyk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8udGltZSA9IGZ1bmN0aW9uIHRpbWUodmFsdWUsIHN1cHByZXNzRXZlbnRzKSB7XHJcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gdGhpcy50b3RhbFRpbWUoTWF0aC5taW4odGhpcy50b3RhbER1cmF0aW9uKCksIHZhbHVlICsgX2VsYXBzZWRDeWNsZUR1cmF0aW9uKHRoaXMpKSAlICh0aGlzLl9kdXIgKyB0aGlzLl9yRGVsYXkpIHx8ICh2YWx1ZSA/IHRoaXMuX2R1ciA6IDApLCBzdXBwcmVzc0V2ZW50cykgOiB0aGlzLl90aW1lO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8udG90YWxQcm9ncmVzcyA9IGZ1bmN0aW9uIHRvdGFsUHJvZ3Jlc3ModmFsdWUsIHN1cHByZXNzRXZlbnRzKSB7XHJcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gdGhpcy50b3RhbFRpbWUodGhpcy50b3RhbER1cmF0aW9uKCkgKiB2YWx1ZSwgc3VwcHJlc3NFdmVudHMpIDogdGhpcy50b3RhbER1cmF0aW9uKCkgPyBNYXRoLm1pbigxLCB0aGlzLl90VGltZSAvIHRoaXMuX3REdXIpIDogdGhpcy5yYXdUaW1lKCkgPj0gMCAmJiB0aGlzLl9pbml0dGVkID8gMSA6IDA7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90by5wcm9ncmVzcyA9IGZ1bmN0aW9uIHByb2dyZXNzKHZhbHVlLCBzdXBwcmVzc0V2ZW50cykge1xyXG4gICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHRoaXMudG90YWxUaW1lKHRoaXMuZHVyYXRpb24oKSAqICh0aGlzLl95b3lvICYmICEodGhpcy5pdGVyYXRpb24oKSAmIDEpID8gMSAtIHZhbHVlIDogdmFsdWUpICsgX2VsYXBzZWRDeWNsZUR1cmF0aW9uKHRoaXMpLCBzdXBwcmVzc0V2ZW50cykgOiB0aGlzLmR1cmF0aW9uKCkgPyBNYXRoLm1pbigxLCB0aGlzLl90aW1lIC8gdGhpcy5fZHVyKSA6IHRoaXMucmF3VGltZSgpID4gMCA/IDEgOiAwO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8uaXRlcmF0aW9uID0gZnVuY3Rpb24gaXRlcmF0aW9uKHZhbHVlLCBzdXBwcmVzc0V2ZW50cykge1xyXG4gICAgICB2YXIgY3ljbGVEdXJhdGlvbiA9IHRoaXMuZHVyYXRpb24oKSArIHRoaXMuX3JEZWxheTtcclxuXHJcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gdGhpcy50b3RhbFRpbWUodGhpcy5fdGltZSArICh2YWx1ZSAtIDEpICogY3ljbGVEdXJhdGlvbiwgc3VwcHJlc3NFdmVudHMpIDogdGhpcy5fcmVwZWF0ID8gX2FuaW1hdGlvbkN5Y2xlKHRoaXMuX3RUaW1lLCBjeWNsZUR1cmF0aW9uKSArIDEgOiAxO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8udGltZVNjYWxlID0gZnVuY3Rpb24gdGltZVNjYWxlKHZhbHVlLCBzdXBwcmVzc0V2ZW50cykge1xyXG4gICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcnRzID09PSAtX3RpbnlOdW0gPyAwIDogdGhpcy5fcnRzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5fcnRzID09PSB2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB2YXIgdFRpbWUgPSB0aGlzLnBhcmVudCAmJiB0aGlzLl90cyA/IF9wYXJlbnRUb0NoaWxkVG90YWxUaW1lKHRoaXMucGFyZW50Ll90aW1lLCB0aGlzKSA6IHRoaXMuX3RUaW1lO1xyXG4gICAgICB0aGlzLl9ydHMgPSArdmFsdWUgfHwgMDtcclxuICAgICAgdGhpcy5fdHMgPSB0aGlzLl9wcyB8fCB2YWx1ZSA9PT0gLV90aW55TnVtID8gMCA6IHRoaXMuX3J0cztcclxuICAgICAgdGhpcy50b3RhbFRpbWUoX2NsYW1wKC1NYXRoLmFicyh0aGlzLl9kZWxheSksIHRoaXMudG90YWxEdXJhdGlvbigpLCB0VGltZSksIHN1cHByZXNzRXZlbnRzICE9PSBmYWxzZSk7XHJcblxyXG4gICAgICBfc2V0RW5kKHRoaXMpO1xyXG5cclxuICAgICAgcmV0dXJuIF9yZWNhY2hlQW5jZXN0b3JzKHRoaXMpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8ucGF1c2VkID0gZnVuY3Rpb24gcGF1c2VkKHZhbHVlKSB7XHJcbiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wcztcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuX3BzICE9PSB2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX3BzID0gdmFsdWU7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgdGhpcy5fcFRpbWUgPSB0aGlzLl90VGltZSB8fCBNYXRoLm1heCgtdGhpcy5fZGVsYXksIHRoaXMucmF3VGltZSgpKTtcclxuICAgICAgICAgIHRoaXMuX3RzID0gdGhpcy5fYWN0ID0gMDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgX3dha2UoKTtcclxuXHJcbiAgICAgICAgICB0aGlzLl90cyA9IHRoaXMuX3J0cztcclxuICAgICAgICAgIHRoaXMudG90YWxUaW1lKHRoaXMucGFyZW50ICYmICF0aGlzLnBhcmVudC5zbW9vdGhDaGlsZFRpbWluZyA/IHRoaXMucmF3VGltZSgpIDogdGhpcy5fdFRpbWUgfHwgdGhpcy5fcFRpbWUsIHRoaXMucHJvZ3Jlc3MoKSA9PT0gMSAmJiBNYXRoLmFicyh0aGlzLl96VGltZSkgIT09IF90aW55TnVtICYmICh0aGlzLl90VGltZSAtPSBfdGlueU51bSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90by5zdGFydFRpbWUgPSBmdW5jdGlvbiBzdGFydFRpbWUodmFsdWUpIHtcclxuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLl9zdGFydCA9IHZhbHVlO1xyXG4gICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudCB8fCB0aGlzLl9kcDtcclxuICAgICAgICBwYXJlbnQgJiYgKHBhcmVudC5fc29ydCB8fCAhdGhpcy5wYXJlbnQpICYmIF9hZGRUb1RpbWVsaW5lKHBhcmVudCwgdGhpcywgdmFsdWUgLSB0aGlzLl9kZWxheSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLl9zdGFydDtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLmVuZFRpbWUgPSBmdW5jdGlvbiBlbmRUaW1lKGluY2x1ZGVSZXBlYXRzKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl9zdGFydCArIChfaXNOb3RGYWxzZShpbmNsdWRlUmVwZWF0cykgPyB0aGlzLnRvdGFsRHVyYXRpb24oKSA6IHRoaXMuZHVyYXRpb24oKSkgLyBNYXRoLmFicyh0aGlzLl90cyB8fCAxKTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLnJhd1RpbWUgPSBmdW5jdGlvbiByYXdUaW1lKHdyYXBSZXBlYXRzKSB7XHJcbiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudCB8fCB0aGlzLl9kcDtcclxuICAgICAgcmV0dXJuICFwYXJlbnQgPyB0aGlzLl90VGltZSA6IHdyYXBSZXBlYXRzICYmICghdGhpcy5fdHMgfHwgdGhpcy5fcmVwZWF0ICYmIHRoaXMuX3RpbWUgJiYgdGhpcy50b3RhbFByb2dyZXNzKCkgPCAxKSA/IHRoaXMuX3RUaW1lICUgKHRoaXMuX2R1ciArIHRoaXMuX3JEZWxheSkgOiAhdGhpcy5fdHMgPyB0aGlzLl90VGltZSA6IF9wYXJlbnRUb0NoaWxkVG90YWxUaW1lKHBhcmVudC5yYXdUaW1lKHdyYXBSZXBlYXRzKSwgdGhpcyk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90by5yZXZlcnQgPSBmdW5jdGlvbiByZXZlcnQoY29uZmlnKSB7XHJcbiAgICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkge1xyXG4gICAgICAgIGNvbmZpZyA9IF9yZXZlcnRDb25maWc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciBwcmV2SXNSZXZlcnRpbmcgPSBfcmV2ZXJ0aW5nO1xyXG4gICAgICBfcmV2ZXJ0aW5nID0gY29uZmlnO1xyXG5cclxuICAgICAgaWYgKF9pc1JldmVydFdvcnRoeSh0aGlzKSkge1xyXG4gICAgICAgIHRoaXMudGltZWxpbmUgJiYgdGhpcy50aW1lbGluZS5yZXZlcnQoY29uZmlnKTtcclxuICAgICAgICB0aGlzLnRvdGFsVGltZSgtMC4wMSwgY29uZmlnLnN1cHByZXNzRXZlbnRzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5kYXRhICE9PSBcIm5lc3RlZFwiICYmIGNvbmZpZy5raWxsICE9PSBmYWxzZSAmJiB0aGlzLmtpbGwoKTtcclxuICAgICAgX3JldmVydGluZyA9IHByZXZJc1JldmVydGluZztcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90by5nbG9iYWxUaW1lID0gZnVuY3Rpb24gZ2xvYmFsVGltZShyYXdUaW1lKSB7XHJcbiAgICAgIHZhciBhbmltYXRpb24gPSB0aGlzLFxyXG4gICAgICAgICAgdGltZSA9IGFyZ3VtZW50cy5sZW5ndGggPyByYXdUaW1lIDogYW5pbWF0aW9uLnJhd1RpbWUoKTtcclxuXHJcbiAgICAgIHdoaWxlIChhbmltYXRpb24pIHtcclxuICAgICAgICB0aW1lID0gYW5pbWF0aW9uLl9zdGFydCArIHRpbWUgLyAoTWF0aC5hYnMoYW5pbWF0aW9uLl90cykgfHwgMSk7XHJcbiAgICAgICAgYW5pbWF0aW9uID0gYW5pbWF0aW9uLl9kcDtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuICF0aGlzLnBhcmVudCAmJiB0aGlzLl9zYXQgPyB0aGlzLl9zYXQuZ2xvYmFsVGltZShyYXdUaW1lKSA6IHRpbWU7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90by5yZXBlYXQgPSBmdW5jdGlvbiByZXBlYXQodmFsdWUpIHtcclxuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLl9yZXBlYXQgPSB2YWx1ZSA9PT0gSW5maW5pdHkgPyAtMiA6IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiBfb25VcGRhdGVUb3RhbER1cmF0aW9uKHRoaXMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5fcmVwZWF0ID09PSAtMiA/IEluZmluaXR5IDogdGhpcy5fcmVwZWF0O1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8ucmVwZWF0RGVsYXkgPSBmdW5jdGlvbiByZXBlYXREZWxheSh2YWx1ZSkge1xyXG4gICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCkge1xyXG4gICAgICAgIHZhciB0aW1lID0gdGhpcy5fdGltZTtcclxuICAgICAgICB0aGlzLl9yRGVsYXkgPSB2YWx1ZTtcclxuXHJcbiAgICAgICAgX29uVXBkYXRlVG90YWxEdXJhdGlvbih0aGlzKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRpbWUgPyB0aGlzLnRpbWUodGltZSkgOiB0aGlzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcy5fckRlbGF5O1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8ueW95byA9IGZ1bmN0aW9uIHlveW8odmFsdWUpIHtcclxuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcclxuICAgICAgICB0aGlzLl95b3lvID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLl95b3lvO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8uc2VlayA9IGZ1bmN0aW9uIHNlZWsocG9zaXRpb24sIHN1cHByZXNzRXZlbnRzKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRvdGFsVGltZShfcGFyc2VQb3NpdGlvbih0aGlzLCBwb3NpdGlvbiksIF9pc05vdEZhbHNlKHN1cHByZXNzRXZlbnRzKSk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90by5yZXN0YXJ0ID0gZnVuY3Rpb24gcmVzdGFydChpbmNsdWRlRGVsYXksIHN1cHByZXNzRXZlbnRzKSB7XHJcbiAgICAgIHRoaXMucGxheSgpLnRvdGFsVGltZShpbmNsdWRlRGVsYXkgPyAtdGhpcy5fZGVsYXkgOiAwLCBfaXNOb3RGYWxzZShzdXBwcmVzc0V2ZW50cykpO1xyXG4gICAgICB0aGlzLl9kdXIgfHwgKHRoaXMuX3pUaW1lID0gLV90aW55TnVtKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90by5wbGF5ID0gZnVuY3Rpb24gcGxheShmcm9tLCBzdXBwcmVzc0V2ZW50cykge1xyXG4gICAgICBmcm9tICE9IG51bGwgJiYgdGhpcy5zZWVrKGZyb20sIHN1cHByZXNzRXZlbnRzKTtcclxuICAgICAgcmV0dXJuIHRoaXMucmV2ZXJzZWQoZmFsc2UpLnBhdXNlZChmYWxzZSk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90by5yZXZlcnNlID0gZnVuY3Rpb24gcmV2ZXJzZShmcm9tLCBzdXBwcmVzc0V2ZW50cykge1xyXG4gICAgICBmcm9tICE9IG51bGwgJiYgdGhpcy5zZWVrKGZyb20gfHwgdGhpcy50b3RhbER1cmF0aW9uKCksIHN1cHByZXNzRXZlbnRzKTtcclxuICAgICAgcmV0dXJuIHRoaXMucmV2ZXJzZWQodHJ1ZSkucGF1c2VkKGZhbHNlKTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLnBhdXNlID0gZnVuY3Rpb24gcGF1c2UoYXRUaW1lLCBzdXBwcmVzc0V2ZW50cykge1xyXG4gICAgICBhdFRpbWUgIT0gbnVsbCAmJiB0aGlzLnNlZWsoYXRUaW1lLCBzdXBwcmVzc0V2ZW50cyk7XHJcbiAgICAgIHJldHVybiB0aGlzLnBhdXNlZCh0cnVlKTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLnJlc3VtZSA9IGZ1bmN0aW9uIHJlc3VtZSgpIHtcclxuICAgICAgcmV0dXJuIHRoaXMucGF1c2VkKGZhbHNlKTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLnJldmVyc2VkID0gZnVuY3Rpb24gcmV2ZXJzZWQodmFsdWUpIHtcclxuICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGgpIHtcclxuICAgICAgICAhIXZhbHVlICE9PSB0aGlzLnJldmVyc2VkKCkgJiYgdGhpcy50aW1lU2NhbGUoLXRoaXMuX3J0cyB8fCAodmFsdWUgPyAtX3RpbnlOdW0gOiAwKSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzLl9ydHMgPCAwO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8uaW52YWxpZGF0ZSA9IGZ1bmN0aW9uIGludmFsaWRhdGUoKSB7XHJcbiAgICAgIHRoaXMuX2luaXR0ZWQgPSB0aGlzLl9hY3QgPSAwO1xyXG4gICAgICB0aGlzLl96VGltZSA9IC1fdGlueU51bTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90by5pc0FjdGl2ZSA9IGZ1bmN0aW9uIGlzQWN0aXZlKCkge1xyXG4gICAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQgfHwgdGhpcy5fZHAsXHJcbiAgICAgICAgICBzdGFydCA9IHRoaXMuX3N0YXJ0LFxyXG4gICAgICAgICAgcmF3VGltZTtcclxuICAgICAgcmV0dXJuICEhKCFwYXJlbnQgfHwgdGhpcy5fdHMgJiYgdGhpcy5faW5pdHRlZCAmJiBwYXJlbnQuaXNBY3RpdmUoKSAmJiAocmF3VGltZSA9IHBhcmVudC5yYXdUaW1lKHRydWUpKSA+PSBzdGFydCAmJiByYXdUaW1lIDwgdGhpcy5lbmRUaW1lKHRydWUpIC0gX3RpbnlOdW0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8uZXZlbnRDYWxsYmFjayA9IGZ1bmN0aW9uIGV2ZW50Q2FsbGJhY2sodHlwZSwgY2FsbGJhY2ssIHBhcmFtcykge1xyXG4gICAgICB2YXIgdmFycyA9IHRoaXMudmFycztcclxuXHJcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIGlmICghY2FsbGJhY2spIHtcclxuICAgICAgICAgIGRlbGV0ZSB2YXJzW3R5cGVdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB2YXJzW3R5cGVdID0gY2FsbGJhY2s7XHJcbiAgICAgICAgICBwYXJhbXMgJiYgKHZhcnNbdHlwZSArIFwiUGFyYW1zXCJdID0gcGFyYW1zKTtcclxuICAgICAgICAgIHR5cGUgPT09IFwib25VcGRhdGVcIiAmJiAodGhpcy5fb25VcGRhdGUgPSBjYWxsYmFjayk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHZhcnNbdHlwZV07XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90by50aGVuID0gZnVuY3Rpb24gdGhlbihvbkZ1bGZpbGxlZCkge1xyXG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xyXG4gICAgICAgIHZhciBmID0gX2lzRnVuY3Rpb24ob25GdWxmaWxsZWQpID8gb25GdWxmaWxsZWQgOiBfcGFzc1Rocm91Z2gsXHJcbiAgICAgICAgICAgIF9yZXNvbHZlID0gZnVuY3Rpb24gX3Jlc29sdmUoKSB7XHJcbiAgICAgICAgICB2YXIgX3RoZW4gPSBzZWxmLnRoZW47XHJcbiAgICAgICAgICBzZWxmLnRoZW4gPSBudWxsO1xyXG4gICAgICAgICAgX2lzRnVuY3Rpb24oZikgJiYgKGYgPSBmKHNlbGYpKSAmJiAoZi50aGVuIHx8IGYgPT09IHNlbGYpICYmIChzZWxmLnRoZW4gPSBfdGhlbik7XHJcbiAgICAgICAgICByZXNvbHZlKGYpO1xyXG4gICAgICAgICAgc2VsZi50aGVuID0gX3RoZW47XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHNlbGYuX2luaXR0ZWQgJiYgc2VsZi50b3RhbFByb2dyZXNzKCkgPT09IDEgJiYgc2VsZi5fdHMgPj0gMCB8fCAhc2VsZi5fdFRpbWUgJiYgc2VsZi5fdHMgPCAwKSB7XHJcbiAgICAgICAgICBfcmVzb2x2ZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBzZWxmLl9wcm9tID0gX3Jlc29sdmU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvLmtpbGwgPSBmdW5jdGlvbiBraWxsKCkge1xyXG4gICAgICBfaW50ZXJydXB0KHRoaXMpO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gQW5pbWF0aW9uO1xyXG4gIH0oKTtcclxuXHJcbiAgX3NldERlZmF1bHRzKEFuaW1hdGlvbi5wcm90b3R5cGUsIHtcclxuICAgIF90aW1lOiAwLFxyXG4gICAgX3N0YXJ0OiAwLFxyXG4gICAgX2VuZDogMCxcclxuICAgIF90VGltZTogMCxcclxuICAgIF90RHVyOiAwLFxyXG4gICAgX2RpcnR5OiAwLFxyXG4gICAgX3JlcGVhdDogMCxcclxuICAgIF95b3lvOiBmYWxzZSxcclxuICAgIHBhcmVudDogbnVsbCxcclxuICAgIF9pbml0dGVkOiBmYWxzZSxcclxuICAgIF9yRGVsYXk6IDAsXHJcbiAgICBfdHM6IDEsXHJcbiAgICBfZHA6IDAsXHJcbiAgICByYXRpbzogMCxcclxuICAgIF96VGltZTogLV90aW55TnVtLFxyXG4gICAgX3Byb206IDAsXHJcbiAgICBfcHM6IGZhbHNlLFxyXG4gICAgX3J0czogMVxyXG4gIH0pO1xyXG5cclxuICB2YXIgVGltZWxpbmUgPSBmdW5jdGlvbiAoX0FuaW1hdGlvbikge1xyXG4gICAgX2luaGVyaXRzTG9vc2UoVGltZWxpbmUsIF9BbmltYXRpb24pO1xyXG5cclxuICAgIGZ1bmN0aW9uIFRpbWVsaW5lKHZhcnMsIHBvc2l0aW9uKSB7XHJcbiAgICAgIHZhciBfdGhpcztcclxuXHJcbiAgICAgIGlmICh2YXJzID09PSB2b2lkIDApIHtcclxuICAgICAgICB2YXJzID0ge307XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIF90aGlzID0gX0FuaW1hdGlvbi5jYWxsKHRoaXMsIHZhcnMpIHx8IHRoaXM7XHJcbiAgICAgIF90aGlzLmxhYmVscyA9IHt9O1xyXG4gICAgICBfdGhpcy5zbW9vdGhDaGlsZFRpbWluZyA9ICEhdmFycy5zbW9vdGhDaGlsZFRpbWluZztcclxuICAgICAgX3RoaXMuYXV0b1JlbW92ZUNoaWxkcmVuID0gISF2YXJzLmF1dG9SZW1vdmVDaGlsZHJlbjtcclxuICAgICAgX3RoaXMuX3NvcnQgPSBfaXNOb3RGYWxzZSh2YXJzLnNvcnRDaGlsZHJlbik7XHJcbiAgICAgIF9nbG9iYWxUaW1lbGluZSAmJiBfYWRkVG9UaW1lbGluZSh2YXJzLnBhcmVudCB8fCBfZ2xvYmFsVGltZWxpbmUsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMpLCBwb3NpdGlvbik7XHJcbiAgICAgIHZhcnMucmV2ZXJzZWQgJiYgX3RoaXMucmV2ZXJzZSgpO1xyXG4gICAgICB2YXJzLnBhdXNlZCAmJiBfdGhpcy5wYXVzZWQodHJ1ZSk7XHJcbiAgICAgIHZhcnMuc2Nyb2xsVHJpZ2dlciAmJiBfc2Nyb2xsVHJpZ2dlcihfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzKSwgdmFycy5zY3JvbGxUcmlnZ2VyKTtcclxuICAgICAgcmV0dXJuIF90aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBfcHJvdG8yID0gVGltZWxpbmUucHJvdG90eXBlO1xyXG5cclxuICAgIF9wcm90bzIudG8gPSBmdW5jdGlvbiB0byh0YXJnZXRzLCB2YXJzLCBwb3NpdGlvbikge1xyXG4gICAgICBfY3JlYXRlVHdlZW5UeXBlKDAsIGFyZ3VtZW50cywgdGhpcyk7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvMi5mcm9tID0gZnVuY3Rpb24gZnJvbSh0YXJnZXRzLCB2YXJzLCBwb3NpdGlvbikge1xyXG4gICAgICBfY3JlYXRlVHdlZW5UeXBlKDEsIGFyZ3VtZW50cywgdGhpcyk7XHJcblxyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvMi5mcm9tVG8gPSBmdW5jdGlvbiBmcm9tVG8odGFyZ2V0cywgZnJvbVZhcnMsIHRvVmFycywgcG9zaXRpb24pIHtcclxuICAgICAgX2NyZWF0ZVR3ZWVuVHlwZSgyLCBhcmd1bWVudHMsIHRoaXMpO1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90bzIuc2V0ID0gZnVuY3Rpb24gc2V0KHRhcmdldHMsIHZhcnMsIHBvc2l0aW9uKSB7XHJcbiAgICAgIHZhcnMuZHVyYXRpb24gPSAwO1xyXG4gICAgICB2YXJzLnBhcmVudCA9IHRoaXM7XHJcbiAgICAgIF9pbmhlcml0RGVmYXVsdHModmFycykucmVwZWF0RGVsYXkgfHwgKHZhcnMucmVwZWF0ID0gMCk7XHJcbiAgICAgIHZhcnMuaW1tZWRpYXRlUmVuZGVyID0gISF2YXJzLmltbWVkaWF0ZVJlbmRlcjtcclxuICAgICAgbmV3IFR3ZWVuKHRhcmdldHMsIHZhcnMsIF9wYXJzZVBvc2l0aW9uKHRoaXMsIHBvc2l0aW9uKSwgMSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8yLmNhbGwgPSBmdW5jdGlvbiBjYWxsKGNhbGxiYWNrLCBwYXJhbXMsIHBvc2l0aW9uKSB7XHJcbiAgICAgIHJldHVybiBfYWRkVG9UaW1lbGluZSh0aGlzLCBUd2Vlbi5kZWxheWVkQ2FsbCgwLCBjYWxsYmFjaywgcGFyYW1zKSwgcG9zaXRpb24pO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8yLnN0YWdnZXJUbyA9IGZ1bmN0aW9uIHN0YWdnZXJUbyh0YXJnZXRzLCBkdXJhdGlvbiwgdmFycywgc3RhZ2dlciwgcG9zaXRpb24sIG9uQ29tcGxldGVBbGwsIG9uQ29tcGxldGVBbGxQYXJhbXMpIHtcclxuICAgICAgdmFycy5kdXJhdGlvbiA9IGR1cmF0aW9uO1xyXG4gICAgICB2YXJzLnN0YWdnZXIgPSB2YXJzLnN0YWdnZXIgfHwgc3RhZ2dlcjtcclxuICAgICAgdmFycy5vbkNvbXBsZXRlID0gb25Db21wbGV0ZUFsbDtcclxuICAgICAgdmFycy5vbkNvbXBsZXRlUGFyYW1zID0gb25Db21wbGV0ZUFsbFBhcmFtcztcclxuICAgICAgdmFycy5wYXJlbnQgPSB0aGlzO1xyXG4gICAgICBuZXcgVHdlZW4odGFyZ2V0cywgdmFycywgX3BhcnNlUG9zaXRpb24odGhpcywgcG9zaXRpb24pKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90bzIuc3RhZ2dlckZyb20gPSBmdW5jdGlvbiBzdGFnZ2VyRnJvbSh0YXJnZXRzLCBkdXJhdGlvbiwgdmFycywgc3RhZ2dlciwgcG9zaXRpb24sIG9uQ29tcGxldGVBbGwsIG9uQ29tcGxldGVBbGxQYXJhbXMpIHtcclxuICAgICAgdmFycy5ydW5CYWNrd2FyZHMgPSAxO1xyXG4gICAgICBfaW5oZXJpdERlZmF1bHRzKHZhcnMpLmltbWVkaWF0ZVJlbmRlciA9IF9pc05vdEZhbHNlKHZhcnMuaW1tZWRpYXRlUmVuZGVyKTtcclxuICAgICAgcmV0dXJuIHRoaXMuc3RhZ2dlclRvKHRhcmdldHMsIGR1cmF0aW9uLCB2YXJzLCBzdGFnZ2VyLCBwb3NpdGlvbiwgb25Db21wbGV0ZUFsbCwgb25Db21wbGV0ZUFsbFBhcmFtcyk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90bzIuc3RhZ2dlckZyb21UbyA9IGZ1bmN0aW9uIHN0YWdnZXJGcm9tVG8odGFyZ2V0cywgZHVyYXRpb24sIGZyb21WYXJzLCB0b1ZhcnMsIHN0YWdnZXIsIHBvc2l0aW9uLCBvbkNvbXBsZXRlQWxsLCBvbkNvbXBsZXRlQWxsUGFyYW1zKSB7XHJcbiAgICAgIHRvVmFycy5zdGFydEF0ID0gZnJvbVZhcnM7XHJcbiAgICAgIF9pbmhlcml0RGVmYXVsdHModG9WYXJzKS5pbW1lZGlhdGVSZW5kZXIgPSBfaXNOb3RGYWxzZSh0b1ZhcnMuaW1tZWRpYXRlUmVuZGVyKTtcclxuICAgICAgcmV0dXJuIHRoaXMuc3RhZ2dlclRvKHRhcmdldHMsIGR1cmF0aW9uLCB0b1ZhcnMsIHN0YWdnZXIsIHBvc2l0aW9uLCBvbkNvbXBsZXRlQWxsLCBvbkNvbXBsZXRlQWxsUGFyYW1zKTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvMi5yZW5kZXIgPSBmdW5jdGlvbiByZW5kZXIodG90YWxUaW1lLCBzdXBwcmVzc0V2ZW50cywgZm9yY2UpIHtcclxuICAgICAgdmFyIHByZXZUaW1lID0gdGhpcy5fdGltZSxcclxuICAgICAgICAgIHREdXIgPSB0aGlzLl9kaXJ0eSA/IHRoaXMudG90YWxEdXJhdGlvbigpIDogdGhpcy5fdER1cixcclxuICAgICAgICAgIGR1ciA9IHRoaXMuX2R1cixcclxuICAgICAgICAgIHRUaW1lID0gdG90YWxUaW1lIDw9IDAgPyAwIDogX3JvdW5kUHJlY2lzZSh0b3RhbFRpbWUpLFxyXG4gICAgICAgICAgY3Jvc3NpbmdTdGFydCA9IHRoaXMuX3pUaW1lIDwgMCAhPT0gdG90YWxUaW1lIDwgMCAmJiAodGhpcy5faW5pdHRlZCB8fCAhZHVyKSxcclxuICAgICAgICAgIHRpbWUsXHJcbiAgICAgICAgICBjaGlsZCxcclxuICAgICAgICAgIG5leHQsXHJcbiAgICAgICAgICBpdGVyYXRpb24sXHJcbiAgICAgICAgICBjeWNsZUR1cmF0aW9uLFxyXG4gICAgICAgICAgcHJldlBhdXNlZCxcclxuICAgICAgICAgIHBhdXNlVHdlZW4sXHJcbiAgICAgICAgICB0aW1lU2NhbGUsXHJcbiAgICAgICAgICBwcmV2U3RhcnQsXHJcbiAgICAgICAgICBwcmV2SXRlcmF0aW9uLFxyXG4gICAgICAgICAgeW95byxcclxuICAgICAgICAgIGlzWW95bztcclxuICAgICAgdGhpcyAhPT0gX2dsb2JhbFRpbWVsaW5lICYmIHRUaW1lID4gdER1ciAmJiB0b3RhbFRpbWUgPj0gMCAmJiAodFRpbWUgPSB0RHVyKTtcclxuXHJcbiAgICAgIGlmICh0VGltZSAhPT0gdGhpcy5fdFRpbWUgfHwgZm9yY2UgfHwgY3Jvc3NpbmdTdGFydCkge1xyXG4gICAgICAgIGlmIChwcmV2VGltZSAhPT0gdGhpcy5fdGltZSAmJiBkdXIpIHtcclxuICAgICAgICAgIHRUaW1lICs9IHRoaXMuX3RpbWUgLSBwcmV2VGltZTtcclxuICAgICAgICAgIHRvdGFsVGltZSArPSB0aGlzLl90aW1lIC0gcHJldlRpbWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aW1lID0gdFRpbWU7XHJcbiAgICAgICAgcHJldlN0YXJ0ID0gdGhpcy5fc3RhcnQ7XHJcbiAgICAgICAgdGltZVNjYWxlID0gdGhpcy5fdHM7XHJcbiAgICAgICAgcHJldlBhdXNlZCA9ICF0aW1lU2NhbGU7XHJcblxyXG4gICAgICAgIGlmIChjcm9zc2luZ1N0YXJ0KSB7XHJcbiAgICAgICAgICBkdXIgfHwgKHByZXZUaW1lID0gdGhpcy5felRpbWUpO1xyXG4gICAgICAgICAgKHRvdGFsVGltZSB8fCAhc3VwcHJlc3NFdmVudHMpICYmICh0aGlzLl96VGltZSA9IHRvdGFsVGltZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5fcmVwZWF0KSB7XHJcbiAgICAgICAgICB5b3lvID0gdGhpcy5feW95bztcclxuICAgICAgICAgIGN5Y2xlRHVyYXRpb24gPSBkdXIgKyB0aGlzLl9yRGVsYXk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuX3JlcGVhdCA8IC0xICYmIHRvdGFsVGltZSA8IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG90YWxUaW1lKGN5Y2xlRHVyYXRpb24gKiAxMDAgKyB0b3RhbFRpbWUsIHN1cHByZXNzRXZlbnRzLCBmb3JjZSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGltZSA9IF9yb3VuZFByZWNpc2UodFRpbWUgJSBjeWNsZUR1cmF0aW9uKTtcclxuXHJcbiAgICAgICAgICBpZiAodFRpbWUgPT09IHREdXIpIHtcclxuICAgICAgICAgICAgaXRlcmF0aW9uID0gdGhpcy5fcmVwZWF0O1xyXG4gICAgICAgICAgICB0aW1lID0gZHVyO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcHJldkl0ZXJhdGlvbiA9IF9yb3VuZFByZWNpc2UodFRpbWUgLyBjeWNsZUR1cmF0aW9uKTtcclxuICAgICAgICAgICAgaXRlcmF0aW9uID0gfn5wcmV2SXRlcmF0aW9uO1xyXG5cclxuICAgICAgICAgICAgaWYgKGl0ZXJhdGlvbiAmJiBpdGVyYXRpb24gPT09IHByZXZJdGVyYXRpb24pIHtcclxuICAgICAgICAgICAgICB0aW1lID0gZHVyO1xyXG4gICAgICAgICAgICAgIGl0ZXJhdGlvbi0tO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aW1lID4gZHVyICYmICh0aW1lID0gZHVyKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBwcmV2SXRlcmF0aW9uID0gX2FuaW1hdGlvbkN5Y2xlKHRoaXMuX3RUaW1lLCBjeWNsZUR1cmF0aW9uKTtcclxuICAgICAgICAgICFwcmV2VGltZSAmJiB0aGlzLl90VGltZSAmJiBwcmV2SXRlcmF0aW9uICE9PSBpdGVyYXRpb24gJiYgdGhpcy5fdFRpbWUgLSBwcmV2SXRlcmF0aW9uICogY3ljbGVEdXJhdGlvbiAtIHRoaXMuX2R1ciA8PSAwICYmIChwcmV2SXRlcmF0aW9uID0gaXRlcmF0aW9uKTtcclxuXHJcbiAgICAgICAgICBpZiAoeW95byAmJiBpdGVyYXRpb24gJiAxKSB7XHJcbiAgICAgICAgICAgIHRpbWUgPSBkdXIgLSB0aW1lO1xyXG4gICAgICAgICAgICBpc1lveW8gPSAxO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChpdGVyYXRpb24gIT09IHByZXZJdGVyYXRpb24gJiYgIXRoaXMuX2xvY2spIHtcclxuICAgICAgICAgICAgdmFyIHJld2luZGluZyA9IHlveW8gJiYgcHJldkl0ZXJhdGlvbiAmIDEsXHJcbiAgICAgICAgICAgICAgICBkb2VzV3JhcCA9IHJld2luZGluZyA9PT0gKHlveW8gJiYgaXRlcmF0aW9uICYgMSk7XHJcbiAgICAgICAgICAgIGl0ZXJhdGlvbiA8IHByZXZJdGVyYXRpb24gJiYgKHJld2luZGluZyA9ICFyZXdpbmRpbmcpO1xyXG4gICAgICAgICAgICBwcmV2VGltZSA9IHJld2luZGluZyA/IDAgOiB0VGltZSAlIGR1ciA/IGR1ciA6IHRUaW1lO1xyXG4gICAgICAgICAgICB0aGlzLl9sb2NrID0gMTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXIocHJldlRpbWUgfHwgKGlzWW95byA/IDAgOiBfcm91bmRQcmVjaXNlKGl0ZXJhdGlvbiAqIGN5Y2xlRHVyYXRpb24pKSwgc3VwcHJlc3NFdmVudHMsICFkdXIpLl9sb2NrID0gMDtcclxuICAgICAgICAgICAgdGhpcy5fdFRpbWUgPSB0VGltZTtcclxuICAgICAgICAgICAgIXN1cHByZXNzRXZlbnRzICYmIHRoaXMucGFyZW50ICYmIF9jYWxsYmFjayh0aGlzLCBcIm9uUmVwZWF0XCIpO1xyXG4gICAgICAgICAgICB0aGlzLnZhcnMucmVwZWF0UmVmcmVzaCAmJiAhaXNZb3lvICYmICh0aGlzLmludmFsaWRhdGUoKS5fbG9jayA9IDEpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHByZXZUaW1lICYmIHByZXZUaW1lICE9PSB0aGlzLl90aW1lIHx8IHByZXZQYXVzZWQgIT09ICF0aGlzLl90cyB8fCB0aGlzLnZhcnMub25SZXBlYXQgJiYgIXRoaXMucGFyZW50ICYmICF0aGlzLl9hY3QpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZHVyID0gdGhpcy5fZHVyO1xyXG4gICAgICAgICAgICB0RHVyID0gdGhpcy5fdER1cjtcclxuXHJcbiAgICAgICAgICAgIGlmIChkb2VzV3JhcCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2xvY2sgPSAyO1xyXG4gICAgICAgICAgICAgIHByZXZUaW1lID0gcmV3aW5kaW5nID8gZHVyIDogLTAuMDAwMTtcclxuICAgICAgICAgICAgICB0aGlzLnJlbmRlcihwcmV2VGltZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgdGhpcy52YXJzLnJlcGVhdFJlZnJlc2ggJiYgIWlzWW95byAmJiB0aGlzLmludmFsaWRhdGUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fbG9jayA9IDA7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3RzICYmICFwcmV2UGF1c2VkKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIF9wcm9wYWdhdGVZb3lvRWFzZSh0aGlzLCBpc1lveW8pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2hhc1BhdXNlICYmICF0aGlzLl9mb3JjaW5nICYmIHRoaXMuX2xvY2sgPCAyKSB7XHJcbiAgICAgICAgICBwYXVzZVR3ZWVuID0gX2ZpbmROZXh0UGF1c2VUd2Vlbih0aGlzLCBfcm91bmRQcmVjaXNlKHByZXZUaW1lKSwgX3JvdW5kUHJlY2lzZSh0aW1lKSk7XHJcblxyXG4gICAgICAgICAgaWYgKHBhdXNlVHdlZW4pIHtcclxuICAgICAgICAgICAgdFRpbWUgLT0gdGltZSAtICh0aW1lID0gcGF1c2VUd2Vlbi5fc3RhcnQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fdFRpbWUgPSB0VGltZTtcclxuICAgICAgICB0aGlzLl90aW1lID0gdGltZTtcclxuICAgICAgICB0aGlzLl9hY3QgPSAhdGltZVNjYWxlO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2luaXR0ZWQpIHtcclxuICAgICAgICAgIHRoaXMuX29uVXBkYXRlID0gdGhpcy52YXJzLm9uVXBkYXRlO1xyXG4gICAgICAgICAgdGhpcy5faW5pdHRlZCA9IDE7XHJcbiAgICAgICAgICB0aGlzLl96VGltZSA9IHRvdGFsVGltZTtcclxuICAgICAgICAgIHByZXZUaW1lID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghcHJldlRpbWUgJiYgdFRpbWUgJiYgIXN1cHByZXNzRXZlbnRzICYmICFwcmV2SXRlcmF0aW9uKSB7XHJcbiAgICAgICAgICBfY2FsbGJhY2sodGhpcywgXCJvblN0YXJ0XCIpO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLl90VGltZSAhPT0gdFRpbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGltZSA+PSBwcmV2VGltZSAmJiB0b3RhbFRpbWUgPj0gMCkge1xyXG4gICAgICAgICAgY2hpbGQgPSB0aGlzLl9maXJzdDtcclxuXHJcbiAgICAgICAgICB3aGlsZSAoY2hpbGQpIHtcclxuICAgICAgICAgICAgbmV4dCA9IGNoaWxkLl9uZXh0O1xyXG5cclxuICAgICAgICAgICAgaWYgKChjaGlsZC5fYWN0IHx8IHRpbWUgPj0gY2hpbGQuX3N0YXJ0KSAmJiBjaGlsZC5fdHMgJiYgcGF1c2VUd2VlbiAhPT0gY2hpbGQpIHtcclxuICAgICAgICAgICAgICBpZiAoY2hpbGQucGFyZW50ICE9PSB0aGlzKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXIodG90YWxUaW1lLCBzdXBwcmVzc0V2ZW50cywgZm9yY2UpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgY2hpbGQucmVuZGVyKGNoaWxkLl90cyA+IDAgPyAodGltZSAtIGNoaWxkLl9zdGFydCkgKiBjaGlsZC5fdHMgOiAoY2hpbGQuX2RpcnR5ID8gY2hpbGQudG90YWxEdXJhdGlvbigpIDogY2hpbGQuX3REdXIpICsgKHRpbWUgLSBjaGlsZC5fc3RhcnQpICogY2hpbGQuX3RzLCBzdXBwcmVzc0V2ZW50cywgZm9yY2UpO1xyXG5cclxuICAgICAgICAgICAgICBpZiAodGltZSAhPT0gdGhpcy5fdGltZSB8fCAhdGhpcy5fdHMgJiYgIXByZXZQYXVzZWQpIHtcclxuICAgICAgICAgICAgICAgIHBhdXNlVHdlZW4gPSAwO1xyXG4gICAgICAgICAgICAgICAgbmV4dCAmJiAodFRpbWUgKz0gdGhpcy5felRpbWUgPSAtX3RpbnlOdW0pO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjaGlsZCA9IG5leHQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNoaWxkID0gdGhpcy5fbGFzdDtcclxuICAgICAgICAgIHZhciBhZGp1c3RlZFRpbWUgPSB0b3RhbFRpbWUgPCAwID8gdG90YWxUaW1lIDogdGltZTtcclxuXHJcbiAgICAgICAgICB3aGlsZSAoY2hpbGQpIHtcclxuICAgICAgICAgICAgbmV4dCA9IGNoaWxkLl9wcmV2O1xyXG5cclxuICAgICAgICAgICAgaWYgKChjaGlsZC5fYWN0IHx8IGFkanVzdGVkVGltZSA8PSBjaGlsZC5fZW5kKSAmJiBjaGlsZC5fdHMgJiYgcGF1c2VUd2VlbiAhPT0gY2hpbGQpIHtcclxuICAgICAgICAgICAgICBpZiAoY2hpbGQucGFyZW50ICE9PSB0aGlzKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXIodG90YWxUaW1lLCBzdXBwcmVzc0V2ZW50cywgZm9yY2UpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgY2hpbGQucmVuZGVyKGNoaWxkLl90cyA+IDAgPyAoYWRqdXN0ZWRUaW1lIC0gY2hpbGQuX3N0YXJ0KSAqIGNoaWxkLl90cyA6IChjaGlsZC5fZGlydHkgPyBjaGlsZC50b3RhbER1cmF0aW9uKCkgOiBjaGlsZC5fdER1cikgKyAoYWRqdXN0ZWRUaW1lIC0gY2hpbGQuX3N0YXJ0KSAqIGNoaWxkLl90cywgc3VwcHJlc3NFdmVudHMsIGZvcmNlIHx8IF9yZXZlcnRpbmcgJiYgX2lzUmV2ZXJ0V29ydGh5KGNoaWxkKSk7XHJcblxyXG4gICAgICAgICAgICAgIGlmICh0aW1lICE9PSB0aGlzLl90aW1lIHx8ICF0aGlzLl90cyAmJiAhcHJldlBhdXNlZCkge1xyXG4gICAgICAgICAgICAgICAgcGF1c2VUd2VlbiA9IDA7XHJcbiAgICAgICAgICAgICAgICBuZXh0ICYmICh0VGltZSArPSB0aGlzLl96VGltZSA9IGFkanVzdGVkVGltZSA/IC1fdGlueU51bSA6IF90aW55TnVtKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY2hpbGQgPSBuZXh0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBhdXNlVHdlZW4gJiYgIXN1cHByZXNzRXZlbnRzKSB7XHJcbiAgICAgICAgICB0aGlzLnBhdXNlKCk7XHJcbiAgICAgICAgICBwYXVzZVR3ZWVuLnJlbmRlcih0aW1lID49IHByZXZUaW1lID8gMCA6IC1fdGlueU51bSkuX3pUaW1lID0gdGltZSA+PSBwcmV2VGltZSA/IDEgOiAtMTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5fdHMpIHtcclxuICAgICAgICAgICAgdGhpcy5fc3RhcnQgPSBwcmV2U3RhcnQ7XHJcblxyXG4gICAgICAgICAgICBfc2V0RW5kKHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyKHRvdGFsVGltZSwgc3VwcHJlc3NFdmVudHMsIGZvcmNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX29uVXBkYXRlICYmICFzdXBwcmVzc0V2ZW50cyAmJiBfY2FsbGJhY2sodGhpcywgXCJvblVwZGF0ZVwiLCB0cnVlKTtcclxuICAgICAgICBpZiAodFRpbWUgPT09IHREdXIgJiYgdGhpcy5fdFRpbWUgPj0gdGhpcy50b3RhbER1cmF0aW9uKCkgfHwgIXRUaW1lICYmIHByZXZUaW1lKSBpZiAocHJldlN0YXJ0ID09PSB0aGlzLl9zdGFydCB8fCBNYXRoLmFicyh0aW1lU2NhbGUpICE9PSBNYXRoLmFicyh0aGlzLl90cykpIGlmICghdGhpcy5fbG9jaykge1xyXG4gICAgICAgICAgKHRvdGFsVGltZSB8fCAhZHVyKSAmJiAodFRpbWUgPT09IHREdXIgJiYgdGhpcy5fdHMgPiAwIHx8ICF0VGltZSAmJiB0aGlzLl90cyA8IDApICYmIF9yZW1vdmVGcm9tUGFyZW50KHRoaXMsIDEpO1xyXG5cclxuICAgICAgICAgIGlmICghc3VwcHJlc3NFdmVudHMgJiYgISh0b3RhbFRpbWUgPCAwICYmICFwcmV2VGltZSkgJiYgKHRUaW1lIHx8IHByZXZUaW1lIHx8ICF0RHVyKSkge1xyXG4gICAgICAgICAgICBfY2FsbGJhY2sodGhpcywgdFRpbWUgPT09IHREdXIgJiYgdG90YWxUaW1lID49IDAgPyBcIm9uQ29tcGxldGVcIiA6IFwib25SZXZlcnNlQ29tcGxldGVcIiwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9wcm9tICYmICEodFRpbWUgPCB0RHVyICYmIHRoaXMudGltZVNjYWxlKCkgPiAwKSAmJiB0aGlzLl9wcm9tKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvMi5hZGQgPSBmdW5jdGlvbiBhZGQoY2hpbGQsIHBvc2l0aW9uKSB7XHJcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xyXG5cclxuICAgICAgX2lzTnVtYmVyKHBvc2l0aW9uKSB8fCAocG9zaXRpb24gPSBfcGFyc2VQb3NpdGlvbih0aGlzLCBwb3NpdGlvbiwgY2hpbGQpKTtcclxuXHJcbiAgICAgIGlmICghKGNoaWxkIGluc3RhbmNlb2YgQW5pbWF0aW9uKSkge1xyXG4gICAgICAgIGlmIChfaXNBcnJheShjaGlsZCkpIHtcclxuICAgICAgICAgIGNoaWxkLmZvckVhY2goZnVuY3Rpb24gKG9iaikge1xyXG4gICAgICAgICAgICByZXR1cm4gX3RoaXMyLmFkZChvYmosIHBvc2l0aW9uKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoX2lzU3RyaW5nKGNoaWxkKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuYWRkTGFiZWwoY2hpbGQsIHBvc2l0aW9uKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChfaXNGdW5jdGlvbihjaGlsZCkpIHtcclxuICAgICAgICAgIGNoaWxkID0gVHdlZW4uZGVsYXllZENhbGwoMCwgY2hpbGQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiB0aGlzICE9PSBjaGlsZCA/IF9hZGRUb1RpbWVsaW5lKHRoaXMsIGNoaWxkLCBwb3NpdGlvbikgOiB0aGlzO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8yLmdldENoaWxkcmVuID0gZnVuY3Rpb24gZ2V0Q2hpbGRyZW4obmVzdGVkLCB0d2VlbnMsIHRpbWVsaW5lcywgaWdub3JlQmVmb3JlVGltZSkge1xyXG4gICAgICBpZiAobmVzdGVkID09PSB2b2lkIDApIHtcclxuICAgICAgICBuZXN0ZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodHdlZW5zID09PSB2b2lkIDApIHtcclxuICAgICAgICB0d2VlbnMgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGltZWxpbmVzID09PSB2b2lkIDApIHtcclxuICAgICAgICB0aW1lbGluZXMgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaWdub3JlQmVmb3JlVGltZSA9PT0gdm9pZCAwKSB7XHJcbiAgICAgICAgaWdub3JlQmVmb3JlVGltZSA9IC1fYmlnTnVtO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB2YXIgYSA9IFtdLFxyXG4gICAgICAgICAgY2hpbGQgPSB0aGlzLl9maXJzdDtcclxuXHJcbiAgICAgIHdoaWxlIChjaGlsZCkge1xyXG4gICAgICAgIGlmIChjaGlsZC5fc3RhcnQgPj0gaWdub3JlQmVmb3JlVGltZSkge1xyXG4gICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgVHdlZW4pIHtcclxuICAgICAgICAgICAgdHdlZW5zICYmIGEucHVzaChjaGlsZCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aW1lbGluZXMgJiYgYS5wdXNoKGNoaWxkKTtcclxuICAgICAgICAgICAgbmVzdGVkICYmIGEucHVzaC5hcHBseShhLCBjaGlsZC5nZXRDaGlsZHJlbih0cnVlLCB0d2VlbnMsIHRpbWVsaW5lcykpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2hpbGQgPSBjaGlsZC5fbmV4dDtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGE7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90bzIuZ2V0QnlJZCA9IGZ1bmN0aW9uIGdldEJ5SWQoaWQpIHtcclxuICAgICAgdmFyIGFuaW1hdGlvbnMgPSB0aGlzLmdldENoaWxkcmVuKDEsIDEsIDEpLFxyXG4gICAgICAgICAgaSA9IGFuaW1hdGlvbnMubGVuZ3RoO1xyXG5cclxuICAgICAgd2hpbGUgKGktLSkge1xyXG4gICAgICAgIGlmIChhbmltYXRpb25zW2ldLnZhcnMuaWQgPT09IGlkKSB7XHJcbiAgICAgICAgICByZXR1cm4gYW5pbWF0aW9uc1tpXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvMi5yZW1vdmUgPSBmdW5jdGlvbiByZW1vdmUoY2hpbGQpIHtcclxuICAgICAgaWYgKF9pc1N0cmluZyhjaGlsZCkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVMYWJlbChjaGlsZCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChfaXNGdW5jdGlvbihjaGlsZCkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5raWxsVHdlZW5zT2YoY2hpbGQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjaGlsZC5wYXJlbnQgPT09IHRoaXMgJiYgX3JlbW92ZUxpbmtlZExpc3RJdGVtKHRoaXMsIGNoaWxkKTtcclxuXHJcbiAgICAgIGlmIChjaGlsZCA9PT0gdGhpcy5fcmVjZW50KSB7XHJcbiAgICAgICAgdGhpcy5fcmVjZW50ID0gdGhpcy5fbGFzdDtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIF91bmNhY2hlKHRoaXMpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8yLnRvdGFsVGltZSA9IGZ1bmN0aW9uIHRvdGFsVGltZShfdG90YWxUaW1lMiwgc3VwcHJlc3NFdmVudHMpIHtcclxuICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RUaW1lO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9mb3JjaW5nID0gMTtcclxuXHJcbiAgICAgIGlmICghdGhpcy5fZHAgJiYgdGhpcy5fdHMpIHtcclxuICAgICAgICB0aGlzLl9zdGFydCA9IF9yb3VuZFByZWNpc2UoX3RpY2tlci50aW1lIC0gKHRoaXMuX3RzID4gMCA/IF90b3RhbFRpbWUyIC8gdGhpcy5fdHMgOiAodGhpcy50b3RhbER1cmF0aW9uKCkgLSBfdG90YWxUaW1lMikgLyAtdGhpcy5fdHMpKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgX0FuaW1hdGlvbi5wcm90b3R5cGUudG90YWxUaW1lLmNhbGwodGhpcywgX3RvdGFsVGltZTIsIHN1cHByZXNzRXZlbnRzKTtcclxuXHJcbiAgICAgIHRoaXMuX2ZvcmNpbmcgPSAwO1xyXG4gICAgICByZXR1cm4gdGhpcztcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvMi5hZGRMYWJlbCA9IGZ1bmN0aW9uIGFkZExhYmVsKGxhYmVsLCBwb3NpdGlvbikge1xyXG4gICAgICB0aGlzLmxhYmVsc1tsYWJlbF0gPSBfcGFyc2VQb3NpdGlvbih0aGlzLCBwb3NpdGlvbik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8yLnJlbW92ZUxhYmVsID0gZnVuY3Rpb24gcmVtb3ZlTGFiZWwobGFiZWwpIHtcclxuICAgICAgZGVsZXRlIHRoaXMubGFiZWxzW2xhYmVsXTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90bzIuYWRkUGF1c2UgPSBmdW5jdGlvbiBhZGRQYXVzZShwb3NpdGlvbiwgY2FsbGJhY2ssIHBhcmFtcykge1xyXG4gICAgICB2YXIgdCA9IFR3ZWVuLmRlbGF5ZWRDYWxsKDAsIGNhbGxiYWNrIHx8IF9lbXB0eUZ1bmMsIHBhcmFtcyk7XHJcbiAgICAgIHQuZGF0YSA9IFwiaXNQYXVzZVwiO1xyXG4gICAgICB0aGlzLl9oYXNQYXVzZSA9IDE7XHJcbiAgICAgIHJldHVybiBfYWRkVG9UaW1lbGluZSh0aGlzLCB0LCBfcGFyc2VQb3NpdGlvbih0aGlzLCBwb3NpdGlvbikpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8yLnJlbW92ZVBhdXNlID0gZnVuY3Rpb24gcmVtb3ZlUGF1c2UocG9zaXRpb24pIHtcclxuICAgICAgdmFyIGNoaWxkID0gdGhpcy5fZmlyc3Q7XHJcbiAgICAgIHBvc2l0aW9uID0gX3BhcnNlUG9zaXRpb24odGhpcywgcG9zaXRpb24pO1xyXG5cclxuICAgICAgd2hpbGUgKGNoaWxkKSB7XHJcbiAgICAgICAgaWYgKGNoaWxkLl9zdGFydCA9PT0gcG9zaXRpb24gJiYgY2hpbGQuZGF0YSA9PT0gXCJpc1BhdXNlXCIpIHtcclxuICAgICAgICAgIF9yZW1vdmVGcm9tUGFyZW50KGNoaWxkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNoaWxkID0gY2hpbGQuX25leHQ7XHJcbiAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvMi5raWxsVHdlZW5zT2YgPSBmdW5jdGlvbiBraWxsVHdlZW5zT2YodGFyZ2V0cywgcHJvcHMsIG9ubHlBY3RpdmUpIHtcclxuICAgICAgdmFyIHR3ZWVucyA9IHRoaXMuZ2V0VHdlZW5zT2YodGFyZ2V0cywgb25seUFjdGl2ZSksXHJcbiAgICAgICAgICBpID0gdHdlZW5zLmxlbmd0aDtcclxuXHJcbiAgICAgIHdoaWxlIChpLS0pIHtcclxuICAgICAgICBfb3ZlcndyaXRpbmdUd2VlbiAhPT0gdHdlZW5zW2ldICYmIHR3ZWVuc1tpXS5raWxsKHRhcmdldHMsIHByb3BzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90bzIuZ2V0VHdlZW5zT2YgPSBmdW5jdGlvbiBnZXRUd2VlbnNPZih0YXJnZXRzLCBvbmx5QWN0aXZlKSB7XHJcbiAgICAgIHZhciBhID0gW10sXHJcbiAgICAgICAgICBwYXJzZWRUYXJnZXRzID0gdG9BcnJheSh0YXJnZXRzKSxcclxuICAgICAgICAgIGNoaWxkID0gdGhpcy5fZmlyc3QsXHJcbiAgICAgICAgICBpc0dsb2JhbFRpbWUgPSBfaXNOdW1iZXIob25seUFjdGl2ZSksXHJcbiAgICAgICAgICBjaGlsZHJlbjtcclxuXHJcbiAgICAgIHdoaWxlIChjaGlsZCkge1xyXG4gICAgICAgIGlmIChjaGlsZCBpbnN0YW5jZW9mIFR3ZWVuKSB7XHJcbiAgICAgICAgICBpZiAoX2FycmF5Q29udGFpbnNBbnkoY2hpbGQuX3RhcmdldHMsIHBhcnNlZFRhcmdldHMpICYmIChpc0dsb2JhbFRpbWUgPyAoIV9vdmVyd3JpdGluZ1R3ZWVuIHx8IGNoaWxkLl9pbml0dGVkICYmIGNoaWxkLl90cykgJiYgY2hpbGQuZ2xvYmFsVGltZSgwKSA8PSBvbmx5QWN0aXZlICYmIGNoaWxkLmdsb2JhbFRpbWUoY2hpbGQudG90YWxEdXJhdGlvbigpKSA+IG9ubHlBY3RpdmUgOiAhb25seUFjdGl2ZSB8fCBjaGlsZC5pc0FjdGl2ZSgpKSkge1xyXG4gICAgICAgICAgICBhLnB1c2goY2hpbGQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoKGNoaWxkcmVuID0gY2hpbGQuZ2V0VHdlZW5zT2YocGFyc2VkVGFyZ2V0cywgb25seUFjdGl2ZSkpLmxlbmd0aCkge1xyXG4gICAgICAgICAgYS5wdXNoLmFwcGx5KGEsIGNoaWxkcmVuKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNoaWxkID0gY2hpbGQuX25leHQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBhO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8yLnR3ZWVuVG8gPSBmdW5jdGlvbiB0d2VlblRvKHBvc2l0aW9uLCB2YXJzKSB7XHJcbiAgICAgIHZhcnMgPSB2YXJzIHx8IHt9O1xyXG5cclxuICAgICAgdmFyIHRsID0gdGhpcyxcclxuICAgICAgICAgIGVuZFRpbWUgPSBfcGFyc2VQb3NpdGlvbih0bCwgcG9zaXRpb24pLFxyXG4gICAgICAgICAgX3ZhcnMgPSB2YXJzLFxyXG4gICAgICAgICAgc3RhcnRBdCA9IF92YXJzLnN0YXJ0QXQsXHJcbiAgICAgICAgICBfb25TdGFydCA9IF92YXJzLm9uU3RhcnQsXHJcbiAgICAgICAgICBvblN0YXJ0UGFyYW1zID0gX3ZhcnMub25TdGFydFBhcmFtcyxcclxuICAgICAgICAgIGltbWVkaWF0ZVJlbmRlciA9IF92YXJzLmltbWVkaWF0ZVJlbmRlcixcclxuICAgICAgICAgIGluaXR0ZWQsXHJcbiAgICAgICAgICB0d2VlbiA9IFR3ZWVuLnRvKHRsLCBfc2V0RGVmYXVsdHMoe1xyXG4gICAgICAgIGVhc2U6IHZhcnMuZWFzZSB8fCBcIm5vbmVcIixcclxuICAgICAgICBsYXp5OiBmYWxzZSxcclxuICAgICAgICBpbW1lZGlhdGVSZW5kZXI6IGZhbHNlLFxyXG4gICAgICAgIHRpbWU6IGVuZFRpbWUsXHJcbiAgICAgICAgb3ZlcndyaXRlOiBcImF1dG9cIixcclxuICAgICAgICBkdXJhdGlvbjogdmFycy5kdXJhdGlvbiB8fCBNYXRoLmFicygoZW5kVGltZSAtIChzdGFydEF0ICYmIFwidGltZVwiIGluIHN0YXJ0QXQgPyBzdGFydEF0LnRpbWUgOiB0bC5fdGltZSkpIC8gdGwudGltZVNjYWxlKCkpIHx8IF90aW55TnVtLFxyXG4gICAgICAgIG9uU3RhcnQ6IGZ1bmN0aW9uIG9uU3RhcnQoKSB7XHJcbiAgICAgICAgICB0bC5wYXVzZSgpO1xyXG5cclxuICAgICAgICAgIGlmICghaW5pdHRlZCkge1xyXG4gICAgICAgICAgICB2YXIgZHVyYXRpb24gPSB2YXJzLmR1cmF0aW9uIHx8IE1hdGguYWJzKChlbmRUaW1lIC0gKHN0YXJ0QXQgJiYgXCJ0aW1lXCIgaW4gc3RhcnRBdCA/IHN0YXJ0QXQudGltZSA6IHRsLl90aW1lKSkgLyB0bC50aW1lU2NhbGUoKSk7XHJcbiAgICAgICAgICAgIHR3ZWVuLl9kdXIgIT09IGR1cmF0aW9uICYmIF9zZXREdXJhdGlvbih0d2VlbiwgZHVyYXRpb24sIDAsIDEpLnJlbmRlcih0d2Vlbi5fdGltZSwgdHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIGluaXR0ZWQgPSAxO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIF9vblN0YXJ0ICYmIF9vblN0YXJ0LmFwcGx5KHR3ZWVuLCBvblN0YXJ0UGFyYW1zIHx8IFtdKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIHZhcnMpKTtcclxuXHJcbiAgICAgIHJldHVybiBpbW1lZGlhdGVSZW5kZXIgPyB0d2Vlbi5yZW5kZXIoMCkgOiB0d2VlbjtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvMi50d2VlbkZyb21UbyA9IGZ1bmN0aW9uIHR3ZWVuRnJvbVRvKGZyb21Qb3NpdGlvbiwgdG9Qb3NpdGlvbiwgdmFycykge1xyXG4gICAgICByZXR1cm4gdGhpcy50d2VlblRvKHRvUG9zaXRpb24sIF9zZXREZWZhdWx0cyh7XHJcbiAgICAgICAgc3RhcnRBdDoge1xyXG4gICAgICAgICAgdGltZTogX3BhcnNlUG9zaXRpb24odGhpcywgZnJvbVBvc2l0aW9uKVxyXG4gICAgICAgIH1cclxuICAgICAgfSwgdmFycykpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8yLnJlY2VudCA9IGZ1bmN0aW9uIHJlY2VudCgpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX3JlY2VudDtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvMi5uZXh0TGFiZWwgPSBmdW5jdGlvbiBuZXh0TGFiZWwoYWZ0ZXJUaW1lKSB7XHJcbiAgICAgIGlmIChhZnRlclRpbWUgPT09IHZvaWQgMCkge1xyXG4gICAgICAgIGFmdGVyVGltZSA9IHRoaXMuX3RpbWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBfZ2V0TGFiZWxJbkRpcmVjdGlvbih0aGlzLCBfcGFyc2VQb3NpdGlvbih0aGlzLCBhZnRlclRpbWUpKTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvMi5wcmV2aW91c0xhYmVsID0gZnVuY3Rpb24gcHJldmlvdXNMYWJlbChiZWZvcmVUaW1lKSB7XHJcbiAgICAgIGlmIChiZWZvcmVUaW1lID09PSB2b2lkIDApIHtcclxuICAgICAgICBiZWZvcmVUaW1lID0gdGhpcy5fdGltZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIF9nZXRMYWJlbEluRGlyZWN0aW9uKHRoaXMsIF9wYXJzZVBvc2l0aW9uKHRoaXMsIGJlZm9yZVRpbWUpLCAxKTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvMi5jdXJyZW50TGFiZWwgPSBmdW5jdGlvbiBjdXJyZW50TGFiZWwodmFsdWUpIHtcclxuICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0aGlzLnNlZWsodmFsdWUsIHRydWUpIDogdGhpcy5wcmV2aW91c0xhYmVsKHRoaXMuX3RpbWUgKyBfdGlueU51bSk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90bzIuc2hpZnRDaGlsZHJlbiA9IGZ1bmN0aW9uIHNoaWZ0Q2hpbGRyZW4oYW1vdW50LCBhZGp1c3RMYWJlbHMsIGlnbm9yZUJlZm9yZVRpbWUpIHtcclxuICAgICAgaWYgKGlnbm9yZUJlZm9yZVRpbWUgPT09IHZvaWQgMCkge1xyXG4gICAgICAgIGlnbm9yZUJlZm9yZVRpbWUgPSAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB2YXIgY2hpbGQgPSB0aGlzLl9maXJzdCxcclxuICAgICAgICAgIGxhYmVscyA9IHRoaXMubGFiZWxzLFxyXG4gICAgICAgICAgcDtcclxuXHJcbiAgICAgIHdoaWxlIChjaGlsZCkge1xyXG4gICAgICAgIGlmIChjaGlsZC5fc3RhcnQgPj0gaWdub3JlQmVmb3JlVGltZSkge1xyXG4gICAgICAgICAgY2hpbGQuX3N0YXJ0ICs9IGFtb3VudDtcclxuICAgICAgICAgIGNoaWxkLl9lbmQgKz0gYW1vdW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2hpbGQgPSBjaGlsZC5fbmV4dDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGFkanVzdExhYmVscykge1xyXG4gICAgICAgIGZvciAocCBpbiBsYWJlbHMpIHtcclxuICAgICAgICAgIGlmIChsYWJlbHNbcF0gPj0gaWdub3JlQmVmb3JlVGltZSkge1xyXG4gICAgICAgICAgICBsYWJlbHNbcF0gKz0gYW1vdW50O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIF91bmNhY2hlKHRoaXMpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8yLmludmFsaWRhdGUgPSBmdW5jdGlvbiBpbnZhbGlkYXRlKHNvZnQpIHtcclxuICAgICAgdmFyIGNoaWxkID0gdGhpcy5fZmlyc3Q7XHJcbiAgICAgIHRoaXMuX2xvY2sgPSAwO1xyXG5cclxuICAgICAgd2hpbGUgKGNoaWxkKSB7XHJcbiAgICAgICAgY2hpbGQuaW52YWxpZGF0ZShzb2Z0KTtcclxuICAgICAgICBjaGlsZCA9IGNoaWxkLl9uZXh0O1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gX0FuaW1hdGlvbi5wcm90b3R5cGUuaW52YWxpZGF0ZS5jYWxsKHRoaXMsIHNvZnQpO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8yLmNsZWFyID0gZnVuY3Rpb24gY2xlYXIoaW5jbHVkZUxhYmVscykge1xyXG4gICAgICBpZiAoaW5jbHVkZUxhYmVscyA9PT0gdm9pZCAwKSB7XHJcbiAgICAgICAgaW5jbHVkZUxhYmVscyA9IHRydWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciBjaGlsZCA9IHRoaXMuX2ZpcnN0LFxyXG4gICAgICAgICAgbmV4dDtcclxuXHJcbiAgICAgIHdoaWxlIChjaGlsZCkge1xyXG4gICAgICAgIG5leHQgPSBjaGlsZC5fbmV4dDtcclxuICAgICAgICB0aGlzLnJlbW92ZShjaGlsZCk7XHJcbiAgICAgICAgY2hpbGQgPSBuZXh0O1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9kcCAmJiAodGhpcy5fdGltZSA9IHRoaXMuX3RUaW1lID0gdGhpcy5fcFRpbWUgPSAwKTtcclxuICAgICAgaW5jbHVkZUxhYmVscyAmJiAodGhpcy5sYWJlbHMgPSB7fSk7XHJcbiAgICAgIHJldHVybiBfdW5jYWNoZSh0aGlzKTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvMi50b3RhbER1cmF0aW9uID0gZnVuY3Rpb24gdG90YWxEdXJhdGlvbih2YWx1ZSkge1xyXG4gICAgICB2YXIgbWF4ID0gMCxcclxuICAgICAgICAgIHNlbGYgPSB0aGlzLFxyXG4gICAgICAgICAgY2hpbGQgPSBzZWxmLl9sYXN0LFxyXG4gICAgICAgICAgcHJldlN0YXJ0ID0gX2JpZ051bSxcclxuICAgICAgICAgIHByZXYsXHJcbiAgICAgICAgICBzdGFydCxcclxuICAgICAgICAgIHBhcmVudDtcclxuXHJcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XHJcbiAgICAgICAgcmV0dXJuIHNlbGYudGltZVNjYWxlKChzZWxmLl9yZXBlYXQgPCAwID8gc2VsZi5kdXJhdGlvbigpIDogc2VsZi50b3RhbER1cmF0aW9uKCkpIC8gKHNlbGYucmV2ZXJzZWQoKSA/IC12YWx1ZSA6IHZhbHVlKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzZWxmLl9kaXJ0eSkge1xyXG4gICAgICAgIHBhcmVudCA9IHNlbGYucGFyZW50O1xyXG5cclxuICAgICAgICB3aGlsZSAoY2hpbGQpIHtcclxuICAgICAgICAgIHByZXYgPSBjaGlsZC5fcHJldjtcclxuICAgICAgICAgIGNoaWxkLl9kaXJ0eSAmJiBjaGlsZC50b3RhbER1cmF0aW9uKCk7XHJcbiAgICAgICAgICBzdGFydCA9IGNoaWxkLl9zdGFydDtcclxuXHJcbiAgICAgICAgICBpZiAoc3RhcnQgPiBwcmV2U3RhcnQgJiYgc2VsZi5fc29ydCAmJiBjaGlsZC5fdHMgJiYgIXNlbGYuX2xvY2spIHtcclxuICAgICAgICAgICAgc2VsZi5fbG9jayA9IDE7XHJcbiAgICAgICAgICAgIF9hZGRUb1RpbWVsaW5lKHNlbGYsIGNoaWxkLCBzdGFydCAtIGNoaWxkLl9kZWxheSwgMSkuX2xvY2sgPSAwO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcHJldlN0YXJ0ID0gc3RhcnQ7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHN0YXJ0IDwgMCAmJiBjaGlsZC5fdHMpIHtcclxuICAgICAgICAgICAgbWF4IC09IHN0YXJ0O1xyXG5cclxuICAgICAgICAgICAgaWYgKCFwYXJlbnQgJiYgIXNlbGYuX2RwIHx8IHBhcmVudCAmJiBwYXJlbnQuc21vb3RoQ2hpbGRUaW1pbmcpIHtcclxuICAgICAgICAgICAgICBzZWxmLl9zdGFydCArPSBzdGFydCAvIHNlbGYuX3RzO1xyXG4gICAgICAgICAgICAgIHNlbGYuX3RpbWUgLT0gc3RhcnQ7XHJcbiAgICAgICAgICAgICAgc2VsZi5fdFRpbWUgLT0gc3RhcnQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHNlbGYuc2hpZnRDaGlsZHJlbigtc3RhcnQsIGZhbHNlLCAtMWU5OTkpO1xyXG4gICAgICAgICAgICBwcmV2U3RhcnQgPSAwO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGNoaWxkLl9lbmQgPiBtYXggJiYgY2hpbGQuX3RzICYmIChtYXggPSBjaGlsZC5fZW5kKTtcclxuICAgICAgICAgIGNoaWxkID0gcHJldjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIF9zZXREdXJhdGlvbihzZWxmLCBzZWxmID09PSBfZ2xvYmFsVGltZWxpbmUgJiYgc2VsZi5fdGltZSA+IG1heCA/IHNlbGYuX3RpbWUgOiBtYXgsIDEsIDEpO1xyXG5cclxuICAgICAgICBzZWxmLl9kaXJ0eSA9IDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBzZWxmLl90RHVyO1xyXG4gICAgfTtcclxuXHJcbiAgICBUaW1lbGluZS51cGRhdGVSb290ID0gZnVuY3Rpb24gdXBkYXRlUm9vdCh0aW1lKSB7XHJcbiAgICAgIGlmIChfZ2xvYmFsVGltZWxpbmUuX3RzKSB7XHJcbiAgICAgICAgX2xhenlTYWZlUmVuZGVyKF9nbG9iYWxUaW1lbGluZSwgX3BhcmVudFRvQ2hpbGRUb3RhbFRpbWUodGltZSwgX2dsb2JhbFRpbWVsaW5lKSk7XHJcblxyXG4gICAgICAgIF9sYXN0UmVuZGVyZWRGcmFtZSA9IF90aWNrZXIuZnJhbWU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChfdGlja2VyLmZyYW1lID49IF9uZXh0R0NGcmFtZSkge1xyXG4gICAgICAgIF9uZXh0R0NGcmFtZSArPSBfY29uZmlnLmF1dG9TbGVlcCB8fCAxMjA7XHJcbiAgICAgICAgdmFyIGNoaWxkID0gX2dsb2JhbFRpbWVsaW5lLl9maXJzdDtcclxuICAgICAgICBpZiAoIWNoaWxkIHx8ICFjaGlsZC5fdHMpIGlmIChfY29uZmlnLmF1dG9TbGVlcCAmJiBfdGlja2VyLl9saXN0ZW5lcnMubGVuZ3RoIDwgMikge1xyXG4gICAgICAgICAgd2hpbGUgKGNoaWxkICYmICFjaGlsZC5fdHMpIHtcclxuICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5fbmV4dDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjaGlsZCB8fCBfdGlja2VyLnNsZWVwKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBUaW1lbGluZTtcclxuICB9KEFuaW1hdGlvbik7XHJcblxyXG4gIF9zZXREZWZhdWx0cyhUaW1lbGluZS5wcm90b3R5cGUsIHtcclxuICAgIF9sb2NrOiAwLFxyXG4gICAgX2hhc1BhdXNlOiAwLFxyXG4gICAgX2ZvcmNpbmc6IDBcclxuICB9KTtcclxuXHJcbiAgdmFyIF9hZGRDb21wbGV4U3RyaW5nUHJvcFR3ZWVuID0gZnVuY3Rpb24gX2FkZENvbXBsZXhTdHJpbmdQcm9wVHdlZW4odGFyZ2V0LCBwcm9wLCBzdGFydCwgZW5kLCBzZXR0ZXIsIHN0cmluZ0ZpbHRlciwgZnVuY1BhcmFtKSB7XHJcbiAgICB2YXIgcHQgPSBuZXcgUHJvcFR3ZWVuKHRoaXMuX3B0LCB0YXJnZXQsIHByb3AsIDAsIDEsIF9yZW5kZXJDb21wbGV4U3RyaW5nLCBudWxsLCBzZXR0ZXIpLFxyXG4gICAgICAgIGluZGV4ID0gMCxcclxuICAgICAgICBtYXRjaEluZGV4ID0gMCxcclxuICAgICAgICByZXN1bHQsXHJcbiAgICAgICAgc3RhcnROdW1zLFxyXG4gICAgICAgIGNvbG9yLFxyXG4gICAgICAgIGVuZE51bSxcclxuICAgICAgICBjaHVuayxcclxuICAgICAgICBzdGFydE51bSxcclxuICAgICAgICBoYXNSYW5kb20sXHJcbiAgICAgICAgYTtcclxuICAgIHB0LmIgPSBzdGFydDtcclxuICAgIHB0LmUgPSBlbmQ7XHJcbiAgICBzdGFydCArPSBcIlwiO1xyXG4gICAgZW5kICs9IFwiXCI7XHJcblxyXG4gICAgaWYgKGhhc1JhbmRvbSA9IH5lbmQuaW5kZXhPZihcInJhbmRvbShcIikpIHtcclxuICAgICAgZW5kID0gX3JlcGxhY2VSYW5kb20oZW5kKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc3RyaW5nRmlsdGVyKSB7XHJcbiAgICAgIGEgPSBbc3RhcnQsIGVuZF07XHJcbiAgICAgIHN0cmluZ0ZpbHRlcihhLCB0YXJnZXQsIHByb3ApO1xyXG4gICAgICBzdGFydCA9IGFbMF07XHJcbiAgICAgIGVuZCA9IGFbMV07XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnROdW1zID0gc3RhcnQubWF0Y2goX2NvbXBsZXhTdHJpbmdOdW1FeHApIHx8IFtdO1xyXG5cclxuICAgIHdoaWxlIChyZXN1bHQgPSBfY29tcGxleFN0cmluZ051bUV4cC5leGVjKGVuZCkpIHtcclxuICAgICAgZW5kTnVtID0gcmVzdWx0WzBdO1xyXG4gICAgICBjaHVuayA9IGVuZC5zdWJzdHJpbmcoaW5kZXgsIHJlc3VsdC5pbmRleCk7XHJcblxyXG4gICAgICBpZiAoY29sb3IpIHtcclxuICAgICAgICBjb2xvciA9IChjb2xvciArIDEpICUgNTtcclxuICAgICAgfSBlbHNlIGlmIChjaHVuay5zdWJzdHIoLTUpID09PSBcInJnYmEoXCIpIHtcclxuICAgICAgICBjb2xvciA9IDE7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChlbmROdW0gIT09IHN0YXJ0TnVtc1ttYXRjaEluZGV4KytdKSB7XHJcbiAgICAgICAgc3RhcnROdW0gPSBwYXJzZUZsb2F0KHN0YXJ0TnVtc1ttYXRjaEluZGV4IC0gMV0pIHx8IDA7XHJcbiAgICAgICAgcHQuX3B0ID0ge1xyXG4gICAgICAgICAgX25leHQ6IHB0Ll9wdCxcclxuICAgICAgICAgIHA6IGNodW5rIHx8IG1hdGNoSW5kZXggPT09IDEgPyBjaHVuayA6IFwiLFwiLFxyXG4gICAgICAgICAgczogc3RhcnROdW0sXHJcbiAgICAgICAgICBjOiBlbmROdW0uY2hhckF0KDEpID09PSBcIj1cIiA/IF9wYXJzZVJlbGF0aXZlKHN0YXJ0TnVtLCBlbmROdW0pIC0gc3RhcnROdW0gOiBwYXJzZUZsb2F0KGVuZE51bSkgLSBzdGFydE51bSxcclxuICAgICAgICAgIG06IGNvbG9yICYmIGNvbG9yIDwgNCA/IE1hdGgucm91bmQgOiAwXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpbmRleCA9IF9jb21wbGV4U3RyaW5nTnVtRXhwLmxhc3RJbmRleDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHB0LmMgPSBpbmRleCA8IGVuZC5sZW5ndGggPyBlbmQuc3Vic3RyaW5nKGluZGV4LCBlbmQubGVuZ3RoKSA6IFwiXCI7XHJcbiAgICBwdC5mcCA9IGZ1bmNQYXJhbTtcclxuXHJcbiAgICBpZiAoX3JlbEV4cC50ZXN0KGVuZCkgfHwgaGFzUmFuZG9tKSB7XHJcbiAgICAgIHB0LmUgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX3B0ID0gcHQ7XHJcbiAgICByZXR1cm4gcHQ7XHJcbiAgfSxcclxuICAgICAgX2FkZFByb3BUd2VlbiA9IGZ1bmN0aW9uIF9hZGRQcm9wVHdlZW4odGFyZ2V0LCBwcm9wLCBzdGFydCwgZW5kLCBpbmRleCwgdGFyZ2V0cywgbW9kaWZpZXIsIHN0cmluZ0ZpbHRlciwgZnVuY1BhcmFtLCBvcHRpb25hbCkge1xyXG4gICAgX2lzRnVuY3Rpb24oZW5kKSAmJiAoZW5kID0gZW5kKGluZGV4IHx8IDAsIHRhcmdldCwgdGFyZ2V0cykpO1xyXG4gICAgdmFyIGN1cnJlbnRWYWx1ZSA9IHRhcmdldFtwcm9wXSxcclxuICAgICAgICBwYXJzZWRTdGFydCA9IHN0YXJ0ICE9PSBcImdldFwiID8gc3RhcnQgOiAhX2lzRnVuY3Rpb24oY3VycmVudFZhbHVlKSA/IGN1cnJlbnRWYWx1ZSA6IGZ1bmNQYXJhbSA/IHRhcmdldFtwcm9wLmluZGV4T2YoXCJzZXRcIikgfHwgIV9pc0Z1bmN0aW9uKHRhcmdldFtcImdldFwiICsgcHJvcC5zdWJzdHIoMyldKSA/IHByb3AgOiBcImdldFwiICsgcHJvcC5zdWJzdHIoMyldKGZ1bmNQYXJhbSkgOiB0YXJnZXRbcHJvcF0oKSxcclxuICAgICAgICBzZXR0ZXIgPSAhX2lzRnVuY3Rpb24oY3VycmVudFZhbHVlKSA/IF9zZXR0ZXJQbGFpbiA6IGZ1bmNQYXJhbSA/IF9zZXR0ZXJGdW5jV2l0aFBhcmFtIDogX3NldHRlckZ1bmMsXHJcbiAgICAgICAgcHQ7XHJcblxyXG4gICAgaWYgKF9pc1N0cmluZyhlbmQpKSB7XHJcbiAgICAgIGlmICh+ZW5kLmluZGV4T2YoXCJyYW5kb20oXCIpKSB7XHJcbiAgICAgICAgZW5kID0gX3JlcGxhY2VSYW5kb20oZW5kKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGVuZC5jaGFyQXQoMSkgPT09IFwiPVwiKSB7XHJcbiAgICAgICAgcHQgPSBfcGFyc2VSZWxhdGl2ZShwYXJzZWRTdGFydCwgZW5kKSArIChnZXRVbml0KHBhcnNlZFN0YXJ0KSB8fCAwKTtcclxuXHJcbiAgICAgICAgaWYgKHB0IHx8IHB0ID09PSAwKSB7XHJcbiAgICAgICAgICBlbmQgPSBwdDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoIW9wdGlvbmFsIHx8IHBhcnNlZFN0YXJ0ICE9PSBlbmQgfHwgX2ZvcmNlQWxsUHJvcFR3ZWVucykge1xyXG4gICAgICBpZiAoIWlzTmFOKHBhcnNlZFN0YXJ0ICogZW5kKSAmJiBlbmQgIT09IFwiXCIpIHtcclxuICAgICAgICBwdCA9IG5ldyBQcm9wVHdlZW4odGhpcy5fcHQsIHRhcmdldCwgcHJvcCwgK3BhcnNlZFN0YXJ0IHx8IDAsIGVuZCAtIChwYXJzZWRTdGFydCB8fCAwKSwgdHlwZW9mIGN1cnJlbnRWYWx1ZSA9PT0gXCJib29sZWFuXCIgPyBfcmVuZGVyQm9vbGVhbiA6IF9yZW5kZXJQbGFpbiwgMCwgc2V0dGVyKTtcclxuICAgICAgICBmdW5jUGFyYW0gJiYgKHB0LmZwID0gZnVuY1BhcmFtKTtcclxuICAgICAgICBtb2RpZmllciAmJiBwdC5tb2RpZmllcihtb2RpZmllciwgdGhpcywgdGFyZ2V0KTtcclxuICAgICAgICByZXR1cm4gdGhpcy5fcHQgPSBwdDtcclxuICAgICAgfVxyXG5cclxuICAgICAgIWN1cnJlbnRWYWx1ZSAmJiAhKHByb3AgaW4gdGFyZ2V0KSAmJiBfbWlzc2luZ1BsdWdpbihwcm9wLCBlbmQpO1xyXG4gICAgICByZXR1cm4gX2FkZENvbXBsZXhTdHJpbmdQcm9wVHdlZW4uY2FsbCh0aGlzLCB0YXJnZXQsIHByb3AsIHBhcnNlZFN0YXJ0LCBlbmQsIHNldHRlciwgc3RyaW5nRmlsdGVyIHx8IF9jb25maWcuc3RyaW5nRmlsdGVyLCBmdW5jUGFyYW0pO1xyXG4gICAgfVxyXG4gIH0sXHJcbiAgICAgIF9wcm9jZXNzVmFycyA9IGZ1bmN0aW9uIF9wcm9jZXNzVmFycyh2YXJzLCBpbmRleCwgdGFyZ2V0LCB0YXJnZXRzLCB0d2Vlbikge1xyXG4gICAgX2lzRnVuY3Rpb24odmFycykgJiYgKHZhcnMgPSBfcGFyc2VGdW5jT3JTdHJpbmcodmFycywgdHdlZW4sIGluZGV4LCB0YXJnZXQsIHRhcmdldHMpKTtcclxuXHJcbiAgICBpZiAoIV9pc09iamVjdCh2YXJzKSB8fCB2YXJzLnN0eWxlICYmIHZhcnMubm9kZVR5cGUgfHwgX2lzQXJyYXkodmFycykgfHwgX2lzVHlwZWRBcnJheSh2YXJzKSkge1xyXG4gICAgICByZXR1cm4gX2lzU3RyaW5nKHZhcnMpID8gX3BhcnNlRnVuY09yU3RyaW5nKHZhcnMsIHR3ZWVuLCBpbmRleCwgdGFyZ2V0LCB0YXJnZXRzKSA6IHZhcnM7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGNvcHkgPSB7fSxcclxuICAgICAgICBwO1xyXG5cclxuICAgIGZvciAocCBpbiB2YXJzKSB7XHJcbiAgICAgIGNvcHlbcF0gPSBfcGFyc2VGdW5jT3JTdHJpbmcodmFyc1twXSwgdHdlZW4sIGluZGV4LCB0YXJnZXQsIHRhcmdldHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjb3B5O1xyXG4gIH0sXHJcbiAgICAgIF9jaGVja1BsdWdpbiA9IGZ1bmN0aW9uIF9jaGVja1BsdWdpbihwcm9wZXJ0eSwgdmFycywgdHdlZW4sIGluZGV4LCB0YXJnZXQsIHRhcmdldHMpIHtcclxuICAgIHZhciBwbHVnaW4sIHB0LCBwdExvb2t1cCwgaTtcclxuXHJcbiAgICBpZiAoX3BsdWdpbnNbcHJvcGVydHldICYmIChwbHVnaW4gPSBuZXcgX3BsdWdpbnNbcHJvcGVydHldKCkpLmluaXQodGFyZ2V0LCBwbHVnaW4ucmF3VmFycyA/IHZhcnNbcHJvcGVydHldIDogX3Byb2Nlc3NWYXJzKHZhcnNbcHJvcGVydHldLCBpbmRleCwgdGFyZ2V0LCB0YXJnZXRzLCB0d2VlbiksIHR3ZWVuLCBpbmRleCwgdGFyZ2V0cykgIT09IGZhbHNlKSB7XHJcbiAgICAgIHR3ZWVuLl9wdCA9IHB0ID0gbmV3IFByb3BUd2Vlbih0d2Vlbi5fcHQsIHRhcmdldCwgcHJvcGVydHksIDAsIDEsIHBsdWdpbi5yZW5kZXIsIHBsdWdpbiwgMCwgcGx1Z2luLnByaW9yaXR5KTtcclxuXHJcbiAgICAgIGlmICh0d2VlbiAhPT0gX3F1aWNrVHdlZW4pIHtcclxuICAgICAgICBwdExvb2t1cCA9IHR3ZWVuLl9wdExvb2t1cFt0d2Vlbi5fdGFyZ2V0cy5pbmRleE9mKHRhcmdldCldO1xyXG4gICAgICAgIGkgPSBwbHVnaW4uX3Byb3BzLmxlbmd0aDtcclxuXHJcbiAgICAgICAgd2hpbGUgKGktLSkge1xyXG4gICAgICAgICAgcHRMb29rdXBbcGx1Z2luLl9wcm9wc1tpXV0gPSBwdDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcGx1Z2luO1xyXG4gIH0sXHJcbiAgICAgIF9vdmVyd3JpdGluZ1R3ZWVuLFxyXG4gICAgICBfZm9yY2VBbGxQcm9wVHdlZW5zLFxyXG4gICAgICBfaW5pdFR3ZWVuID0gZnVuY3Rpb24gX2luaXRUd2Vlbih0d2VlbiwgdGltZSwgdFRpbWUpIHtcclxuICAgIHZhciB2YXJzID0gdHdlZW4udmFycyxcclxuICAgICAgICBlYXNlID0gdmFycy5lYXNlLFxyXG4gICAgICAgIHN0YXJ0QXQgPSB2YXJzLnN0YXJ0QXQsXHJcbiAgICAgICAgaW1tZWRpYXRlUmVuZGVyID0gdmFycy5pbW1lZGlhdGVSZW5kZXIsXHJcbiAgICAgICAgbGF6eSA9IHZhcnMubGF6eSxcclxuICAgICAgICBvblVwZGF0ZSA9IHZhcnMub25VcGRhdGUsXHJcbiAgICAgICAgcnVuQmFja3dhcmRzID0gdmFycy5ydW5CYWNrd2FyZHMsXHJcbiAgICAgICAgeW95b0Vhc2UgPSB2YXJzLnlveW9FYXNlLFxyXG4gICAgICAgIGtleWZyYW1lcyA9IHZhcnMua2V5ZnJhbWVzLFxyXG4gICAgICAgIGF1dG9SZXZlcnQgPSB2YXJzLmF1dG9SZXZlcnQsXHJcbiAgICAgICAgZHVyID0gdHdlZW4uX2R1cixcclxuICAgICAgICBwcmV2U3RhcnRBdCA9IHR3ZWVuLl9zdGFydEF0LFxyXG4gICAgICAgIHRhcmdldHMgPSB0d2Vlbi5fdGFyZ2V0cyxcclxuICAgICAgICBwYXJlbnQgPSB0d2Vlbi5wYXJlbnQsXHJcbiAgICAgICAgZnVsbFRhcmdldHMgPSBwYXJlbnQgJiYgcGFyZW50LmRhdGEgPT09IFwibmVzdGVkXCIgPyBwYXJlbnQudmFycy50YXJnZXRzIDogdGFyZ2V0cyxcclxuICAgICAgICBhdXRvT3ZlcndyaXRlID0gdHdlZW4uX292ZXJ3cml0ZSA9PT0gXCJhdXRvXCIgJiYgIV9zdXBwcmVzc092ZXJ3cml0ZXMsXHJcbiAgICAgICAgdGwgPSB0d2Vlbi50aW1lbGluZSxcclxuICAgICAgICBjbGVhblZhcnMsXHJcbiAgICAgICAgaSxcclxuICAgICAgICBwLFxyXG4gICAgICAgIHB0LFxyXG4gICAgICAgIHRhcmdldCxcclxuICAgICAgICBoYXNQcmlvcml0eSxcclxuICAgICAgICBnc0RhdGEsXHJcbiAgICAgICAgaGFybmVzcyxcclxuICAgICAgICBwbHVnaW4sXHJcbiAgICAgICAgcHRMb29rdXAsXHJcbiAgICAgICAgaW5kZXgsXHJcbiAgICAgICAgaGFybmVzc1ZhcnMsXHJcbiAgICAgICAgb3ZlcndyaXR0ZW47XHJcbiAgICB0bCAmJiAoIWtleWZyYW1lcyB8fCAhZWFzZSkgJiYgKGVhc2UgPSBcIm5vbmVcIik7XHJcbiAgICB0d2Vlbi5fZWFzZSA9IF9wYXJzZUVhc2UoZWFzZSwgX2RlZmF1bHRzLmVhc2UpO1xyXG4gICAgdHdlZW4uX3lFYXNlID0geW95b0Vhc2UgPyBfaW52ZXJ0RWFzZShfcGFyc2VFYXNlKHlveW9FYXNlID09PSB0cnVlID8gZWFzZSA6IHlveW9FYXNlLCBfZGVmYXVsdHMuZWFzZSkpIDogMDtcclxuXHJcbiAgICBpZiAoeW95b0Vhc2UgJiYgdHdlZW4uX3lveW8gJiYgIXR3ZWVuLl9yZXBlYXQpIHtcclxuICAgICAgeW95b0Vhc2UgPSB0d2Vlbi5feUVhc2U7XHJcbiAgICAgIHR3ZWVuLl95RWFzZSA9IHR3ZWVuLl9lYXNlO1xyXG4gICAgICB0d2Vlbi5fZWFzZSA9IHlveW9FYXNlO1xyXG4gICAgfVxyXG5cclxuICAgIHR3ZWVuLl9mcm9tID0gIXRsICYmICEhdmFycy5ydW5CYWNrd2FyZHM7XHJcblxyXG4gICAgaWYgKCF0bCB8fCBrZXlmcmFtZXMgJiYgIXZhcnMuc3RhZ2dlcikge1xyXG4gICAgICBoYXJuZXNzID0gdGFyZ2V0c1swXSA/IF9nZXRDYWNoZSh0YXJnZXRzWzBdKS5oYXJuZXNzIDogMDtcclxuICAgICAgaGFybmVzc1ZhcnMgPSBoYXJuZXNzICYmIHZhcnNbaGFybmVzcy5wcm9wXTtcclxuICAgICAgY2xlYW5WYXJzID0gX2NvcHlFeGNsdWRpbmcodmFycywgX3Jlc2VydmVkUHJvcHMpO1xyXG5cclxuICAgICAgaWYgKHByZXZTdGFydEF0KSB7XHJcbiAgICAgICAgcHJldlN0YXJ0QXQuX3pUaW1lIDwgMCAmJiBwcmV2U3RhcnRBdC5wcm9ncmVzcygxKTtcclxuICAgICAgICB0aW1lIDwgMCAmJiBydW5CYWNrd2FyZHMgJiYgaW1tZWRpYXRlUmVuZGVyICYmICFhdXRvUmV2ZXJ0ID8gcHJldlN0YXJ0QXQucmVuZGVyKC0xLCB0cnVlKSA6IHByZXZTdGFydEF0LnJldmVydChydW5CYWNrd2FyZHMgJiYgZHVyID8gX3JldmVydENvbmZpZ05vS2lsbCA6IF9zdGFydEF0UmV2ZXJ0Q29uZmlnKTtcclxuICAgICAgICBwcmV2U3RhcnRBdC5fbGF6eSA9IDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzdGFydEF0KSB7XHJcbiAgICAgICAgX3JlbW92ZUZyb21QYXJlbnQodHdlZW4uX3N0YXJ0QXQgPSBUd2Vlbi5zZXQodGFyZ2V0cywgX3NldERlZmF1bHRzKHtcclxuICAgICAgICAgIGRhdGE6IFwiaXNTdGFydFwiLFxyXG4gICAgICAgICAgb3ZlcndyaXRlOiBmYWxzZSxcclxuICAgICAgICAgIHBhcmVudDogcGFyZW50LFxyXG4gICAgICAgICAgaW1tZWRpYXRlUmVuZGVyOiB0cnVlLFxyXG4gICAgICAgICAgbGF6eTogIXByZXZTdGFydEF0ICYmIF9pc05vdEZhbHNlKGxhenkpLFxyXG4gICAgICAgICAgc3RhcnRBdDogbnVsbCxcclxuICAgICAgICAgIGRlbGF5OiAwLFxyXG4gICAgICAgICAgb25VcGRhdGU6IG9uVXBkYXRlICYmIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIF9jYWxsYmFjayh0d2VlbiwgXCJvblVwZGF0ZVwiKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBzdGFnZ2VyOiAwXHJcbiAgICAgICAgfSwgc3RhcnRBdCkpKTtcclxuXHJcbiAgICAgICAgdHdlZW4uX3N0YXJ0QXQuX2RwID0gMDtcclxuICAgICAgICB0d2Vlbi5fc3RhcnRBdC5fc2F0ID0gdHdlZW47XHJcbiAgICAgICAgdGltZSA8IDAgJiYgKF9yZXZlcnRpbmcgfHwgIWltbWVkaWF0ZVJlbmRlciAmJiAhYXV0b1JldmVydCkgJiYgdHdlZW4uX3N0YXJ0QXQucmV2ZXJ0KF9yZXZlcnRDb25maWdOb0tpbGwpO1xyXG5cclxuICAgICAgICBpZiAoaW1tZWRpYXRlUmVuZGVyKSB7XHJcbiAgICAgICAgICBpZiAoZHVyICYmIHRpbWUgPD0gMCAmJiB0VGltZSA8PSAwKSB7XHJcbiAgICAgICAgICAgIHRpbWUgJiYgKHR3ZWVuLl96VGltZSA9IHRpbWUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHJ1bkJhY2t3YXJkcyAmJiBkdXIpIHtcclxuICAgICAgICBpZiAoIXByZXZTdGFydEF0KSB7XHJcbiAgICAgICAgICB0aW1lICYmIChpbW1lZGlhdGVSZW5kZXIgPSBmYWxzZSk7XHJcbiAgICAgICAgICBwID0gX3NldERlZmF1bHRzKHtcclxuICAgICAgICAgICAgb3ZlcndyaXRlOiBmYWxzZSxcclxuICAgICAgICAgICAgZGF0YTogXCJpc0Zyb21TdGFydFwiLFxyXG4gICAgICAgICAgICBsYXp5OiBpbW1lZGlhdGVSZW5kZXIgJiYgIXByZXZTdGFydEF0ICYmIF9pc05vdEZhbHNlKGxhenkpLFxyXG4gICAgICAgICAgICBpbW1lZGlhdGVSZW5kZXI6IGltbWVkaWF0ZVJlbmRlcixcclxuICAgICAgICAgICAgc3RhZ2dlcjogMCxcclxuICAgICAgICAgICAgcGFyZW50OiBwYXJlbnRcclxuICAgICAgICAgIH0sIGNsZWFuVmFycyk7XHJcbiAgICAgICAgICBoYXJuZXNzVmFycyAmJiAocFtoYXJuZXNzLnByb3BdID0gaGFybmVzc1ZhcnMpO1xyXG5cclxuICAgICAgICAgIF9yZW1vdmVGcm9tUGFyZW50KHR3ZWVuLl9zdGFydEF0ID0gVHdlZW4uc2V0KHRhcmdldHMsIHApKTtcclxuXHJcbiAgICAgICAgICB0d2Vlbi5fc3RhcnRBdC5fZHAgPSAwO1xyXG4gICAgICAgICAgdHdlZW4uX3N0YXJ0QXQuX3NhdCA9IHR3ZWVuO1xyXG4gICAgICAgICAgdGltZSA8IDAgJiYgKF9yZXZlcnRpbmcgPyB0d2Vlbi5fc3RhcnRBdC5yZXZlcnQoX3JldmVydENvbmZpZ05vS2lsbCkgOiB0d2Vlbi5fc3RhcnRBdC5yZW5kZXIoLTEsIHRydWUpKTtcclxuICAgICAgICAgIHR3ZWVuLl96VGltZSA9IHRpbWU7XHJcblxyXG4gICAgICAgICAgaWYgKCFpbW1lZGlhdGVSZW5kZXIpIHtcclxuICAgICAgICAgICAgX2luaXRUd2Vlbih0d2Vlbi5fc3RhcnRBdCwgX3RpbnlOdW0sIF90aW55TnVtKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoIXRpbWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgdHdlZW4uX3B0ID0gdHdlZW4uX3B0Q2FjaGUgPSAwO1xyXG4gICAgICBsYXp5ID0gZHVyICYmIF9pc05vdEZhbHNlKGxhenkpIHx8IGxhenkgJiYgIWR1cjtcclxuXHJcbiAgICAgIGZvciAoaSA9IDA7IGkgPCB0YXJnZXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0c1tpXTtcclxuICAgICAgICBnc0RhdGEgPSB0YXJnZXQuX2dzYXAgfHwgX2hhcm5lc3ModGFyZ2V0cylbaV0uX2dzYXA7XHJcbiAgICAgICAgdHdlZW4uX3B0TG9va3VwW2ldID0gcHRMb29rdXAgPSB7fTtcclxuICAgICAgICBfbGF6eUxvb2t1cFtnc0RhdGEuaWRdICYmIF9sYXp5VHdlZW5zLmxlbmd0aCAmJiBfbGF6eVJlbmRlcigpO1xyXG4gICAgICAgIGluZGV4ID0gZnVsbFRhcmdldHMgPT09IHRhcmdldHMgPyBpIDogZnVsbFRhcmdldHMuaW5kZXhPZih0YXJnZXQpO1xyXG5cclxuICAgICAgICBpZiAoaGFybmVzcyAmJiAocGx1Z2luID0gbmV3IGhhcm5lc3MoKSkuaW5pdCh0YXJnZXQsIGhhcm5lc3NWYXJzIHx8IGNsZWFuVmFycywgdHdlZW4sIGluZGV4LCBmdWxsVGFyZ2V0cykgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICB0d2Vlbi5fcHQgPSBwdCA9IG5ldyBQcm9wVHdlZW4odHdlZW4uX3B0LCB0YXJnZXQsIHBsdWdpbi5uYW1lLCAwLCAxLCBwbHVnaW4ucmVuZGVyLCBwbHVnaW4sIDAsIHBsdWdpbi5wcmlvcml0eSk7XHJcblxyXG4gICAgICAgICAgcGx1Z2luLl9wcm9wcy5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XHJcbiAgICAgICAgICAgIHB0TG9va3VwW25hbWVdID0gcHQ7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICBwbHVnaW4ucHJpb3JpdHkgJiYgKGhhc1ByaW9yaXR5ID0gMSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWhhcm5lc3MgfHwgaGFybmVzc1ZhcnMpIHtcclxuICAgICAgICAgIGZvciAocCBpbiBjbGVhblZhcnMpIHtcclxuICAgICAgICAgICAgaWYgKF9wbHVnaW5zW3BdICYmIChwbHVnaW4gPSBfY2hlY2tQbHVnaW4ocCwgY2xlYW5WYXJzLCB0d2VlbiwgaW5kZXgsIHRhcmdldCwgZnVsbFRhcmdldHMpKSkge1xyXG4gICAgICAgICAgICAgIHBsdWdpbi5wcmlvcml0eSAmJiAoaGFzUHJpb3JpdHkgPSAxKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBwdExvb2t1cFtwXSA9IHB0ID0gX2FkZFByb3BUd2Vlbi5jYWxsKHR3ZWVuLCB0YXJnZXQsIHAsIFwiZ2V0XCIsIGNsZWFuVmFyc1twXSwgaW5kZXgsIGZ1bGxUYXJnZXRzLCAwLCB2YXJzLnN0cmluZ0ZpbHRlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHR3ZWVuLl9vcCAmJiB0d2Vlbi5fb3BbaV0gJiYgdHdlZW4ua2lsbCh0YXJnZXQsIHR3ZWVuLl9vcFtpXSk7XHJcblxyXG4gICAgICAgIGlmIChhdXRvT3ZlcndyaXRlICYmIHR3ZWVuLl9wdCkge1xyXG4gICAgICAgICAgX292ZXJ3cml0aW5nVHdlZW4gPSB0d2VlbjtcclxuXHJcbiAgICAgICAgICBfZ2xvYmFsVGltZWxpbmUua2lsbFR3ZWVuc09mKHRhcmdldCwgcHRMb29rdXAsIHR3ZWVuLmdsb2JhbFRpbWUodGltZSkpO1xyXG5cclxuICAgICAgICAgIG92ZXJ3cml0dGVuID0gIXR3ZWVuLnBhcmVudDtcclxuICAgICAgICAgIF9vdmVyd3JpdGluZ1R3ZWVuID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHR3ZWVuLl9wdCAmJiBsYXp5ICYmIChfbGF6eUxvb2t1cFtnc0RhdGEuaWRdID0gMSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGhhc1ByaW9yaXR5ICYmIF9zb3J0UHJvcFR3ZWVuc0J5UHJpb3JpdHkodHdlZW4pO1xyXG4gICAgICB0d2Vlbi5fb25Jbml0ICYmIHR3ZWVuLl9vbkluaXQodHdlZW4pO1xyXG4gICAgfVxyXG5cclxuICAgIHR3ZWVuLl9vblVwZGF0ZSA9IG9uVXBkYXRlO1xyXG4gICAgdHdlZW4uX2luaXR0ZWQgPSAoIXR3ZWVuLl9vcCB8fCB0d2Vlbi5fcHQpICYmICFvdmVyd3JpdHRlbjtcclxuICAgIGtleWZyYW1lcyAmJiB0aW1lIDw9IDAgJiYgdGwucmVuZGVyKF9iaWdOdW0sIHRydWUsIHRydWUpO1xyXG4gIH0sXHJcbiAgICAgIF91cGRhdGVQcm9wVHdlZW5zID0gZnVuY3Rpb24gX3VwZGF0ZVByb3BUd2VlbnModHdlZW4sIHByb3BlcnR5LCB2YWx1ZSwgc3RhcnQsIHN0YXJ0SXNSZWxhdGl2ZSwgcmF0aW8sIHRpbWUsIHNraXBSZWN1cnNpb24pIHtcclxuICAgIHZhciBwdENhY2hlID0gKHR3ZWVuLl9wdCAmJiB0d2Vlbi5fcHRDYWNoZSB8fCAodHdlZW4uX3B0Q2FjaGUgPSB7fSkpW3Byb3BlcnR5XSxcclxuICAgICAgICBwdCxcclxuICAgICAgICByb290UFQsXHJcbiAgICAgICAgbG9va3VwLFxyXG4gICAgICAgIGk7XHJcblxyXG4gICAgaWYgKCFwdENhY2hlKSB7XHJcbiAgICAgIHB0Q2FjaGUgPSB0d2Vlbi5fcHRDYWNoZVtwcm9wZXJ0eV0gPSBbXTtcclxuICAgICAgbG9va3VwID0gdHdlZW4uX3B0TG9va3VwO1xyXG4gICAgICBpID0gdHdlZW4uX3RhcmdldHMubGVuZ3RoO1xyXG5cclxuICAgICAgd2hpbGUgKGktLSkge1xyXG4gICAgICAgIHB0ID0gbG9va3VwW2ldW3Byb3BlcnR5XTtcclxuXHJcbiAgICAgICAgaWYgKHB0ICYmIHB0LmQgJiYgcHQuZC5fcHQpIHtcclxuICAgICAgICAgIHB0ID0gcHQuZC5fcHQ7XHJcblxyXG4gICAgICAgICAgd2hpbGUgKHB0ICYmIHB0LnAgIT09IHByb3BlcnR5ICYmIHB0LmZwICE9PSBwcm9wZXJ0eSkge1xyXG4gICAgICAgICAgICBwdCA9IHB0Ll9uZXh0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFwdCkge1xyXG4gICAgICAgICAgX2ZvcmNlQWxsUHJvcFR3ZWVucyA9IDE7XHJcbiAgICAgICAgICB0d2Vlbi52YXJzW3Byb3BlcnR5XSA9IFwiKz0wXCI7XHJcblxyXG4gICAgICAgICAgX2luaXRUd2Vlbih0d2VlbiwgdGltZSk7XHJcblxyXG4gICAgICAgICAgX2ZvcmNlQWxsUHJvcFR3ZWVucyA9IDA7XHJcbiAgICAgICAgICByZXR1cm4gc2tpcFJlY3Vyc2lvbiA/IF93YXJuKHByb3BlcnR5ICsgXCIgbm90IGVsaWdpYmxlIGZvciByZXNldFwiKSA6IDE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwdENhY2hlLnB1c2gocHQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaSA9IHB0Q2FjaGUubGVuZ3RoO1xyXG5cclxuICAgIHdoaWxlIChpLS0pIHtcclxuICAgICAgcm9vdFBUID0gcHRDYWNoZVtpXTtcclxuICAgICAgcHQgPSByb290UFQuX3B0IHx8IHJvb3RQVDtcclxuICAgICAgcHQucyA9IChzdGFydCB8fCBzdGFydCA9PT0gMCkgJiYgIXN0YXJ0SXNSZWxhdGl2ZSA/IHN0YXJ0IDogcHQucyArIChzdGFydCB8fCAwKSArIHJhdGlvICogcHQuYztcclxuICAgICAgcHQuYyA9IHZhbHVlIC0gcHQucztcclxuICAgICAgcm9vdFBULmUgJiYgKHJvb3RQVC5lID0gX3JvdW5kKHZhbHVlKSArIGdldFVuaXQocm9vdFBULmUpKTtcclxuICAgICAgcm9vdFBULmIgJiYgKHJvb3RQVC5iID0gcHQucyArIGdldFVuaXQocm9vdFBULmIpKTtcclxuICAgIH1cclxuICB9LFxyXG4gICAgICBfYWRkQWxpYXNlc1RvVmFycyA9IGZ1bmN0aW9uIF9hZGRBbGlhc2VzVG9WYXJzKHRhcmdldHMsIHZhcnMpIHtcclxuICAgIHZhciBoYXJuZXNzID0gdGFyZ2V0c1swXSA/IF9nZXRDYWNoZSh0YXJnZXRzWzBdKS5oYXJuZXNzIDogMCxcclxuICAgICAgICBwcm9wZXJ0eUFsaWFzZXMgPSBoYXJuZXNzICYmIGhhcm5lc3MuYWxpYXNlcyxcclxuICAgICAgICBjb3B5LFxyXG4gICAgICAgIHAsXHJcbiAgICAgICAgaSxcclxuICAgICAgICBhbGlhc2VzO1xyXG5cclxuICAgIGlmICghcHJvcGVydHlBbGlhc2VzKSB7XHJcbiAgICAgIHJldHVybiB2YXJzO1xyXG4gICAgfVxyXG5cclxuICAgIGNvcHkgPSBfbWVyZ2Uoe30sIHZhcnMpO1xyXG5cclxuICAgIGZvciAocCBpbiBwcm9wZXJ0eUFsaWFzZXMpIHtcclxuICAgICAgaWYgKHAgaW4gY29weSkge1xyXG4gICAgICAgIGFsaWFzZXMgPSBwcm9wZXJ0eUFsaWFzZXNbcF0uc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgIGkgPSBhbGlhc2VzLmxlbmd0aDtcclxuXHJcbiAgICAgICAgd2hpbGUgKGktLSkge1xyXG4gICAgICAgICAgY29weVthbGlhc2VzW2ldXSA9IGNvcHlbcF07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvcHk7XHJcbiAgfSxcclxuICAgICAgX3BhcnNlS2V5ZnJhbWUgPSBmdW5jdGlvbiBfcGFyc2VLZXlmcmFtZShwcm9wLCBvYmosIGFsbFByb3BzLCBlYXNlRWFjaCkge1xyXG4gICAgdmFyIGVhc2UgPSBvYmouZWFzZSB8fCBlYXNlRWFjaCB8fCBcInBvd2VyMS5pbk91dFwiLFxyXG4gICAgICAgIHAsXHJcbiAgICAgICAgYTtcclxuXHJcbiAgICBpZiAoX2lzQXJyYXkob2JqKSkge1xyXG4gICAgICBhID0gYWxsUHJvcHNbcHJvcF0gfHwgKGFsbFByb3BzW3Byb3BdID0gW10pO1xyXG4gICAgICBvYmouZm9yRWFjaChmdW5jdGlvbiAodmFsdWUsIGkpIHtcclxuICAgICAgICByZXR1cm4gYS5wdXNoKHtcclxuICAgICAgICAgIHQ6IGkgLyAob2JqLmxlbmd0aCAtIDEpICogMTAwLFxyXG4gICAgICAgICAgdjogdmFsdWUsXHJcbiAgICAgICAgICBlOiBlYXNlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZm9yIChwIGluIG9iaikge1xyXG4gICAgICAgIGEgPSBhbGxQcm9wc1twXSB8fCAoYWxsUHJvcHNbcF0gPSBbXSk7XHJcbiAgICAgICAgcCA9PT0gXCJlYXNlXCIgfHwgYS5wdXNoKHtcclxuICAgICAgICAgIHQ6IHBhcnNlRmxvYXQocHJvcCksXHJcbiAgICAgICAgICB2OiBvYmpbcF0sXHJcbiAgICAgICAgICBlOiBlYXNlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9LFxyXG4gICAgICBfcGFyc2VGdW5jT3JTdHJpbmcgPSBmdW5jdGlvbiBfcGFyc2VGdW5jT3JTdHJpbmcodmFsdWUsIHR3ZWVuLCBpLCB0YXJnZXQsIHRhcmdldHMpIHtcclxuICAgIHJldHVybiBfaXNGdW5jdGlvbih2YWx1ZSkgPyB2YWx1ZS5jYWxsKHR3ZWVuLCBpLCB0YXJnZXQsIHRhcmdldHMpIDogX2lzU3RyaW5nKHZhbHVlKSAmJiB+dmFsdWUuaW5kZXhPZihcInJhbmRvbShcIikgPyBfcmVwbGFjZVJhbmRvbSh2YWx1ZSkgOiB2YWx1ZTtcclxuICB9LFxyXG4gICAgICBfc3RhZ2dlclR3ZWVuUHJvcHMgPSBfY2FsbGJhY2tOYW1lcyArIFwicmVwZWF0LHJlcGVhdERlbGF5LHlveW8scmVwZWF0UmVmcmVzaCx5b3lvRWFzZSxhdXRvUmV2ZXJ0XCIsXHJcbiAgICAgIF9zdGFnZ2VyUHJvcHNUb1NraXAgPSB7fTtcclxuXHJcbiAgX2ZvckVhY2hOYW1lKF9zdGFnZ2VyVHdlZW5Qcm9wcyArIFwiLGlkLHN0YWdnZXIsZGVsYXksZHVyYXRpb24scGF1c2VkLHNjcm9sbFRyaWdnZXJcIiwgZnVuY3Rpb24gKG5hbWUpIHtcclxuICAgIHJldHVybiBfc3RhZ2dlclByb3BzVG9Ta2lwW25hbWVdID0gMTtcclxuICB9KTtcclxuXHJcbiAgdmFyIFR3ZWVuID0gZnVuY3Rpb24gKF9BbmltYXRpb24yKSB7XHJcbiAgICBfaW5oZXJpdHNMb29zZShUd2VlbiwgX0FuaW1hdGlvbjIpO1xyXG5cclxuICAgIGZ1bmN0aW9uIFR3ZWVuKHRhcmdldHMsIHZhcnMsIHBvc2l0aW9uLCBza2lwSW5oZXJpdCkge1xyXG4gICAgICB2YXIgX3RoaXMzO1xyXG5cclxuICAgICAgaWYgKHR5cGVvZiB2YXJzID09PSBcIm51bWJlclwiKSB7XHJcbiAgICAgICAgcG9zaXRpb24uZHVyYXRpb24gPSB2YXJzO1xyXG4gICAgICAgIHZhcnMgPSBwb3NpdGlvbjtcclxuICAgICAgICBwb3NpdGlvbiA9IG51bGw7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIF90aGlzMyA9IF9BbmltYXRpb24yLmNhbGwodGhpcywgc2tpcEluaGVyaXQgPyB2YXJzIDogX2luaGVyaXREZWZhdWx0cyh2YXJzKSkgfHwgdGhpcztcclxuICAgICAgdmFyIF90aGlzMyR2YXJzID0gX3RoaXMzLnZhcnMsXHJcbiAgICAgICAgICBkdXJhdGlvbiA9IF90aGlzMyR2YXJzLmR1cmF0aW9uLFxyXG4gICAgICAgICAgZGVsYXkgPSBfdGhpczMkdmFycy5kZWxheSxcclxuICAgICAgICAgIGltbWVkaWF0ZVJlbmRlciA9IF90aGlzMyR2YXJzLmltbWVkaWF0ZVJlbmRlcixcclxuICAgICAgICAgIHN0YWdnZXIgPSBfdGhpczMkdmFycy5zdGFnZ2VyLFxyXG4gICAgICAgICAgb3ZlcndyaXRlID0gX3RoaXMzJHZhcnMub3ZlcndyaXRlLFxyXG4gICAgICAgICAga2V5ZnJhbWVzID0gX3RoaXMzJHZhcnMua2V5ZnJhbWVzLFxyXG4gICAgICAgICAgZGVmYXVsdHMgPSBfdGhpczMkdmFycy5kZWZhdWx0cyxcclxuICAgICAgICAgIHNjcm9sbFRyaWdnZXIgPSBfdGhpczMkdmFycy5zY3JvbGxUcmlnZ2VyLFxyXG4gICAgICAgICAgeW95b0Vhc2UgPSBfdGhpczMkdmFycy55b3lvRWFzZSxcclxuICAgICAgICAgIHBhcmVudCA9IHZhcnMucGFyZW50IHx8IF9nbG9iYWxUaW1lbGluZSxcclxuICAgICAgICAgIHBhcnNlZFRhcmdldHMgPSAoX2lzQXJyYXkodGFyZ2V0cykgfHwgX2lzVHlwZWRBcnJheSh0YXJnZXRzKSA/IF9pc051bWJlcih0YXJnZXRzWzBdKSA6IFwibGVuZ3RoXCIgaW4gdmFycykgPyBbdGFyZ2V0c10gOiB0b0FycmF5KHRhcmdldHMpLFxyXG4gICAgICAgICAgdGwsXHJcbiAgICAgICAgICBpLFxyXG4gICAgICAgICAgY29weSxcclxuICAgICAgICAgIGwsXHJcbiAgICAgICAgICBwLFxyXG4gICAgICAgICAgY3VyVGFyZ2V0LFxyXG4gICAgICAgICAgc3RhZ2dlckZ1bmMsXHJcbiAgICAgICAgICBzdGFnZ2VyVmFyc1RvTWVyZ2U7XHJcbiAgICAgIF90aGlzMy5fdGFyZ2V0cyA9IHBhcnNlZFRhcmdldHMubGVuZ3RoID8gX2hhcm5lc3MocGFyc2VkVGFyZ2V0cykgOiBfd2FybihcIkdTQVAgdGFyZ2V0IFwiICsgdGFyZ2V0cyArIFwiIG5vdCBmb3VuZC4gaHR0cHM6Ly9nc2FwLmNvbVwiLCAhX2NvbmZpZy5udWxsVGFyZ2V0V2FybikgfHwgW107XHJcbiAgICAgIF90aGlzMy5fcHRMb29rdXAgPSBbXTtcclxuICAgICAgX3RoaXMzLl9vdmVyd3JpdGUgPSBvdmVyd3JpdGU7XHJcblxyXG4gICAgICBpZiAoa2V5ZnJhbWVzIHx8IHN0YWdnZXIgfHwgX2lzRnVuY09yU3RyaW5nKGR1cmF0aW9uKSB8fCBfaXNGdW5jT3JTdHJpbmcoZGVsYXkpKSB7XHJcbiAgICAgICAgdmFycyA9IF90aGlzMy52YXJzO1xyXG4gICAgICAgIHRsID0gX3RoaXMzLnRpbWVsaW5lID0gbmV3IFRpbWVsaW5lKHtcclxuICAgICAgICAgIGRhdGE6IFwibmVzdGVkXCIsXHJcbiAgICAgICAgICBkZWZhdWx0czogZGVmYXVsdHMgfHwge30sXHJcbiAgICAgICAgICB0YXJnZXRzOiBwYXJlbnQgJiYgcGFyZW50LmRhdGEgPT09IFwibmVzdGVkXCIgPyBwYXJlbnQudmFycy50YXJnZXRzIDogcGFyc2VkVGFyZ2V0c1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRsLmtpbGwoKTtcclxuICAgICAgICB0bC5wYXJlbnQgPSB0bC5fZHAgPSBfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzMyk7XHJcbiAgICAgICAgdGwuX3N0YXJ0ID0gMDtcclxuXHJcbiAgICAgICAgaWYgKHN0YWdnZXIgfHwgX2lzRnVuY09yU3RyaW5nKGR1cmF0aW9uKSB8fCBfaXNGdW5jT3JTdHJpbmcoZGVsYXkpKSB7XHJcbiAgICAgICAgICBsID0gcGFyc2VkVGFyZ2V0cy5sZW5ndGg7XHJcbiAgICAgICAgICBzdGFnZ2VyRnVuYyA9IHN0YWdnZXIgJiYgZGlzdHJpYnV0ZShzdGFnZ2VyKTtcclxuXHJcbiAgICAgICAgICBpZiAoX2lzT2JqZWN0KHN0YWdnZXIpKSB7XHJcbiAgICAgICAgICAgIGZvciAocCBpbiBzdGFnZ2VyKSB7XHJcbiAgICAgICAgICAgICAgaWYgKH5fc3RhZ2dlclR3ZWVuUHJvcHMuaW5kZXhPZihwKSkge1xyXG4gICAgICAgICAgICAgICAgc3RhZ2dlclZhcnNUb01lcmdlIHx8IChzdGFnZ2VyVmFyc1RvTWVyZ2UgPSB7fSk7XHJcbiAgICAgICAgICAgICAgICBzdGFnZ2VyVmFyc1RvTWVyZ2VbcF0gPSBzdGFnZ2VyW3BdO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgY29weSA9IF9jb3B5RXhjbHVkaW5nKHZhcnMsIF9zdGFnZ2VyUHJvcHNUb1NraXApO1xyXG4gICAgICAgICAgICBjb3B5LnN0YWdnZXIgPSAwO1xyXG4gICAgICAgICAgICB5b3lvRWFzZSAmJiAoY29weS55b3lvRWFzZSA9IHlveW9FYXNlKTtcclxuICAgICAgICAgICAgc3RhZ2dlclZhcnNUb01lcmdlICYmIF9tZXJnZShjb3B5LCBzdGFnZ2VyVmFyc1RvTWVyZ2UpO1xyXG4gICAgICAgICAgICBjdXJUYXJnZXQgPSBwYXJzZWRUYXJnZXRzW2ldO1xyXG4gICAgICAgICAgICBjb3B5LmR1cmF0aW9uID0gK19wYXJzZUZ1bmNPclN0cmluZyhkdXJhdGlvbiwgX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpczMpLCBpLCBjdXJUYXJnZXQsIHBhcnNlZFRhcmdldHMpO1xyXG4gICAgICAgICAgICBjb3B5LmRlbGF5ID0gKCtfcGFyc2VGdW5jT3JTdHJpbmcoZGVsYXksIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMzKSwgaSwgY3VyVGFyZ2V0LCBwYXJzZWRUYXJnZXRzKSB8fCAwKSAtIF90aGlzMy5fZGVsYXk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXN0YWdnZXIgJiYgbCA9PT0gMSAmJiBjb3B5LmRlbGF5KSB7XHJcbiAgICAgICAgICAgICAgX3RoaXMzLl9kZWxheSA9IGRlbGF5ID0gY29weS5kZWxheTtcclxuICAgICAgICAgICAgICBfdGhpczMuX3N0YXJ0ICs9IGRlbGF5O1xyXG4gICAgICAgICAgICAgIGNvcHkuZGVsYXkgPSAwO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0bC50byhjdXJUYXJnZXQsIGNvcHksIHN0YWdnZXJGdW5jID8gc3RhZ2dlckZ1bmMoaSwgY3VyVGFyZ2V0LCBwYXJzZWRUYXJnZXRzKSA6IDApO1xyXG4gICAgICAgICAgICB0bC5fZWFzZSA9IF9lYXNlTWFwLm5vbmU7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGwuZHVyYXRpb24oKSA/IGR1cmF0aW9uID0gZGVsYXkgPSAwIDogX3RoaXMzLnRpbWVsaW5lID0gMDtcclxuICAgICAgICB9IGVsc2UgaWYgKGtleWZyYW1lcykge1xyXG4gICAgICAgICAgX2luaGVyaXREZWZhdWx0cyhfc2V0RGVmYXVsdHModGwudmFycy5kZWZhdWx0cywge1xyXG4gICAgICAgICAgICBlYXNlOiBcIm5vbmVcIlxyXG4gICAgICAgICAgfSkpO1xyXG5cclxuICAgICAgICAgIHRsLl9lYXNlID0gX3BhcnNlRWFzZShrZXlmcmFtZXMuZWFzZSB8fCB2YXJzLmVhc2UgfHwgXCJub25lXCIpO1xyXG4gICAgICAgICAgdmFyIHRpbWUgPSAwLFxyXG4gICAgICAgICAgICAgIGEsXHJcbiAgICAgICAgICAgICAga2YsXHJcbiAgICAgICAgICAgICAgdjtcclxuXHJcbiAgICAgICAgICBpZiAoX2lzQXJyYXkoa2V5ZnJhbWVzKSkge1xyXG4gICAgICAgICAgICBrZXlmcmFtZXMuZm9yRWFjaChmdW5jdGlvbiAoZnJhbWUpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gdGwudG8ocGFyc2VkVGFyZ2V0cywgZnJhbWUsIFwiPlwiKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRsLmR1cmF0aW9uKCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb3B5ID0ge307XHJcblxyXG4gICAgICAgICAgICBmb3IgKHAgaW4ga2V5ZnJhbWVzKSB7XHJcbiAgICAgICAgICAgICAgcCA9PT0gXCJlYXNlXCIgfHwgcCA9PT0gXCJlYXNlRWFjaFwiIHx8IF9wYXJzZUtleWZyYW1lKHAsIGtleWZyYW1lc1twXSwgY29weSwga2V5ZnJhbWVzLmVhc2VFYWNoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgZm9yIChwIGluIGNvcHkpIHtcclxuICAgICAgICAgICAgICBhID0gY29weVtwXS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYS50IC0gYi50O1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIHRpbWUgPSAwO1xyXG5cclxuICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAga2YgPSBhW2ldO1xyXG4gICAgICAgICAgICAgICAgdiA9IHtcclxuICAgICAgICAgICAgICAgICAgZWFzZToga2YuZSxcclxuICAgICAgICAgICAgICAgICAgZHVyYXRpb246IChrZi50IC0gKGkgPyBhW2kgLSAxXS50IDogMCkpIC8gMTAwICogZHVyYXRpb25cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB2W3BdID0ga2YudjtcclxuICAgICAgICAgICAgICAgIHRsLnRvKHBhcnNlZFRhcmdldHMsIHYsIHRpbWUpO1xyXG4gICAgICAgICAgICAgICAgdGltZSArPSB2LmR1cmF0aW9uO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGwuZHVyYXRpb24oKSA8IGR1cmF0aW9uICYmIHRsLnRvKHt9LCB7XHJcbiAgICAgICAgICAgICAgZHVyYXRpb246IGR1cmF0aW9uIC0gdGwuZHVyYXRpb24oKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGR1cmF0aW9uIHx8IF90aGlzMy5kdXJhdGlvbihkdXJhdGlvbiA9IHRsLmR1cmF0aW9uKCkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIF90aGlzMy50aW1lbGluZSA9IDA7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChvdmVyd3JpdGUgPT09IHRydWUgJiYgIV9zdXBwcmVzc092ZXJ3cml0ZXMpIHtcclxuICAgICAgICBfb3ZlcndyaXRpbmdUd2VlbiA9IF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMzKTtcclxuXHJcbiAgICAgICAgX2dsb2JhbFRpbWVsaW5lLmtpbGxUd2VlbnNPZihwYXJzZWRUYXJnZXRzKTtcclxuXHJcbiAgICAgICAgX292ZXJ3cml0aW5nVHdlZW4gPSAwO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBfYWRkVG9UaW1lbGluZShwYXJlbnQsIF9hc3NlcnRUaGlzSW5pdGlhbGl6ZWQoX3RoaXMzKSwgcG9zaXRpb24pO1xyXG5cclxuICAgICAgdmFycy5yZXZlcnNlZCAmJiBfdGhpczMucmV2ZXJzZSgpO1xyXG4gICAgICB2YXJzLnBhdXNlZCAmJiBfdGhpczMucGF1c2VkKHRydWUpO1xyXG5cclxuICAgICAgaWYgKGltbWVkaWF0ZVJlbmRlciB8fCAhZHVyYXRpb24gJiYgIWtleWZyYW1lcyAmJiBfdGhpczMuX3N0YXJ0ID09PSBfcm91bmRQcmVjaXNlKHBhcmVudC5fdGltZSkgJiYgX2lzTm90RmFsc2UoaW1tZWRpYXRlUmVuZGVyKSAmJiBfaGFzTm9QYXVzZWRBbmNlc3RvcnMoX2Fzc2VydFRoaXNJbml0aWFsaXplZChfdGhpczMpKSAmJiBwYXJlbnQuZGF0YSAhPT0gXCJuZXN0ZWRcIikge1xyXG4gICAgICAgIF90aGlzMy5fdFRpbWUgPSAtX3RpbnlOdW07XHJcblxyXG4gICAgICAgIF90aGlzMy5yZW5kZXIoTWF0aC5tYXgoMCwgLWRlbGF5KSB8fCAwKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgc2Nyb2xsVHJpZ2dlciAmJiBfc2Nyb2xsVHJpZ2dlcihfYXNzZXJ0VGhpc0luaXRpYWxpemVkKF90aGlzMyksIHNjcm9sbFRyaWdnZXIpO1xyXG4gICAgICByZXR1cm4gX3RoaXMzO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBfcHJvdG8zID0gVHdlZW4ucHJvdG90eXBlO1xyXG5cclxuICAgIF9wcm90bzMucmVuZGVyID0gZnVuY3Rpb24gcmVuZGVyKHRvdGFsVGltZSwgc3VwcHJlc3NFdmVudHMsIGZvcmNlKSB7XHJcbiAgICAgIHZhciBwcmV2VGltZSA9IHRoaXMuX3RpbWUsXHJcbiAgICAgICAgICB0RHVyID0gdGhpcy5fdER1cixcclxuICAgICAgICAgIGR1ciA9IHRoaXMuX2R1cixcclxuICAgICAgICAgIGlzTmVnYXRpdmUgPSB0b3RhbFRpbWUgPCAwLFxyXG4gICAgICAgICAgdFRpbWUgPSB0b3RhbFRpbWUgPiB0RHVyIC0gX3RpbnlOdW0gJiYgIWlzTmVnYXRpdmUgPyB0RHVyIDogdG90YWxUaW1lIDwgX3RpbnlOdW0gPyAwIDogdG90YWxUaW1lLFxyXG4gICAgICAgICAgdGltZSxcclxuICAgICAgICAgIHB0LFxyXG4gICAgICAgICAgaXRlcmF0aW9uLFxyXG4gICAgICAgICAgY3ljbGVEdXJhdGlvbixcclxuICAgICAgICAgIHByZXZJdGVyYXRpb24sXHJcbiAgICAgICAgICBpc1lveW8sXHJcbiAgICAgICAgICByYXRpbyxcclxuICAgICAgICAgIHRpbWVsaW5lLFxyXG4gICAgICAgICAgeW95b0Vhc2U7XHJcblxyXG4gICAgICBpZiAoIWR1cikge1xyXG4gICAgICAgIF9yZW5kZXJaZXJvRHVyYXRpb25Ud2Vlbih0aGlzLCB0b3RhbFRpbWUsIHN1cHByZXNzRXZlbnRzLCBmb3JjZSk7XHJcbiAgICAgIH0gZWxzZSBpZiAodFRpbWUgIT09IHRoaXMuX3RUaW1lIHx8ICF0b3RhbFRpbWUgfHwgZm9yY2UgfHwgIXRoaXMuX2luaXR0ZWQgJiYgdGhpcy5fdFRpbWUgfHwgdGhpcy5fc3RhcnRBdCAmJiB0aGlzLl96VGltZSA8IDAgIT09IGlzTmVnYXRpdmUgfHwgdGhpcy5fbGF6eSkge1xyXG4gICAgICAgIHRpbWUgPSB0VGltZTtcclxuICAgICAgICB0aW1lbGluZSA9IHRoaXMudGltZWxpbmU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9yZXBlYXQpIHtcclxuICAgICAgICAgIGN5Y2xlRHVyYXRpb24gPSBkdXIgKyB0aGlzLl9yRGVsYXk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuX3JlcGVhdCA8IC0xICYmIGlzTmVnYXRpdmUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG90YWxUaW1lKGN5Y2xlRHVyYXRpb24gKiAxMDAgKyB0b3RhbFRpbWUsIHN1cHByZXNzRXZlbnRzLCBmb3JjZSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGltZSA9IF9yb3VuZFByZWNpc2UodFRpbWUgJSBjeWNsZUR1cmF0aW9uKTtcclxuXHJcbiAgICAgICAgICBpZiAodFRpbWUgPT09IHREdXIpIHtcclxuICAgICAgICAgICAgaXRlcmF0aW9uID0gdGhpcy5fcmVwZWF0O1xyXG4gICAgICAgICAgICB0aW1lID0gZHVyO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcHJldkl0ZXJhdGlvbiA9IF9yb3VuZFByZWNpc2UodFRpbWUgLyBjeWNsZUR1cmF0aW9uKTtcclxuICAgICAgICAgICAgaXRlcmF0aW9uID0gfn5wcmV2SXRlcmF0aW9uO1xyXG5cclxuICAgICAgICAgICAgaWYgKGl0ZXJhdGlvbiAmJiBpdGVyYXRpb24gPT09IHByZXZJdGVyYXRpb24pIHtcclxuICAgICAgICAgICAgICB0aW1lID0gZHVyO1xyXG4gICAgICAgICAgICAgIGl0ZXJhdGlvbi0tO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRpbWUgPiBkdXIpIHtcclxuICAgICAgICAgICAgICB0aW1lID0gZHVyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaXNZb3lvID0gdGhpcy5feW95byAmJiBpdGVyYXRpb24gJiAxO1xyXG5cclxuICAgICAgICAgIGlmIChpc1lveW8pIHtcclxuICAgICAgICAgICAgeW95b0Vhc2UgPSB0aGlzLl95RWFzZTtcclxuICAgICAgICAgICAgdGltZSA9IGR1ciAtIHRpbWU7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcHJldkl0ZXJhdGlvbiA9IF9hbmltYXRpb25DeWNsZSh0aGlzLl90VGltZSwgY3ljbGVEdXJhdGlvbik7XHJcblxyXG4gICAgICAgICAgaWYgKHRpbWUgPT09IHByZXZUaW1lICYmICFmb3JjZSAmJiB0aGlzLl9pbml0dGVkICYmIGl0ZXJhdGlvbiA9PT0gcHJldkl0ZXJhdGlvbikge1xyXG4gICAgICAgICAgICB0aGlzLl90VGltZSA9IHRUaW1lO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoaXRlcmF0aW9uICE9PSBwcmV2SXRlcmF0aW9uKSB7XHJcbiAgICAgICAgICAgIHRpbWVsaW5lICYmIHRoaXMuX3lFYXNlICYmIF9wcm9wYWdhdGVZb3lvRWFzZSh0aW1lbGluZSwgaXNZb3lvKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnZhcnMucmVwZWF0UmVmcmVzaCAmJiAhaXNZb3lvICYmICF0aGlzLl9sb2NrICYmIHRpbWUgIT09IGN5Y2xlRHVyYXRpb24gJiYgdGhpcy5faW5pdHRlZCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuX2xvY2sgPSBmb3JjZSA9IDE7XHJcbiAgICAgICAgICAgICAgdGhpcy5yZW5kZXIoX3JvdW5kUHJlY2lzZShjeWNsZUR1cmF0aW9uICogaXRlcmF0aW9uKSwgdHJ1ZSkuaW52YWxpZGF0ZSgpLl9sb2NrID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9pbml0dGVkKSB7XHJcbiAgICAgICAgICBpZiAoX2F0dGVtcHRJbml0VHdlZW4odGhpcywgaXNOZWdhdGl2ZSA/IHRvdGFsVGltZSA6IHRpbWUsIGZvcmNlLCBzdXBwcmVzc0V2ZW50cywgdFRpbWUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RUaW1lID0gMDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHByZXZUaW1lICE9PSB0aGlzLl90aW1lICYmICEoZm9yY2UgJiYgdGhpcy52YXJzLnJlcGVhdFJlZnJlc2ggJiYgaXRlcmF0aW9uICE9PSBwcmV2SXRlcmF0aW9uKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAoZHVyICE9PSB0aGlzLl9kdXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyKHRvdGFsVGltZSwgc3VwcHJlc3NFdmVudHMsIGZvcmNlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3RUaW1lID0gdFRpbWU7XHJcbiAgICAgICAgdGhpcy5fdGltZSA9IHRpbWU7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fYWN0ICYmIHRoaXMuX3RzKSB7XHJcbiAgICAgICAgICB0aGlzLl9hY3QgPSAxO1xyXG4gICAgICAgICAgdGhpcy5fbGF6eSA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnJhdGlvID0gcmF0aW8gPSAoeW95b0Vhc2UgfHwgdGhpcy5fZWFzZSkodGltZSAvIGR1cik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9mcm9tKSB7XHJcbiAgICAgICAgICB0aGlzLnJhdGlvID0gcmF0aW8gPSAxIC0gcmF0aW87XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXByZXZUaW1lICYmIHRUaW1lICYmICFzdXBwcmVzc0V2ZW50cyAmJiAhcHJldkl0ZXJhdGlvbikge1xyXG4gICAgICAgICAgX2NhbGxiYWNrKHRoaXMsIFwib25TdGFydFwiKTtcclxuXHJcbiAgICAgICAgICBpZiAodGhpcy5fdFRpbWUgIT09IHRUaW1lKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHQgPSB0aGlzLl9wdDtcclxuXHJcbiAgICAgICAgd2hpbGUgKHB0KSB7XHJcbiAgICAgICAgICBwdC5yKHJhdGlvLCBwdC5kKTtcclxuICAgICAgICAgIHB0ID0gcHQuX25leHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aW1lbGluZSAmJiB0aW1lbGluZS5yZW5kZXIodG90YWxUaW1lIDwgMCA/IHRvdGFsVGltZSA6IHRpbWVsaW5lLl9kdXIgKiB0aW1lbGluZS5fZWFzZSh0aW1lIC8gdGhpcy5fZHVyKSwgc3VwcHJlc3NFdmVudHMsIGZvcmNlKSB8fCB0aGlzLl9zdGFydEF0ICYmICh0aGlzLl96VGltZSA9IHRvdGFsVGltZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9vblVwZGF0ZSAmJiAhc3VwcHJlc3NFdmVudHMpIHtcclxuICAgICAgICAgIGlzTmVnYXRpdmUgJiYgX3Jld2luZFN0YXJ0QXQodGhpcywgdG90YWxUaW1lLCBzdXBwcmVzc0V2ZW50cywgZm9yY2UpO1xyXG5cclxuICAgICAgICAgIF9jYWxsYmFjayh0aGlzLCBcIm9uVXBkYXRlXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcmVwZWF0ICYmIGl0ZXJhdGlvbiAhPT0gcHJldkl0ZXJhdGlvbiAmJiB0aGlzLnZhcnMub25SZXBlYXQgJiYgIXN1cHByZXNzRXZlbnRzICYmIHRoaXMucGFyZW50ICYmIF9jYWxsYmFjayh0aGlzLCBcIm9uUmVwZWF0XCIpO1xyXG5cclxuICAgICAgICBpZiAoKHRUaW1lID09PSB0aGlzLl90RHVyIHx8ICF0VGltZSkgJiYgdGhpcy5fdFRpbWUgPT09IHRUaW1lKSB7XHJcbiAgICAgICAgICBpc05lZ2F0aXZlICYmICF0aGlzLl9vblVwZGF0ZSAmJiBfcmV3aW5kU3RhcnRBdCh0aGlzLCB0b3RhbFRpbWUsIHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgKHRvdGFsVGltZSB8fCAhZHVyKSAmJiAodFRpbWUgPT09IHRoaXMuX3REdXIgJiYgdGhpcy5fdHMgPiAwIHx8ICF0VGltZSAmJiB0aGlzLl90cyA8IDApICYmIF9yZW1vdmVGcm9tUGFyZW50KHRoaXMsIDEpO1xyXG5cclxuICAgICAgICAgIGlmICghc3VwcHJlc3NFdmVudHMgJiYgIShpc05lZ2F0aXZlICYmICFwcmV2VGltZSkgJiYgKHRUaW1lIHx8IHByZXZUaW1lIHx8IGlzWW95bykpIHtcclxuICAgICAgICAgICAgX2NhbGxiYWNrKHRoaXMsIHRUaW1lID09PSB0RHVyID8gXCJvbkNvbXBsZXRlXCIgOiBcIm9uUmV2ZXJzZUNvbXBsZXRlXCIsIHRydWUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fcHJvbSAmJiAhKHRUaW1lIDwgdER1ciAmJiB0aGlzLnRpbWVTY2FsZSgpID4gMCkgJiYgdGhpcy5fcHJvbSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90bzMudGFyZ2V0cyA9IGZ1bmN0aW9uIHRhcmdldHMoKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLl90YXJnZXRzO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG8zLmludmFsaWRhdGUgPSBmdW5jdGlvbiBpbnZhbGlkYXRlKHNvZnQpIHtcclxuICAgICAgKCFzb2Z0IHx8ICF0aGlzLnZhcnMucnVuQmFja3dhcmRzKSAmJiAodGhpcy5fc3RhcnRBdCA9IDApO1xyXG4gICAgICB0aGlzLl9wdCA9IHRoaXMuX29wID0gdGhpcy5fb25VcGRhdGUgPSB0aGlzLl9sYXp5ID0gdGhpcy5yYXRpbyA9IDA7XHJcbiAgICAgIHRoaXMuX3B0TG9va3VwID0gW107XHJcbiAgICAgIHRoaXMudGltZWxpbmUgJiYgdGhpcy50aW1lbGluZS5pbnZhbGlkYXRlKHNvZnQpO1xyXG4gICAgICByZXR1cm4gX0FuaW1hdGlvbjIucHJvdG90eXBlLmludmFsaWRhdGUuY2FsbCh0aGlzLCBzb2Z0KTtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvMy5yZXNldFRvID0gZnVuY3Rpb24gcmVzZXRUbyhwcm9wZXJ0eSwgdmFsdWUsIHN0YXJ0LCBzdGFydElzUmVsYXRpdmUsIHNraXBSZWN1cnNpb24pIHtcclxuICAgICAgX3RpY2tlckFjdGl2ZSB8fCBfdGlja2VyLndha2UoKTtcclxuICAgICAgdGhpcy5fdHMgfHwgdGhpcy5wbGF5KCk7XHJcbiAgICAgIHZhciB0aW1lID0gTWF0aC5taW4odGhpcy5fZHVyLCAodGhpcy5fZHAuX3RpbWUgLSB0aGlzLl9zdGFydCkgKiB0aGlzLl90cyksXHJcbiAgICAgICAgICByYXRpbztcclxuICAgICAgdGhpcy5faW5pdHRlZCB8fCBfaW5pdFR3ZWVuKHRoaXMsIHRpbWUpO1xyXG4gICAgICByYXRpbyA9IHRoaXMuX2Vhc2UodGltZSAvIHRoaXMuX2R1cik7XHJcblxyXG4gICAgICBpZiAoX3VwZGF0ZVByb3BUd2VlbnModGhpcywgcHJvcGVydHksIHZhbHVlLCBzdGFydCwgc3RhcnRJc1JlbGF0aXZlLCByYXRpbywgdGltZSwgc2tpcFJlY3Vyc2lvbikpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZXNldFRvKHByb3BlcnR5LCB2YWx1ZSwgc3RhcnQsIHN0YXJ0SXNSZWxhdGl2ZSwgMSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIF9hbGlnblBsYXloZWFkKHRoaXMsIDApO1xyXG5cclxuICAgICAgdGhpcy5wYXJlbnQgfHwgX2FkZExpbmtlZExpc3RJdGVtKHRoaXMuX2RwLCB0aGlzLCBcIl9maXJzdFwiLCBcIl9sYXN0XCIsIHRoaXMuX2RwLl9zb3J0ID8gXCJfc3RhcnRcIiA6IDApO1xyXG4gICAgICByZXR1cm4gdGhpcy5yZW5kZXIoMCk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90bzMua2lsbCA9IGZ1bmN0aW9uIGtpbGwodGFyZ2V0cywgdmFycykge1xyXG4gICAgICBpZiAodmFycyA9PT0gdm9pZCAwKSB7XHJcbiAgICAgICAgdmFycyA9IFwiYWxsXCI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGFyZ2V0cyAmJiAoIXZhcnMgfHwgdmFycyA9PT0gXCJhbGxcIikpIHtcclxuICAgICAgICB0aGlzLl9sYXp5ID0gdGhpcy5fcHQgPSAwO1xyXG4gICAgICAgIHRoaXMucGFyZW50ID8gX2ludGVycnVwdCh0aGlzKSA6IHRoaXMuc2Nyb2xsVHJpZ2dlciAmJiB0aGlzLnNjcm9sbFRyaWdnZXIua2lsbCghIV9yZXZlcnRpbmcpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy50aW1lbGluZSkge1xyXG4gICAgICAgIHZhciB0RHVyID0gdGhpcy50aW1lbGluZS50b3RhbER1cmF0aW9uKCk7XHJcbiAgICAgICAgdGhpcy50aW1lbGluZS5raWxsVHdlZW5zT2YodGFyZ2V0cywgdmFycywgX292ZXJ3cml0aW5nVHdlZW4gJiYgX292ZXJ3cml0aW5nVHdlZW4udmFycy5vdmVyd3JpdGUgIT09IHRydWUpLl9maXJzdCB8fCBfaW50ZXJydXB0KHRoaXMpO1xyXG4gICAgICAgIHRoaXMucGFyZW50ICYmIHREdXIgIT09IHRoaXMudGltZWxpbmUudG90YWxEdXJhdGlvbigpICYmIF9zZXREdXJhdGlvbih0aGlzLCB0aGlzLl9kdXIgKiB0aGlzLnRpbWVsaW5lLl90RHVyIC8gdER1ciwgMCwgMSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciBwYXJzZWRUYXJnZXRzID0gdGhpcy5fdGFyZ2V0cyxcclxuICAgICAgICAgIGtpbGxpbmdUYXJnZXRzID0gdGFyZ2V0cyA/IHRvQXJyYXkodGFyZ2V0cykgOiBwYXJzZWRUYXJnZXRzLFxyXG4gICAgICAgICAgcHJvcFR3ZWVuTG9va3VwID0gdGhpcy5fcHRMb29rdXAsXHJcbiAgICAgICAgICBmaXJzdFBUID0gdGhpcy5fcHQsXHJcbiAgICAgICAgICBvdmVyd3JpdHRlblByb3BzLFxyXG4gICAgICAgICAgY3VyTG9va3VwLFxyXG4gICAgICAgICAgY3VyT3ZlcndyaXRlUHJvcHMsXHJcbiAgICAgICAgICBwcm9wcyxcclxuICAgICAgICAgIHAsXHJcbiAgICAgICAgICBwdCxcclxuICAgICAgICAgIGk7XHJcblxyXG4gICAgICBpZiAoKCF2YXJzIHx8IHZhcnMgPT09IFwiYWxsXCIpICYmIF9hcnJheXNNYXRjaChwYXJzZWRUYXJnZXRzLCBraWxsaW5nVGFyZ2V0cykpIHtcclxuICAgICAgICB2YXJzID09PSBcImFsbFwiICYmICh0aGlzLl9wdCA9IDApO1xyXG4gICAgICAgIHJldHVybiBfaW50ZXJydXB0KHRoaXMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBvdmVyd3JpdHRlblByb3BzID0gdGhpcy5fb3AgPSB0aGlzLl9vcCB8fCBbXTtcclxuXHJcbiAgICAgIGlmICh2YXJzICE9PSBcImFsbFwiKSB7XHJcbiAgICAgICAgaWYgKF9pc1N0cmluZyh2YXJzKSkge1xyXG4gICAgICAgICAgcCA9IHt9O1xyXG5cclxuICAgICAgICAgIF9mb3JFYWNoTmFtZSh2YXJzLCBmdW5jdGlvbiAobmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gcFtuYW1lXSA9IDE7XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB2YXJzID0gcDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHZhcnMgPSBfYWRkQWxpYXNlc1RvVmFycyhwYXJzZWRUYXJnZXRzLCB2YXJzKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaSA9IHBhcnNlZFRhcmdldHMubGVuZ3RoO1xyXG5cclxuICAgICAgd2hpbGUgKGktLSkge1xyXG4gICAgICAgIGlmICh+a2lsbGluZ1RhcmdldHMuaW5kZXhPZihwYXJzZWRUYXJnZXRzW2ldKSkge1xyXG4gICAgICAgICAgY3VyTG9va3VwID0gcHJvcFR3ZWVuTG9va3VwW2ldO1xyXG5cclxuICAgICAgICAgIGlmICh2YXJzID09PSBcImFsbFwiKSB7XHJcbiAgICAgICAgICAgIG92ZXJ3cml0dGVuUHJvcHNbaV0gPSB2YXJzO1xyXG4gICAgICAgICAgICBwcm9wcyA9IGN1ckxvb2t1cDtcclxuICAgICAgICAgICAgY3VyT3ZlcndyaXRlUHJvcHMgPSB7fTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGN1ck92ZXJ3cml0ZVByb3BzID0gb3ZlcndyaXR0ZW5Qcm9wc1tpXSA9IG92ZXJ3cml0dGVuUHJvcHNbaV0gfHwge307XHJcbiAgICAgICAgICAgIHByb3BzID0gdmFycztcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBmb3IgKHAgaW4gcHJvcHMpIHtcclxuICAgICAgICAgICAgcHQgPSBjdXJMb29rdXAgJiYgY3VyTG9va3VwW3BdO1xyXG5cclxuICAgICAgICAgICAgaWYgKHB0KSB7XHJcbiAgICAgICAgICAgICAgaWYgKCEoXCJraWxsXCIgaW4gcHQuZCkgfHwgcHQuZC5raWxsKHApID09PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICBfcmVtb3ZlTGlua2VkTGlzdEl0ZW0odGhpcywgcHQsIFwiX3B0XCIpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgZGVsZXRlIGN1ckxvb2t1cFtwXTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGN1ck92ZXJ3cml0ZVByb3BzICE9PSBcImFsbFwiKSB7XHJcbiAgICAgICAgICAgICAgY3VyT3ZlcndyaXRlUHJvcHNbcF0gPSAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLl9pbml0dGVkICYmICF0aGlzLl9wdCAmJiBmaXJzdFBUICYmIF9pbnRlcnJ1cHQodGhpcyk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuXHJcbiAgICBUd2Vlbi50byA9IGZ1bmN0aW9uIHRvKHRhcmdldHMsIHZhcnMpIHtcclxuICAgICAgcmV0dXJuIG5ldyBUd2Vlbih0YXJnZXRzLCB2YXJzLCBhcmd1bWVudHNbMl0pO1xyXG4gICAgfTtcclxuXHJcbiAgICBUd2Vlbi5mcm9tID0gZnVuY3Rpb24gZnJvbSh0YXJnZXRzLCB2YXJzKSB7XHJcbiAgICAgIHJldHVybiBfY3JlYXRlVHdlZW5UeXBlKDEsIGFyZ3VtZW50cyk7XHJcbiAgICB9O1xyXG5cclxuICAgIFR3ZWVuLmRlbGF5ZWRDYWxsID0gZnVuY3Rpb24gZGVsYXllZENhbGwoZGVsYXksIGNhbGxiYWNrLCBwYXJhbXMsIHNjb3BlKSB7XHJcbiAgICAgIHJldHVybiBuZXcgVHdlZW4oY2FsbGJhY2ssIDAsIHtcclxuICAgICAgICBpbW1lZGlhdGVSZW5kZXI6IGZhbHNlLFxyXG4gICAgICAgIGxhenk6IGZhbHNlLFxyXG4gICAgICAgIG92ZXJ3cml0ZTogZmFsc2UsXHJcbiAgICAgICAgZGVsYXk6IGRlbGF5LFxyXG4gICAgICAgIG9uQ29tcGxldGU6IGNhbGxiYWNrLFxyXG4gICAgICAgIG9uUmV2ZXJzZUNvbXBsZXRlOiBjYWxsYmFjayxcclxuICAgICAgICBvbkNvbXBsZXRlUGFyYW1zOiBwYXJhbXMsXHJcbiAgICAgICAgb25SZXZlcnNlQ29tcGxldGVQYXJhbXM6IHBhcmFtcyxcclxuICAgICAgICBjYWxsYmFja1Njb3BlOiBzY29wZVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgVHdlZW4uZnJvbVRvID0gZnVuY3Rpb24gZnJvbVRvKHRhcmdldHMsIGZyb21WYXJzLCB0b1ZhcnMpIHtcclxuICAgICAgcmV0dXJuIF9jcmVhdGVUd2VlblR5cGUoMiwgYXJndW1lbnRzKTtcclxuICAgIH07XHJcblxyXG4gICAgVHdlZW4uc2V0ID0gZnVuY3Rpb24gc2V0KHRhcmdldHMsIHZhcnMpIHtcclxuICAgICAgdmFycy5kdXJhdGlvbiA9IDA7XHJcbiAgICAgIHZhcnMucmVwZWF0RGVsYXkgfHwgKHZhcnMucmVwZWF0ID0gMCk7XHJcbiAgICAgIHJldHVybiBuZXcgVHdlZW4odGFyZ2V0cywgdmFycyk7XHJcbiAgICB9O1xyXG5cclxuICAgIFR3ZWVuLmtpbGxUd2VlbnNPZiA9IGZ1bmN0aW9uIGtpbGxUd2VlbnNPZih0YXJnZXRzLCBwcm9wcywgb25seUFjdGl2ZSkge1xyXG4gICAgICByZXR1cm4gX2dsb2JhbFRpbWVsaW5lLmtpbGxUd2VlbnNPZih0YXJnZXRzLCBwcm9wcywgb25seUFjdGl2ZSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBUd2VlbjtcclxuICB9KEFuaW1hdGlvbik7XHJcblxyXG4gIF9zZXREZWZhdWx0cyhUd2Vlbi5wcm90b3R5cGUsIHtcclxuICAgIF90YXJnZXRzOiBbXSxcclxuICAgIF9sYXp5OiAwLFxyXG4gICAgX3N0YXJ0QXQ6IDAsXHJcbiAgICBfb3A6IDAsXHJcbiAgICBfb25Jbml0OiAwXHJcbiAgfSk7XHJcblxyXG4gIF9mb3JFYWNoTmFtZShcInN0YWdnZXJUbyxzdGFnZ2VyRnJvbSxzdGFnZ2VyRnJvbVRvXCIsIGZ1bmN0aW9uIChuYW1lKSB7XHJcbiAgICBUd2VlbltuYW1lXSA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyIHRsID0gbmV3IFRpbWVsaW5lKCksXHJcbiAgICAgICAgICBwYXJhbXMgPSBfc2xpY2UuY2FsbChhcmd1bWVudHMsIDApO1xyXG5cclxuICAgICAgcGFyYW1zLnNwbGljZShuYW1lID09PSBcInN0YWdnZXJGcm9tVG9cIiA/IDUgOiA0LCAwLCAwKTtcclxuICAgICAgcmV0dXJuIHRsW25hbWVdLmFwcGx5KHRsLCBwYXJhbXMpO1xyXG4gICAgfTtcclxuICB9KTtcclxuXHJcbiAgdmFyIF9zZXR0ZXJQbGFpbiA9IGZ1bmN0aW9uIF9zZXR0ZXJQbGFpbih0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSkge1xyXG4gICAgcmV0dXJuIHRhcmdldFtwcm9wZXJ0eV0gPSB2YWx1ZTtcclxuICB9LFxyXG4gICAgICBfc2V0dGVyRnVuYyA9IGZ1bmN0aW9uIF9zZXR0ZXJGdW5jKHRhcmdldCwgcHJvcGVydHksIHZhbHVlKSB7XHJcbiAgICByZXR1cm4gdGFyZ2V0W3Byb3BlcnR5XSh2YWx1ZSk7XHJcbiAgfSxcclxuICAgICAgX3NldHRlckZ1bmNXaXRoUGFyYW0gPSBmdW5jdGlvbiBfc2V0dGVyRnVuY1dpdGhQYXJhbSh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSwgZGF0YSkge1xyXG4gICAgcmV0dXJuIHRhcmdldFtwcm9wZXJ0eV0oZGF0YS5mcCwgdmFsdWUpO1xyXG4gIH0sXHJcbiAgICAgIF9zZXR0ZXJBdHRyaWJ1dGUgPSBmdW5jdGlvbiBfc2V0dGVyQXR0cmlidXRlKHRhcmdldCwgcHJvcGVydHksIHZhbHVlKSB7XHJcbiAgICByZXR1cm4gdGFyZ2V0LnNldEF0dHJpYnV0ZShwcm9wZXJ0eSwgdmFsdWUpO1xyXG4gIH0sXHJcbiAgICAgIF9nZXRTZXR0ZXIgPSBmdW5jdGlvbiBfZ2V0U2V0dGVyKHRhcmdldCwgcHJvcGVydHkpIHtcclxuICAgIHJldHVybiBfaXNGdW5jdGlvbih0YXJnZXRbcHJvcGVydHldKSA/IF9zZXR0ZXJGdW5jIDogX2lzVW5kZWZpbmVkKHRhcmdldFtwcm9wZXJ0eV0pICYmIHRhcmdldC5zZXRBdHRyaWJ1dGUgPyBfc2V0dGVyQXR0cmlidXRlIDogX3NldHRlclBsYWluO1xyXG4gIH0sXHJcbiAgICAgIF9yZW5kZXJQbGFpbiA9IGZ1bmN0aW9uIF9yZW5kZXJQbGFpbihyYXRpbywgZGF0YSkge1xyXG4gICAgcmV0dXJuIGRhdGEuc2V0KGRhdGEudCwgZGF0YS5wLCBNYXRoLnJvdW5kKChkYXRhLnMgKyBkYXRhLmMgKiByYXRpbykgKiAxMDAwMDAwKSAvIDEwMDAwMDAsIGRhdGEpO1xyXG4gIH0sXHJcbiAgICAgIF9yZW5kZXJCb29sZWFuID0gZnVuY3Rpb24gX3JlbmRlckJvb2xlYW4ocmF0aW8sIGRhdGEpIHtcclxuICAgIHJldHVybiBkYXRhLnNldChkYXRhLnQsIGRhdGEucCwgISEoZGF0YS5zICsgZGF0YS5jICogcmF0aW8pLCBkYXRhKTtcclxuICB9LFxyXG4gICAgICBfcmVuZGVyQ29tcGxleFN0cmluZyA9IGZ1bmN0aW9uIF9yZW5kZXJDb21wbGV4U3RyaW5nKHJhdGlvLCBkYXRhKSB7XHJcbiAgICB2YXIgcHQgPSBkYXRhLl9wdCxcclxuICAgICAgICBzID0gXCJcIjtcclxuXHJcbiAgICBpZiAoIXJhdGlvICYmIGRhdGEuYikge1xyXG4gICAgICBzID0gZGF0YS5iO1xyXG4gICAgfSBlbHNlIGlmIChyYXRpbyA9PT0gMSAmJiBkYXRhLmUpIHtcclxuICAgICAgcyA9IGRhdGEuZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdoaWxlIChwdCkge1xyXG4gICAgICAgIHMgPSBwdC5wICsgKHB0Lm0gPyBwdC5tKHB0LnMgKyBwdC5jICogcmF0aW8pIDogTWF0aC5yb3VuZCgocHQucyArIHB0LmMgKiByYXRpbykgKiAxMDAwMCkgLyAxMDAwMCkgKyBzO1xyXG4gICAgICAgIHB0ID0gcHQuX25leHQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHMgKz0gZGF0YS5jO1xyXG4gICAgfVxyXG5cclxuICAgIGRhdGEuc2V0KGRhdGEudCwgZGF0YS5wLCBzLCBkYXRhKTtcclxuICB9LFxyXG4gICAgICBfcmVuZGVyUHJvcFR3ZWVucyA9IGZ1bmN0aW9uIF9yZW5kZXJQcm9wVHdlZW5zKHJhdGlvLCBkYXRhKSB7XHJcbiAgICB2YXIgcHQgPSBkYXRhLl9wdDtcclxuXHJcbiAgICB3aGlsZSAocHQpIHtcclxuICAgICAgcHQucihyYXRpbywgcHQuZCk7XHJcbiAgICAgIHB0ID0gcHQuX25leHQ7XHJcbiAgICB9XHJcbiAgfSxcclxuICAgICAgX2FkZFBsdWdpbk1vZGlmaWVyID0gZnVuY3Rpb24gX2FkZFBsdWdpbk1vZGlmaWVyKG1vZGlmaWVyLCB0d2VlbiwgdGFyZ2V0LCBwcm9wZXJ0eSkge1xyXG4gICAgdmFyIHB0ID0gdGhpcy5fcHQsXHJcbiAgICAgICAgbmV4dDtcclxuXHJcbiAgICB3aGlsZSAocHQpIHtcclxuICAgICAgbmV4dCA9IHB0Ll9uZXh0O1xyXG4gICAgICBwdC5wID09PSBwcm9wZXJ0eSAmJiBwdC5tb2RpZmllcihtb2RpZmllciwgdHdlZW4sIHRhcmdldCk7XHJcbiAgICAgIHB0ID0gbmV4dDtcclxuICAgIH1cclxuICB9LFxyXG4gICAgICBfa2lsbFByb3BUd2VlbnNPZiA9IGZ1bmN0aW9uIF9raWxsUHJvcFR3ZWVuc09mKHByb3BlcnR5KSB7XHJcbiAgICB2YXIgcHQgPSB0aGlzLl9wdCxcclxuICAgICAgICBoYXNOb25EZXBlbmRlbnRSZW1haW5pbmcsXHJcbiAgICAgICAgbmV4dDtcclxuXHJcbiAgICB3aGlsZSAocHQpIHtcclxuICAgICAgbmV4dCA9IHB0Ll9uZXh0O1xyXG5cclxuICAgICAgaWYgKHB0LnAgPT09IHByb3BlcnR5ICYmICFwdC5vcCB8fCBwdC5vcCA9PT0gcHJvcGVydHkpIHtcclxuICAgICAgICBfcmVtb3ZlTGlua2VkTGlzdEl0ZW0odGhpcywgcHQsIFwiX3B0XCIpO1xyXG4gICAgICB9IGVsc2UgaWYgKCFwdC5kZXApIHtcclxuICAgICAgICBoYXNOb25EZXBlbmRlbnRSZW1haW5pbmcgPSAxO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBwdCA9IG5leHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuICFoYXNOb25EZXBlbmRlbnRSZW1haW5pbmc7XHJcbiAgfSxcclxuICAgICAgX3NldHRlcldpdGhNb2RpZmllciA9IGZ1bmN0aW9uIF9zZXR0ZXJXaXRoTW9kaWZpZXIodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUsIGRhdGEpIHtcclxuICAgIGRhdGEubVNldCh0YXJnZXQsIHByb3BlcnR5LCBkYXRhLm0uY2FsbChkYXRhLnR3ZWVuLCB2YWx1ZSwgZGF0YS5tdCksIGRhdGEpO1xyXG4gIH0sXHJcbiAgICAgIF9zb3J0UHJvcFR3ZWVuc0J5UHJpb3JpdHkgPSBmdW5jdGlvbiBfc29ydFByb3BUd2VlbnNCeVByaW9yaXR5KHBhcmVudCkge1xyXG4gICAgdmFyIHB0ID0gcGFyZW50Ll9wdCxcclxuICAgICAgICBuZXh0LFxyXG4gICAgICAgIHB0MixcclxuICAgICAgICBmaXJzdCxcclxuICAgICAgICBsYXN0O1xyXG5cclxuICAgIHdoaWxlIChwdCkge1xyXG4gICAgICBuZXh0ID0gcHQuX25leHQ7XHJcbiAgICAgIHB0MiA9IGZpcnN0O1xyXG5cclxuICAgICAgd2hpbGUgKHB0MiAmJiBwdDIucHIgPiBwdC5wcikge1xyXG4gICAgICAgIHB0MiA9IHB0Mi5fbmV4dDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHB0Ll9wcmV2ID0gcHQyID8gcHQyLl9wcmV2IDogbGFzdCkge1xyXG4gICAgICAgIHB0Ll9wcmV2Ll9uZXh0ID0gcHQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZmlyc3QgPSBwdDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHB0Ll9uZXh0ID0gcHQyKSB7XHJcbiAgICAgICAgcHQyLl9wcmV2ID0gcHQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgbGFzdCA9IHB0O1xyXG4gICAgICB9XHJcblxyXG4gICAgICBwdCA9IG5leHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcGFyZW50Ll9wdCA9IGZpcnN0O1xyXG4gIH07XHJcblxyXG4gIHZhciBQcm9wVHdlZW4gPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBmdW5jdGlvbiBQcm9wVHdlZW4obmV4dCwgdGFyZ2V0LCBwcm9wLCBzdGFydCwgY2hhbmdlLCByZW5kZXJlciwgZGF0YSwgc2V0dGVyLCBwcmlvcml0eSkge1xyXG4gICAgICB0aGlzLnQgPSB0YXJnZXQ7XHJcbiAgICAgIHRoaXMucyA9IHN0YXJ0O1xyXG4gICAgICB0aGlzLmMgPSBjaGFuZ2U7XHJcbiAgICAgIHRoaXMucCA9IHByb3A7XHJcbiAgICAgIHRoaXMuciA9IHJlbmRlcmVyIHx8IF9yZW5kZXJQbGFpbjtcclxuICAgICAgdGhpcy5kID0gZGF0YSB8fCB0aGlzO1xyXG4gICAgICB0aGlzLnNldCA9IHNldHRlciB8fCBfc2V0dGVyUGxhaW47XHJcbiAgICAgIHRoaXMucHIgPSBwcmlvcml0eSB8fCAwO1xyXG4gICAgICB0aGlzLl9uZXh0ID0gbmV4dDtcclxuXHJcbiAgICAgIGlmIChuZXh0KSB7XHJcbiAgICAgICAgbmV4dC5fcHJldiA9IHRoaXM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB2YXIgX3Byb3RvNCA9IFByb3BUd2Vlbi5wcm90b3R5cGU7XHJcblxyXG4gICAgX3Byb3RvNC5tb2RpZmllciA9IGZ1bmN0aW9uIG1vZGlmaWVyKGZ1bmMsIHR3ZWVuLCB0YXJnZXQpIHtcclxuICAgICAgdGhpcy5tU2V0ID0gdGhpcy5tU2V0IHx8IHRoaXMuc2V0O1xyXG4gICAgICB0aGlzLnNldCA9IF9zZXR0ZXJXaXRoTW9kaWZpZXI7XHJcbiAgICAgIHRoaXMubSA9IGZ1bmM7XHJcbiAgICAgIHRoaXMubXQgPSB0YXJnZXQ7XHJcbiAgICAgIHRoaXMudHdlZW4gPSB0d2VlbjtcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIFByb3BUd2VlbjtcclxuICB9KCk7XHJcblxyXG4gIF9mb3JFYWNoTmFtZShfY2FsbGJhY2tOYW1lcyArIFwicGFyZW50LGR1cmF0aW9uLGVhc2UsZGVsYXksb3ZlcndyaXRlLHJ1bkJhY2t3YXJkcyxzdGFydEF0LHlveW8saW1tZWRpYXRlUmVuZGVyLHJlcGVhdCxyZXBlYXREZWxheSxkYXRhLHBhdXNlZCxyZXZlcnNlZCxsYXp5LGNhbGxiYWNrU2NvcGUsc3RyaW5nRmlsdGVyLGlkLHlveW9FYXNlLHN0YWdnZXIsaW5oZXJpdCxyZXBlYXRSZWZyZXNoLGtleWZyYW1lcyxhdXRvUmV2ZXJ0LHNjcm9sbFRyaWdnZXJcIiwgZnVuY3Rpb24gKG5hbWUpIHtcclxuICAgIHJldHVybiBfcmVzZXJ2ZWRQcm9wc1tuYW1lXSA9IDE7XHJcbiAgfSk7XHJcblxyXG4gIF9nbG9iYWxzLlR3ZWVuTWF4ID0gX2dsb2JhbHMuVHdlZW5MaXRlID0gVHdlZW47XHJcbiAgX2dsb2JhbHMuVGltZWxpbmVMaXRlID0gX2dsb2JhbHMuVGltZWxpbmVNYXggPSBUaW1lbGluZTtcclxuICBfZ2xvYmFsVGltZWxpbmUgPSBuZXcgVGltZWxpbmUoe1xyXG4gICAgc29ydENoaWxkcmVuOiBmYWxzZSxcclxuICAgIGRlZmF1bHRzOiBfZGVmYXVsdHMsXHJcbiAgICBhdXRvUmVtb3ZlQ2hpbGRyZW46IHRydWUsXHJcbiAgICBpZDogXCJyb290XCIsXHJcbiAgICBzbW9vdGhDaGlsZFRpbWluZzogdHJ1ZVxyXG4gIH0pO1xyXG4gIF9jb25maWcuc3RyaW5nRmlsdGVyID0gX2NvbG9yU3RyaW5nRmlsdGVyO1xyXG5cclxuICB2YXIgX21lZGlhID0gW10sXHJcbiAgICAgIF9saXN0ZW5lcnMgPSB7fSxcclxuICAgICAgX2VtcHR5QXJyYXkgPSBbXSxcclxuICAgICAgX2xhc3RNZWRpYVRpbWUgPSAwLFxyXG4gICAgICBfY29udGV4dElEID0gMCxcclxuICAgICAgX2Rpc3BhdGNoID0gZnVuY3Rpb24gX2Rpc3BhdGNoKHR5cGUpIHtcclxuICAgIHJldHVybiAoX2xpc3RlbmVyc1t0eXBlXSB8fCBfZW1wdHlBcnJheSkubWFwKGZ1bmN0aW9uIChmKSB7XHJcbiAgICAgIHJldHVybiBmKCk7XHJcbiAgICB9KTtcclxuICB9LFxyXG4gICAgICBfb25NZWRpYUNoYW5nZSA9IGZ1bmN0aW9uIF9vbk1lZGlhQ2hhbmdlKCkge1xyXG4gICAgdmFyIHRpbWUgPSBEYXRlLm5vdygpLFxyXG4gICAgICAgIG1hdGNoZXMgPSBbXTtcclxuXHJcbiAgICBpZiAodGltZSAtIF9sYXN0TWVkaWFUaW1lID4gMikge1xyXG4gICAgICBfZGlzcGF0Y2goXCJtYXRjaE1lZGlhSW5pdFwiKTtcclxuXHJcbiAgICAgIF9tZWRpYS5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XHJcbiAgICAgICAgdmFyIHF1ZXJpZXMgPSBjLnF1ZXJpZXMsXHJcbiAgICAgICAgICAgIGNvbmRpdGlvbnMgPSBjLmNvbmRpdGlvbnMsXHJcbiAgICAgICAgICAgIG1hdGNoLFxyXG4gICAgICAgICAgICBwLFxyXG4gICAgICAgICAgICBhbnlNYXRjaCxcclxuICAgICAgICAgICAgdG9nZ2xlZDtcclxuXHJcbiAgICAgICAgZm9yIChwIGluIHF1ZXJpZXMpIHtcclxuICAgICAgICAgIG1hdGNoID0gX3dpbi5tYXRjaE1lZGlhKHF1ZXJpZXNbcF0pLm1hdGNoZXM7XHJcbiAgICAgICAgICBtYXRjaCAmJiAoYW55TWF0Y2ggPSAxKTtcclxuXHJcbiAgICAgICAgICBpZiAobWF0Y2ggIT09IGNvbmRpdGlvbnNbcF0pIHtcclxuICAgICAgICAgICAgY29uZGl0aW9uc1twXSA9IG1hdGNoO1xyXG4gICAgICAgICAgICB0b2dnbGVkID0gMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0b2dnbGVkKSB7XHJcbiAgICAgICAgICBjLnJldmVydCgpO1xyXG4gICAgICAgICAgYW55TWF0Y2ggJiYgbWF0Y2hlcy5wdXNoKGMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICBfZGlzcGF0Y2goXCJtYXRjaE1lZGlhUmV2ZXJ0XCIpO1xyXG5cclxuICAgICAgbWF0Y2hlcy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7XHJcbiAgICAgICAgcmV0dXJuIGMub25NYXRjaChjLCBmdW5jdGlvbiAoZnVuYykge1xyXG4gICAgICAgICAgcmV0dXJuIGMuYWRkKG51bGwsIGZ1bmMpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgICAgX2xhc3RNZWRpYVRpbWUgPSB0aW1lO1xyXG5cclxuICAgICAgX2Rpc3BhdGNoKFwibWF0Y2hNZWRpYVwiKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICB2YXIgQ29udGV4dCA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIENvbnRleHQoZnVuYywgc2NvcGUpIHtcclxuICAgICAgdGhpcy5zZWxlY3RvciA9IHNjb3BlICYmIHNlbGVjdG9yKHNjb3BlKTtcclxuICAgICAgdGhpcy5kYXRhID0gW107XHJcbiAgICAgIHRoaXMuX3IgPSBbXTtcclxuICAgICAgdGhpcy5pc1JldmVydGVkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuaWQgPSBfY29udGV4dElEKys7XHJcbiAgICAgIGZ1bmMgJiYgdGhpcy5hZGQoZnVuYyk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIF9wcm90bzUgPSBDb250ZXh0LnByb3RvdHlwZTtcclxuXHJcbiAgICBfcHJvdG81LmFkZCA9IGZ1bmN0aW9uIGFkZChuYW1lLCBmdW5jLCBzY29wZSkge1xyXG4gICAgICBpZiAoX2lzRnVuY3Rpb24obmFtZSkpIHtcclxuICAgICAgICBzY29wZSA9IGZ1bmM7XHJcbiAgICAgICAgZnVuYyA9IG5hbWU7XHJcbiAgICAgICAgbmFtZSA9IF9pc0Z1bmN0aW9uO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB2YXIgc2VsZiA9IHRoaXMsXHJcbiAgICAgICAgICBmID0gZnVuY3Rpb24gZigpIHtcclxuICAgICAgICB2YXIgcHJldiA9IF9jb250ZXh0LFxyXG4gICAgICAgICAgICBwcmV2U2VsZWN0b3IgPSBzZWxmLnNlbGVjdG9yLFxyXG4gICAgICAgICAgICByZXN1bHQ7XHJcbiAgICAgICAgcHJldiAmJiBwcmV2ICE9PSBzZWxmICYmIHByZXYuZGF0YS5wdXNoKHNlbGYpO1xyXG4gICAgICAgIHNjb3BlICYmIChzZWxmLnNlbGVjdG9yID0gc2VsZWN0b3Ioc2NvcGUpKTtcclxuICAgICAgICBfY29udGV4dCA9IHNlbGY7XHJcbiAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShzZWxmLCBhcmd1bWVudHMpO1xyXG4gICAgICAgIF9pc0Z1bmN0aW9uKHJlc3VsdCkgJiYgc2VsZi5fci5wdXNoKHJlc3VsdCk7XHJcbiAgICAgICAgX2NvbnRleHQgPSBwcmV2O1xyXG4gICAgICAgIHNlbGYuc2VsZWN0b3IgPSBwcmV2U2VsZWN0b3I7XHJcbiAgICAgICAgc2VsZi5pc1JldmVydGVkID0gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHNlbGYubGFzdCA9IGY7XHJcbiAgICAgIHJldHVybiBuYW1lID09PSBfaXNGdW5jdGlvbiA/IGYoc2VsZiwgZnVuY3Rpb24gKGZ1bmMpIHtcclxuICAgICAgICByZXR1cm4gc2VsZi5hZGQobnVsbCwgZnVuYyk7XHJcbiAgICAgIH0pIDogbmFtZSA/IHNlbGZbbmFtZV0gPSBmIDogZjtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvNS5pZ25vcmUgPSBmdW5jdGlvbiBpZ25vcmUoZnVuYykge1xyXG4gICAgICB2YXIgcHJldiA9IF9jb250ZXh0O1xyXG4gICAgICBfY29udGV4dCA9IG51bGw7XHJcbiAgICAgIGZ1bmModGhpcyk7XHJcbiAgICAgIF9jb250ZXh0ID0gcHJldjtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvNS5nZXRUd2VlbnMgPSBmdW5jdGlvbiBnZXRUd2VlbnMoKSB7XHJcbiAgICAgIHZhciBhID0gW107XHJcbiAgICAgIHRoaXMuZGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBDb250ZXh0ID8gYS5wdXNoLmFwcGx5KGEsIGUuZ2V0VHdlZW5zKCkpIDogZSBpbnN0YW5jZW9mIFR3ZWVuICYmICEoZS5wYXJlbnQgJiYgZS5wYXJlbnQuZGF0YSA9PT0gXCJuZXN0ZWRcIikgJiYgYS5wdXNoKGUpO1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGE7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90bzUuY2xlYXIgPSBmdW5jdGlvbiBjbGVhcigpIHtcclxuICAgICAgdGhpcy5fci5sZW5ndGggPSB0aGlzLmRhdGEubGVuZ3RoID0gMDtcclxuICAgIH07XHJcblxyXG4gICAgX3Byb3RvNS5raWxsID0gZnVuY3Rpb24ga2lsbChyZXZlcnQsIG1hdGNoTWVkaWEpIHtcclxuICAgICAgdmFyIF90aGlzNCA9IHRoaXM7XHJcblxyXG4gICAgICBpZiAocmV2ZXJ0KSB7XHJcbiAgICAgICAgKGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgIHZhciB0d2VlbnMgPSBfdGhpczQuZ2V0VHdlZW5zKCksXHJcbiAgICAgICAgICAgICAgaSA9IF90aGlzNC5kYXRhLmxlbmd0aCxcclxuICAgICAgICAgICAgICB0O1xyXG5cclxuICAgICAgICAgIHdoaWxlIChpLS0pIHtcclxuICAgICAgICAgICAgdCA9IF90aGlzNC5kYXRhW2ldO1xyXG5cclxuICAgICAgICAgICAgaWYgKHQuZGF0YSA9PT0gXCJpc0ZsaXBcIikge1xyXG4gICAgICAgICAgICAgIHQucmV2ZXJ0KCk7XHJcbiAgICAgICAgICAgICAgdC5nZXRDaGlsZHJlbih0cnVlLCB0cnVlLCBmYWxzZSkuZm9yRWFjaChmdW5jdGlvbiAodHdlZW4pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0d2VlbnMuc3BsaWNlKHR3ZWVucy5pbmRleE9mKHR3ZWVuKSwgMSk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0d2VlbnMubWFwKGZ1bmN0aW9uICh0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgZzogdC5fZHVyIHx8IHQuX2RlbGF5IHx8IHQuX3NhdCAmJiAhdC5fc2F0LnZhcnMuaW1tZWRpYXRlUmVuZGVyID8gdC5nbG9iYWxUaW1lKDApIDogLUluZmluaXR5LFxyXG4gICAgICAgICAgICAgIHQ6IHRcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIH0pLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGIuZyAtIGEuZyB8fCAtSW5maW5pdHk7XHJcbiAgICAgICAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChvKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvLnQucmV2ZXJ0KHJldmVydCk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGkgPSBfdGhpczQuZGF0YS5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgd2hpbGUgKGktLSkge1xyXG4gICAgICAgICAgICB0ID0gX3RoaXM0LmRhdGFbaV07XHJcblxyXG4gICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIFRpbWVsaW5lKSB7XHJcbiAgICAgICAgICAgICAgaWYgKHQuZGF0YSAhPT0gXCJuZXN0ZWRcIikge1xyXG4gICAgICAgICAgICAgICAgdC5zY3JvbGxUcmlnZ2VyICYmIHQuc2Nyb2xsVHJpZ2dlci5yZXZlcnQoKTtcclxuICAgICAgICAgICAgICAgIHQua2lsbCgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAhKHQgaW5zdGFuY2VvZiBUd2VlbikgJiYgdC5yZXZlcnQgJiYgdC5yZXZlcnQocmV2ZXJ0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIF90aGlzNC5fci5mb3JFYWNoKGZ1bmN0aW9uIChmKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmKHJldmVydCwgX3RoaXM0KTtcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIF90aGlzNC5pc1JldmVydGVkID0gdHJ1ZTtcclxuICAgICAgICB9KSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICByZXR1cm4gZS5raWxsICYmIGUua2lsbCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmNsZWFyKCk7XHJcblxyXG4gICAgICBpZiAobWF0Y2hNZWRpYSkge1xyXG4gICAgICAgIHZhciBpID0gX21lZGlhLmxlbmd0aDtcclxuXHJcbiAgICAgICAgd2hpbGUgKGktLSkge1xyXG4gICAgICAgICAgX21lZGlhW2ldLmlkID09PSB0aGlzLmlkICYmIF9tZWRpYS5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90bzUucmV2ZXJ0ID0gZnVuY3Rpb24gcmV2ZXJ0KGNvbmZpZykge1xyXG4gICAgICB0aGlzLmtpbGwoY29uZmlnIHx8IHt9KTtcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIENvbnRleHQ7XHJcbiAgfSgpO1xyXG5cclxuICB2YXIgTWF0Y2hNZWRpYSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGZ1bmN0aW9uIE1hdGNoTWVkaWEoc2NvcGUpIHtcclxuICAgICAgdGhpcy5jb250ZXh0cyA9IFtdO1xyXG4gICAgICB0aGlzLnNjb3BlID0gc2NvcGU7XHJcbiAgICAgIF9jb250ZXh0ICYmIF9jb250ZXh0LmRhdGEucHVzaCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICB2YXIgX3Byb3RvNiA9IE1hdGNoTWVkaWEucHJvdG90eXBlO1xyXG5cclxuICAgIF9wcm90bzYuYWRkID0gZnVuY3Rpb24gYWRkKGNvbmRpdGlvbnMsIGZ1bmMsIHNjb3BlKSB7XHJcbiAgICAgIF9pc09iamVjdChjb25kaXRpb25zKSB8fCAoY29uZGl0aW9ucyA9IHtcclxuICAgICAgICBtYXRjaGVzOiBjb25kaXRpb25zXHJcbiAgICAgIH0pO1xyXG4gICAgICB2YXIgY29udGV4dCA9IG5ldyBDb250ZXh0KDAsIHNjb3BlIHx8IHRoaXMuc2NvcGUpLFxyXG4gICAgICAgICAgY29uZCA9IGNvbnRleHQuY29uZGl0aW9ucyA9IHt9LFxyXG4gICAgICAgICAgbXEsXHJcbiAgICAgICAgICBwLFxyXG4gICAgICAgICAgYWN0aXZlO1xyXG4gICAgICBfY29udGV4dCAmJiAhY29udGV4dC5zZWxlY3RvciAmJiAoY29udGV4dC5zZWxlY3RvciA9IF9jb250ZXh0LnNlbGVjdG9yKTtcclxuICAgICAgdGhpcy5jb250ZXh0cy5wdXNoKGNvbnRleHQpO1xyXG4gICAgICBmdW5jID0gY29udGV4dC5hZGQoXCJvbk1hdGNoXCIsIGZ1bmMpO1xyXG4gICAgICBjb250ZXh0LnF1ZXJpZXMgPSBjb25kaXRpb25zO1xyXG5cclxuICAgICAgZm9yIChwIGluIGNvbmRpdGlvbnMpIHtcclxuICAgICAgICBpZiAocCA9PT0gXCJhbGxcIikge1xyXG4gICAgICAgICAgYWN0aXZlID0gMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgbXEgPSBfd2luLm1hdGNoTWVkaWEoY29uZGl0aW9uc1twXSk7XHJcblxyXG4gICAgICAgICAgaWYgKG1xKSB7XHJcbiAgICAgICAgICAgIF9tZWRpYS5pbmRleE9mKGNvbnRleHQpIDwgMCAmJiBfbWVkaWEucHVzaChjb250ZXh0KTtcclxuICAgICAgICAgICAgKGNvbmRbcF0gPSBtcS5tYXRjaGVzKSAmJiAoYWN0aXZlID0gMSk7XHJcbiAgICAgICAgICAgIG1xLmFkZExpc3RlbmVyID8gbXEuYWRkTGlzdGVuZXIoX29uTWVkaWFDaGFuZ2UpIDogbXEuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLCBfb25NZWRpYUNoYW5nZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBhY3RpdmUgJiYgZnVuYyhjb250ZXh0LCBmdW5jdGlvbiAoZikge1xyXG4gICAgICAgIHJldHVybiBjb250ZXh0LmFkZChudWxsLCBmKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfTtcclxuXHJcbiAgICBfcHJvdG82LnJldmVydCA9IGZ1bmN0aW9uIHJldmVydChjb25maWcpIHtcclxuICAgICAgdGhpcy5raWxsKGNvbmZpZyB8fCB7fSk7XHJcbiAgICB9O1xyXG5cclxuICAgIF9wcm90bzYua2lsbCA9IGZ1bmN0aW9uIGtpbGwocmV2ZXJ0KSB7XHJcbiAgICAgIHRoaXMuY29udGV4dHMuZm9yRWFjaChmdW5jdGlvbiAoYykge1xyXG4gICAgICAgIHJldHVybiBjLmtpbGwocmV2ZXJ0LCB0cnVlKTtcclxuICAgICAgfSk7XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBNYXRjaE1lZGlhO1xyXG4gIH0oKTtcclxuXHJcbiAgdmFyIF9nc2FwID0ge1xyXG4gICAgcmVnaXN0ZXJQbHVnaW46IGZ1bmN0aW9uIHJlZ2lzdGVyUGx1Z2luKCkge1xyXG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcclxuICAgICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGFyZ3MuZm9yRWFjaChmdW5jdGlvbiAoY29uZmlnKSB7XHJcbiAgICAgICAgcmV0dXJuIF9jcmVhdGVQbHVnaW4oY29uZmlnKTtcclxuICAgICAgfSk7XHJcbiAgICB9LFxyXG4gICAgdGltZWxpbmU6IGZ1bmN0aW9uIHRpbWVsaW5lKHZhcnMpIHtcclxuICAgICAgcmV0dXJuIG5ldyBUaW1lbGluZSh2YXJzKTtcclxuICAgIH0sXHJcbiAgICBnZXRUd2VlbnNPZjogZnVuY3Rpb24gZ2V0VHdlZW5zT2YodGFyZ2V0cywgb25seUFjdGl2ZSkge1xyXG4gICAgICByZXR1cm4gX2dsb2JhbFRpbWVsaW5lLmdldFR3ZWVuc09mKHRhcmdldHMsIG9ubHlBY3RpdmUpO1xyXG4gICAgfSxcclxuICAgIGdldFByb3BlcnR5OiBmdW5jdGlvbiBnZXRQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5LCB1bml0LCB1bmNhY2hlKSB7XHJcbiAgICAgIF9pc1N0cmluZyh0YXJnZXQpICYmICh0YXJnZXQgPSB0b0FycmF5KHRhcmdldClbMF0pO1xyXG5cclxuICAgICAgdmFyIGdldHRlciA9IF9nZXRDYWNoZSh0YXJnZXQgfHwge30pLmdldCxcclxuICAgICAgICAgIGZvcm1hdCA9IHVuaXQgPyBfcGFzc1Rocm91Z2ggOiBfbnVtZXJpY0lmUG9zc2libGU7XHJcblxyXG4gICAgICB1bml0ID09PSBcIm5hdGl2ZVwiICYmICh1bml0ID0gXCJcIik7XHJcbiAgICAgIHJldHVybiAhdGFyZ2V0ID8gdGFyZ2V0IDogIXByb3BlcnR5ID8gZnVuY3Rpb24gKHByb3BlcnR5LCB1bml0LCB1bmNhY2hlKSB7XHJcbiAgICAgICAgcmV0dXJuIGZvcm1hdCgoX3BsdWdpbnNbcHJvcGVydHldICYmIF9wbHVnaW5zW3Byb3BlcnR5XS5nZXQgfHwgZ2V0dGVyKSh0YXJnZXQsIHByb3BlcnR5LCB1bml0LCB1bmNhY2hlKSk7XHJcbiAgICAgIH0gOiBmb3JtYXQoKF9wbHVnaW5zW3Byb3BlcnR5XSAmJiBfcGx1Z2luc1twcm9wZXJ0eV0uZ2V0IHx8IGdldHRlcikodGFyZ2V0LCBwcm9wZXJ0eSwgdW5pdCwgdW5jYWNoZSkpO1xyXG4gICAgfSxcclxuICAgIHF1aWNrU2V0dGVyOiBmdW5jdGlvbiBxdWlja1NldHRlcih0YXJnZXQsIHByb3BlcnR5LCB1bml0KSB7XHJcbiAgICAgIHRhcmdldCA9IHRvQXJyYXkodGFyZ2V0KTtcclxuXHJcbiAgICAgIGlmICh0YXJnZXQubGVuZ3RoID4gMSkge1xyXG4gICAgICAgIHZhciBzZXR0ZXJzID0gdGFyZ2V0Lm1hcChmdW5jdGlvbiAodCkge1xyXG4gICAgICAgICAgcmV0dXJuIGdzYXAucXVpY2tTZXR0ZXIodCwgcHJvcGVydHksIHVuaXQpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgICAgICBsID0gc2V0dGVycy5sZW5ndGg7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xyXG4gICAgICAgICAgdmFyIGkgPSBsO1xyXG5cclxuICAgICAgICAgIHdoaWxlIChpLS0pIHtcclxuICAgICAgICAgICAgc2V0dGVyc1tpXSh2YWx1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGFyZ2V0ID0gdGFyZ2V0WzBdIHx8IHt9O1xyXG5cclxuICAgICAgdmFyIFBsdWdpbiA9IF9wbHVnaW5zW3Byb3BlcnR5XSxcclxuICAgICAgICAgIGNhY2hlID0gX2dldENhY2hlKHRhcmdldCksXHJcbiAgICAgICAgICBwID0gY2FjaGUuaGFybmVzcyAmJiAoY2FjaGUuaGFybmVzcy5hbGlhc2VzIHx8IHt9KVtwcm9wZXJ0eV0gfHwgcHJvcGVydHksXHJcbiAgICAgICAgICBzZXR0ZXIgPSBQbHVnaW4gPyBmdW5jdGlvbiAodmFsdWUpIHtcclxuICAgICAgICB2YXIgcCA9IG5ldyBQbHVnaW4oKTtcclxuICAgICAgICBfcXVpY2tUd2Vlbi5fcHQgPSAwO1xyXG4gICAgICAgIHAuaW5pdCh0YXJnZXQsIHVuaXQgPyB2YWx1ZSArIHVuaXQgOiB2YWx1ZSwgX3F1aWNrVHdlZW4sIDAsIFt0YXJnZXRdKTtcclxuICAgICAgICBwLnJlbmRlcigxLCBwKTtcclxuICAgICAgICBfcXVpY2tUd2Vlbi5fcHQgJiYgX3JlbmRlclByb3BUd2VlbnMoMSwgX3F1aWNrVHdlZW4pO1xyXG4gICAgICB9IDogY2FjaGUuc2V0KHRhcmdldCwgcCk7XHJcblxyXG4gICAgICByZXR1cm4gUGx1Z2luID8gc2V0dGVyIDogZnVuY3Rpb24gKHZhbHVlKSB7XHJcbiAgICAgICAgcmV0dXJuIHNldHRlcih0YXJnZXQsIHAsIHVuaXQgPyB2YWx1ZSArIHVuaXQgOiB2YWx1ZSwgY2FjaGUsIDEpO1xyXG4gICAgICB9O1xyXG4gICAgfSxcclxuICAgIHF1aWNrVG86IGZ1bmN0aW9uIHF1aWNrVG8odGFyZ2V0LCBwcm9wZXJ0eSwgdmFycykge1xyXG4gICAgICB2YXIgX3NldERlZmF1bHRzMjtcclxuXHJcbiAgICAgIHZhciB0d2VlbiA9IGdzYXAudG8odGFyZ2V0LCBfc2V0RGVmYXVsdHMoKF9zZXREZWZhdWx0czIgPSB7fSwgX3NldERlZmF1bHRzMltwcm9wZXJ0eV0gPSBcIis9MC4xXCIsIF9zZXREZWZhdWx0czIucGF1c2VkID0gdHJ1ZSwgX3NldERlZmF1bHRzMi5zdGFnZ2VyID0gMCwgX3NldERlZmF1bHRzMiksIHZhcnMgfHwge30pKSxcclxuICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiBmdW5jKHZhbHVlLCBzdGFydCwgc3RhcnRJc1JlbGF0aXZlKSB7XHJcbiAgICAgICAgcmV0dXJuIHR3ZWVuLnJlc2V0VG8ocHJvcGVydHksIHZhbHVlLCBzdGFydCwgc3RhcnRJc1JlbGF0aXZlKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGZ1bmMudHdlZW4gPSB0d2VlbjtcclxuICAgICAgcmV0dXJuIGZ1bmM7XHJcbiAgICB9LFxyXG4gICAgaXNUd2VlbmluZzogZnVuY3Rpb24gaXNUd2VlbmluZyh0YXJnZXRzKSB7XHJcbiAgICAgIHJldHVybiBfZ2xvYmFsVGltZWxpbmUuZ2V0VHdlZW5zT2YodGFyZ2V0cywgdHJ1ZSkubGVuZ3RoID4gMDtcclxuICAgIH0sXHJcbiAgICBkZWZhdWx0czogZnVuY3Rpb24gZGVmYXVsdHModmFsdWUpIHtcclxuICAgICAgdmFsdWUgJiYgdmFsdWUuZWFzZSAmJiAodmFsdWUuZWFzZSA9IF9wYXJzZUVhc2UodmFsdWUuZWFzZSwgX2RlZmF1bHRzLmVhc2UpKTtcclxuICAgICAgcmV0dXJuIF9tZXJnZURlZXAoX2RlZmF1bHRzLCB2YWx1ZSB8fCB7fSk7XHJcbiAgICB9LFxyXG4gICAgY29uZmlnOiBmdW5jdGlvbiBjb25maWcodmFsdWUpIHtcclxuICAgICAgcmV0dXJuIF9tZXJnZURlZXAoX2NvbmZpZywgdmFsdWUgfHwge30pO1xyXG4gICAgfSxcclxuICAgIHJlZ2lzdGVyRWZmZWN0OiBmdW5jdGlvbiByZWdpc3RlckVmZmVjdChfcmVmMykge1xyXG4gICAgICB2YXIgbmFtZSA9IF9yZWYzLm5hbWUsXHJcbiAgICAgICAgICBlZmZlY3QgPSBfcmVmMy5lZmZlY3QsXHJcbiAgICAgICAgICBwbHVnaW5zID0gX3JlZjMucGx1Z2lucyxcclxuICAgICAgICAgIGRlZmF1bHRzID0gX3JlZjMuZGVmYXVsdHMsXHJcbiAgICAgICAgICBleHRlbmRUaW1lbGluZSA9IF9yZWYzLmV4dGVuZFRpbWVsaW5lO1xyXG4gICAgICAocGx1Z2lucyB8fCBcIlwiKS5zcGxpdChcIixcIikuZm9yRWFjaChmdW5jdGlvbiAocGx1Z2luTmFtZSkge1xyXG4gICAgICAgIHJldHVybiBwbHVnaW5OYW1lICYmICFfcGx1Z2luc1twbHVnaW5OYW1lXSAmJiAhX2dsb2JhbHNbcGx1Z2luTmFtZV0gJiYgX3dhcm4obmFtZSArIFwiIGVmZmVjdCByZXF1aXJlcyBcIiArIHBsdWdpbk5hbWUgKyBcIiBwbHVnaW4uXCIpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIF9lZmZlY3RzW25hbWVdID0gZnVuY3Rpb24gKHRhcmdldHMsIHZhcnMsIHRsKSB7XHJcbiAgICAgICAgcmV0dXJuIGVmZmVjdCh0b0FycmF5KHRhcmdldHMpLCBfc2V0RGVmYXVsdHModmFycyB8fCB7fSwgZGVmYXVsdHMpLCB0bCk7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBpZiAoZXh0ZW5kVGltZWxpbmUpIHtcclxuICAgICAgICBUaW1lbGluZS5wcm90b3R5cGVbbmFtZV0gPSBmdW5jdGlvbiAodGFyZ2V0cywgdmFycywgcG9zaXRpb24pIHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmFkZChfZWZmZWN0c1tuYW1lXSh0YXJnZXRzLCBfaXNPYmplY3QodmFycykgPyB2YXJzIDogKHBvc2l0aW9uID0gdmFycykgJiYge30sIHRoaXMpLCBwb3NpdGlvbik7XHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIHJlZ2lzdGVyRWFzZTogZnVuY3Rpb24gcmVnaXN0ZXJFYXNlKG5hbWUsIGVhc2UpIHtcclxuICAgICAgX2Vhc2VNYXBbbmFtZV0gPSBfcGFyc2VFYXNlKGVhc2UpO1xyXG4gICAgfSxcclxuICAgIHBhcnNlRWFzZTogZnVuY3Rpb24gcGFyc2VFYXNlKGVhc2UsIGRlZmF1bHRFYXNlKSB7XHJcbiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gX3BhcnNlRWFzZShlYXNlLCBkZWZhdWx0RWFzZSkgOiBfZWFzZU1hcDtcclxuICAgIH0sXHJcbiAgICBnZXRCeUlkOiBmdW5jdGlvbiBnZXRCeUlkKGlkKSB7XHJcbiAgICAgIHJldHVybiBfZ2xvYmFsVGltZWxpbmUuZ2V0QnlJZChpZCk7XHJcbiAgICB9LFxyXG4gICAgZXhwb3J0Um9vdDogZnVuY3Rpb24gZXhwb3J0Um9vdCh2YXJzLCBpbmNsdWRlRGVsYXllZENhbGxzKSB7XHJcbiAgICAgIGlmICh2YXJzID09PSB2b2lkIDApIHtcclxuICAgICAgICB2YXJzID0ge307XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHZhciB0bCA9IG5ldyBUaW1lbGluZSh2YXJzKSxcclxuICAgICAgICAgIGNoaWxkLFxyXG4gICAgICAgICAgbmV4dDtcclxuICAgICAgdGwuc21vb3RoQ2hpbGRUaW1pbmcgPSBfaXNOb3RGYWxzZSh2YXJzLnNtb290aENoaWxkVGltaW5nKTtcclxuXHJcbiAgICAgIF9nbG9iYWxUaW1lbGluZS5yZW1vdmUodGwpO1xyXG5cclxuICAgICAgdGwuX2RwID0gMDtcclxuICAgICAgdGwuX3RpbWUgPSB0bC5fdFRpbWUgPSBfZ2xvYmFsVGltZWxpbmUuX3RpbWU7XHJcbiAgICAgIGNoaWxkID0gX2dsb2JhbFRpbWVsaW5lLl9maXJzdDtcclxuXHJcbiAgICAgIHdoaWxlIChjaGlsZCkge1xyXG4gICAgICAgIG5leHQgPSBjaGlsZC5fbmV4dDtcclxuXHJcbiAgICAgICAgaWYgKGluY2x1ZGVEZWxheWVkQ2FsbHMgfHwgISghY2hpbGQuX2R1ciAmJiBjaGlsZCBpbnN0YW5jZW9mIFR3ZWVuICYmIGNoaWxkLnZhcnMub25Db21wbGV0ZSA9PT0gY2hpbGQuX3RhcmdldHNbMF0pKSB7XHJcbiAgICAgICAgICBfYWRkVG9UaW1lbGluZSh0bCwgY2hpbGQsIGNoaWxkLl9zdGFydCAtIGNoaWxkLl9kZWxheSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjaGlsZCA9IG5leHQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIF9hZGRUb1RpbWVsaW5lKF9nbG9iYWxUaW1lbGluZSwgdGwsIDApO1xyXG5cclxuICAgICAgcmV0dXJuIHRsO1xyXG4gICAgfSxcclxuICAgIGNvbnRleHQ6IGZ1bmN0aW9uIGNvbnRleHQoZnVuYywgc2NvcGUpIHtcclxuICAgICAgcmV0dXJuIGZ1bmMgPyBuZXcgQ29udGV4dChmdW5jLCBzY29wZSkgOiBfY29udGV4dDtcclxuICAgIH0sXHJcbiAgICBtYXRjaE1lZGlhOiBmdW5jdGlvbiBtYXRjaE1lZGlhKHNjb3BlKSB7XHJcbiAgICAgIHJldHVybiBuZXcgTWF0Y2hNZWRpYShzY29wZSk7XHJcbiAgICB9LFxyXG4gICAgbWF0Y2hNZWRpYVJlZnJlc2g6IGZ1bmN0aW9uIG1hdGNoTWVkaWFSZWZyZXNoKCkge1xyXG4gICAgICByZXR1cm4gX21lZGlhLmZvckVhY2goZnVuY3Rpb24gKGMpIHtcclxuICAgICAgICB2YXIgY29uZCA9IGMuY29uZGl0aW9ucyxcclxuICAgICAgICAgICAgZm91bmQsXHJcbiAgICAgICAgICAgIHA7XHJcblxyXG4gICAgICAgIGZvciAocCBpbiBjb25kKSB7XHJcbiAgICAgICAgICBpZiAoY29uZFtwXSkge1xyXG4gICAgICAgICAgICBjb25kW3BdID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGZvdW5kID0gMTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvdW5kICYmIGMucmV2ZXJ0KCk7XHJcbiAgICAgIH0pIHx8IF9vbk1lZGlhQ2hhbmdlKCk7XHJcbiAgICB9LFxyXG4gICAgYWRkRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjaykge1xyXG4gICAgICB2YXIgYSA9IF9saXN0ZW5lcnNbdHlwZV0gfHwgKF9saXN0ZW5lcnNbdHlwZV0gPSBbXSk7XHJcbiAgICAgIH5hLmluZGV4T2YoY2FsbGJhY2spIHx8IGEucHVzaChjYWxsYmFjayk7XHJcbiAgICB9LFxyXG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBjYWxsYmFjaykge1xyXG4gICAgICB2YXIgYSA9IF9saXN0ZW5lcnNbdHlwZV0sXHJcbiAgICAgICAgICBpID0gYSAmJiBhLmluZGV4T2YoY2FsbGJhY2spO1xyXG4gICAgICBpID49IDAgJiYgYS5zcGxpY2UoaSwgMSk7XHJcbiAgICB9LFxyXG4gICAgdXRpbHM6IHtcclxuICAgICAgd3JhcDogd3JhcCxcclxuICAgICAgd3JhcFlveW86IHdyYXBZb3lvLFxyXG4gICAgICBkaXN0cmlidXRlOiBkaXN0cmlidXRlLFxyXG4gICAgICByYW5kb206IHJhbmRvbSxcclxuICAgICAgc25hcDogc25hcCxcclxuICAgICAgbm9ybWFsaXplOiBub3JtYWxpemUsXHJcbiAgICAgIGdldFVuaXQ6IGdldFVuaXQsXHJcbiAgICAgIGNsYW1wOiBjbGFtcCxcclxuICAgICAgc3BsaXRDb2xvcjogc3BsaXRDb2xvcixcclxuICAgICAgdG9BcnJheTogdG9BcnJheSxcclxuICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxyXG4gICAgICBtYXBSYW5nZTogbWFwUmFuZ2UsXHJcbiAgICAgIHBpcGU6IHBpcGUsXHJcbiAgICAgIHVuaXRpemU6IHVuaXRpemUsXHJcbiAgICAgIGludGVycG9sYXRlOiBpbnRlcnBvbGF0ZSxcclxuICAgICAgc2h1ZmZsZTogc2h1ZmZsZVxyXG4gICAgfSxcclxuICAgIGluc3RhbGw6IF9pbnN0YWxsLFxyXG4gICAgZWZmZWN0czogX2VmZmVjdHMsXHJcbiAgICB0aWNrZXI6IF90aWNrZXIsXHJcbiAgICB1cGRhdGVSb290OiBUaW1lbGluZS51cGRhdGVSb290LFxyXG4gICAgcGx1Z2luczogX3BsdWdpbnMsXHJcbiAgICBnbG9iYWxUaW1lbGluZTogX2dsb2JhbFRpbWVsaW5lLFxyXG4gICAgY29yZToge1xyXG4gICAgICBQcm9wVHdlZW46IFByb3BUd2VlbixcclxuICAgICAgZ2xvYmFsczogX2FkZEdsb2JhbCxcclxuICAgICAgVHdlZW46IFR3ZWVuLFxyXG4gICAgICBUaW1lbGluZTogVGltZWxpbmUsXHJcbiAgICAgIEFuaW1hdGlvbjogQW5pbWF0aW9uLFxyXG4gICAgICBnZXRDYWNoZTogX2dldENhY2hlLFxyXG4gICAgICBfcmVtb3ZlTGlua2VkTGlzdEl0ZW06IF9yZW1vdmVMaW5rZWRMaXN0SXRlbSxcclxuICAgICAgcmV2ZXJ0aW5nOiBmdW5jdGlvbiByZXZlcnRpbmcoKSB7XHJcbiAgICAgICAgcmV0dXJuIF9yZXZlcnRpbmc7XHJcbiAgICAgIH0sXHJcbiAgICAgIGNvbnRleHQ6IGZ1bmN0aW9uIGNvbnRleHQodG9BZGQpIHtcclxuICAgICAgICBpZiAodG9BZGQgJiYgX2NvbnRleHQpIHtcclxuICAgICAgICAgIF9jb250ZXh0LmRhdGEucHVzaCh0b0FkZCk7XHJcblxyXG4gICAgICAgICAgdG9BZGQuX2N0eCA9IF9jb250ZXh0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIF9jb250ZXh0O1xyXG4gICAgICB9LFxyXG4gICAgICBzdXBwcmVzc092ZXJ3cml0ZXM6IGZ1bmN0aW9uIHN1cHByZXNzT3ZlcndyaXRlcyh2YWx1ZSkge1xyXG4gICAgICAgIHJldHVybiBfc3VwcHJlc3NPdmVyd3JpdGVzID0gdmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9O1xyXG5cclxuICBfZm9yRWFjaE5hbWUoXCJ0byxmcm9tLGZyb21UbyxkZWxheWVkQ2FsbCxzZXQsa2lsbFR3ZWVuc09mXCIsIGZ1bmN0aW9uIChuYW1lKSB7XHJcbiAgICByZXR1cm4gX2dzYXBbbmFtZV0gPSBUd2VlbltuYW1lXTtcclxuICB9KTtcclxuXHJcbiAgX3RpY2tlci5hZGQoVGltZWxpbmUudXBkYXRlUm9vdCk7XHJcblxyXG4gIF9xdWlja1R3ZWVuID0gX2dzYXAudG8oe30sIHtcclxuICAgIGR1cmF0aW9uOiAwXHJcbiAgfSk7XHJcblxyXG4gIHZhciBfZ2V0UGx1Z2luUHJvcFR3ZWVuID0gZnVuY3Rpb24gX2dldFBsdWdpblByb3BUd2VlbihwbHVnaW4sIHByb3ApIHtcclxuICAgIHZhciBwdCA9IHBsdWdpbi5fcHQ7XHJcblxyXG4gICAgd2hpbGUgKHB0ICYmIHB0LnAgIT09IHByb3AgJiYgcHQub3AgIT09IHByb3AgJiYgcHQuZnAgIT09IHByb3ApIHtcclxuICAgICAgcHQgPSBwdC5fbmV4dDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcHQ7XHJcbiAgfSxcclxuICAgICAgX2FkZE1vZGlmaWVycyA9IGZ1bmN0aW9uIF9hZGRNb2RpZmllcnModHdlZW4sIG1vZGlmaWVycykge1xyXG4gICAgdmFyIHRhcmdldHMgPSB0d2Vlbi5fdGFyZ2V0cyxcclxuICAgICAgICBwLFxyXG4gICAgICAgIGksXHJcbiAgICAgICAgcHQ7XHJcblxyXG4gICAgZm9yIChwIGluIG1vZGlmaWVycykge1xyXG4gICAgICBpID0gdGFyZ2V0cy5sZW5ndGg7XHJcblxyXG4gICAgICB3aGlsZSAoaS0tKSB7XHJcbiAgICAgICAgcHQgPSB0d2Vlbi5fcHRMb29rdXBbaV1bcF07XHJcblxyXG4gICAgICAgIGlmIChwdCAmJiAocHQgPSBwdC5kKSkge1xyXG4gICAgICAgICAgaWYgKHB0Ll9wdCkge1xyXG4gICAgICAgICAgICBwdCA9IF9nZXRQbHVnaW5Qcm9wVHdlZW4ocHQsIHApO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHB0ICYmIHB0Lm1vZGlmaWVyICYmIHB0Lm1vZGlmaWVyKG1vZGlmaWVyc1twXSwgdHdlZW4sIHRhcmdldHNbaV0sIHApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0sXHJcbiAgICAgIF9idWlsZE1vZGlmaWVyUGx1Z2luID0gZnVuY3Rpb24gX2J1aWxkTW9kaWZpZXJQbHVnaW4obmFtZSwgbW9kaWZpZXIpIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG5hbWU6IG5hbWUsXHJcbiAgICAgIGhlYWRsZXNzOiAxLFxyXG4gICAgICByYXdWYXJzOiAxLFxyXG4gICAgICBpbml0OiBmdW5jdGlvbiBpbml0KHRhcmdldCwgdmFycywgdHdlZW4pIHtcclxuICAgICAgICB0d2Vlbi5fb25Jbml0ID0gZnVuY3Rpb24gKHR3ZWVuKSB7XHJcbiAgICAgICAgICB2YXIgdGVtcCwgcDtcclxuXHJcbiAgICAgICAgICBpZiAoX2lzU3RyaW5nKHZhcnMpKSB7XHJcbiAgICAgICAgICAgIHRlbXAgPSB7fTtcclxuXHJcbiAgICAgICAgICAgIF9mb3JFYWNoTmFtZSh2YXJzLCBmdW5jdGlvbiAobmFtZSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiB0ZW1wW25hbWVdID0gMTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB2YXJzID0gdGVtcDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZiAobW9kaWZpZXIpIHtcclxuICAgICAgICAgICAgdGVtcCA9IHt9O1xyXG5cclxuICAgICAgICAgICAgZm9yIChwIGluIHZhcnMpIHtcclxuICAgICAgICAgICAgICB0ZW1wW3BdID0gbW9kaWZpZXIodmFyc1twXSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhcnMgPSB0ZW1wO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIF9hZGRNb2RpZmllcnModHdlZW4sIHZhcnMpO1xyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfTtcclxuXHJcbiAgdmFyIGdzYXAgPSBfZ3NhcC5yZWdpc3RlclBsdWdpbih7XHJcbiAgICBuYW1lOiBcImF0dHJcIixcclxuICAgIGluaXQ6IGZ1bmN0aW9uIGluaXQodGFyZ2V0LCB2YXJzLCB0d2VlbiwgaW5kZXgsIHRhcmdldHMpIHtcclxuICAgICAgdmFyIHAsIHB0LCB2O1xyXG4gICAgICB0aGlzLnR3ZWVuID0gdHdlZW47XHJcblxyXG4gICAgICBmb3IgKHAgaW4gdmFycykge1xyXG4gICAgICAgIHYgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKHApIHx8IFwiXCI7XHJcbiAgICAgICAgcHQgPSB0aGlzLmFkZCh0YXJnZXQsIFwic2V0QXR0cmlidXRlXCIsICh2IHx8IDApICsgXCJcIiwgdmFyc1twXSwgaW5kZXgsIHRhcmdldHMsIDAsIDAsIHApO1xyXG4gICAgICAgIHB0Lm9wID0gcDtcclxuICAgICAgICBwdC5iID0gdjtcclxuXHJcbiAgICAgICAgdGhpcy5fcHJvcHMucHVzaChwKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIHJlbmRlcjogZnVuY3Rpb24gcmVuZGVyKHJhdGlvLCBkYXRhKSB7XHJcbiAgICAgIHZhciBwdCA9IGRhdGEuX3B0O1xyXG5cclxuICAgICAgd2hpbGUgKHB0KSB7XHJcbiAgICAgICAgX3JldmVydGluZyA/IHB0LnNldChwdC50LCBwdC5wLCBwdC5iLCBwdCkgOiBwdC5yKHJhdGlvLCBwdC5kKTtcclxuICAgICAgICBwdCA9IHB0Ll9uZXh0O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSwge1xyXG4gICAgbmFtZTogXCJlbmRBcnJheVwiLFxyXG4gICAgaGVhZGxlc3M6IDEsXHJcbiAgICBpbml0OiBmdW5jdGlvbiBpbml0KHRhcmdldCwgdmFsdWUpIHtcclxuICAgICAgdmFyIGkgPSB2YWx1ZS5sZW5ndGg7XHJcblxyXG4gICAgICB3aGlsZSAoaS0tKSB7XHJcbiAgICAgICAgdGhpcy5hZGQodGFyZ2V0LCBpLCB0YXJnZXRbaV0gfHwgMCwgdmFsdWVbaV0sIDAsIDAsIDAsIDAsIDAsIDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSwgX2J1aWxkTW9kaWZpZXJQbHVnaW4oXCJyb3VuZFByb3BzXCIsIF9yb3VuZE1vZGlmaWVyKSwgX2J1aWxkTW9kaWZpZXJQbHVnaW4oXCJtb2RpZmllcnNcIiksIF9idWlsZE1vZGlmaWVyUGx1Z2luKFwic25hcFwiLCBzbmFwKSkgfHwgX2dzYXA7XHJcbiAgVHdlZW4udmVyc2lvbiA9IFRpbWVsaW5lLnZlcnNpb24gPSBnc2FwLnZlcnNpb24gPSBcIjMuMTMuMFwiO1xyXG4gIF9jb3JlUmVhZHkgPSAxO1xyXG4gIF93aW5kb3dFeGlzdHMoKSAmJiBfd2FrZSgpO1xyXG4gIHZhciBQb3dlcjAgPSBfZWFzZU1hcC5Qb3dlcjAsXHJcbiAgICAgIFBvd2VyMSA9IF9lYXNlTWFwLlBvd2VyMSxcclxuICAgICAgUG93ZXIyID0gX2Vhc2VNYXAuUG93ZXIyLFxyXG4gICAgICBQb3dlcjMgPSBfZWFzZU1hcC5Qb3dlcjMsXHJcbiAgICAgIFBvd2VyNCA9IF9lYXNlTWFwLlBvd2VyNCxcclxuICAgICAgTGluZWFyID0gX2Vhc2VNYXAuTGluZWFyLFxyXG4gICAgICBRdWFkID0gX2Vhc2VNYXAuUXVhZCxcclxuICAgICAgQ3ViaWMgPSBfZWFzZU1hcC5DdWJpYyxcclxuICAgICAgUXVhcnQgPSBfZWFzZU1hcC5RdWFydCxcclxuICAgICAgUXVpbnQgPSBfZWFzZU1hcC5RdWludCxcclxuICAgICAgU3Ryb25nID0gX2Vhc2VNYXAuU3Ryb25nLFxyXG4gICAgICBFbGFzdGljID0gX2Vhc2VNYXAuRWxhc3RpYyxcclxuICAgICAgQmFjayA9IF9lYXNlTWFwLkJhY2ssXHJcbiAgICAgIFN0ZXBwZWRFYXNlID0gX2Vhc2VNYXAuU3RlcHBlZEVhc2UsXHJcbiAgICAgIEJvdW5jZSA9IF9lYXNlTWFwLkJvdW5jZSxcclxuICAgICAgU2luZSA9IF9lYXNlTWFwLlNpbmUsXHJcbiAgICAgIEV4cG8gPSBfZWFzZU1hcC5FeHBvLFxyXG4gICAgICBDaXJjID0gX2Vhc2VNYXAuQ2lyYztcclxuXHJcbiAgdmFyIF93aW4kMSxcclxuICAgICAgX2RvYyQxLFxyXG4gICAgICBfZG9jRWxlbWVudCxcclxuICAgICAgX3BsdWdpbkluaXR0ZWQsXHJcbiAgICAgIF90ZW1wRGl2LFxyXG4gICAgICBfdGVtcERpdlN0eWxlcixcclxuICAgICAgX3JlY2VudFNldHRlclBsdWdpbixcclxuICAgICAgX3JldmVydGluZyQxLFxyXG4gICAgICBfd2luZG93RXhpc3RzJDEgPSBmdW5jdGlvbiBfd2luZG93RXhpc3RzKCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCI7XHJcbiAgfSxcclxuICAgICAgX3RyYW5zZm9ybVByb3BzID0ge30sXHJcbiAgICAgIF9SQUQyREVHID0gMTgwIC8gTWF0aC5QSSxcclxuICAgICAgX0RFRzJSQUQgPSBNYXRoLlBJIC8gMTgwLFxyXG4gICAgICBfYXRhbjIgPSBNYXRoLmF0YW4yLFxyXG4gICAgICBfYmlnTnVtJDEgPSAxZTgsXHJcbiAgICAgIF9jYXBzRXhwID0gLyhbQS1aXSkvZyxcclxuICAgICAgX2hvcml6b250YWxFeHAgPSAvKGxlZnR8cmlnaHR8d2lkdGh8bWFyZ2lufHBhZGRpbmd8eCkvaSxcclxuICAgICAgX2NvbXBsZXhFeHAgPSAvW1xccyxcXChdXFxTLyxcclxuICAgICAgX3Byb3BlcnR5QWxpYXNlcyA9IHtcclxuICAgIGF1dG9BbHBoYTogXCJvcGFjaXR5LHZpc2liaWxpdHlcIixcclxuICAgIHNjYWxlOiBcInNjYWxlWCxzY2FsZVlcIixcclxuICAgIGFscGhhOiBcIm9wYWNpdHlcIlxyXG4gIH0sXHJcbiAgICAgIF9yZW5kZXJDU1NQcm9wID0gZnVuY3Rpb24gX3JlbmRlckNTU1Byb3AocmF0aW8sIGRhdGEpIHtcclxuICAgIHJldHVybiBkYXRhLnNldChkYXRhLnQsIGRhdGEucCwgTWF0aC5yb3VuZCgoZGF0YS5zICsgZGF0YS5jICogcmF0aW8pICogMTAwMDApIC8gMTAwMDAgKyBkYXRhLnUsIGRhdGEpO1xyXG4gIH0sXHJcbiAgICAgIF9yZW5kZXJQcm9wV2l0aEVuZCA9IGZ1bmN0aW9uIF9yZW5kZXJQcm9wV2l0aEVuZChyYXRpbywgZGF0YSkge1xyXG4gICAgcmV0dXJuIGRhdGEuc2V0KGRhdGEudCwgZGF0YS5wLCByYXRpbyA9PT0gMSA/IGRhdGEuZSA6IE1hdGgucm91bmQoKGRhdGEucyArIGRhdGEuYyAqIHJhdGlvKSAqIDEwMDAwKSAvIDEwMDAwICsgZGF0YS51LCBkYXRhKTtcclxuICB9LFxyXG4gICAgICBfcmVuZGVyQ1NTUHJvcFdpdGhCZWdpbm5pbmcgPSBmdW5jdGlvbiBfcmVuZGVyQ1NTUHJvcFdpdGhCZWdpbm5pbmcocmF0aW8sIGRhdGEpIHtcclxuICAgIHJldHVybiBkYXRhLnNldChkYXRhLnQsIGRhdGEucCwgcmF0aW8gPyBNYXRoLnJvdW5kKChkYXRhLnMgKyBkYXRhLmMgKiByYXRpbykgKiAxMDAwMCkgLyAxMDAwMCArIGRhdGEudSA6IGRhdGEuYiwgZGF0YSk7XHJcbiAgfSxcclxuICAgICAgX3JlbmRlclJvdW5kZWRDU1NQcm9wID0gZnVuY3Rpb24gX3JlbmRlclJvdW5kZWRDU1NQcm9wKHJhdGlvLCBkYXRhKSB7XHJcbiAgICB2YXIgdmFsdWUgPSBkYXRhLnMgKyBkYXRhLmMgKiByYXRpbztcclxuICAgIGRhdGEuc2V0KGRhdGEudCwgZGF0YS5wLCB+fih2YWx1ZSArICh2YWx1ZSA8IDAgPyAtLjUgOiAuNSkpICsgZGF0YS51LCBkYXRhKTtcclxuICB9LFxyXG4gICAgICBfcmVuZGVyTm9uVHdlZW5pbmdWYWx1ZSA9IGZ1bmN0aW9uIF9yZW5kZXJOb25Ud2VlbmluZ1ZhbHVlKHJhdGlvLCBkYXRhKSB7XHJcbiAgICByZXR1cm4gZGF0YS5zZXQoZGF0YS50LCBkYXRhLnAsIHJhdGlvID8gZGF0YS5lIDogZGF0YS5iLCBkYXRhKTtcclxuICB9LFxyXG4gICAgICBfcmVuZGVyTm9uVHdlZW5pbmdWYWx1ZU9ubHlBdEVuZCA9IGZ1bmN0aW9uIF9yZW5kZXJOb25Ud2VlbmluZ1ZhbHVlT25seUF0RW5kKHJhdGlvLCBkYXRhKSB7XHJcbiAgICByZXR1cm4gZGF0YS5zZXQoZGF0YS50LCBkYXRhLnAsIHJhdGlvICE9PSAxID8gZGF0YS5iIDogZGF0YS5lLCBkYXRhKTtcclxuICB9LFxyXG4gICAgICBfc2V0dGVyQ1NTU3R5bGUgPSBmdW5jdGlvbiBfc2V0dGVyQ1NTU3R5bGUodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUpIHtcclxuICAgIHJldHVybiB0YXJnZXQuc3R5bGVbcHJvcGVydHldID0gdmFsdWU7XHJcbiAgfSxcclxuICAgICAgX3NldHRlckNTU1Byb3AgPSBmdW5jdGlvbiBfc2V0dGVyQ1NTUHJvcCh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSkge1xyXG4gICAgcmV0dXJuIHRhcmdldC5zdHlsZS5zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpO1xyXG4gIH0sXHJcbiAgICAgIF9zZXR0ZXJUcmFuc2Zvcm0gPSBmdW5jdGlvbiBfc2V0dGVyVHJhbnNmb3JtKHRhcmdldCwgcHJvcGVydHksIHZhbHVlKSB7XHJcbiAgICByZXR1cm4gdGFyZ2V0Ll9nc2FwW3Byb3BlcnR5XSA9IHZhbHVlO1xyXG4gIH0sXHJcbiAgICAgIF9zZXR0ZXJTY2FsZSA9IGZ1bmN0aW9uIF9zZXR0ZXJTY2FsZSh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSkge1xyXG4gICAgcmV0dXJuIHRhcmdldC5fZ3NhcC5zY2FsZVggPSB0YXJnZXQuX2dzYXAuc2NhbGVZID0gdmFsdWU7XHJcbiAgfSxcclxuICAgICAgX3NldHRlclNjYWxlV2l0aFJlbmRlciA9IGZ1bmN0aW9uIF9zZXR0ZXJTY2FsZVdpdGhSZW5kZXIodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUsIGRhdGEsIHJhdGlvKSB7XHJcbiAgICB2YXIgY2FjaGUgPSB0YXJnZXQuX2dzYXA7XHJcbiAgICBjYWNoZS5zY2FsZVggPSBjYWNoZS5zY2FsZVkgPSB2YWx1ZTtcclxuICAgIGNhY2hlLnJlbmRlclRyYW5zZm9ybShyYXRpbywgY2FjaGUpO1xyXG4gIH0sXHJcbiAgICAgIF9zZXR0ZXJUcmFuc2Zvcm1XaXRoUmVuZGVyID0gZnVuY3Rpb24gX3NldHRlclRyYW5zZm9ybVdpdGhSZW5kZXIodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUsIGRhdGEsIHJhdGlvKSB7XHJcbiAgICB2YXIgY2FjaGUgPSB0YXJnZXQuX2dzYXA7XHJcbiAgICBjYWNoZVtwcm9wZXJ0eV0gPSB2YWx1ZTtcclxuICAgIGNhY2hlLnJlbmRlclRyYW5zZm9ybShyYXRpbywgY2FjaGUpO1xyXG4gIH0sXHJcbiAgICAgIF90cmFuc2Zvcm1Qcm9wID0gXCJ0cmFuc2Zvcm1cIixcclxuICAgICAgX3RyYW5zZm9ybU9yaWdpblByb3AgPSBfdHJhbnNmb3JtUHJvcCArIFwiT3JpZ2luXCIsXHJcbiAgICAgIF9zYXZlU3R5bGUgPSBmdW5jdGlvbiBfc2F2ZVN0eWxlKHByb3BlcnR5LCBpc05vdENTUykge1xyXG4gICAgdmFyIF90aGlzID0gdGhpcztcclxuXHJcbiAgICB2YXIgdGFyZ2V0ID0gdGhpcy50YXJnZXQsXHJcbiAgICAgICAgc3R5bGUgPSB0YXJnZXQuc3R5bGUsXHJcbiAgICAgICAgY2FjaGUgPSB0YXJnZXQuX2dzYXA7XHJcblxyXG4gICAgaWYgKHByb3BlcnR5IGluIF90cmFuc2Zvcm1Qcm9wcyAmJiBzdHlsZSkge1xyXG4gICAgICB0aGlzLnRmbSA9IHRoaXMudGZtIHx8IHt9O1xyXG5cclxuICAgICAgaWYgKHByb3BlcnR5ICE9PSBcInRyYW5zZm9ybVwiKSB7XHJcbiAgICAgICAgcHJvcGVydHkgPSBfcHJvcGVydHlBbGlhc2VzW3Byb3BlcnR5XSB8fCBwcm9wZXJ0eTtcclxuICAgICAgICB+cHJvcGVydHkuaW5kZXhPZihcIixcIikgPyBwcm9wZXJ0eS5zcGxpdChcIixcIikuZm9yRWFjaChmdW5jdGlvbiAoYSkge1xyXG4gICAgICAgICAgcmV0dXJuIF90aGlzLnRmbVthXSA9IF9nZXQodGFyZ2V0LCBhKTtcclxuICAgICAgICB9KSA6IHRoaXMudGZtW3Byb3BlcnR5XSA9IGNhY2hlLnggPyBjYWNoZVtwcm9wZXJ0eV0gOiBfZ2V0KHRhcmdldCwgcHJvcGVydHkpO1xyXG4gICAgICAgIHByb3BlcnR5ID09PSBfdHJhbnNmb3JtT3JpZ2luUHJvcCAmJiAodGhpcy50Zm0uek9yaWdpbiA9IGNhY2hlLnpPcmlnaW4pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBfcHJvcGVydHlBbGlhc2VzLnRyYW5zZm9ybS5zcGxpdChcIixcIikuZm9yRWFjaChmdW5jdGlvbiAocCkge1xyXG4gICAgICAgICAgcmV0dXJuIF9zYXZlU3R5bGUuY2FsbChfdGhpcywgcCwgaXNOb3RDU1MpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGhpcy5wcm9wcy5pbmRleE9mKF90cmFuc2Zvcm1Qcm9wKSA+PSAwKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY2FjaGUuc3ZnKSB7XHJcbiAgICAgICAgdGhpcy5zdmdvID0gdGFyZ2V0LmdldEF0dHJpYnV0ZShcImRhdGEtc3ZnLW9yaWdpblwiKTtcclxuICAgICAgICB0aGlzLnByb3BzLnB1c2goX3RyYW5zZm9ybU9yaWdpblByb3AsIGlzTm90Q1NTLCBcIlwiKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgcHJvcGVydHkgPSBfdHJhbnNmb3JtUHJvcDtcclxuICAgIH1cclxuXHJcbiAgICAoc3R5bGUgfHwgaXNOb3RDU1MpICYmIHRoaXMucHJvcHMucHVzaChwcm9wZXJ0eSwgaXNOb3RDU1MsIHN0eWxlW3Byb3BlcnR5XSk7XHJcbiAgfSxcclxuICAgICAgX3JlbW92ZUluZGVwZW5kZW50VHJhbnNmb3JtcyA9IGZ1bmN0aW9uIF9yZW1vdmVJbmRlcGVuZGVudFRyYW5zZm9ybXMoc3R5bGUpIHtcclxuICAgIGlmIChzdHlsZS50cmFuc2xhdGUpIHtcclxuICAgICAgc3R5bGUucmVtb3ZlUHJvcGVydHkoXCJ0cmFuc2xhdGVcIik7XHJcbiAgICAgIHN0eWxlLnJlbW92ZVByb3BlcnR5KFwic2NhbGVcIik7XHJcbiAgICAgIHN0eWxlLnJlbW92ZVByb3BlcnR5KFwicm90YXRlXCIpO1xyXG4gICAgfVxyXG4gIH0sXHJcbiAgICAgIF9yZXZlcnRTdHlsZSA9IGZ1bmN0aW9uIF9yZXZlcnRTdHlsZSgpIHtcclxuICAgIHZhciBwcm9wcyA9IHRoaXMucHJvcHMsXHJcbiAgICAgICAgdGFyZ2V0ID0gdGhpcy50YXJnZXQsXHJcbiAgICAgICAgc3R5bGUgPSB0YXJnZXQuc3R5bGUsXHJcbiAgICAgICAgY2FjaGUgPSB0YXJnZXQuX2dzYXAsXHJcbiAgICAgICAgaSxcclxuICAgICAgICBwO1xyXG5cclxuICAgIGZvciAoaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkgKz0gMykge1xyXG4gICAgICBpZiAoIXByb3BzW2kgKyAxXSkge1xyXG4gICAgICAgIHByb3BzW2kgKyAyXSA/IHN0eWxlW3Byb3BzW2ldXSA9IHByb3BzW2kgKyAyXSA6IHN0eWxlLnJlbW92ZVByb3BlcnR5KHByb3BzW2ldLnN1YnN0cigwLCAyKSA9PT0gXCItLVwiID8gcHJvcHNbaV0gOiBwcm9wc1tpXS5yZXBsYWNlKF9jYXBzRXhwLCBcIi0kMVwiKS50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgfSBlbHNlIGlmIChwcm9wc1tpICsgMV0gPT09IDIpIHtcclxuICAgICAgICB0YXJnZXRbcHJvcHNbaV1dKHByb3BzW2kgKyAyXSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGFyZ2V0W3Byb3BzW2ldXSA9IHByb3BzW2kgKyAyXTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnRmbSkge1xyXG4gICAgICBmb3IgKHAgaW4gdGhpcy50Zm0pIHtcclxuICAgICAgICBjYWNoZVtwXSA9IHRoaXMudGZtW3BdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY2FjaGUuc3ZnKSB7XHJcbiAgICAgICAgY2FjaGUucmVuZGVyVHJhbnNmb3JtKCk7XHJcbiAgICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZShcImRhdGEtc3ZnLW9yaWdpblwiLCB0aGlzLnN2Z28gfHwgXCJcIik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGkgPSBfcmV2ZXJ0aW5nJDEoKTtcclxuXHJcbiAgICAgIGlmICgoIWkgfHwgIWkuaXNTdGFydCkgJiYgIXN0eWxlW190cmFuc2Zvcm1Qcm9wXSkge1xyXG4gICAgICAgIF9yZW1vdmVJbmRlcGVuZGVudFRyYW5zZm9ybXMoc3R5bGUpO1xyXG5cclxuICAgICAgICBpZiAoY2FjaGUuek9yaWdpbiAmJiBzdHlsZVtfdHJhbnNmb3JtT3JpZ2luUHJvcF0pIHtcclxuICAgICAgICAgIHN0eWxlW190cmFuc2Zvcm1PcmlnaW5Qcm9wXSArPSBcIiBcIiArIGNhY2hlLnpPcmlnaW4gKyBcInB4XCI7XHJcbiAgICAgICAgICBjYWNoZS56T3JpZ2luID0gMDtcclxuICAgICAgICAgIGNhY2hlLnJlbmRlclRyYW5zZm9ybSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY2FjaGUudW5jYWNoZSA9IDE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9LFxyXG4gICAgICBfZ2V0U3R5bGVTYXZlciA9IGZ1bmN0aW9uIF9nZXRTdHlsZVNhdmVyKHRhcmdldCwgcHJvcGVydGllcykge1xyXG4gICAgdmFyIHNhdmVyID0ge1xyXG4gICAgICB0YXJnZXQ6IHRhcmdldCxcclxuICAgICAgcHJvcHM6IFtdLFxyXG4gICAgICByZXZlcnQ6IF9yZXZlcnRTdHlsZSxcclxuICAgICAgc2F2ZTogX3NhdmVTdHlsZVxyXG4gICAgfTtcclxuICAgIHRhcmdldC5fZ3NhcCB8fCBnc2FwLmNvcmUuZ2V0Q2FjaGUodGFyZ2V0KTtcclxuICAgIHByb3BlcnRpZXMgJiYgdGFyZ2V0LnN0eWxlICYmIHRhcmdldC5ub2RlVHlwZSAmJiBwcm9wZXJ0aWVzLnNwbGl0KFwiLFwiKS5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XHJcbiAgICAgIHJldHVybiBzYXZlci5zYXZlKHApO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gc2F2ZXI7XHJcbiAgfSxcclxuICAgICAgX3N1cHBvcnRzM0QsXHJcbiAgICAgIF9jcmVhdGVFbGVtZW50ID0gZnVuY3Rpb24gX2NyZWF0ZUVsZW1lbnQodHlwZSwgbnMpIHtcclxuICAgIHZhciBlID0gX2RvYyQxLmNyZWF0ZUVsZW1lbnROUyA/IF9kb2MkMS5jcmVhdGVFbGVtZW50TlMoKG5zIHx8IFwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbFwiKS5yZXBsYWNlKC9eaHR0cHMvLCBcImh0dHBcIiksIHR5cGUpIDogX2RvYyQxLmNyZWF0ZUVsZW1lbnQodHlwZSk7XHJcbiAgICByZXR1cm4gZSAmJiBlLnN0eWxlID8gZSA6IF9kb2MkMS5jcmVhdGVFbGVtZW50KHR5cGUpO1xyXG4gIH0sXHJcbiAgICAgIF9nZXRDb21wdXRlZFByb3BlcnR5ID0gZnVuY3Rpb24gX2dldENvbXB1dGVkUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eSwgc2tpcFByZWZpeEZhbGxiYWNrKSB7XHJcbiAgICB2YXIgY3MgPSBnZXRDb21wdXRlZFN0eWxlKHRhcmdldCk7XHJcbiAgICByZXR1cm4gY3NbcHJvcGVydHldIHx8IGNzLmdldFByb3BlcnR5VmFsdWUocHJvcGVydHkucmVwbGFjZShfY2Fwc0V4cCwgXCItJDFcIikudG9Mb3dlckNhc2UoKSkgfHwgY3MuZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eSkgfHwgIXNraXBQcmVmaXhGYWxsYmFjayAmJiBfZ2V0Q29tcHV0ZWRQcm9wZXJ0eSh0YXJnZXQsIF9jaGVja1Byb3BQcmVmaXgocHJvcGVydHkpIHx8IHByb3BlcnR5LCAxKSB8fCBcIlwiO1xyXG4gIH0sXHJcbiAgICAgIF9wcmVmaXhlcyA9IFwiTyxNb3osbXMsTXMsV2Via2l0XCIuc3BsaXQoXCIsXCIpLFxyXG4gICAgICBfY2hlY2tQcm9wUHJlZml4ID0gZnVuY3Rpb24gX2NoZWNrUHJvcFByZWZpeChwcm9wZXJ0eSwgZWxlbWVudCwgcHJlZmVyUHJlZml4KSB7XHJcbiAgICB2YXIgZSA9IGVsZW1lbnQgfHwgX3RlbXBEaXYsXHJcbiAgICAgICAgcyA9IGUuc3R5bGUsXHJcbiAgICAgICAgaSA9IDU7XHJcblxyXG4gICAgaWYgKHByb3BlcnR5IGluIHMgJiYgIXByZWZlclByZWZpeCkge1xyXG4gICAgICByZXR1cm4gcHJvcGVydHk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHByb3BlcnR5LnN1YnN0cigxKTtcclxuXHJcbiAgICB3aGlsZSAoaS0tICYmICEoX3ByZWZpeGVzW2ldICsgcHJvcGVydHkgaW4gcykpIHt9XHJcblxyXG4gICAgcmV0dXJuIGkgPCAwID8gbnVsbCA6IChpID09PSAzID8gXCJtc1wiIDogaSA+PSAwID8gX3ByZWZpeGVzW2ldIDogXCJcIikgKyBwcm9wZXJ0eTtcclxuICB9LFxyXG4gICAgICBfaW5pdENvcmUgPSBmdW5jdGlvbiBfaW5pdENvcmUoKSB7XHJcbiAgICBpZiAoX3dpbmRvd0V4aXN0cyQxKCkgJiYgd2luZG93LmRvY3VtZW50KSB7XHJcbiAgICAgIF93aW4kMSA9IHdpbmRvdztcclxuICAgICAgX2RvYyQxID0gX3dpbiQxLmRvY3VtZW50O1xyXG4gICAgICBfZG9jRWxlbWVudCA9IF9kb2MkMS5kb2N1bWVudEVsZW1lbnQ7XHJcbiAgICAgIF90ZW1wRGl2ID0gX2NyZWF0ZUVsZW1lbnQoXCJkaXZcIikgfHwge1xyXG4gICAgICAgIHN0eWxlOiB7fVxyXG4gICAgICB9O1xyXG4gICAgICBfdGVtcERpdlN0eWxlciA9IF9jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgICBfdHJhbnNmb3JtUHJvcCA9IF9jaGVja1Byb3BQcmVmaXgoX3RyYW5zZm9ybVByb3ApO1xyXG4gICAgICBfdHJhbnNmb3JtT3JpZ2luUHJvcCA9IF90cmFuc2Zvcm1Qcm9wICsgXCJPcmlnaW5cIjtcclxuICAgICAgX3RlbXBEaXYuc3R5bGUuY3NzVGV4dCA9IFwiYm9yZGVyLXdpZHRoOjA7bGluZS1oZWlnaHQ6MDtwb3NpdGlvbjphYnNvbHV0ZTtwYWRkaW5nOjBcIjtcclxuICAgICAgX3N1cHBvcnRzM0QgPSAhIV9jaGVja1Byb3BQcmVmaXgoXCJwZXJzcGVjdGl2ZVwiKTtcclxuICAgICAgX3JldmVydGluZyQxID0gZ3NhcC5jb3JlLnJldmVydGluZztcclxuICAgICAgX3BsdWdpbkluaXR0ZWQgPSAxO1xyXG4gICAgfVxyXG4gIH0sXHJcbiAgICAgIF9nZXRSZXBhcmVudGVkQ2xvbmVCQm94ID0gZnVuY3Rpb24gX2dldFJlcGFyZW50ZWRDbG9uZUJCb3godGFyZ2V0KSB7XHJcbiAgICB2YXIgb3duZXIgPSB0YXJnZXQub3duZXJTVkdFbGVtZW50LFxyXG4gICAgICAgIHN2ZyA9IF9jcmVhdGVFbGVtZW50KFwic3ZnXCIsIG93bmVyICYmIG93bmVyLmdldEF0dHJpYnV0ZShcInhtbG5zXCIpIHx8IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiksXHJcbiAgICAgICAgY2xvbmUgPSB0YXJnZXQuY2xvbmVOb2RlKHRydWUpLFxyXG4gICAgICAgIGJib3g7XHJcblxyXG4gICAgY2xvbmUuc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcclxuICAgIHN2Zy5hcHBlbmRDaGlsZChjbG9uZSk7XHJcblxyXG4gICAgX2RvY0VsZW1lbnQuYXBwZW5kQ2hpbGQoc3ZnKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBiYm94ID0gY2xvbmUuZ2V0QkJveCgpO1xyXG4gICAgfSBjYXRjaCAoZSkge31cclxuXHJcbiAgICBzdmcucmVtb3ZlQ2hpbGQoY2xvbmUpO1xyXG5cclxuICAgIF9kb2NFbGVtZW50LnJlbW92ZUNoaWxkKHN2Zyk7XHJcblxyXG4gICAgcmV0dXJuIGJib3g7XHJcbiAgfSxcclxuICAgICAgX2dldEF0dHJpYnV0ZUZhbGxiYWNrcyA9IGZ1bmN0aW9uIF9nZXRBdHRyaWJ1dGVGYWxsYmFja3ModGFyZ2V0LCBhdHRyaWJ1dGVzQXJyYXkpIHtcclxuICAgIHZhciBpID0gYXR0cmlidXRlc0FycmF5Lmxlbmd0aDtcclxuXHJcbiAgICB3aGlsZSAoaS0tKSB7XHJcbiAgICAgIGlmICh0YXJnZXQuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZXNBcnJheVtpXSkpIHtcclxuICAgICAgICByZXR1cm4gdGFyZ2V0LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVzQXJyYXlbaV0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSxcclxuICAgICAgX2dldEJCb3ggPSBmdW5jdGlvbiBfZ2V0QkJveCh0YXJnZXQpIHtcclxuICAgIHZhciBib3VuZHMsIGNsb25lZDtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBib3VuZHMgPSB0YXJnZXQuZ2V0QkJveCgpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgYm91bmRzID0gX2dldFJlcGFyZW50ZWRDbG9uZUJCb3godGFyZ2V0KTtcclxuICAgICAgY2xvbmVkID0gMTtcclxuICAgIH1cclxuXHJcbiAgICBib3VuZHMgJiYgKGJvdW5kcy53aWR0aCB8fCBib3VuZHMuaGVpZ2h0KSB8fCBjbG9uZWQgfHwgKGJvdW5kcyA9IF9nZXRSZXBhcmVudGVkQ2xvbmVCQm94KHRhcmdldCkpO1xyXG4gICAgcmV0dXJuIGJvdW5kcyAmJiAhYm91bmRzLndpZHRoICYmICFib3VuZHMueCAmJiAhYm91bmRzLnkgPyB7XHJcbiAgICAgIHg6ICtfZ2V0QXR0cmlidXRlRmFsbGJhY2tzKHRhcmdldCwgW1wieFwiLCBcImN4XCIsIFwieDFcIl0pIHx8IDAsXHJcbiAgICAgIHk6ICtfZ2V0QXR0cmlidXRlRmFsbGJhY2tzKHRhcmdldCwgW1wieVwiLCBcImN5XCIsIFwieTFcIl0pIHx8IDAsXHJcbiAgICAgIHdpZHRoOiAwLFxyXG4gICAgICBoZWlnaHQ6IDBcclxuICAgIH0gOiBib3VuZHM7XHJcbiAgfSxcclxuICAgICAgX2lzU1ZHID0gZnVuY3Rpb24gX2lzU1ZHKGUpIHtcclxuICAgIHJldHVybiAhIShlLmdldENUTSAmJiAoIWUucGFyZW50Tm9kZSB8fCBlLm93bmVyU1ZHRWxlbWVudCkgJiYgX2dldEJCb3goZSkpO1xyXG4gIH0sXHJcbiAgICAgIF9yZW1vdmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIF9yZW1vdmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5KSB7XHJcbiAgICBpZiAocHJvcGVydHkpIHtcclxuICAgICAgdmFyIHN0eWxlID0gdGFyZ2V0LnN0eWxlLFxyXG4gICAgICAgICAgZmlyc3QyQ2hhcnM7XHJcblxyXG4gICAgICBpZiAocHJvcGVydHkgaW4gX3RyYW5zZm9ybVByb3BzICYmIHByb3BlcnR5ICE9PSBfdHJhbnNmb3JtT3JpZ2luUHJvcCkge1xyXG4gICAgICAgIHByb3BlcnR5ID0gX3RyYW5zZm9ybVByb3A7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChzdHlsZS5yZW1vdmVQcm9wZXJ0eSkge1xyXG4gICAgICAgIGZpcnN0MkNoYXJzID0gcHJvcGVydHkuc3Vic3RyKDAsIDIpO1xyXG5cclxuICAgICAgICBpZiAoZmlyc3QyQ2hhcnMgPT09IFwibXNcIiB8fCBwcm9wZXJ0eS5zdWJzdHIoMCwgNikgPT09IFwid2Via2l0XCIpIHtcclxuICAgICAgICAgIHByb3BlcnR5ID0gXCItXCIgKyBwcm9wZXJ0eTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHN0eWxlLnJlbW92ZVByb3BlcnR5KGZpcnN0MkNoYXJzID09PSBcIi0tXCIgPyBwcm9wZXJ0eSA6IHByb3BlcnR5LnJlcGxhY2UoX2NhcHNFeHAsIFwiLSQxXCIpLnRvTG93ZXJDYXNlKCkpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHN0eWxlLnJlbW92ZUF0dHJpYnV0ZShwcm9wZXJ0eSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9LFxyXG4gICAgICBfYWRkTm9uVHdlZW5pbmdQVCA9IGZ1bmN0aW9uIF9hZGROb25Ud2VlbmluZ1BUKHBsdWdpbiwgdGFyZ2V0LCBwcm9wZXJ0eSwgYmVnaW5uaW5nLCBlbmQsIG9ubHlTZXRBdEVuZCkge1xyXG4gICAgdmFyIHB0ID0gbmV3IFByb3BUd2VlbihwbHVnaW4uX3B0LCB0YXJnZXQsIHByb3BlcnR5LCAwLCAxLCBvbmx5U2V0QXRFbmQgPyBfcmVuZGVyTm9uVHdlZW5pbmdWYWx1ZU9ubHlBdEVuZCA6IF9yZW5kZXJOb25Ud2VlbmluZ1ZhbHVlKTtcclxuICAgIHBsdWdpbi5fcHQgPSBwdDtcclxuICAgIHB0LmIgPSBiZWdpbm5pbmc7XHJcbiAgICBwdC5lID0gZW5kO1xyXG5cclxuICAgIHBsdWdpbi5fcHJvcHMucHVzaChwcm9wZXJ0eSk7XHJcblxyXG4gICAgcmV0dXJuIHB0O1xyXG4gIH0sXHJcbiAgICAgIF9ub25Db252ZXJ0aWJsZVVuaXRzID0ge1xyXG4gICAgZGVnOiAxLFxyXG4gICAgcmFkOiAxLFxyXG4gICAgdHVybjogMVxyXG4gIH0sXHJcbiAgICAgIF9ub25TdGFuZGFyZExheW91dHMgPSB7XHJcbiAgICBncmlkOiAxLFxyXG4gICAgZmxleDogMVxyXG4gIH0sXHJcbiAgICAgIF9jb252ZXJ0VG9Vbml0ID0gZnVuY3Rpb24gX2NvbnZlcnRUb1VuaXQodGFyZ2V0LCBwcm9wZXJ0eSwgdmFsdWUsIHVuaXQpIHtcclxuICAgIHZhciBjdXJWYWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpIHx8IDAsXHJcbiAgICAgICAgY3VyVW5pdCA9ICh2YWx1ZSArIFwiXCIpLnRyaW0oKS5zdWJzdHIoKGN1clZhbHVlICsgXCJcIikubGVuZ3RoKSB8fCBcInB4XCIsXHJcbiAgICAgICAgc3R5bGUgPSBfdGVtcERpdi5zdHlsZSxcclxuICAgICAgICBob3Jpem9udGFsID0gX2hvcml6b250YWxFeHAudGVzdChwcm9wZXJ0eSksXHJcbiAgICAgICAgaXNSb290U1ZHID0gdGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzdmdcIixcclxuICAgICAgICBtZWFzdXJlUHJvcGVydHkgPSAoaXNSb290U1ZHID8gXCJjbGllbnRcIiA6IFwib2Zmc2V0XCIpICsgKGhvcml6b250YWwgPyBcIldpZHRoXCIgOiBcIkhlaWdodFwiKSxcclxuICAgICAgICBhbW91bnQgPSAxMDAsXHJcbiAgICAgICAgdG9QaXhlbHMgPSB1bml0ID09PSBcInB4XCIsXHJcbiAgICAgICAgdG9QZXJjZW50ID0gdW5pdCA9PT0gXCIlXCIsXHJcbiAgICAgICAgcHgsXHJcbiAgICAgICAgcGFyZW50LFxyXG4gICAgICAgIGNhY2hlLFxyXG4gICAgICAgIGlzU1ZHO1xyXG5cclxuICAgIGlmICh1bml0ID09PSBjdXJVbml0IHx8ICFjdXJWYWx1ZSB8fCBfbm9uQ29udmVydGlibGVVbml0c1t1bml0XSB8fCBfbm9uQ29udmVydGlibGVVbml0c1tjdXJVbml0XSkge1xyXG4gICAgICByZXR1cm4gY3VyVmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgY3VyVW5pdCAhPT0gXCJweFwiICYmICF0b1BpeGVscyAmJiAoY3VyVmFsdWUgPSBfY29udmVydFRvVW5pdCh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSwgXCJweFwiKSk7XHJcbiAgICBpc1NWRyA9IHRhcmdldC5nZXRDVE0gJiYgX2lzU1ZHKHRhcmdldCk7XHJcblxyXG4gICAgaWYgKCh0b1BlcmNlbnQgfHwgY3VyVW5pdCA9PT0gXCIlXCIpICYmIChfdHJhbnNmb3JtUHJvcHNbcHJvcGVydHldIHx8IH5wcm9wZXJ0eS5pbmRleE9mKFwiYWRpdXNcIikpKSB7XHJcbiAgICAgIHB4ID0gaXNTVkcgPyB0YXJnZXQuZ2V0QkJveCgpW2hvcml6b250YWwgPyBcIndpZHRoXCIgOiBcImhlaWdodFwiXSA6IHRhcmdldFttZWFzdXJlUHJvcGVydHldO1xyXG4gICAgICByZXR1cm4gX3JvdW5kKHRvUGVyY2VudCA/IGN1clZhbHVlIC8gcHggKiBhbW91bnQgOiBjdXJWYWx1ZSAvIDEwMCAqIHB4KTtcclxuICAgIH1cclxuXHJcbiAgICBzdHlsZVtob3Jpem9udGFsID8gXCJ3aWR0aFwiIDogXCJoZWlnaHRcIl0gPSBhbW91bnQgKyAodG9QaXhlbHMgPyBjdXJVbml0IDogdW5pdCk7XHJcbiAgICBwYXJlbnQgPSB1bml0ICE9PSBcInJlbVwiICYmIH5wcm9wZXJ0eS5pbmRleE9mKFwiYWRpdXNcIikgfHwgdW5pdCA9PT0gXCJlbVwiICYmIHRhcmdldC5hcHBlbmRDaGlsZCAmJiAhaXNSb290U1ZHID8gdGFyZ2V0IDogdGFyZ2V0LnBhcmVudE5vZGU7XHJcblxyXG4gICAgaWYgKGlzU1ZHKSB7XHJcbiAgICAgIHBhcmVudCA9ICh0YXJnZXQub3duZXJTVkdFbGVtZW50IHx8IHt9KS5wYXJlbnROb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghcGFyZW50IHx8IHBhcmVudCA9PT0gX2RvYyQxIHx8ICFwYXJlbnQuYXBwZW5kQ2hpbGQpIHtcclxuICAgICAgcGFyZW50ID0gX2RvYyQxLmJvZHk7XHJcbiAgICB9XHJcblxyXG4gICAgY2FjaGUgPSBwYXJlbnQuX2dzYXA7XHJcblxyXG4gICAgaWYgKGNhY2hlICYmIHRvUGVyY2VudCAmJiBjYWNoZS53aWR0aCAmJiBob3Jpem9udGFsICYmIGNhY2hlLnRpbWUgPT09IF90aWNrZXIudGltZSAmJiAhY2FjaGUudW5jYWNoZSkge1xyXG4gICAgICByZXR1cm4gX3JvdW5kKGN1clZhbHVlIC8gY2FjaGUud2lkdGggKiBhbW91bnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRvUGVyY2VudCAmJiAocHJvcGVydHkgPT09IFwiaGVpZ2h0XCIgfHwgcHJvcGVydHkgPT09IFwid2lkdGhcIikpIHtcclxuICAgICAgICB2YXIgdiA9IHRhcmdldC5zdHlsZVtwcm9wZXJ0eV07XHJcbiAgICAgICAgdGFyZ2V0LnN0eWxlW3Byb3BlcnR5XSA9IGFtb3VudCArIHVuaXQ7XHJcbiAgICAgICAgcHggPSB0YXJnZXRbbWVhc3VyZVByb3BlcnR5XTtcclxuICAgICAgICB2ID8gdGFyZ2V0LnN0eWxlW3Byb3BlcnR5XSA9IHYgOiBfcmVtb3ZlUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgKHRvUGVyY2VudCB8fCBjdXJVbml0ID09PSBcIiVcIikgJiYgIV9ub25TdGFuZGFyZExheW91dHNbX2dldENvbXB1dGVkUHJvcGVydHkocGFyZW50LCBcImRpc3BsYXlcIildICYmIChzdHlsZS5wb3NpdGlvbiA9IF9nZXRDb21wdXRlZFByb3BlcnR5KHRhcmdldCwgXCJwb3NpdGlvblwiKSk7XHJcbiAgICAgICAgcGFyZW50ID09PSB0YXJnZXQgJiYgKHN0eWxlLnBvc2l0aW9uID0gXCJzdGF0aWNcIik7XHJcbiAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKF90ZW1wRGl2KTtcclxuICAgICAgICBweCA9IF90ZW1wRGl2W21lYXN1cmVQcm9wZXJ0eV07XHJcbiAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKF90ZW1wRGl2KTtcclxuICAgICAgICBzdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGhvcml6b250YWwgJiYgdG9QZXJjZW50KSB7XHJcbiAgICAgICAgY2FjaGUgPSBfZ2V0Q2FjaGUocGFyZW50KTtcclxuICAgICAgICBjYWNoZS50aW1lID0gX3RpY2tlci50aW1lO1xyXG4gICAgICAgIGNhY2hlLndpZHRoID0gcGFyZW50W21lYXN1cmVQcm9wZXJ0eV07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gX3JvdW5kKHRvUGl4ZWxzID8gcHggKiBjdXJWYWx1ZSAvIGFtb3VudCA6IHB4ICYmIGN1clZhbHVlID8gYW1vdW50IC8gcHggKiBjdXJWYWx1ZSA6IDApO1xyXG4gIH0sXHJcbiAgICAgIF9nZXQgPSBmdW5jdGlvbiBfZ2V0KHRhcmdldCwgcHJvcGVydHksIHVuaXQsIHVuY2FjaGUpIHtcclxuICAgIHZhciB2YWx1ZTtcclxuICAgIF9wbHVnaW5Jbml0dGVkIHx8IF9pbml0Q29yZSgpO1xyXG5cclxuICAgIGlmIChwcm9wZXJ0eSBpbiBfcHJvcGVydHlBbGlhc2VzICYmIHByb3BlcnR5ICE9PSBcInRyYW5zZm9ybVwiKSB7XHJcbiAgICAgIHByb3BlcnR5ID0gX3Byb3BlcnR5QWxpYXNlc1twcm9wZXJ0eV07XHJcblxyXG4gICAgICBpZiAofnByb3BlcnR5LmluZGV4T2YoXCIsXCIpKSB7XHJcbiAgICAgICAgcHJvcGVydHkgPSBwcm9wZXJ0eS5zcGxpdChcIixcIilbMF07XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoX3RyYW5zZm9ybVByb3BzW3Byb3BlcnR5XSAmJiBwcm9wZXJ0eSAhPT0gXCJ0cmFuc2Zvcm1cIikge1xyXG4gICAgICB2YWx1ZSA9IF9wYXJzZVRyYW5zZm9ybSh0YXJnZXQsIHVuY2FjaGUpO1xyXG4gICAgICB2YWx1ZSA9IHByb3BlcnR5ICE9PSBcInRyYW5zZm9ybU9yaWdpblwiID8gdmFsdWVbcHJvcGVydHldIDogdmFsdWUuc3ZnID8gdmFsdWUub3JpZ2luIDogX2ZpcnN0VHdvT25seShfZ2V0Q29tcHV0ZWRQcm9wZXJ0eSh0YXJnZXQsIF90cmFuc2Zvcm1PcmlnaW5Qcm9wKSkgKyBcIiBcIiArIHZhbHVlLnpPcmlnaW4gKyBcInB4XCI7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2YWx1ZSA9IHRhcmdldC5zdHlsZVtwcm9wZXJ0eV07XHJcblxyXG4gICAgICBpZiAoIXZhbHVlIHx8IHZhbHVlID09PSBcImF1dG9cIiB8fCB1bmNhY2hlIHx8IH4odmFsdWUgKyBcIlwiKS5pbmRleE9mKFwiY2FsYyhcIikpIHtcclxuICAgICAgICB2YWx1ZSA9IF9zcGVjaWFsUHJvcHNbcHJvcGVydHldICYmIF9zcGVjaWFsUHJvcHNbcHJvcGVydHldKHRhcmdldCwgcHJvcGVydHksIHVuaXQpIHx8IF9nZXRDb21wdXRlZFByb3BlcnR5KHRhcmdldCwgcHJvcGVydHkpIHx8IF9nZXRQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5KSB8fCAocHJvcGVydHkgPT09IFwib3BhY2l0eVwiID8gMSA6IDApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHVuaXQgJiYgIX4odmFsdWUgKyBcIlwiKS50cmltKCkuaW5kZXhPZihcIiBcIikgPyBfY29udmVydFRvVW5pdCh0YXJnZXQsIHByb3BlcnR5LCB2YWx1ZSwgdW5pdCkgKyB1bml0IDogdmFsdWU7XHJcbiAgfSxcclxuICAgICAgX3R3ZWVuQ29tcGxleENTU1N0cmluZyA9IGZ1bmN0aW9uIF90d2VlbkNvbXBsZXhDU1NTdHJpbmcodGFyZ2V0LCBwcm9wLCBzdGFydCwgZW5kKSB7XHJcbiAgICBpZiAoIXN0YXJ0IHx8IHN0YXJ0ID09PSBcIm5vbmVcIikge1xyXG4gICAgICB2YXIgcCA9IF9jaGVja1Byb3BQcmVmaXgocHJvcCwgdGFyZ2V0LCAxKSxcclxuICAgICAgICAgIHMgPSBwICYmIF9nZXRDb21wdXRlZFByb3BlcnR5KHRhcmdldCwgcCwgMSk7XHJcblxyXG4gICAgICBpZiAocyAmJiBzICE9PSBzdGFydCkge1xyXG4gICAgICAgIHByb3AgPSBwO1xyXG4gICAgICAgIHN0YXJ0ID0gcztcclxuICAgICAgfSBlbHNlIGlmIChwcm9wID09PSBcImJvcmRlckNvbG9yXCIpIHtcclxuICAgICAgICBzdGFydCA9IF9nZXRDb21wdXRlZFByb3BlcnR5KHRhcmdldCwgXCJib3JkZXJUb3BDb2xvclwiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHZhciBwdCA9IG5ldyBQcm9wVHdlZW4odGhpcy5fcHQsIHRhcmdldC5zdHlsZSwgcHJvcCwgMCwgMSwgX3JlbmRlckNvbXBsZXhTdHJpbmcpLFxyXG4gICAgICAgIGluZGV4ID0gMCxcclxuICAgICAgICBtYXRjaEluZGV4ID0gMCxcclxuICAgICAgICBhLFxyXG4gICAgICAgIHJlc3VsdCxcclxuICAgICAgICBzdGFydFZhbHVlcyxcclxuICAgICAgICBzdGFydE51bSxcclxuICAgICAgICBjb2xvcixcclxuICAgICAgICBzdGFydFZhbHVlLFxyXG4gICAgICAgIGVuZFZhbHVlLFxyXG4gICAgICAgIGVuZE51bSxcclxuICAgICAgICBjaHVuayxcclxuICAgICAgICBlbmRVbml0LFxyXG4gICAgICAgIHN0YXJ0VW5pdCxcclxuICAgICAgICBlbmRWYWx1ZXM7XHJcbiAgICBwdC5iID0gc3RhcnQ7XHJcbiAgICBwdC5lID0gZW5kO1xyXG4gICAgc3RhcnQgKz0gXCJcIjtcclxuICAgIGVuZCArPSBcIlwiO1xyXG5cclxuICAgIGlmIChlbmQuc3Vic3RyaW5nKDAsIDYpID09PSBcInZhcigtLVwiKSB7XHJcbiAgICAgIGVuZCA9IF9nZXRDb21wdXRlZFByb3BlcnR5KHRhcmdldCwgZW5kLnN1YnN0cmluZyg0LCBlbmQuaW5kZXhPZihcIilcIikpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoZW5kID09PSBcImF1dG9cIikge1xyXG4gICAgICBzdGFydFZhbHVlID0gdGFyZ2V0LnN0eWxlW3Byb3BdO1xyXG4gICAgICB0YXJnZXQuc3R5bGVbcHJvcF0gPSBlbmQ7XHJcbiAgICAgIGVuZCA9IF9nZXRDb21wdXRlZFByb3BlcnR5KHRhcmdldCwgcHJvcCkgfHwgZW5kO1xyXG4gICAgICBzdGFydFZhbHVlID8gdGFyZ2V0LnN0eWxlW3Byb3BdID0gc3RhcnRWYWx1ZSA6IF9yZW1vdmVQcm9wZXJ0eSh0YXJnZXQsIHByb3ApO1xyXG4gICAgfVxyXG5cclxuICAgIGEgPSBbc3RhcnQsIGVuZF07XHJcblxyXG4gICAgX2NvbG9yU3RyaW5nRmlsdGVyKGEpO1xyXG5cclxuICAgIHN0YXJ0ID0gYVswXTtcclxuICAgIGVuZCA9IGFbMV07XHJcbiAgICBzdGFydFZhbHVlcyA9IHN0YXJ0Lm1hdGNoKF9udW1XaXRoVW5pdEV4cCkgfHwgW107XHJcbiAgICBlbmRWYWx1ZXMgPSBlbmQubWF0Y2goX251bVdpdGhVbml0RXhwKSB8fCBbXTtcclxuXHJcbiAgICBpZiAoZW5kVmFsdWVzLmxlbmd0aCkge1xyXG4gICAgICB3aGlsZSAocmVzdWx0ID0gX251bVdpdGhVbml0RXhwLmV4ZWMoZW5kKSkge1xyXG4gICAgICAgIGVuZFZhbHVlID0gcmVzdWx0WzBdO1xyXG4gICAgICAgIGNodW5rID0gZW5kLnN1YnN0cmluZyhpbmRleCwgcmVzdWx0LmluZGV4KTtcclxuXHJcbiAgICAgICAgaWYgKGNvbG9yKSB7XHJcbiAgICAgICAgICBjb2xvciA9IChjb2xvciArIDEpICUgNTtcclxuICAgICAgICB9IGVsc2UgaWYgKGNodW5rLnN1YnN0cigtNSkgPT09IFwicmdiYShcIiB8fCBjaHVuay5zdWJzdHIoLTUpID09PSBcImhzbGEoXCIpIHtcclxuICAgICAgICAgIGNvbG9yID0gMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChlbmRWYWx1ZSAhPT0gKHN0YXJ0VmFsdWUgPSBzdGFydFZhbHVlc1ttYXRjaEluZGV4KytdIHx8IFwiXCIpKSB7XHJcbiAgICAgICAgICBzdGFydE51bSA9IHBhcnNlRmxvYXQoc3RhcnRWYWx1ZSkgfHwgMDtcclxuICAgICAgICAgIHN0YXJ0VW5pdCA9IHN0YXJ0VmFsdWUuc3Vic3RyKChzdGFydE51bSArIFwiXCIpLmxlbmd0aCk7XHJcbiAgICAgICAgICBlbmRWYWx1ZS5jaGFyQXQoMSkgPT09IFwiPVwiICYmIChlbmRWYWx1ZSA9IF9wYXJzZVJlbGF0aXZlKHN0YXJ0TnVtLCBlbmRWYWx1ZSkgKyBzdGFydFVuaXQpO1xyXG4gICAgICAgICAgZW5kTnVtID0gcGFyc2VGbG9hdChlbmRWYWx1ZSk7XHJcbiAgICAgICAgICBlbmRVbml0ID0gZW5kVmFsdWUuc3Vic3RyKChlbmROdW0gKyBcIlwiKS5sZW5ndGgpO1xyXG4gICAgICAgICAgaW5kZXggPSBfbnVtV2l0aFVuaXRFeHAubGFzdEluZGV4IC0gZW5kVW5pdC5sZW5ndGg7XHJcblxyXG4gICAgICAgICAgaWYgKCFlbmRVbml0KSB7XHJcbiAgICAgICAgICAgIGVuZFVuaXQgPSBlbmRVbml0IHx8IF9jb25maWcudW5pdHNbcHJvcF0gfHwgc3RhcnRVbml0O1xyXG5cclxuICAgICAgICAgICAgaWYgKGluZGV4ID09PSBlbmQubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgZW5kICs9IGVuZFVuaXQ7XHJcbiAgICAgICAgICAgICAgcHQuZSArPSBlbmRVbml0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgaWYgKHN0YXJ0VW5pdCAhPT0gZW5kVW5pdCkge1xyXG4gICAgICAgICAgICBzdGFydE51bSA9IF9jb252ZXJ0VG9Vbml0KHRhcmdldCwgcHJvcCwgc3RhcnRWYWx1ZSwgZW5kVW5pdCkgfHwgMDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBwdC5fcHQgPSB7XHJcbiAgICAgICAgICAgIF9uZXh0OiBwdC5fcHQsXHJcbiAgICAgICAgICAgIHA6IGNodW5rIHx8IG1hdGNoSW5kZXggPT09IDEgPyBjaHVuayA6IFwiLFwiLFxyXG4gICAgICAgICAgICBzOiBzdGFydE51bSxcclxuICAgICAgICAgICAgYzogZW5kTnVtIC0gc3RhcnROdW0sXHJcbiAgICAgICAgICAgIG06IGNvbG9yICYmIGNvbG9yIDwgNCB8fCBwcm9wID09PSBcInpJbmRleFwiID8gTWF0aC5yb3VuZCA6IDBcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBwdC5jID0gaW5kZXggPCBlbmQubGVuZ3RoID8gZW5kLnN1YnN0cmluZyhpbmRleCwgZW5kLmxlbmd0aCkgOiBcIlwiO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcHQuciA9IHByb3AgPT09IFwiZGlzcGxheVwiICYmIGVuZCA9PT0gXCJub25lXCIgPyBfcmVuZGVyTm9uVHdlZW5pbmdWYWx1ZU9ubHlBdEVuZCA6IF9yZW5kZXJOb25Ud2VlbmluZ1ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIF9yZWxFeHAudGVzdChlbmQpICYmIChwdC5lID0gMCk7XHJcbiAgICB0aGlzLl9wdCA9IHB0O1xyXG4gICAgcmV0dXJuIHB0O1xyXG4gIH0sXHJcbiAgICAgIF9rZXl3b3JkVG9QZXJjZW50ID0ge1xyXG4gICAgdG9wOiBcIjAlXCIsXHJcbiAgICBib3R0b206IFwiMTAwJVwiLFxyXG4gICAgbGVmdDogXCIwJVwiLFxyXG4gICAgcmlnaHQ6IFwiMTAwJVwiLFxyXG4gICAgY2VudGVyOiBcIjUwJVwiXHJcbiAgfSxcclxuICAgICAgX2NvbnZlcnRLZXl3b3Jkc1RvUGVyY2VudGFnZXMgPSBmdW5jdGlvbiBfY29udmVydEtleXdvcmRzVG9QZXJjZW50YWdlcyh2YWx1ZSkge1xyXG4gICAgdmFyIHNwbGl0ID0gdmFsdWUuc3BsaXQoXCIgXCIpLFxyXG4gICAgICAgIHggPSBzcGxpdFswXSxcclxuICAgICAgICB5ID0gc3BsaXRbMV0gfHwgXCI1MCVcIjtcclxuXHJcbiAgICBpZiAoeCA9PT0gXCJ0b3BcIiB8fCB4ID09PSBcImJvdHRvbVwiIHx8IHkgPT09IFwibGVmdFwiIHx8IHkgPT09IFwicmlnaHRcIikge1xyXG4gICAgICB2YWx1ZSA9IHg7XHJcbiAgICAgIHggPSB5O1xyXG4gICAgICB5ID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgc3BsaXRbMF0gPSBfa2V5d29yZFRvUGVyY2VudFt4XSB8fCB4O1xyXG4gICAgc3BsaXRbMV0gPSBfa2V5d29yZFRvUGVyY2VudFt5XSB8fCB5O1xyXG4gICAgcmV0dXJuIHNwbGl0LmpvaW4oXCIgXCIpO1xyXG4gIH0sXHJcbiAgICAgIF9yZW5kZXJDbGVhclByb3BzID0gZnVuY3Rpb24gX3JlbmRlckNsZWFyUHJvcHMocmF0aW8sIGRhdGEpIHtcclxuICAgIGlmIChkYXRhLnR3ZWVuICYmIGRhdGEudHdlZW4uX3RpbWUgPT09IGRhdGEudHdlZW4uX2R1cikge1xyXG4gICAgICB2YXIgdGFyZ2V0ID0gZGF0YS50LFxyXG4gICAgICAgICAgc3R5bGUgPSB0YXJnZXQuc3R5bGUsXHJcbiAgICAgICAgICBwcm9wcyA9IGRhdGEudSxcclxuICAgICAgICAgIGNhY2hlID0gdGFyZ2V0Ll9nc2FwLFxyXG4gICAgICAgICAgcHJvcCxcclxuICAgICAgICAgIGNsZWFyVHJhbnNmb3JtcyxcclxuICAgICAgICAgIGk7XHJcblxyXG4gICAgICBpZiAocHJvcHMgPT09IFwiYWxsXCIgfHwgcHJvcHMgPT09IHRydWUpIHtcclxuICAgICAgICBzdHlsZS5jc3NUZXh0ID0gXCJcIjtcclxuICAgICAgICBjbGVhclRyYW5zZm9ybXMgPSAxO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHByb3BzID0gcHJvcHMuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgIGkgPSBwcm9wcy5sZW5ndGg7XHJcblxyXG4gICAgICAgIHdoaWxlICgtLWkgPiAtMSkge1xyXG4gICAgICAgICAgcHJvcCA9IHByb3BzW2ldO1xyXG5cclxuICAgICAgICAgIGlmIChfdHJhbnNmb3JtUHJvcHNbcHJvcF0pIHtcclxuICAgICAgICAgICAgY2xlYXJUcmFuc2Zvcm1zID0gMTtcclxuICAgICAgICAgICAgcHJvcCA9IHByb3AgPT09IFwidHJhbnNmb3JtT3JpZ2luXCIgPyBfdHJhbnNmb3JtT3JpZ2luUHJvcCA6IF90cmFuc2Zvcm1Qcm9wO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIF9yZW1vdmVQcm9wZXJ0eSh0YXJnZXQsIHByb3ApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNsZWFyVHJhbnNmb3Jtcykge1xyXG4gICAgICAgIF9yZW1vdmVQcm9wZXJ0eSh0YXJnZXQsIF90cmFuc2Zvcm1Qcm9wKTtcclxuXHJcbiAgICAgICAgaWYgKGNhY2hlKSB7XHJcbiAgICAgICAgICBjYWNoZS5zdmcgJiYgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZShcInRyYW5zZm9ybVwiKTtcclxuICAgICAgICAgIHN0eWxlLnNjYWxlID0gc3R5bGUucm90YXRlID0gc3R5bGUudHJhbnNsYXRlID0gXCJub25lXCI7XHJcblxyXG4gICAgICAgICAgX3BhcnNlVHJhbnNmb3JtKHRhcmdldCwgMSk7XHJcblxyXG4gICAgICAgICAgY2FjaGUudW5jYWNoZSA9IDE7XHJcblxyXG4gICAgICAgICAgX3JlbW92ZUluZGVwZW5kZW50VHJhbnNmb3JtcyhzdHlsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSxcclxuICAgICAgX3NwZWNpYWxQcm9wcyA9IHtcclxuICAgIGNsZWFyUHJvcHM6IGZ1bmN0aW9uIGNsZWFyUHJvcHMocGx1Z2luLCB0YXJnZXQsIHByb3BlcnR5LCBlbmRWYWx1ZSwgdHdlZW4pIHtcclxuICAgICAgaWYgKHR3ZWVuLmRhdGEgIT09IFwiaXNGcm9tU3RhcnRcIikge1xyXG4gICAgICAgIHZhciBwdCA9IHBsdWdpbi5fcHQgPSBuZXcgUHJvcFR3ZWVuKHBsdWdpbi5fcHQsIHRhcmdldCwgcHJvcGVydHksIDAsIDAsIF9yZW5kZXJDbGVhclByb3BzKTtcclxuICAgICAgICBwdC51ID0gZW5kVmFsdWU7XHJcbiAgICAgICAgcHQucHIgPSAtMTA7XHJcbiAgICAgICAgcHQudHdlZW4gPSB0d2VlbjtcclxuXHJcbiAgICAgICAgcGx1Z2luLl9wcm9wcy5wdXNoKHByb3BlcnR5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9LFxyXG4gICAgICBfaWRlbnRpdHkyRE1hdHJpeCA9IFsxLCAwLCAwLCAxLCAwLCAwXSxcclxuICAgICAgX3JvdGF0aW9uYWxQcm9wZXJ0aWVzID0ge30sXHJcbiAgICAgIF9pc051bGxUcmFuc2Zvcm0gPSBmdW5jdGlvbiBfaXNOdWxsVHJhbnNmb3JtKHZhbHVlKSB7XHJcbiAgICByZXR1cm4gdmFsdWUgPT09IFwibWF0cml4KDEsIDAsIDAsIDEsIDAsIDApXCIgfHwgdmFsdWUgPT09IFwibm9uZVwiIHx8ICF2YWx1ZTtcclxuICB9LFxyXG4gICAgICBfZ2V0Q29tcHV0ZWRUcmFuc2Zvcm1NYXRyaXhBc0FycmF5ID0gZnVuY3Rpb24gX2dldENvbXB1dGVkVHJhbnNmb3JtTWF0cml4QXNBcnJheSh0YXJnZXQpIHtcclxuICAgIHZhciBtYXRyaXhTdHJpbmcgPSBfZ2V0Q29tcHV0ZWRQcm9wZXJ0eSh0YXJnZXQsIF90cmFuc2Zvcm1Qcm9wKTtcclxuXHJcbiAgICByZXR1cm4gX2lzTnVsbFRyYW5zZm9ybShtYXRyaXhTdHJpbmcpID8gX2lkZW50aXR5MkRNYXRyaXggOiBtYXRyaXhTdHJpbmcuc3Vic3RyKDcpLm1hdGNoKF9udW1FeHApLm1hcChfcm91bmQpO1xyXG4gIH0sXHJcbiAgICAgIF9nZXRNYXRyaXggPSBmdW5jdGlvbiBfZ2V0TWF0cml4KHRhcmdldCwgZm9yY2UyRCkge1xyXG4gICAgdmFyIGNhY2hlID0gdGFyZ2V0Ll9nc2FwIHx8IF9nZXRDYWNoZSh0YXJnZXQpLFxyXG4gICAgICAgIHN0eWxlID0gdGFyZ2V0LnN0eWxlLFxyXG4gICAgICAgIG1hdHJpeCA9IF9nZXRDb21wdXRlZFRyYW5zZm9ybU1hdHJpeEFzQXJyYXkodGFyZ2V0KSxcclxuICAgICAgICBwYXJlbnQsXHJcbiAgICAgICAgbmV4dFNpYmxpbmcsXHJcbiAgICAgICAgdGVtcCxcclxuICAgICAgICBhZGRlZFRvRE9NO1xyXG5cclxuICAgIGlmIChjYWNoZS5zdmcgJiYgdGFyZ2V0LmdldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiKSkge1xyXG4gICAgICB0ZW1wID0gdGFyZ2V0LnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkubWF0cml4O1xyXG4gICAgICBtYXRyaXggPSBbdGVtcC5hLCB0ZW1wLmIsIHRlbXAuYywgdGVtcC5kLCB0ZW1wLmUsIHRlbXAuZl07XHJcbiAgICAgIHJldHVybiBtYXRyaXguam9pbihcIixcIikgPT09IFwiMSwwLDAsMSwwLDBcIiA/IF9pZGVudGl0eTJETWF0cml4IDogbWF0cml4O1xyXG4gICAgfSBlbHNlIGlmIChtYXRyaXggPT09IF9pZGVudGl0eTJETWF0cml4ICYmICF0YXJnZXQub2Zmc2V0UGFyZW50ICYmIHRhcmdldCAhPT0gX2RvY0VsZW1lbnQgJiYgIWNhY2hlLnN2Zykge1xyXG4gICAgICB0ZW1wID0gc3R5bGUuZGlzcGxheTtcclxuICAgICAgc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcclxuICAgICAgcGFyZW50ID0gdGFyZ2V0LnBhcmVudE5vZGU7XHJcblxyXG4gICAgICBpZiAoIXBhcmVudCB8fCAhdGFyZ2V0Lm9mZnNldFBhcmVudCAmJiAhdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKSB7XHJcbiAgICAgICAgYWRkZWRUb0RPTSA9IDE7XHJcbiAgICAgICAgbmV4dFNpYmxpbmcgPSB0YXJnZXQubmV4dEVsZW1lbnRTaWJsaW5nO1xyXG5cclxuICAgICAgICBfZG9jRWxlbWVudC5hcHBlbmRDaGlsZCh0YXJnZXQpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBtYXRyaXggPSBfZ2V0Q29tcHV0ZWRUcmFuc2Zvcm1NYXRyaXhBc0FycmF5KHRhcmdldCk7XHJcbiAgICAgIHRlbXAgPyBzdHlsZS5kaXNwbGF5ID0gdGVtcCA6IF9yZW1vdmVQcm9wZXJ0eSh0YXJnZXQsIFwiZGlzcGxheVwiKTtcclxuXHJcbiAgICAgIGlmIChhZGRlZFRvRE9NKSB7XHJcbiAgICAgICAgbmV4dFNpYmxpbmcgPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKHRhcmdldCwgbmV4dFNpYmxpbmcpIDogcGFyZW50ID8gcGFyZW50LmFwcGVuZENoaWxkKHRhcmdldCkgOiBfZG9jRWxlbWVudC5yZW1vdmVDaGlsZCh0YXJnZXQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZvcmNlMkQgJiYgbWF0cml4Lmxlbmd0aCA+IDYgPyBbbWF0cml4WzBdLCBtYXRyaXhbMV0sIG1hdHJpeFs0XSwgbWF0cml4WzVdLCBtYXRyaXhbMTJdLCBtYXRyaXhbMTNdXSA6IG1hdHJpeDtcclxuICB9LFxyXG4gICAgICBfYXBwbHlTVkdPcmlnaW4gPSBmdW5jdGlvbiBfYXBwbHlTVkdPcmlnaW4odGFyZ2V0LCBvcmlnaW4sIG9yaWdpbklzQWJzb2x1dGUsIHNtb290aCwgbWF0cml4QXJyYXksIHBsdWdpblRvQWRkUHJvcFR3ZWVuc1RvKSB7XHJcbiAgICB2YXIgY2FjaGUgPSB0YXJnZXQuX2dzYXAsXHJcbiAgICAgICAgbWF0cml4ID0gbWF0cml4QXJyYXkgfHwgX2dldE1hdHJpeCh0YXJnZXQsIHRydWUpLFxyXG4gICAgICAgIHhPcmlnaW5PbGQgPSBjYWNoZS54T3JpZ2luIHx8IDAsXHJcbiAgICAgICAgeU9yaWdpbk9sZCA9IGNhY2hlLnlPcmlnaW4gfHwgMCxcclxuICAgICAgICB4T2Zmc2V0T2xkID0gY2FjaGUueE9mZnNldCB8fCAwLFxyXG4gICAgICAgIHlPZmZzZXRPbGQgPSBjYWNoZS55T2Zmc2V0IHx8IDAsXHJcbiAgICAgICAgYSA9IG1hdHJpeFswXSxcclxuICAgICAgICBiID0gbWF0cml4WzFdLFxyXG4gICAgICAgIGMgPSBtYXRyaXhbMl0sXHJcbiAgICAgICAgZCA9IG1hdHJpeFszXSxcclxuICAgICAgICB0eCA9IG1hdHJpeFs0XSxcclxuICAgICAgICB0eSA9IG1hdHJpeFs1XSxcclxuICAgICAgICBvcmlnaW5TcGxpdCA9IG9yaWdpbi5zcGxpdChcIiBcIiksXHJcbiAgICAgICAgeE9yaWdpbiA9IHBhcnNlRmxvYXQob3JpZ2luU3BsaXRbMF0pIHx8IDAsXHJcbiAgICAgICAgeU9yaWdpbiA9IHBhcnNlRmxvYXQob3JpZ2luU3BsaXRbMV0pIHx8IDAsXHJcbiAgICAgICAgYm91bmRzLFxyXG4gICAgICAgIGRldGVybWluYW50LFxyXG4gICAgICAgIHgsXHJcbiAgICAgICAgeTtcclxuXHJcbiAgICBpZiAoIW9yaWdpbklzQWJzb2x1dGUpIHtcclxuICAgICAgYm91bmRzID0gX2dldEJCb3godGFyZ2V0KTtcclxuICAgICAgeE9yaWdpbiA9IGJvdW5kcy54ICsgKH5vcmlnaW5TcGxpdFswXS5pbmRleE9mKFwiJVwiKSA/IHhPcmlnaW4gLyAxMDAgKiBib3VuZHMud2lkdGggOiB4T3JpZ2luKTtcclxuICAgICAgeU9yaWdpbiA9IGJvdW5kcy55ICsgKH4ob3JpZ2luU3BsaXRbMV0gfHwgb3JpZ2luU3BsaXRbMF0pLmluZGV4T2YoXCIlXCIpID8geU9yaWdpbiAvIDEwMCAqIGJvdW5kcy5oZWlnaHQgOiB5T3JpZ2luKTtcclxuICAgIH0gZWxzZSBpZiAobWF0cml4ICE9PSBfaWRlbnRpdHkyRE1hdHJpeCAmJiAoZGV0ZXJtaW5hbnQgPSBhICogZCAtIGIgKiBjKSkge1xyXG4gICAgICB4ID0geE9yaWdpbiAqIChkIC8gZGV0ZXJtaW5hbnQpICsgeU9yaWdpbiAqICgtYyAvIGRldGVybWluYW50KSArIChjICogdHkgLSBkICogdHgpIC8gZGV0ZXJtaW5hbnQ7XHJcbiAgICAgIHkgPSB4T3JpZ2luICogKC1iIC8gZGV0ZXJtaW5hbnQpICsgeU9yaWdpbiAqIChhIC8gZGV0ZXJtaW5hbnQpIC0gKGEgKiB0eSAtIGIgKiB0eCkgLyBkZXRlcm1pbmFudDtcclxuICAgICAgeE9yaWdpbiA9IHg7XHJcbiAgICAgIHlPcmlnaW4gPSB5O1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChzbW9vdGggfHwgc21vb3RoICE9PSBmYWxzZSAmJiBjYWNoZS5zbW9vdGgpIHtcclxuICAgICAgdHggPSB4T3JpZ2luIC0geE9yaWdpbk9sZDtcclxuICAgICAgdHkgPSB5T3JpZ2luIC0geU9yaWdpbk9sZDtcclxuICAgICAgY2FjaGUueE9mZnNldCA9IHhPZmZzZXRPbGQgKyAodHggKiBhICsgdHkgKiBjKSAtIHR4O1xyXG4gICAgICBjYWNoZS55T2Zmc2V0ID0geU9mZnNldE9sZCArICh0eCAqIGIgKyB0eSAqIGQpIC0gdHk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjYWNoZS54T2Zmc2V0ID0gY2FjaGUueU9mZnNldCA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgY2FjaGUueE9yaWdpbiA9IHhPcmlnaW47XHJcbiAgICBjYWNoZS55T3JpZ2luID0geU9yaWdpbjtcclxuICAgIGNhY2hlLnNtb290aCA9ICEhc21vb3RoO1xyXG4gICAgY2FjaGUub3JpZ2luID0gb3JpZ2luO1xyXG4gICAgY2FjaGUub3JpZ2luSXNBYnNvbHV0ZSA9ICEhb3JpZ2luSXNBYnNvbHV0ZTtcclxuICAgIHRhcmdldC5zdHlsZVtfdHJhbnNmb3JtT3JpZ2luUHJvcF0gPSBcIjBweCAwcHhcIjtcclxuXHJcbiAgICBpZiAocGx1Z2luVG9BZGRQcm9wVHdlZW5zVG8pIHtcclxuICAgICAgX2FkZE5vblR3ZWVuaW5nUFQocGx1Z2luVG9BZGRQcm9wVHdlZW5zVG8sIGNhY2hlLCBcInhPcmlnaW5cIiwgeE9yaWdpbk9sZCwgeE9yaWdpbik7XHJcblxyXG4gICAgICBfYWRkTm9uVHdlZW5pbmdQVChwbHVnaW5Ub0FkZFByb3BUd2VlbnNUbywgY2FjaGUsIFwieU9yaWdpblwiLCB5T3JpZ2luT2xkLCB5T3JpZ2luKTtcclxuXHJcbiAgICAgIF9hZGROb25Ud2VlbmluZ1BUKHBsdWdpblRvQWRkUHJvcFR3ZWVuc1RvLCBjYWNoZSwgXCJ4T2Zmc2V0XCIsIHhPZmZzZXRPbGQsIGNhY2hlLnhPZmZzZXQpO1xyXG5cclxuICAgICAgX2FkZE5vblR3ZWVuaW5nUFQocGx1Z2luVG9BZGRQcm9wVHdlZW5zVG8sIGNhY2hlLCBcInlPZmZzZXRcIiwgeU9mZnNldE9sZCwgY2FjaGUueU9mZnNldCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGFyZ2V0LnNldEF0dHJpYnV0ZShcImRhdGEtc3ZnLW9yaWdpblwiLCB4T3JpZ2luICsgXCIgXCIgKyB5T3JpZ2luKTtcclxuICB9LFxyXG4gICAgICBfcGFyc2VUcmFuc2Zvcm0gPSBmdW5jdGlvbiBfcGFyc2VUcmFuc2Zvcm0odGFyZ2V0LCB1bmNhY2hlKSB7XHJcbiAgICB2YXIgY2FjaGUgPSB0YXJnZXQuX2dzYXAgfHwgbmV3IEdTQ2FjaGUodGFyZ2V0KTtcclxuXHJcbiAgICBpZiAoXCJ4XCIgaW4gY2FjaGUgJiYgIXVuY2FjaGUgJiYgIWNhY2hlLnVuY2FjaGUpIHtcclxuICAgICAgcmV0dXJuIGNhY2hlO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBzdHlsZSA9IHRhcmdldC5zdHlsZSxcclxuICAgICAgICBpbnZlcnRlZFNjYWxlWCA9IGNhY2hlLnNjYWxlWCA8IDAsXHJcbiAgICAgICAgcHggPSBcInB4XCIsXHJcbiAgICAgICAgZGVnID0gXCJkZWdcIixcclxuICAgICAgICBjcyA9IGdldENvbXB1dGVkU3R5bGUodGFyZ2V0KSxcclxuICAgICAgICBvcmlnaW4gPSBfZ2V0Q29tcHV0ZWRQcm9wZXJ0eSh0YXJnZXQsIF90cmFuc2Zvcm1PcmlnaW5Qcm9wKSB8fCBcIjBcIixcclxuICAgICAgICB4LFxyXG4gICAgICAgIHksXHJcbiAgICAgICAgeixcclxuICAgICAgICBzY2FsZVgsXHJcbiAgICAgICAgc2NhbGVZLFxyXG4gICAgICAgIHJvdGF0aW9uLFxyXG4gICAgICAgIHJvdGF0aW9uWCxcclxuICAgICAgICByb3RhdGlvblksXHJcbiAgICAgICAgc2tld1gsXHJcbiAgICAgICAgc2tld1ksXHJcbiAgICAgICAgcGVyc3BlY3RpdmUsXHJcbiAgICAgICAgeE9yaWdpbixcclxuICAgICAgICB5T3JpZ2luLFxyXG4gICAgICAgIG1hdHJpeCxcclxuICAgICAgICBhbmdsZSxcclxuICAgICAgICBjb3MsXHJcbiAgICAgICAgc2luLFxyXG4gICAgICAgIGEsXHJcbiAgICAgICAgYixcclxuICAgICAgICBjLFxyXG4gICAgICAgIGQsXHJcbiAgICAgICAgYTEyLFxyXG4gICAgICAgIGEyMixcclxuICAgICAgICB0MSxcclxuICAgICAgICB0MixcclxuICAgICAgICB0MyxcclxuICAgICAgICBhMTMsXHJcbiAgICAgICAgYTIzLFxyXG4gICAgICAgIGEzMyxcclxuICAgICAgICBhNDIsXHJcbiAgICAgICAgYTQzLFxyXG4gICAgICAgIGEzMjtcclxuICAgIHggPSB5ID0geiA9IHJvdGF0aW9uID0gcm90YXRpb25YID0gcm90YXRpb25ZID0gc2tld1ggPSBza2V3WSA9IHBlcnNwZWN0aXZlID0gMDtcclxuICAgIHNjYWxlWCA9IHNjYWxlWSA9IDE7XHJcbiAgICBjYWNoZS5zdmcgPSAhISh0YXJnZXQuZ2V0Q1RNICYmIF9pc1NWRyh0YXJnZXQpKTtcclxuXHJcbiAgICBpZiAoY3MudHJhbnNsYXRlKSB7XHJcbiAgICAgIGlmIChjcy50cmFuc2xhdGUgIT09IFwibm9uZVwiIHx8IGNzLnNjYWxlICE9PSBcIm5vbmVcIiB8fCBjcy5yb3RhdGUgIT09IFwibm9uZVwiKSB7XHJcbiAgICAgICAgc3R5bGVbX3RyYW5zZm9ybVByb3BdID0gKGNzLnRyYW5zbGF0ZSAhPT0gXCJub25lXCIgPyBcInRyYW5zbGF0ZTNkKFwiICsgKGNzLnRyYW5zbGF0ZSArIFwiIDAgMFwiKS5zcGxpdChcIiBcIikuc2xpY2UoMCwgMykuam9pbihcIiwgXCIpICsgXCIpIFwiIDogXCJcIikgKyAoY3Mucm90YXRlICE9PSBcIm5vbmVcIiA/IFwicm90YXRlKFwiICsgY3Mucm90YXRlICsgXCIpIFwiIDogXCJcIikgKyAoY3Muc2NhbGUgIT09IFwibm9uZVwiID8gXCJzY2FsZShcIiArIGNzLnNjYWxlLnNwbGl0KFwiIFwiKS5qb2luKFwiLFwiKSArIFwiKSBcIiA6IFwiXCIpICsgKGNzW190cmFuc2Zvcm1Qcm9wXSAhPT0gXCJub25lXCIgPyBjc1tfdHJhbnNmb3JtUHJvcF0gOiBcIlwiKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgc3R5bGUuc2NhbGUgPSBzdHlsZS5yb3RhdGUgPSBzdHlsZS50cmFuc2xhdGUgPSBcIm5vbmVcIjtcclxuICAgIH1cclxuXHJcbiAgICBtYXRyaXggPSBfZ2V0TWF0cml4KHRhcmdldCwgY2FjaGUuc3ZnKTtcclxuXHJcbiAgICBpZiAoY2FjaGUuc3ZnKSB7XHJcbiAgICAgIGlmIChjYWNoZS51bmNhY2hlKSB7XHJcbiAgICAgICAgdDIgPSB0YXJnZXQuZ2V0QkJveCgpO1xyXG4gICAgICAgIG9yaWdpbiA9IGNhY2hlLnhPcmlnaW4gLSB0Mi54ICsgXCJweCBcIiArIChjYWNoZS55T3JpZ2luIC0gdDIueSkgKyBcInB4XCI7XHJcbiAgICAgICAgdDEgPSBcIlwiO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHQxID0gIXVuY2FjaGUgJiYgdGFyZ2V0LmdldEF0dHJpYnV0ZShcImRhdGEtc3ZnLW9yaWdpblwiKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgX2FwcGx5U1ZHT3JpZ2luKHRhcmdldCwgdDEgfHwgb3JpZ2luLCAhIXQxIHx8IGNhY2hlLm9yaWdpbklzQWJzb2x1dGUsIGNhY2hlLnNtb290aCAhPT0gZmFsc2UsIG1hdHJpeCk7XHJcbiAgICB9XHJcblxyXG4gICAgeE9yaWdpbiA9IGNhY2hlLnhPcmlnaW4gfHwgMDtcclxuICAgIHlPcmlnaW4gPSBjYWNoZS55T3JpZ2luIHx8IDA7XHJcblxyXG4gICAgaWYgKG1hdHJpeCAhPT0gX2lkZW50aXR5MkRNYXRyaXgpIHtcclxuICAgICAgYSA9IG1hdHJpeFswXTtcclxuICAgICAgYiA9IG1hdHJpeFsxXTtcclxuICAgICAgYyA9IG1hdHJpeFsyXTtcclxuICAgICAgZCA9IG1hdHJpeFszXTtcclxuICAgICAgeCA9IGExMiA9IG1hdHJpeFs0XTtcclxuICAgICAgeSA9IGEyMiA9IG1hdHJpeFs1XTtcclxuXHJcbiAgICAgIGlmIChtYXRyaXgubGVuZ3RoID09PSA2KSB7XHJcbiAgICAgICAgc2NhbGVYID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpO1xyXG4gICAgICAgIHNjYWxlWSA9IE1hdGguc3FydChkICogZCArIGMgKiBjKTtcclxuICAgICAgICByb3RhdGlvbiA9IGEgfHwgYiA/IF9hdGFuMihiLCBhKSAqIF9SQUQyREVHIDogMDtcclxuICAgICAgICBza2V3WCA9IGMgfHwgZCA/IF9hdGFuMihjLCBkKSAqIF9SQUQyREVHICsgcm90YXRpb24gOiAwO1xyXG4gICAgICAgIHNrZXdYICYmIChzY2FsZVkgKj0gTWF0aC5hYnMoTWF0aC5jb3Moc2tld1ggKiBfREVHMlJBRCkpKTtcclxuXHJcbiAgICAgICAgaWYgKGNhY2hlLnN2Zykge1xyXG4gICAgICAgICAgeCAtPSB4T3JpZ2luIC0gKHhPcmlnaW4gKiBhICsgeU9yaWdpbiAqIGMpO1xyXG4gICAgICAgICAgeSAtPSB5T3JpZ2luIC0gKHhPcmlnaW4gKiBiICsgeU9yaWdpbiAqIGQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBhMzIgPSBtYXRyaXhbNl07XHJcbiAgICAgICAgYTQyID0gbWF0cml4WzddO1xyXG4gICAgICAgIGExMyA9IG1hdHJpeFs4XTtcclxuICAgICAgICBhMjMgPSBtYXRyaXhbOV07XHJcbiAgICAgICAgYTMzID0gbWF0cml4WzEwXTtcclxuICAgICAgICBhNDMgPSBtYXRyaXhbMTFdO1xyXG4gICAgICAgIHggPSBtYXRyaXhbMTJdO1xyXG4gICAgICAgIHkgPSBtYXRyaXhbMTNdO1xyXG4gICAgICAgIHogPSBtYXRyaXhbMTRdO1xyXG4gICAgICAgIGFuZ2xlID0gX2F0YW4yKGEzMiwgYTMzKTtcclxuICAgICAgICByb3RhdGlvblggPSBhbmdsZSAqIF9SQUQyREVHO1xyXG5cclxuICAgICAgICBpZiAoYW5nbGUpIHtcclxuICAgICAgICAgIGNvcyA9IE1hdGguY29zKC1hbmdsZSk7XHJcbiAgICAgICAgICBzaW4gPSBNYXRoLnNpbigtYW5nbGUpO1xyXG4gICAgICAgICAgdDEgPSBhMTIgKiBjb3MgKyBhMTMgKiBzaW47XHJcbiAgICAgICAgICB0MiA9IGEyMiAqIGNvcyArIGEyMyAqIHNpbjtcclxuICAgICAgICAgIHQzID0gYTMyICogY29zICsgYTMzICogc2luO1xyXG4gICAgICAgICAgYTEzID0gYTEyICogLXNpbiArIGExMyAqIGNvcztcclxuICAgICAgICAgIGEyMyA9IGEyMiAqIC1zaW4gKyBhMjMgKiBjb3M7XHJcbiAgICAgICAgICBhMzMgPSBhMzIgKiAtc2luICsgYTMzICogY29zO1xyXG4gICAgICAgICAgYTQzID0gYTQyICogLXNpbiArIGE0MyAqIGNvcztcclxuICAgICAgICAgIGExMiA9IHQxO1xyXG4gICAgICAgICAgYTIyID0gdDI7XHJcbiAgICAgICAgICBhMzIgPSB0MztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGFuZ2xlID0gX2F0YW4yKC1jLCBhMzMpO1xyXG4gICAgICAgIHJvdGF0aW9uWSA9IGFuZ2xlICogX1JBRDJERUc7XHJcblxyXG4gICAgICAgIGlmIChhbmdsZSkge1xyXG4gICAgICAgICAgY29zID0gTWF0aC5jb3MoLWFuZ2xlKTtcclxuICAgICAgICAgIHNpbiA9IE1hdGguc2luKC1hbmdsZSk7XHJcbiAgICAgICAgICB0MSA9IGEgKiBjb3MgLSBhMTMgKiBzaW47XHJcbiAgICAgICAgICB0MiA9IGIgKiBjb3MgLSBhMjMgKiBzaW47XHJcbiAgICAgICAgICB0MyA9IGMgKiBjb3MgLSBhMzMgKiBzaW47XHJcbiAgICAgICAgICBhNDMgPSBkICogc2luICsgYTQzICogY29zO1xyXG4gICAgICAgICAgYSA9IHQxO1xyXG4gICAgICAgICAgYiA9IHQyO1xyXG4gICAgICAgICAgYyA9IHQzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYW5nbGUgPSBfYXRhbjIoYiwgYSk7XHJcbiAgICAgICAgcm90YXRpb24gPSBhbmdsZSAqIF9SQUQyREVHO1xyXG5cclxuICAgICAgICBpZiAoYW5nbGUpIHtcclxuICAgICAgICAgIGNvcyA9IE1hdGguY29zKGFuZ2xlKTtcclxuICAgICAgICAgIHNpbiA9IE1hdGguc2luKGFuZ2xlKTtcclxuICAgICAgICAgIHQxID0gYSAqIGNvcyArIGIgKiBzaW47XHJcbiAgICAgICAgICB0MiA9IGExMiAqIGNvcyArIGEyMiAqIHNpbjtcclxuICAgICAgICAgIGIgPSBiICogY29zIC0gYSAqIHNpbjtcclxuICAgICAgICAgIGEyMiA9IGEyMiAqIGNvcyAtIGExMiAqIHNpbjtcclxuICAgICAgICAgIGEgPSB0MTtcclxuICAgICAgICAgIGExMiA9IHQyO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJvdGF0aW9uWCAmJiBNYXRoLmFicyhyb3RhdGlvblgpICsgTWF0aC5hYnMocm90YXRpb24pID4gMzU5LjkpIHtcclxuICAgICAgICAgIHJvdGF0aW9uWCA9IHJvdGF0aW9uID0gMDtcclxuICAgICAgICAgIHJvdGF0aW9uWSA9IDE4MCAtIHJvdGF0aW9uWTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNjYWxlWCA9IF9yb3VuZChNYXRoLnNxcnQoYSAqIGEgKyBiICogYiArIGMgKiBjKSk7XHJcbiAgICAgICAgc2NhbGVZID0gX3JvdW5kKE1hdGguc3FydChhMjIgKiBhMjIgKyBhMzIgKiBhMzIpKTtcclxuICAgICAgICBhbmdsZSA9IF9hdGFuMihhMTIsIGEyMik7XHJcbiAgICAgICAgc2tld1ggPSBNYXRoLmFicyhhbmdsZSkgPiAwLjAwMDIgPyBhbmdsZSAqIF9SQUQyREVHIDogMDtcclxuICAgICAgICBwZXJzcGVjdGl2ZSA9IGE0MyA/IDEgLyAoYTQzIDwgMCA/IC1hNDMgOiBhNDMpIDogMDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNhY2hlLnN2Zykge1xyXG4gICAgICAgIHQxID0gdGFyZ2V0LmdldEF0dHJpYnV0ZShcInRyYW5zZm9ybVwiKTtcclxuICAgICAgICBjYWNoZS5mb3JjZUNTUyA9IHRhcmdldC5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgXCJcIikgfHwgIV9pc051bGxUcmFuc2Zvcm0oX2dldENvbXB1dGVkUHJvcGVydHkodGFyZ2V0LCBfdHJhbnNmb3JtUHJvcCkpO1xyXG4gICAgICAgIHQxICYmIHRhcmdldC5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgdDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKE1hdGguYWJzKHNrZXdYKSA+IDkwICYmIE1hdGguYWJzKHNrZXdYKSA8IDI3MCkge1xyXG4gICAgICBpZiAoaW52ZXJ0ZWRTY2FsZVgpIHtcclxuICAgICAgICBzY2FsZVggKj0gLTE7XHJcbiAgICAgICAgc2tld1ggKz0gcm90YXRpb24gPD0gMCA/IDE4MCA6IC0xODA7XHJcbiAgICAgICAgcm90YXRpb24gKz0gcm90YXRpb24gPD0gMCA/IDE4MCA6IC0xODA7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2NhbGVZICo9IC0xO1xyXG4gICAgICAgIHNrZXdYICs9IHNrZXdYIDw9IDAgPyAxODAgOiAtMTgwO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdW5jYWNoZSA9IHVuY2FjaGUgfHwgY2FjaGUudW5jYWNoZTtcclxuICAgIGNhY2hlLnggPSB4IC0gKChjYWNoZS54UGVyY2VudCA9IHggJiYgKCF1bmNhY2hlICYmIGNhY2hlLnhQZXJjZW50IHx8IChNYXRoLnJvdW5kKHRhcmdldC5vZmZzZXRXaWR0aCAvIDIpID09PSBNYXRoLnJvdW5kKC14KSA/IC01MCA6IDApKSkgPyB0YXJnZXQub2Zmc2V0V2lkdGggKiBjYWNoZS54UGVyY2VudCAvIDEwMCA6IDApICsgcHg7XHJcbiAgICBjYWNoZS55ID0geSAtICgoY2FjaGUueVBlcmNlbnQgPSB5ICYmICghdW5jYWNoZSAmJiBjYWNoZS55UGVyY2VudCB8fCAoTWF0aC5yb3VuZCh0YXJnZXQub2Zmc2V0SGVpZ2h0IC8gMikgPT09IE1hdGgucm91bmQoLXkpID8gLTUwIDogMCkpKSA/IHRhcmdldC5vZmZzZXRIZWlnaHQgKiBjYWNoZS55UGVyY2VudCAvIDEwMCA6IDApICsgcHg7XHJcbiAgICBjYWNoZS56ID0geiArIHB4O1xyXG4gICAgY2FjaGUuc2NhbGVYID0gX3JvdW5kKHNjYWxlWCk7XHJcbiAgICBjYWNoZS5zY2FsZVkgPSBfcm91bmQoc2NhbGVZKTtcclxuICAgIGNhY2hlLnJvdGF0aW9uID0gX3JvdW5kKHJvdGF0aW9uKSArIGRlZztcclxuICAgIGNhY2hlLnJvdGF0aW9uWCA9IF9yb3VuZChyb3RhdGlvblgpICsgZGVnO1xyXG4gICAgY2FjaGUucm90YXRpb25ZID0gX3JvdW5kKHJvdGF0aW9uWSkgKyBkZWc7XHJcbiAgICBjYWNoZS5za2V3WCA9IHNrZXdYICsgZGVnO1xyXG4gICAgY2FjaGUuc2tld1kgPSBza2V3WSArIGRlZztcclxuICAgIGNhY2hlLnRyYW5zZm9ybVBlcnNwZWN0aXZlID0gcGVyc3BlY3RpdmUgKyBweDtcclxuXHJcbiAgICBpZiAoY2FjaGUuek9yaWdpbiA9IHBhcnNlRmxvYXQob3JpZ2luLnNwbGl0KFwiIFwiKVsyXSkgfHwgIXVuY2FjaGUgJiYgY2FjaGUuek9yaWdpbiB8fCAwKSB7XHJcbiAgICAgIHN0eWxlW190cmFuc2Zvcm1PcmlnaW5Qcm9wXSA9IF9maXJzdFR3b09ubHkob3JpZ2luKTtcclxuICAgIH1cclxuXHJcbiAgICBjYWNoZS54T2Zmc2V0ID0gY2FjaGUueU9mZnNldCA9IDA7XHJcbiAgICBjYWNoZS5mb3JjZTNEID0gX2NvbmZpZy5mb3JjZTNEO1xyXG4gICAgY2FjaGUucmVuZGVyVHJhbnNmb3JtID0gY2FjaGUuc3ZnID8gX3JlbmRlclNWR1RyYW5zZm9ybXMgOiBfc3VwcG9ydHMzRCA/IF9yZW5kZXJDU1NUcmFuc2Zvcm1zIDogX3JlbmRlck5vbjNEVHJhbnNmb3JtcztcclxuICAgIGNhY2hlLnVuY2FjaGUgPSAwO1xyXG4gICAgcmV0dXJuIGNhY2hlO1xyXG4gIH0sXHJcbiAgICAgIF9maXJzdFR3b09ubHkgPSBmdW5jdGlvbiBfZmlyc3RUd29Pbmx5KHZhbHVlKSB7XHJcbiAgICByZXR1cm4gKHZhbHVlID0gdmFsdWUuc3BsaXQoXCIgXCIpKVswXSArIFwiIFwiICsgdmFsdWVbMV07XHJcbiAgfSxcclxuICAgICAgX2FkZFB4VHJhbnNsYXRlID0gZnVuY3Rpb24gX2FkZFB4VHJhbnNsYXRlKHRhcmdldCwgc3RhcnQsIHZhbHVlKSB7XHJcbiAgICB2YXIgdW5pdCA9IGdldFVuaXQoc3RhcnQpO1xyXG4gICAgcmV0dXJuIF9yb3VuZChwYXJzZUZsb2F0KHN0YXJ0KSArIHBhcnNlRmxvYXQoX2NvbnZlcnRUb1VuaXQodGFyZ2V0LCBcInhcIiwgdmFsdWUgKyBcInB4XCIsIHVuaXQpKSkgKyB1bml0O1xyXG4gIH0sXHJcbiAgICAgIF9yZW5kZXJOb24zRFRyYW5zZm9ybXMgPSBmdW5jdGlvbiBfcmVuZGVyTm9uM0RUcmFuc2Zvcm1zKHJhdGlvLCBjYWNoZSkge1xyXG4gICAgY2FjaGUueiA9IFwiMHB4XCI7XHJcbiAgICBjYWNoZS5yb3RhdGlvblkgPSBjYWNoZS5yb3RhdGlvblggPSBcIjBkZWdcIjtcclxuICAgIGNhY2hlLmZvcmNlM0QgPSAwO1xyXG5cclxuICAgIF9yZW5kZXJDU1NUcmFuc2Zvcm1zKHJhdGlvLCBjYWNoZSk7XHJcbiAgfSxcclxuICAgICAgX3plcm9EZWcgPSBcIjBkZWdcIixcclxuICAgICAgX3plcm9QeCA9IFwiMHB4XCIsXHJcbiAgICAgIF9lbmRQYXJlbnRoZXNpcyA9IFwiKSBcIixcclxuICAgICAgX3JlbmRlckNTU1RyYW5zZm9ybXMgPSBmdW5jdGlvbiBfcmVuZGVyQ1NTVHJhbnNmb3JtcyhyYXRpbywgY2FjaGUpIHtcclxuICAgIHZhciBfcmVmID0gY2FjaGUgfHwgdGhpcyxcclxuICAgICAgICB4UGVyY2VudCA9IF9yZWYueFBlcmNlbnQsXHJcbiAgICAgICAgeVBlcmNlbnQgPSBfcmVmLnlQZXJjZW50LFxyXG4gICAgICAgIHggPSBfcmVmLngsXHJcbiAgICAgICAgeSA9IF9yZWYueSxcclxuICAgICAgICB6ID0gX3JlZi56LFxyXG4gICAgICAgIHJvdGF0aW9uID0gX3JlZi5yb3RhdGlvbixcclxuICAgICAgICByb3RhdGlvblkgPSBfcmVmLnJvdGF0aW9uWSxcclxuICAgICAgICByb3RhdGlvblggPSBfcmVmLnJvdGF0aW9uWCxcclxuICAgICAgICBza2V3WCA9IF9yZWYuc2tld1gsXHJcbiAgICAgICAgc2tld1kgPSBfcmVmLnNrZXdZLFxyXG4gICAgICAgIHNjYWxlWCA9IF9yZWYuc2NhbGVYLFxyXG4gICAgICAgIHNjYWxlWSA9IF9yZWYuc2NhbGVZLFxyXG4gICAgICAgIHRyYW5zZm9ybVBlcnNwZWN0aXZlID0gX3JlZi50cmFuc2Zvcm1QZXJzcGVjdGl2ZSxcclxuICAgICAgICBmb3JjZTNEID0gX3JlZi5mb3JjZTNELFxyXG4gICAgICAgIHRhcmdldCA9IF9yZWYudGFyZ2V0LFxyXG4gICAgICAgIHpPcmlnaW4gPSBfcmVmLnpPcmlnaW4sXHJcbiAgICAgICAgdHJhbnNmb3JtcyA9IFwiXCIsXHJcbiAgICAgICAgdXNlM0QgPSBmb3JjZTNEID09PSBcImF1dG9cIiAmJiByYXRpbyAmJiByYXRpbyAhPT0gMSB8fCBmb3JjZTNEID09PSB0cnVlO1xyXG5cclxuICAgIGlmICh6T3JpZ2luICYmIChyb3RhdGlvblggIT09IF96ZXJvRGVnIHx8IHJvdGF0aW9uWSAhPT0gX3plcm9EZWcpKSB7XHJcbiAgICAgIHZhciBhbmdsZSA9IHBhcnNlRmxvYXQocm90YXRpb25ZKSAqIF9ERUcyUkFELFxyXG4gICAgICAgICAgYTEzID0gTWF0aC5zaW4oYW5nbGUpLFxyXG4gICAgICAgICAgYTMzID0gTWF0aC5jb3MoYW5nbGUpLFxyXG4gICAgICAgICAgY29zO1xyXG5cclxuICAgICAgYW5nbGUgPSBwYXJzZUZsb2F0KHJvdGF0aW9uWCkgKiBfREVHMlJBRDtcclxuICAgICAgY29zID0gTWF0aC5jb3MoYW5nbGUpO1xyXG4gICAgICB4ID0gX2FkZFB4VHJhbnNsYXRlKHRhcmdldCwgeCwgYTEzICogY29zICogLXpPcmlnaW4pO1xyXG4gICAgICB5ID0gX2FkZFB4VHJhbnNsYXRlKHRhcmdldCwgeSwgLU1hdGguc2luKGFuZ2xlKSAqIC16T3JpZ2luKTtcclxuICAgICAgeiA9IF9hZGRQeFRyYW5zbGF0ZSh0YXJnZXQsIHosIGEzMyAqIGNvcyAqIC16T3JpZ2luICsgek9yaWdpbik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRyYW5zZm9ybVBlcnNwZWN0aXZlICE9PSBfemVyb1B4KSB7XHJcbiAgICAgIHRyYW5zZm9ybXMgKz0gXCJwZXJzcGVjdGl2ZShcIiArIHRyYW5zZm9ybVBlcnNwZWN0aXZlICsgX2VuZFBhcmVudGhlc2lzO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh4UGVyY2VudCB8fCB5UGVyY2VudCkge1xyXG4gICAgICB0cmFuc2Zvcm1zICs9IFwidHJhbnNsYXRlKFwiICsgeFBlcmNlbnQgKyBcIiUsIFwiICsgeVBlcmNlbnQgKyBcIiUpIFwiO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh1c2UzRCB8fCB4ICE9PSBfemVyb1B4IHx8IHkgIT09IF96ZXJvUHggfHwgeiAhPT0gX3plcm9QeCkge1xyXG4gICAgICB0cmFuc2Zvcm1zICs9IHogIT09IF96ZXJvUHggfHwgdXNlM0QgPyBcInRyYW5zbGF0ZTNkKFwiICsgeCArIFwiLCBcIiArIHkgKyBcIiwgXCIgKyB6ICsgXCIpIFwiIDogXCJ0cmFuc2xhdGUoXCIgKyB4ICsgXCIsIFwiICsgeSArIF9lbmRQYXJlbnRoZXNpcztcclxuICAgIH1cclxuXHJcbiAgICBpZiAocm90YXRpb24gIT09IF96ZXJvRGVnKSB7XHJcbiAgICAgIHRyYW5zZm9ybXMgKz0gXCJyb3RhdGUoXCIgKyByb3RhdGlvbiArIF9lbmRQYXJlbnRoZXNpcztcclxuICAgIH1cclxuXHJcbiAgICBpZiAocm90YXRpb25ZICE9PSBfemVyb0RlZykge1xyXG4gICAgICB0cmFuc2Zvcm1zICs9IFwicm90YXRlWShcIiArIHJvdGF0aW9uWSArIF9lbmRQYXJlbnRoZXNpcztcclxuICAgIH1cclxuXHJcbiAgICBpZiAocm90YXRpb25YICE9PSBfemVyb0RlZykge1xyXG4gICAgICB0cmFuc2Zvcm1zICs9IFwicm90YXRlWChcIiArIHJvdGF0aW9uWCArIF9lbmRQYXJlbnRoZXNpcztcclxuICAgIH1cclxuXHJcbiAgICBpZiAoc2tld1ggIT09IF96ZXJvRGVnIHx8IHNrZXdZICE9PSBfemVyb0RlZykge1xyXG4gICAgICB0cmFuc2Zvcm1zICs9IFwic2tldyhcIiArIHNrZXdYICsgXCIsIFwiICsgc2tld1kgKyBfZW5kUGFyZW50aGVzaXM7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNjYWxlWCAhPT0gMSB8fCBzY2FsZVkgIT09IDEpIHtcclxuICAgICAgdHJhbnNmb3JtcyArPSBcInNjYWxlKFwiICsgc2NhbGVYICsgXCIsIFwiICsgc2NhbGVZICsgX2VuZFBhcmVudGhlc2lzO1xyXG4gICAgfVxyXG5cclxuICAgIHRhcmdldC5zdHlsZVtfdHJhbnNmb3JtUHJvcF0gPSB0cmFuc2Zvcm1zIHx8IFwidHJhbnNsYXRlKDAsIDApXCI7XHJcbiAgfSxcclxuICAgICAgX3JlbmRlclNWR1RyYW5zZm9ybXMgPSBmdW5jdGlvbiBfcmVuZGVyU1ZHVHJhbnNmb3JtcyhyYXRpbywgY2FjaGUpIHtcclxuICAgIHZhciBfcmVmMiA9IGNhY2hlIHx8IHRoaXMsXHJcbiAgICAgICAgeFBlcmNlbnQgPSBfcmVmMi54UGVyY2VudCxcclxuICAgICAgICB5UGVyY2VudCA9IF9yZWYyLnlQZXJjZW50LFxyXG4gICAgICAgIHggPSBfcmVmMi54LFxyXG4gICAgICAgIHkgPSBfcmVmMi55LFxyXG4gICAgICAgIHJvdGF0aW9uID0gX3JlZjIucm90YXRpb24sXHJcbiAgICAgICAgc2tld1ggPSBfcmVmMi5za2V3WCxcclxuICAgICAgICBza2V3WSA9IF9yZWYyLnNrZXdZLFxyXG4gICAgICAgIHNjYWxlWCA9IF9yZWYyLnNjYWxlWCxcclxuICAgICAgICBzY2FsZVkgPSBfcmVmMi5zY2FsZVksXHJcbiAgICAgICAgdGFyZ2V0ID0gX3JlZjIudGFyZ2V0LFxyXG4gICAgICAgIHhPcmlnaW4gPSBfcmVmMi54T3JpZ2luLFxyXG4gICAgICAgIHlPcmlnaW4gPSBfcmVmMi55T3JpZ2luLFxyXG4gICAgICAgIHhPZmZzZXQgPSBfcmVmMi54T2Zmc2V0LFxyXG4gICAgICAgIHlPZmZzZXQgPSBfcmVmMi55T2Zmc2V0LFxyXG4gICAgICAgIGZvcmNlQ1NTID0gX3JlZjIuZm9yY2VDU1MsXHJcbiAgICAgICAgdHggPSBwYXJzZUZsb2F0KHgpLFxyXG4gICAgICAgIHR5ID0gcGFyc2VGbG9hdCh5KSxcclxuICAgICAgICBhMTEsXHJcbiAgICAgICAgYTIxLFxyXG4gICAgICAgIGExMixcclxuICAgICAgICBhMjIsXHJcbiAgICAgICAgdGVtcDtcclxuXHJcbiAgICByb3RhdGlvbiA9IHBhcnNlRmxvYXQocm90YXRpb24pO1xyXG4gICAgc2tld1ggPSBwYXJzZUZsb2F0KHNrZXdYKTtcclxuICAgIHNrZXdZID0gcGFyc2VGbG9hdChza2V3WSk7XHJcblxyXG4gICAgaWYgKHNrZXdZKSB7XHJcbiAgICAgIHNrZXdZID0gcGFyc2VGbG9hdChza2V3WSk7XHJcbiAgICAgIHNrZXdYICs9IHNrZXdZO1xyXG4gICAgICByb3RhdGlvbiArPSBza2V3WTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocm90YXRpb24gfHwgc2tld1gpIHtcclxuICAgICAgcm90YXRpb24gKj0gX0RFRzJSQUQ7XHJcbiAgICAgIHNrZXdYICo9IF9ERUcyUkFEO1xyXG4gICAgICBhMTEgPSBNYXRoLmNvcyhyb3RhdGlvbikgKiBzY2FsZVg7XHJcbiAgICAgIGEyMSA9IE1hdGguc2luKHJvdGF0aW9uKSAqIHNjYWxlWDtcclxuICAgICAgYTEyID0gTWF0aC5zaW4ocm90YXRpb24gLSBza2V3WCkgKiAtc2NhbGVZO1xyXG4gICAgICBhMjIgPSBNYXRoLmNvcyhyb3RhdGlvbiAtIHNrZXdYKSAqIHNjYWxlWTtcclxuXHJcbiAgICAgIGlmIChza2V3WCkge1xyXG4gICAgICAgIHNrZXdZICo9IF9ERUcyUkFEO1xyXG4gICAgICAgIHRlbXAgPSBNYXRoLnRhbihza2V3WCAtIHNrZXdZKTtcclxuICAgICAgICB0ZW1wID0gTWF0aC5zcXJ0KDEgKyB0ZW1wICogdGVtcCk7XHJcbiAgICAgICAgYTEyICo9IHRlbXA7XHJcbiAgICAgICAgYTIyICo9IHRlbXA7XHJcblxyXG4gICAgICAgIGlmIChza2V3WSkge1xyXG4gICAgICAgICAgdGVtcCA9IE1hdGgudGFuKHNrZXdZKTtcclxuICAgICAgICAgIHRlbXAgPSBNYXRoLnNxcnQoMSArIHRlbXAgKiB0ZW1wKTtcclxuICAgICAgICAgIGExMSAqPSB0ZW1wO1xyXG4gICAgICAgICAgYTIxICo9IHRlbXA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBhMTEgPSBfcm91bmQoYTExKTtcclxuICAgICAgYTIxID0gX3JvdW5kKGEyMSk7XHJcbiAgICAgIGExMiA9IF9yb3VuZChhMTIpO1xyXG4gICAgICBhMjIgPSBfcm91bmQoYTIyKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGExMSA9IHNjYWxlWDtcclxuICAgICAgYTIyID0gc2NhbGVZO1xyXG4gICAgICBhMjEgPSBhMTIgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eCAmJiAhfih4ICsgXCJcIikuaW5kZXhPZihcInB4XCIpIHx8IHR5ICYmICF+KHkgKyBcIlwiKS5pbmRleE9mKFwicHhcIikpIHtcclxuICAgICAgdHggPSBfY29udmVydFRvVW5pdCh0YXJnZXQsIFwieFwiLCB4LCBcInB4XCIpO1xyXG4gICAgICB0eSA9IF9jb252ZXJ0VG9Vbml0KHRhcmdldCwgXCJ5XCIsIHksIFwicHhcIik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHhPcmlnaW4gfHwgeU9yaWdpbiB8fCB4T2Zmc2V0IHx8IHlPZmZzZXQpIHtcclxuICAgICAgdHggPSBfcm91bmQodHggKyB4T3JpZ2luIC0gKHhPcmlnaW4gKiBhMTEgKyB5T3JpZ2luICogYTEyKSArIHhPZmZzZXQpO1xyXG4gICAgICB0eSA9IF9yb3VuZCh0eSArIHlPcmlnaW4gLSAoeE9yaWdpbiAqIGEyMSArIHlPcmlnaW4gKiBhMjIpICsgeU9mZnNldCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHhQZXJjZW50IHx8IHlQZXJjZW50KSB7XHJcbiAgICAgIHRlbXAgPSB0YXJnZXQuZ2V0QkJveCgpO1xyXG4gICAgICB0eCA9IF9yb3VuZCh0eCArIHhQZXJjZW50IC8gMTAwICogdGVtcC53aWR0aCk7XHJcbiAgICAgIHR5ID0gX3JvdW5kKHR5ICsgeVBlcmNlbnQgLyAxMDAgKiB0ZW1wLmhlaWdodCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGVtcCA9IFwibWF0cml4KFwiICsgYTExICsgXCIsXCIgKyBhMjEgKyBcIixcIiArIGExMiArIFwiLFwiICsgYTIyICsgXCIsXCIgKyB0eCArIFwiLFwiICsgdHkgKyBcIilcIjtcclxuICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgdGVtcCk7XHJcbiAgICBmb3JjZUNTUyAmJiAodGFyZ2V0LnN0eWxlW190cmFuc2Zvcm1Qcm9wXSA9IHRlbXApO1xyXG4gIH0sXHJcbiAgICAgIF9hZGRSb3RhdGlvbmFsUHJvcFR3ZWVuID0gZnVuY3Rpb24gX2FkZFJvdGF0aW9uYWxQcm9wVHdlZW4ocGx1Z2luLCB0YXJnZXQsIHByb3BlcnR5LCBzdGFydE51bSwgZW5kVmFsdWUpIHtcclxuICAgIHZhciBjYXAgPSAzNjAsXHJcbiAgICAgICAgaXNTdHJpbmcgPSBfaXNTdHJpbmcoZW5kVmFsdWUpLFxyXG4gICAgICAgIGVuZE51bSA9IHBhcnNlRmxvYXQoZW5kVmFsdWUpICogKGlzU3RyaW5nICYmIH5lbmRWYWx1ZS5pbmRleE9mKFwicmFkXCIpID8gX1JBRDJERUcgOiAxKSxcclxuICAgICAgICBjaGFuZ2UgPSBlbmROdW0gLSBzdGFydE51bSxcclxuICAgICAgICBmaW5hbFZhbHVlID0gc3RhcnROdW0gKyBjaGFuZ2UgKyBcImRlZ1wiLFxyXG4gICAgICAgIGRpcmVjdGlvbixcclxuICAgICAgICBwdDtcclxuXHJcbiAgICBpZiAoaXNTdHJpbmcpIHtcclxuICAgICAgZGlyZWN0aW9uID0gZW5kVmFsdWUuc3BsaXQoXCJfXCIpWzFdO1xyXG5cclxuICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gXCJzaG9ydFwiKSB7XHJcbiAgICAgICAgY2hhbmdlICU9IGNhcDtcclxuXHJcbiAgICAgICAgaWYgKGNoYW5nZSAhPT0gY2hhbmdlICUgKGNhcCAvIDIpKSB7XHJcbiAgICAgICAgICBjaGFuZ2UgKz0gY2hhbmdlIDwgMCA/IGNhcCA6IC1jYXA7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZGlyZWN0aW9uID09PSBcImN3XCIgJiYgY2hhbmdlIDwgMCkge1xyXG4gICAgICAgIGNoYW5nZSA9IChjaGFuZ2UgKyBjYXAgKiBfYmlnTnVtJDEpICUgY2FwIC0gfn4oY2hhbmdlIC8gY2FwKSAqIGNhcDtcclxuICAgICAgfSBlbHNlIGlmIChkaXJlY3Rpb24gPT09IFwiY2N3XCIgJiYgY2hhbmdlID4gMCkge1xyXG4gICAgICAgIGNoYW5nZSA9IChjaGFuZ2UgLSBjYXAgKiBfYmlnTnVtJDEpICUgY2FwIC0gfn4oY2hhbmdlIC8gY2FwKSAqIGNhcDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHBsdWdpbi5fcHQgPSBwdCA9IG5ldyBQcm9wVHdlZW4ocGx1Z2luLl9wdCwgdGFyZ2V0LCBwcm9wZXJ0eSwgc3RhcnROdW0sIGNoYW5nZSwgX3JlbmRlclByb3BXaXRoRW5kKTtcclxuICAgIHB0LmUgPSBmaW5hbFZhbHVlO1xyXG4gICAgcHQudSA9IFwiZGVnXCI7XHJcblxyXG4gICAgcGx1Z2luLl9wcm9wcy5wdXNoKHByb3BlcnR5KTtcclxuXHJcbiAgICByZXR1cm4gcHQ7XHJcbiAgfSxcclxuICAgICAgX2Fzc2lnbiA9IGZ1bmN0aW9uIF9hc3NpZ24odGFyZ2V0LCBzb3VyY2UpIHtcclxuICAgIGZvciAodmFyIHAgaW4gc291cmNlKSB7XHJcbiAgICAgIHRhcmdldFtwXSA9IHNvdXJjZVtwXTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gdGFyZ2V0O1xyXG4gIH0sXHJcbiAgICAgIF9hZGRSYXdUcmFuc2Zvcm1QVHMgPSBmdW5jdGlvbiBfYWRkUmF3VHJhbnNmb3JtUFRzKHBsdWdpbiwgdHJhbnNmb3JtcywgdGFyZ2V0KSB7XHJcbiAgICB2YXIgc3RhcnRDYWNoZSA9IF9hc3NpZ24oe30sIHRhcmdldC5fZ3NhcCksXHJcbiAgICAgICAgZXhjbHVkZSA9IFwicGVyc3BlY3RpdmUsZm9yY2UzRCx0cmFuc2Zvcm1PcmlnaW4sc3ZnT3JpZ2luXCIsXHJcbiAgICAgICAgc3R5bGUgPSB0YXJnZXQuc3R5bGUsXHJcbiAgICAgICAgZW5kQ2FjaGUsXHJcbiAgICAgICAgcCxcclxuICAgICAgICBzdGFydFZhbHVlLFxyXG4gICAgICAgIGVuZFZhbHVlLFxyXG4gICAgICAgIHN0YXJ0TnVtLFxyXG4gICAgICAgIGVuZE51bSxcclxuICAgICAgICBzdGFydFVuaXQsXHJcbiAgICAgICAgZW5kVW5pdDtcclxuXHJcbiAgICBpZiAoc3RhcnRDYWNoZS5zdmcpIHtcclxuICAgICAgc3RhcnRWYWx1ZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIik7XHJcbiAgICAgIHRhcmdldC5zZXRBdHRyaWJ1dGUoXCJ0cmFuc2Zvcm1cIiwgXCJcIik7XHJcbiAgICAgIHN0eWxlW190cmFuc2Zvcm1Qcm9wXSA9IHRyYW5zZm9ybXM7XHJcbiAgICAgIGVuZENhY2hlID0gX3BhcnNlVHJhbnNmb3JtKHRhcmdldCwgMSk7XHJcblxyXG4gICAgICBfcmVtb3ZlUHJvcGVydHkodGFyZ2V0LCBfdHJhbnNmb3JtUHJvcCk7XHJcblxyXG4gICAgICB0YXJnZXQuc2V0QXR0cmlidXRlKFwidHJhbnNmb3JtXCIsIHN0YXJ0VmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc3RhcnRWYWx1ZSA9IGdldENvbXB1dGVkU3R5bGUodGFyZ2V0KVtfdHJhbnNmb3JtUHJvcF07XHJcbiAgICAgIHN0eWxlW190cmFuc2Zvcm1Qcm9wXSA9IHRyYW5zZm9ybXM7XHJcbiAgICAgIGVuZENhY2hlID0gX3BhcnNlVHJhbnNmb3JtKHRhcmdldCwgMSk7XHJcbiAgICAgIHN0eWxlW190cmFuc2Zvcm1Qcm9wXSA9IHN0YXJ0VmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChwIGluIF90cmFuc2Zvcm1Qcm9wcykge1xyXG4gICAgICBzdGFydFZhbHVlID0gc3RhcnRDYWNoZVtwXTtcclxuICAgICAgZW5kVmFsdWUgPSBlbmRDYWNoZVtwXTtcclxuXHJcbiAgICAgIGlmIChzdGFydFZhbHVlICE9PSBlbmRWYWx1ZSAmJiBleGNsdWRlLmluZGV4T2YocCkgPCAwKSB7XHJcbiAgICAgICAgc3RhcnRVbml0ID0gZ2V0VW5pdChzdGFydFZhbHVlKTtcclxuICAgICAgICBlbmRVbml0ID0gZ2V0VW5pdChlbmRWYWx1ZSk7XHJcbiAgICAgICAgc3RhcnROdW0gPSBzdGFydFVuaXQgIT09IGVuZFVuaXQgPyBfY29udmVydFRvVW5pdCh0YXJnZXQsIHAsIHN0YXJ0VmFsdWUsIGVuZFVuaXQpIDogcGFyc2VGbG9hdChzdGFydFZhbHVlKTtcclxuICAgICAgICBlbmROdW0gPSBwYXJzZUZsb2F0KGVuZFZhbHVlKTtcclxuICAgICAgICBwbHVnaW4uX3B0ID0gbmV3IFByb3BUd2VlbihwbHVnaW4uX3B0LCBlbmRDYWNoZSwgcCwgc3RhcnROdW0sIGVuZE51bSAtIHN0YXJ0TnVtLCBfcmVuZGVyQ1NTUHJvcCk7XHJcbiAgICAgICAgcGx1Z2luLl9wdC51ID0gZW5kVW5pdCB8fCAwO1xyXG5cclxuICAgICAgICBwbHVnaW4uX3Byb3BzLnB1c2gocCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfYXNzaWduKGVuZENhY2hlLCBzdGFydENhY2hlKTtcclxuICB9O1xyXG5cclxuICBfZm9yRWFjaE5hbWUoXCJwYWRkaW5nLG1hcmdpbixXaWR0aCxSYWRpdXNcIiwgZnVuY3Rpb24gKG5hbWUsIGluZGV4KSB7XHJcbiAgICB2YXIgdCA9IFwiVG9wXCIsXHJcbiAgICAgICAgciA9IFwiUmlnaHRcIixcclxuICAgICAgICBiID0gXCJCb3R0b21cIixcclxuICAgICAgICBsID0gXCJMZWZ0XCIsXHJcbiAgICAgICAgcHJvcHMgPSAoaW5kZXggPCAzID8gW3QsIHIsIGIsIGxdIDogW3QgKyBsLCB0ICsgciwgYiArIHIsIGIgKyBsXSkubWFwKGZ1bmN0aW9uIChzaWRlKSB7XHJcbiAgICAgIHJldHVybiBpbmRleCA8IDIgPyBuYW1lICsgc2lkZSA6IFwiYm9yZGVyXCIgKyBzaWRlICsgbmFtZTtcclxuICAgIH0pO1xyXG5cclxuICAgIF9zcGVjaWFsUHJvcHNbaW5kZXggPiAxID8gXCJib3JkZXJcIiArIG5hbWUgOiBuYW1lXSA9IGZ1bmN0aW9uIChwbHVnaW4sIHRhcmdldCwgcHJvcGVydHksIGVuZFZhbHVlLCB0d2Vlbikge1xyXG4gICAgICB2YXIgYSwgdmFycztcclxuXHJcbiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgNCkge1xyXG4gICAgICAgIGEgPSBwcm9wcy5tYXAoZnVuY3Rpb24gKHByb3ApIHtcclxuICAgICAgICAgIHJldHVybiBfZ2V0KHBsdWdpbiwgcHJvcCwgcHJvcGVydHkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHZhcnMgPSBhLmpvaW4oXCIgXCIpO1xyXG4gICAgICAgIHJldHVybiB2YXJzLnNwbGl0KGFbMF0pLmxlbmd0aCA9PT0gNSA/IGFbMF0gOiB2YXJzO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBhID0gKGVuZFZhbHVlICsgXCJcIikuc3BsaXQoXCIgXCIpO1xyXG4gICAgICB2YXJzID0ge307XHJcbiAgICAgIHByb3BzLmZvckVhY2goZnVuY3Rpb24gKHByb3AsIGkpIHtcclxuICAgICAgICByZXR1cm4gdmFyc1twcm9wXSA9IGFbaV0gPSBhW2ldIHx8IGFbKGkgLSAxKSAvIDIgfCAwXTtcclxuICAgICAgfSk7XHJcbiAgICAgIHBsdWdpbi5pbml0KHRhcmdldCwgdmFycywgdHdlZW4pO1xyXG4gICAgfTtcclxuICB9KTtcclxuXHJcbiAgdmFyIENTU1BsdWdpbiA9IHtcclxuICAgIG5hbWU6IFwiY3NzXCIsXHJcbiAgICByZWdpc3RlcjogX2luaXRDb3JlLFxyXG4gICAgdGFyZ2V0VGVzdDogZnVuY3Rpb24gdGFyZ2V0VGVzdCh0YXJnZXQpIHtcclxuICAgICAgcmV0dXJuIHRhcmdldC5zdHlsZSAmJiB0YXJnZXQubm9kZVR5cGU7XHJcbiAgICB9LFxyXG4gICAgaW5pdDogZnVuY3Rpb24gaW5pdCh0YXJnZXQsIHZhcnMsIHR3ZWVuLCBpbmRleCwgdGFyZ2V0cykge1xyXG4gICAgICB2YXIgcHJvcHMgPSB0aGlzLl9wcm9wcyxcclxuICAgICAgICAgIHN0eWxlID0gdGFyZ2V0LnN0eWxlLFxyXG4gICAgICAgICAgc3RhcnRBdCA9IHR3ZWVuLnZhcnMuc3RhcnRBdCxcclxuICAgICAgICAgIHN0YXJ0VmFsdWUsXHJcbiAgICAgICAgICBlbmRWYWx1ZSxcclxuICAgICAgICAgIGVuZE51bSxcclxuICAgICAgICAgIHN0YXJ0TnVtLFxyXG4gICAgICAgICAgdHlwZSxcclxuICAgICAgICAgIHNwZWNpYWxQcm9wLFxyXG4gICAgICAgICAgcCxcclxuICAgICAgICAgIHN0YXJ0VW5pdCxcclxuICAgICAgICAgIGVuZFVuaXQsXHJcbiAgICAgICAgICByZWxhdGl2ZSxcclxuICAgICAgICAgIGlzVHJhbnNmb3JtUmVsYXRlZCxcclxuICAgICAgICAgIHRyYW5zZm9ybVByb3BUd2VlbixcclxuICAgICAgICAgIGNhY2hlLFxyXG4gICAgICAgICAgc21vb3RoLFxyXG4gICAgICAgICAgaGFzUHJpb3JpdHksXHJcbiAgICAgICAgICBpbmxpbmVQcm9wcztcclxuICAgICAgX3BsdWdpbkluaXR0ZWQgfHwgX2luaXRDb3JlKCk7XHJcbiAgICAgIHRoaXMuc3R5bGVzID0gdGhpcy5zdHlsZXMgfHwgX2dldFN0eWxlU2F2ZXIodGFyZ2V0KTtcclxuICAgICAgaW5saW5lUHJvcHMgPSB0aGlzLnN0eWxlcy5wcm9wcztcclxuICAgICAgdGhpcy50d2VlbiA9IHR3ZWVuO1xyXG5cclxuICAgICAgZm9yIChwIGluIHZhcnMpIHtcclxuICAgICAgICBpZiAocCA9PT0gXCJhdXRvUm91bmRcIikge1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBlbmRWYWx1ZSA9IHZhcnNbcF07XHJcblxyXG4gICAgICAgIGlmIChfcGx1Z2luc1twXSAmJiBfY2hlY2tQbHVnaW4ocCwgdmFycywgdHdlZW4sIGluZGV4LCB0YXJnZXQsIHRhcmdldHMpKSB7XHJcbiAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHR5cGUgPSB0eXBlb2YgZW5kVmFsdWU7XHJcbiAgICAgICAgc3BlY2lhbFByb3AgPSBfc3BlY2lhbFByb3BzW3BdO1xyXG5cclxuICAgICAgICBpZiAodHlwZSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICBlbmRWYWx1ZSA9IGVuZFZhbHVlLmNhbGwodHdlZW4sIGluZGV4LCB0YXJnZXQsIHRhcmdldHMpO1xyXG4gICAgICAgICAgdHlwZSA9IHR5cGVvZiBlbmRWYWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0eXBlID09PSBcInN0cmluZ1wiICYmIH5lbmRWYWx1ZS5pbmRleE9mKFwicmFuZG9tKFwiKSkge1xyXG4gICAgICAgICAgZW5kVmFsdWUgPSBfcmVwbGFjZVJhbmRvbShlbmRWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3BlY2lhbFByb3ApIHtcclxuICAgICAgICAgIHNwZWNpYWxQcm9wKHRoaXMsIHRhcmdldCwgcCwgZW5kVmFsdWUsIHR3ZWVuKSAmJiAoaGFzUHJpb3JpdHkgPSAxKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHAuc3Vic3RyKDAsIDIpID09PSBcIi0tXCIpIHtcclxuICAgICAgICAgIHN0YXJ0VmFsdWUgPSAoZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLmdldFByb3BlcnR5VmFsdWUocCkgKyBcIlwiKS50cmltKCk7XHJcbiAgICAgICAgICBlbmRWYWx1ZSArPSBcIlwiO1xyXG4gICAgICAgICAgX2NvbG9yRXhwLmxhc3RJbmRleCA9IDA7XHJcblxyXG4gICAgICAgICAgaWYgKCFfY29sb3JFeHAudGVzdChzdGFydFZhbHVlKSkge1xyXG4gICAgICAgICAgICBzdGFydFVuaXQgPSBnZXRVbml0KHN0YXJ0VmFsdWUpO1xyXG4gICAgICAgICAgICBlbmRVbml0ID0gZ2V0VW5pdChlbmRWYWx1ZSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgZW5kVW5pdCA/IHN0YXJ0VW5pdCAhPT0gZW5kVW5pdCAmJiAoc3RhcnRWYWx1ZSA9IF9jb252ZXJ0VG9Vbml0KHRhcmdldCwgcCwgc3RhcnRWYWx1ZSwgZW5kVW5pdCkgKyBlbmRVbml0KSA6IHN0YXJ0VW5pdCAmJiAoZW5kVmFsdWUgKz0gc3RhcnRVbml0KTtcclxuICAgICAgICAgIHRoaXMuYWRkKHN0eWxlLCBcInNldFByb3BlcnR5XCIsIHN0YXJ0VmFsdWUsIGVuZFZhbHVlLCBpbmRleCwgdGFyZ2V0cywgMCwgMCwgcCk7XHJcbiAgICAgICAgICBwcm9wcy5wdXNoKHApO1xyXG4gICAgICAgICAgaW5saW5lUHJvcHMucHVzaChwLCAwLCBzdHlsZVtwXSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlICE9PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICAgICAgICBpZiAoc3RhcnRBdCAmJiBwIGluIHN0YXJ0QXQpIHtcclxuICAgICAgICAgICAgc3RhcnRWYWx1ZSA9IHR5cGVvZiBzdGFydEF0W3BdID09PSBcImZ1bmN0aW9uXCIgPyBzdGFydEF0W3BdLmNhbGwodHdlZW4sIGluZGV4LCB0YXJnZXQsIHRhcmdldHMpIDogc3RhcnRBdFtwXTtcclxuICAgICAgICAgICAgX2lzU3RyaW5nKHN0YXJ0VmFsdWUpICYmIH5zdGFydFZhbHVlLmluZGV4T2YoXCJyYW5kb20oXCIpICYmIChzdGFydFZhbHVlID0gX3JlcGxhY2VSYW5kb20oc3RhcnRWYWx1ZSkpO1xyXG4gICAgICAgICAgICBnZXRVbml0KHN0YXJ0VmFsdWUgKyBcIlwiKSB8fCBzdGFydFZhbHVlID09PSBcImF1dG9cIiB8fCAoc3RhcnRWYWx1ZSArPSBfY29uZmlnLnVuaXRzW3BdIHx8IGdldFVuaXQoX2dldCh0YXJnZXQsIHApKSB8fCBcIlwiKTtcclxuICAgICAgICAgICAgKHN0YXJ0VmFsdWUgKyBcIlwiKS5jaGFyQXQoMSkgPT09IFwiPVwiICYmIChzdGFydFZhbHVlID0gX2dldCh0YXJnZXQsIHApKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHN0YXJ0VmFsdWUgPSBfZ2V0KHRhcmdldCwgcCk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgc3RhcnROdW0gPSBwYXJzZUZsb2F0KHN0YXJ0VmFsdWUpO1xyXG4gICAgICAgICAgcmVsYXRpdmUgPSB0eXBlID09PSBcInN0cmluZ1wiICYmIGVuZFZhbHVlLmNoYXJBdCgxKSA9PT0gXCI9XCIgJiYgZW5kVmFsdWUuc3Vic3RyKDAsIDIpO1xyXG4gICAgICAgICAgcmVsYXRpdmUgJiYgKGVuZFZhbHVlID0gZW5kVmFsdWUuc3Vic3RyKDIpKTtcclxuICAgICAgICAgIGVuZE51bSA9IHBhcnNlRmxvYXQoZW5kVmFsdWUpO1xyXG5cclxuICAgICAgICAgIGlmIChwIGluIF9wcm9wZXJ0eUFsaWFzZXMpIHtcclxuICAgICAgICAgICAgaWYgKHAgPT09IFwiYXV0b0FscGhhXCIpIHtcclxuICAgICAgICAgICAgICBpZiAoc3RhcnROdW0gPT09IDEgJiYgX2dldCh0YXJnZXQsIFwidmlzaWJpbGl0eVwiKSA9PT0gXCJoaWRkZW5cIiAmJiBlbmROdW0pIHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0TnVtID0gMDtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGlubGluZVByb3BzLnB1c2goXCJ2aXNpYmlsaXR5XCIsIDAsIHN0eWxlLnZpc2liaWxpdHkpO1xyXG5cclxuICAgICAgICAgICAgICBfYWRkTm9uVHdlZW5pbmdQVCh0aGlzLCBzdHlsZSwgXCJ2aXNpYmlsaXR5XCIsIHN0YXJ0TnVtID8gXCJpbmhlcml0XCIgOiBcImhpZGRlblwiLCBlbmROdW0gPyBcImluaGVyaXRcIiA6IFwiaGlkZGVuXCIsICFlbmROdW0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocCAhPT0gXCJzY2FsZVwiICYmIHAgIT09IFwidHJhbnNmb3JtXCIpIHtcclxuICAgICAgICAgICAgICBwID0gX3Byb3BlcnR5QWxpYXNlc1twXTtcclxuICAgICAgICAgICAgICB+cC5pbmRleE9mKFwiLFwiKSAmJiAocCA9IHAuc3BsaXQoXCIsXCIpWzBdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlzVHJhbnNmb3JtUmVsYXRlZCA9IHAgaW4gX3RyYW5zZm9ybVByb3BzO1xyXG5cclxuICAgICAgICAgIGlmIChpc1RyYW5zZm9ybVJlbGF0ZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5zdHlsZXMuc2F2ZShwKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBcInN0cmluZ1wiICYmIGVuZFZhbHVlLnN1YnN0cmluZygwLCA2KSA9PT0gXCJ2YXIoLS1cIikge1xyXG4gICAgICAgICAgICAgIGVuZFZhbHVlID0gX2dldENvbXB1dGVkUHJvcGVydHkodGFyZ2V0LCBlbmRWYWx1ZS5zdWJzdHJpbmcoNCwgZW5kVmFsdWUuaW5kZXhPZihcIilcIikpKTtcclxuICAgICAgICAgICAgICBlbmROdW0gPSBwYXJzZUZsb2F0KGVuZFZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF0cmFuc2Zvcm1Qcm9wVHdlZW4pIHtcclxuICAgICAgICAgICAgICBjYWNoZSA9IHRhcmdldC5fZ3NhcDtcclxuICAgICAgICAgICAgICBjYWNoZS5yZW5kZXJUcmFuc2Zvcm0gJiYgIXZhcnMucGFyc2VUcmFuc2Zvcm0gfHwgX3BhcnNlVHJhbnNmb3JtKHRhcmdldCwgdmFycy5wYXJzZVRyYW5zZm9ybSk7XHJcbiAgICAgICAgICAgICAgc21vb3RoID0gdmFycy5zbW9vdGhPcmlnaW4gIT09IGZhbHNlICYmIGNhY2hlLnNtb290aDtcclxuICAgICAgICAgICAgICB0cmFuc2Zvcm1Qcm9wVHdlZW4gPSB0aGlzLl9wdCA9IG5ldyBQcm9wVHdlZW4odGhpcy5fcHQsIHN0eWxlLCBfdHJhbnNmb3JtUHJvcCwgMCwgMSwgY2FjaGUucmVuZGVyVHJhbnNmb3JtLCBjYWNoZSwgMCwgLTEpO1xyXG4gICAgICAgICAgICAgIHRyYW5zZm9ybVByb3BUd2Vlbi5kZXAgPSAxO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAocCA9PT0gXCJzY2FsZVwiKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fcHQgPSBuZXcgUHJvcFR3ZWVuKHRoaXMuX3B0LCBjYWNoZSwgXCJzY2FsZVlcIiwgY2FjaGUuc2NhbGVZLCAocmVsYXRpdmUgPyBfcGFyc2VSZWxhdGl2ZShjYWNoZS5zY2FsZVksIHJlbGF0aXZlICsgZW5kTnVtKSA6IGVuZE51bSkgLSBjYWNoZS5zY2FsZVkgfHwgMCwgX3JlbmRlckNTU1Byb3ApO1xyXG4gICAgICAgICAgICAgIHRoaXMuX3B0LnUgPSAwO1xyXG4gICAgICAgICAgICAgIHByb3BzLnB1c2goXCJzY2FsZVlcIiwgcCk7XHJcbiAgICAgICAgICAgICAgcCArPSBcIlhcIjtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwID09PSBcInRyYW5zZm9ybU9yaWdpblwiKSB7XHJcbiAgICAgICAgICAgICAgaW5saW5lUHJvcHMucHVzaChfdHJhbnNmb3JtT3JpZ2luUHJvcCwgMCwgc3R5bGVbX3RyYW5zZm9ybU9yaWdpblByb3BdKTtcclxuICAgICAgICAgICAgICBlbmRWYWx1ZSA9IF9jb252ZXJ0S2V5d29yZHNUb1BlcmNlbnRhZ2VzKGVuZFZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGNhY2hlLnN2Zykge1xyXG4gICAgICAgICAgICAgICAgX2FwcGx5U1ZHT3JpZ2luKHRhcmdldCwgZW5kVmFsdWUsIDAsIHNtb290aCwgMCwgdGhpcyk7XHJcbiAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGVuZFVuaXQgPSBwYXJzZUZsb2F0KGVuZFZhbHVlLnNwbGl0KFwiIFwiKVsyXSkgfHwgMDtcclxuICAgICAgICAgICAgICAgIGVuZFVuaXQgIT09IGNhY2hlLnpPcmlnaW4gJiYgX2FkZE5vblR3ZWVuaW5nUFQodGhpcywgY2FjaGUsIFwiek9yaWdpblwiLCBjYWNoZS56T3JpZ2luLCBlbmRVbml0KTtcclxuXHJcbiAgICAgICAgICAgICAgICBfYWRkTm9uVHdlZW5pbmdQVCh0aGlzLCBzdHlsZSwgcCwgX2ZpcnN0VHdvT25seShzdGFydFZhbHVlKSwgX2ZpcnN0VHdvT25seShlbmRWYWx1ZSkpO1xyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocCA9PT0gXCJzdmdPcmlnaW5cIikge1xyXG4gICAgICAgICAgICAgIF9hcHBseVNWR09yaWdpbih0YXJnZXQsIGVuZFZhbHVlLCAxLCBzbW9vdGgsIDAsIHRoaXMpO1xyXG5cclxuICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwIGluIF9yb3RhdGlvbmFsUHJvcGVydGllcykge1xyXG4gICAgICAgICAgICAgIF9hZGRSb3RhdGlvbmFsUHJvcFR3ZWVuKHRoaXMsIGNhY2hlLCBwLCBzdGFydE51bSwgcmVsYXRpdmUgPyBfcGFyc2VSZWxhdGl2ZShzdGFydE51bSwgcmVsYXRpdmUgKyBlbmRWYWx1ZSkgOiBlbmRWYWx1ZSk7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAgPT09IFwic21vb3RoT3JpZ2luXCIpIHtcclxuICAgICAgICAgICAgICBfYWRkTm9uVHdlZW5pbmdQVCh0aGlzLCBjYWNoZSwgXCJzbW9vdGhcIiwgY2FjaGUuc21vb3RoLCBlbmRWYWx1ZSk7XHJcblxyXG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAgPT09IFwiZm9yY2UzRFwiKSB7XHJcbiAgICAgICAgICAgICAgY2FjaGVbcF0gPSBlbmRWYWx1ZTtcclxuICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwID09PSBcInRyYW5zZm9ybVwiKSB7XHJcbiAgICAgICAgICAgICAgX2FkZFJhd1RyYW5zZm9ybVBUcyh0aGlzLCBlbmRWYWx1ZSwgdGFyZ2V0KTtcclxuXHJcbiAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSBpZiAoIShwIGluIHN0eWxlKSkge1xyXG4gICAgICAgICAgICBwID0gX2NoZWNrUHJvcFByZWZpeChwKSB8fCBwO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmIChpc1RyYW5zZm9ybVJlbGF0ZWQgfHwgKGVuZE51bSB8fCBlbmROdW0gPT09IDApICYmIChzdGFydE51bSB8fCBzdGFydE51bSA9PT0gMCkgJiYgIV9jb21wbGV4RXhwLnRlc3QoZW5kVmFsdWUpICYmIHAgaW4gc3R5bGUpIHtcclxuICAgICAgICAgICAgc3RhcnRVbml0ID0gKHN0YXJ0VmFsdWUgKyBcIlwiKS5zdWJzdHIoKHN0YXJ0TnVtICsgXCJcIikubGVuZ3RoKTtcclxuICAgICAgICAgICAgZW5kTnVtIHx8IChlbmROdW0gPSAwKTtcclxuICAgICAgICAgICAgZW5kVW5pdCA9IGdldFVuaXQoZW5kVmFsdWUpIHx8IChwIGluIF9jb25maWcudW5pdHMgPyBfY29uZmlnLnVuaXRzW3BdIDogc3RhcnRVbml0KTtcclxuICAgICAgICAgICAgc3RhcnRVbml0ICE9PSBlbmRVbml0ICYmIChzdGFydE51bSA9IF9jb252ZXJ0VG9Vbml0KHRhcmdldCwgcCwgc3RhcnRWYWx1ZSwgZW5kVW5pdCkpO1xyXG4gICAgICAgICAgICB0aGlzLl9wdCA9IG5ldyBQcm9wVHdlZW4odGhpcy5fcHQsIGlzVHJhbnNmb3JtUmVsYXRlZCA/IGNhY2hlIDogc3R5bGUsIHAsIHN0YXJ0TnVtLCAocmVsYXRpdmUgPyBfcGFyc2VSZWxhdGl2ZShzdGFydE51bSwgcmVsYXRpdmUgKyBlbmROdW0pIDogZW5kTnVtKSAtIHN0YXJ0TnVtLCAhaXNUcmFuc2Zvcm1SZWxhdGVkICYmIChlbmRVbml0ID09PSBcInB4XCIgfHwgcCA9PT0gXCJ6SW5kZXhcIikgJiYgdmFycy5hdXRvUm91bmQgIT09IGZhbHNlID8gX3JlbmRlclJvdW5kZWRDU1NQcm9wIDogX3JlbmRlckNTU1Byb3ApO1xyXG4gICAgICAgICAgICB0aGlzLl9wdC51ID0gZW5kVW5pdCB8fCAwO1xyXG5cclxuICAgICAgICAgICAgaWYgKHN0YXJ0VW5pdCAhPT0gZW5kVW5pdCAmJiBlbmRVbml0ICE9PSBcIiVcIikge1xyXG4gICAgICAgICAgICAgIHRoaXMuX3B0LmIgPSBzdGFydFZhbHVlO1xyXG4gICAgICAgICAgICAgIHRoaXMuX3B0LnIgPSBfcmVuZGVyQ1NTUHJvcFdpdGhCZWdpbm5pbmc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSBpZiAoIShwIGluIHN0eWxlKSkge1xyXG4gICAgICAgICAgICBpZiAocCBpbiB0YXJnZXQpIHtcclxuICAgICAgICAgICAgICB0aGlzLmFkZCh0YXJnZXQsIHAsIHN0YXJ0VmFsdWUgfHwgdGFyZ2V0W3BdLCByZWxhdGl2ZSA/IHJlbGF0aXZlICsgZW5kVmFsdWUgOiBlbmRWYWx1ZSwgaW5kZXgsIHRhcmdldHMpO1xyXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHAgIT09IFwicGFyc2VUcmFuc2Zvcm1cIikge1xyXG4gICAgICAgICAgICAgIF9taXNzaW5nUGx1Z2luKHAsIGVuZFZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIF90d2VlbkNvbXBsZXhDU1NTdHJpbmcuY2FsbCh0aGlzLCB0YXJnZXQsIHAsIHN0YXJ0VmFsdWUsIHJlbGF0aXZlID8gcmVsYXRpdmUgKyBlbmRWYWx1ZSA6IGVuZFZhbHVlKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpc1RyYW5zZm9ybVJlbGF0ZWQgfHwgKHAgaW4gc3R5bGUgPyBpbmxpbmVQcm9wcy5wdXNoKHAsIDAsIHN0eWxlW3BdKSA6IHR5cGVvZiB0YXJnZXRbcF0gPT09IFwiZnVuY3Rpb25cIiA/IGlubGluZVByb3BzLnB1c2gocCwgMiwgdGFyZ2V0W3BdKCkpIDogaW5saW5lUHJvcHMucHVzaChwLCAxLCBzdGFydFZhbHVlIHx8IHRhcmdldFtwXSkpO1xyXG4gICAgICAgICAgcHJvcHMucHVzaChwKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGhhc1ByaW9yaXR5ICYmIF9zb3J0UHJvcFR3ZWVuc0J5UHJpb3JpdHkodGhpcyk7XHJcbiAgICB9LFxyXG4gICAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIocmF0aW8sIGRhdGEpIHtcclxuICAgICAgaWYgKGRhdGEudHdlZW4uX3RpbWUgfHwgIV9yZXZlcnRpbmckMSgpKSB7XHJcbiAgICAgICAgdmFyIHB0ID0gZGF0YS5fcHQ7XHJcblxyXG4gICAgICAgIHdoaWxlIChwdCkge1xyXG4gICAgICAgICAgcHQucihyYXRpbywgcHQuZCk7XHJcbiAgICAgICAgICBwdCA9IHB0Ll9uZXh0O1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBkYXRhLnN0eWxlcy5yZXZlcnQoKTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIGdldDogX2dldCxcclxuICAgIGFsaWFzZXM6IF9wcm9wZXJ0eUFsaWFzZXMsXHJcbiAgICBnZXRTZXR0ZXI6IGZ1bmN0aW9uIGdldFNldHRlcih0YXJnZXQsIHByb3BlcnR5LCBwbHVnaW4pIHtcclxuICAgICAgdmFyIHAgPSBfcHJvcGVydHlBbGlhc2VzW3Byb3BlcnR5XTtcclxuICAgICAgcCAmJiBwLmluZGV4T2YoXCIsXCIpIDwgMCAmJiAocHJvcGVydHkgPSBwKTtcclxuICAgICAgcmV0dXJuIHByb3BlcnR5IGluIF90cmFuc2Zvcm1Qcm9wcyAmJiBwcm9wZXJ0eSAhPT0gX3RyYW5zZm9ybU9yaWdpblByb3AgJiYgKHRhcmdldC5fZ3NhcC54IHx8IF9nZXQodGFyZ2V0LCBcInhcIikpID8gcGx1Z2luICYmIF9yZWNlbnRTZXR0ZXJQbHVnaW4gPT09IHBsdWdpbiA/IHByb3BlcnR5ID09PSBcInNjYWxlXCIgPyBfc2V0dGVyU2NhbGUgOiBfc2V0dGVyVHJhbnNmb3JtIDogKF9yZWNlbnRTZXR0ZXJQbHVnaW4gPSBwbHVnaW4gfHwge30pICYmIChwcm9wZXJ0eSA9PT0gXCJzY2FsZVwiID8gX3NldHRlclNjYWxlV2l0aFJlbmRlciA6IF9zZXR0ZXJUcmFuc2Zvcm1XaXRoUmVuZGVyKSA6IHRhcmdldC5zdHlsZSAmJiAhX2lzVW5kZWZpbmVkKHRhcmdldC5zdHlsZVtwcm9wZXJ0eV0pID8gX3NldHRlckNTU1N0eWxlIDogfnByb3BlcnR5LmluZGV4T2YoXCItXCIpID8gX3NldHRlckNTU1Byb3AgOiBfZ2V0U2V0dGVyKHRhcmdldCwgcHJvcGVydHkpO1xyXG4gICAgfSxcclxuICAgIGNvcmU6IHtcclxuICAgICAgX3JlbW92ZVByb3BlcnR5OiBfcmVtb3ZlUHJvcGVydHksXHJcbiAgICAgIF9nZXRNYXRyaXg6IF9nZXRNYXRyaXhcclxuICAgIH1cclxuICB9O1xyXG4gIGdzYXAudXRpbHMuY2hlY2tQcmVmaXggPSBfY2hlY2tQcm9wUHJlZml4O1xyXG4gIGdzYXAuY29yZS5nZXRTdHlsZVNhdmVyID0gX2dldFN0eWxlU2F2ZXI7XHJcblxyXG4gIChmdW5jdGlvbiAocG9zaXRpb25BbmRTY2FsZSwgcm90YXRpb24sIG90aGVycywgYWxpYXNlcykge1xyXG4gICAgdmFyIGFsbCA9IF9mb3JFYWNoTmFtZShwb3NpdGlvbkFuZFNjYWxlICsgXCIsXCIgKyByb3RhdGlvbiArIFwiLFwiICsgb3RoZXJzLCBmdW5jdGlvbiAobmFtZSkge1xyXG4gICAgICBfdHJhbnNmb3JtUHJvcHNbbmFtZV0gPSAxO1xyXG4gICAgfSk7XHJcblxyXG4gICAgX2ZvckVhY2hOYW1lKHJvdGF0aW9uLCBmdW5jdGlvbiAobmFtZSkge1xyXG4gICAgICBfY29uZmlnLnVuaXRzW25hbWVdID0gXCJkZWdcIjtcclxuICAgICAgX3JvdGF0aW9uYWxQcm9wZXJ0aWVzW25hbWVdID0gMTtcclxuICAgIH0pO1xyXG5cclxuICAgIF9wcm9wZXJ0eUFsaWFzZXNbYWxsWzEzXV0gPSBwb3NpdGlvbkFuZFNjYWxlICsgXCIsXCIgKyByb3RhdGlvbjtcclxuXHJcbiAgICBfZm9yRWFjaE5hbWUoYWxpYXNlcywgZnVuY3Rpb24gKG5hbWUpIHtcclxuICAgICAgdmFyIHNwbGl0ID0gbmFtZS5zcGxpdChcIjpcIik7XHJcbiAgICAgIF9wcm9wZXJ0eUFsaWFzZXNbc3BsaXRbMV1dID0gYWxsW3NwbGl0WzBdXTtcclxuICAgIH0pO1xyXG4gIH0pKFwieCx5LHosc2NhbGUsc2NhbGVYLHNjYWxlWSx4UGVyY2VudCx5UGVyY2VudFwiLCBcInJvdGF0aW9uLHJvdGF0aW9uWCxyb3RhdGlvblksc2tld1gsc2tld1lcIiwgXCJ0cmFuc2Zvcm0sdHJhbnNmb3JtT3JpZ2luLHN2Z09yaWdpbixmb3JjZTNELHNtb290aE9yaWdpbix0cmFuc2Zvcm1QZXJzcGVjdGl2ZVwiLCBcIjA6dHJhbnNsYXRlWCwxOnRyYW5zbGF0ZVksMjp0cmFuc2xhdGVaLDg6cm90YXRlLDg6cm90YXRpb25aLDg6cm90YXRlWiw5OnJvdGF0ZVgsMTA6cm90YXRlWVwiKTtcclxuXHJcbiAgX2ZvckVhY2hOYW1lKFwieCx5LHosdG9wLHJpZ2h0LGJvdHRvbSxsZWZ0LHdpZHRoLGhlaWdodCxmb250U2l6ZSxwYWRkaW5nLG1hcmdpbixwZXJzcGVjdGl2ZVwiLCBmdW5jdGlvbiAobmFtZSkge1xyXG4gICAgX2NvbmZpZy51bml0c1tuYW1lXSA9IFwicHhcIjtcclxuICB9KTtcclxuXHJcbiAgZ3NhcC5yZWdpc3RlclBsdWdpbihDU1NQbHVnaW4pO1xyXG5cclxuICB2YXIgZ3NhcFdpdGhDU1MgPSBnc2FwLnJlZ2lzdGVyUGx1Z2luKENTU1BsdWdpbikgfHwgZ3NhcCxcclxuICAgICAgVHdlZW5NYXhXaXRoQ1NTID0gZ3NhcFdpdGhDU1MuY29yZS5Ud2VlbjtcclxuXHJcbiAgZXhwb3J0cy5CYWNrID0gQmFjaztcclxuICBleHBvcnRzLkJvdW5jZSA9IEJvdW5jZTtcclxuICBleHBvcnRzLkNTU1BsdWdpbiA9IENTU1BsdWdpbjtcclxuICBleHBvcnRzLkNpcmMgPSBDaXJjO1xyXG4gIGV4cG9ydHMuQ3ViaWMgPSBDdWJpYztcclxuICBleHBvcnRzLkVsYXN0aWMgPSBFbGFzdGljO1xyXG4gIGV4cG9ydHMuRXhwbyA9IEV4cG87XHJcbiAgZXhwb3J0cy5MaW5lYXIgPSBMaW5lYXI7XHJcbiAgZXhwb3J0cy5Qb3dlcjAgPSBQb3dlcjA7XHJcbiAgZXhwb3J0cy5Qb3dlcjEgPSBQb3dlcjE7XHJcbiAgZXhwb3J0cy5Qb3dlcjIgPSBQb3dlcjI7XHJcbiAgZXhwb3J0cy5Qb3dlcjMgPSBQb3dlcjM7XHJcbiAgZXhwb3J0cy5Qb3dlcjQgPSBQb3dlcjQ7XHJcbiAgZXhwb3J0cy5RdWFkID0gUXVhZDtcclxuICBleHBvcnRzLlF1YXJ0ID0gUXVhcnQ7XHJcbiAgZXhwb3J0cy5RdWludCA9IFF1aW50O1xyXG4gIGV4cG9ydHMuU2luZSA9IFNpbmU7XHJcbiAgZXhwb3J0cy5TdGVwcGVkRWFzZSA9IFN0ZXBwZWRFYXNlO1xyXG4gIGV4cG9ydHMuU3Ryb25nID0gU3Ryb25nO1xyXG4gIGV4cG9ydHMuVGltZWxpbmVMaXRlID0gVGltZWxpbmU7XHJcbiAgZXhwb3J0cy5UaW1lbGluZU1heCA9IFRpbWVsaW5lO1xyXG4gIGV4cG9ydHMuVHdlZW5MaXRlID0gVHdlZW47XHJcbiAgZXhwb3J0cy5Ud2Vlbk1heCA9IFR3ZWVuTWF4V2l0aENTUztcclxuICBleHBvcnRzLmRlZmF1bHQgPSBnc2FwV2l0aENTUztcclxuICBleHBvcnRzLmdzYXAgPSBnc2FwV2l0aENTUztcclxuXHJcbiAgaWYgKHR5cGVvZih3aW5kb3cpID09PSAndW5kZWZpbmVkJyB8fCB3aW5kb3cgIT09IGV4cG9ydHMpIHtPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO30gZWxzZSB7ZGVsZXRlIHdpbmRvdy5kZWZhdWx0O31cclxuXHJcbn0pKSk7XHJcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/gsap/dist/gsap.js\n");
|
|
|
|
/***/ })
|
|
|
|
};
|
|
; |