You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
snabbdom/dist/snabbdom-patch.min.js.map

1 line
92 KiB
Plaintext

{"version":3,"sources":["snabbdom-patch.js"],"names":["f","exports","module","define","amd","g","window","global","self","this","snabbdom","e","t","n","r","s","o","u","a","require","i","Error","code","l","call","length","1","addNS","data","children","sel","ns","undefined","childData","h","b","c","text","is","array","primitive","vnode_1","vnode","Object","defineProperty","value","./is","./vnode","2","createElement","tagName","document","createElementNS","namespaceURI","qualifiedName","createTextNode","createComment","insertBefore","parentNode","newNode","referenceNode","removeChild","node","child","appendChild","nextSibling","elm","setTextContent","textContent","getTextContent","isElement","nodeType","isText","isComment","htmlDomApi","3","Array","isArray","4","updateAttrs","oldVnode","key","cur","old","namespaceSplit","oldAttrs","attrs","booleanAttrsDict","removeAttribute","split","NamespaceURIs","hasOwnProperty","setAttributeNS","setAttribute","xlink","booleanAttrs","create","len","attributesModule","update","5","updateClass","name","oldClass","klass","classList","remove","classModule","6","invokeHandler","handler","event","args","slice","push","apply","handleEvent","type","on","createListener","updateEventListeners","oldOn","oldListener","listener","oldElm","removeEventListener","addEventListener","eventListenersModule","destroy","7","updateProps","oldProps","props","propsModule","8","setNextFrame","obj","prop","val","nextFrame","updateStyle","oldStyle","style","oldHasDel","removeProperty","delayed","setProperty","applyDestroyStyle","applyRemoveStyle","rm","compStyle","amount","applied","getComputedStyle","indexOf","ev","target","raf","requestAnimationFrame","setTimeout","fn","styleModule","9","snabbdom_1","attributes_1","class_1","props_1","style_1","eventlisteners_1","h_1","patch","init","snabbdomBundle","./h","./modules/attributes","./modules/class","./modules/eventlisteners","./modules/props","./modules/style","./snabbdom","10","isUndef","isDef","sameVnode","vnode1","vnode2","isVnode","createKeyToOldIdx","beginIdx","endIdx","ch","map","modules","domApi","emptyNodeAt","id","className","join","api","toLowerCase","createRmCb","childElm","listeners","parent_1","createElm","insertedVnodeQueue","hook","hashIdx","dotIdx","hash","dot","tag","Math","min","replace","cbs","emptyNode","insert","addVnodes","parentElm","before","vnodes","startIdx","invokeDestroyHook","j","removeVnodes","i_1","updateChildren","oldCh","newCh","oldKeyToIdx","idxInOld","elmToMove","oldStartIdx","newStartIdx","oldEndIdx","oldStartVnode","oldEndVnode","newEndIdx","newStartVnode","newEndVnode","patchVnode","prepatch","postpatch","htmldomapi_1","hooks","parent","pre","post","thunk_1","thunk","./htmldomapi","./thunk","11","copyToThunk","oldArgs","12"],"mappings":"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","file":"snabbdom-patch.min.js","sourcesContent":["(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.snabbdom = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n\"use strict\";\nvar vnode_1 = require(\"./vnode\");\nvar is = require(\"./is\");\nfunction addNS(data, children, sel) {\n data.ns = 'http://www.w3.org/2000/svg';\n if (sel !== 'foreignObject' && children !== undefined) {\n for (var i = 0; i < children.length; ++i) {\n var childData = children[i].data;\n if (childData !== undefined) {\n addNS(childData, children[i].children, children[i].sel);\n }\n }\n }\n}\nfunction h(sel, b, c) {\n var data = {}, children, text, i;\n if (c !== undefined) {\n data = b;\n if (is.array(c)) {\n children = c;\n }\n else if (is.primitive(c)) {\n text = c;\n }\n else if (c && c.sel) {\n children = [c];\n }\n }\n else if (b !== undefined) {\n if (is.array(b)) {\n children = b;\n }\n else if (is.primitive(b)) {\n text = b;\n }\n else if (b && b.sel) {\n children = [b];\n }\n else {\n data = b;\n }\n }\n if (is.array(children)) {\n for (i = 0; i < children.length; ++i) {\n if (is.primitive(children[i]))\n children[i] = vnode_1.vnode(undefined, undefined, undefined, children[i]);\n }\n }\n if (sel[0] === 's' && sel[1] === 'v' && sel[2] === 'g' &&\n (sel.length === 3 || sel[3] === '.' || sel[3] === '#')) {\n addNS(data, children, sel);\n }\n return vnode_1.vnode(sel, data, children, text, undefined);\n}\nexports.h = h;\n;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = h;\n\n},{\"./is\":3,\"./vnode\":12}],2:[function(require,module,exports){\n\"use strict\";\nfunction createElement(tagName) {\n return document.createElement(tagName);\n}\nfunction createElementNS(namespaceURI, qualifiedName) {\n return document.createElementNS(namespaceURI, qualifiedName);\n}\nfunction createTextNode(text) {\n return document.createTextNode(text);\n}\nfunction createComment(text) {\n return document.createComment(text);\n}\nfunction insertBefore(parentNode, newNode, referenceNode) {\n parentNode.insertBefore(newNode, referenceNode);\n}\nfunction removeChild(node, child) {\n node.removeChild(child);\n}\nfunction appendChild(node, child) {\n node.appendChild(child);\n}\nfunction parentNode(node) {\n return node.parentNode;\n}\nfunction nextSibling(node) {\n return node.nextSibling;\n}\nfunction tagName(elm) {\n return elm.tagName;\n}\nfunction setTextContent(node, text) {\n node.textContent = text;\n}\nfunction getTextContent(node) {\n return node.textContent;\n}\nfunction isElement(node) {\n return node.nodeType === 1;\n}\nfunction isText(node) {\n return node.nodeType === 3;\n}\nfunction isComment(node) {\n return node.nodeType === 8;\n}\nexports.htmlDomApi = {\n createElement: createElement,\n createElementNS: createElementNS,\n createTextNode: createTextNode,\n createComment: createComment,\n insertBefore: insertBefore,\n removeChild: removeChild,\n appendChild: appendChild,\n parentNode: parentNode,\n nextSibling: nextSibling,\n tagName: tagName,\n setTextContent: setTextContent,\n getTextContent: getTextContent,\n isElement: isElement,\n isText: isText,\n isComment: isComment,\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = exports.htmlDomApi;\n\n},{}],3:[function(require,module,exports){\n\"use strict\";\nexports.array = Array.isArray;\nfunction primitive(s) {\n return typeof s === 'string' || typeof s === 'number';\n}\nexports.primitive = primitive;\n\n},{}],4:[function(require,module,exports){\n\"use strict\";\nvar NamespaceURIs = {\n \"xlink\": \"http://www.w3.org/1999/xlink\"\n};\nvar booleanAttrs = [\"allowfullscreen\", \"async\", \"autofocus\", \"autoplay\", \"checked\", \"compact\", \"controls\", \"declare\",\n \"default\", \"defaultchecked\", \"defaultmuted\", \"defaultselected\", \"defer\", \"disabled\", \"draggable\",\n \"enabled\", \"formnovalidate\", \"hidden\", \"indeterminate\", \"inert\", \"ismap\", \"itemscope\", \"loop\", \"multiple\",\n \"muted\", \"nohref\", \"noresize\", \"noshade\", \"novalidate\", \"nowrap\", \"open\", \"pauseonexit\", \"readonly\",\n \"required\", \"reversed\", \"scoped\", \"seamless\", \"selected\", \"sortable\", \"spellcheck\", \"translate\",\n \"truespeed\", \"typemustmatch\", \"visible\"];\nvar booleanAttrsDict = Object.create(null);\nfor (var i = 0, len = booleanAttrs.length; i < len; i++) {\n booleanAttrsDict[booleanAttrs[i]] = true;\n}\nfunction updateAttrs(oldVnode, vnode) {\n var key, cur, old, elm = vnode.elm, oldAttrs = oldVnode.data.attrs, attrs = vnode.data.attrs, namespaceSplit;\n if (!oldAttrs && !attrs)\n return;\n if (oldAttrs === attrs)\n return;\n oldAttrs = oldAttrs || {};\n attrs = attrs || {};\n // update modified attributes, add new attributes\n for (key in attrs) {\n cur = attrs[key];\n old = oldAttrs[key];\n if (old !== cur) {\n if (!cur && booleanAttrsDict[key])\n elm.removeAttribute(key);\n else {\n namespaceSplit = key.split(\":\");\n if (namespaceSplit.length > 1 && NamespaceURIs.hasOwnProperty(namespaceSplit[0]))\n elm.setAttributeNS(NamespaceURIs[namespaceSplit[0]], key, cur);\n else\n elm.setAttribute(key, cur);\n }\n }\n }\n //remove removed attributes\n // use `in` operator since the previous `for` iteration uses it (.i.e. add even attributes with undefined value)\n // the other option is to remove all attributes with value == undefined\n for (key in oldAttrs) {\n if (!(key in attrs)) {\n elm.removeAttribute(key);\n }\n }\n}\nexports.attributesModule = { create: updateAttrs, update: updateAttrs };\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = exports.attributesModule;\n\n},{}],5:[function(require,module,exports){\n\"use strict\";\nfunction updateClass(oldVnode, vnode) {\n var cur, name, elm = vnode.elm, oldClass = oldVnode.data.class, klass = vnode.data.class;\n if (!oldClass && !klass)\n return;\n if (oldClass === klass)\n return;\n oldClass = oldClass || {};\n klass = klass || {};\n for (name in oldClass) {\n if (!klass[name]) {\n elm.classList.remove(name);\n }\n }\n for (name in klass) {\n cur = klass[name];\n if (cur !== oldClass[name]) {\n elm.classList[cur ? 'add' : 'remove'](name);\n }\n }\n}\nexports.classModule = { create: updateClass, update: updateClass };\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = exports.classModule;\n\n},{}],6:[function(require,module,exports){\n\"use strict\";\nfunction invokeHandler(handler, vnode, event) {\n if (typeof handler === \"function\") {\n // call function handler\n handler.call(vnode, event, vnode);\n }\n else if (typeof handler === \"object\") {\n // call handler with arguments\n if (typeof handler[0] === \"function\") {\n // special case for single argument for performance\n if (handler.length === 2) {\n handler[0].call(vnode, handler[1], event, vnode);\n }\n else {\n var args = handler.slice(1);\n args.push(event);\n args.push(vnode);\n handler[0].apply(vnode, args);\n }\n }\n else {\n // call multiple handlers\n for (var i = 0; i < handler.length; i++) {\n invokeHandler(handler[i]);\n }\n }\n }\n}\nfunction handleEvent(event, vnode) {\n var name = event.type, on = vnode.data.on;\n // call event handler(s) if exists\n if (on && on[name]) {\n invokeHandler(on[name], vnode, event);\n }\n}\nfunction createListener() {\n return function handler(event) {\n handleEvent(event, handler.vnode);\n };\n}\nfunction updateEventListeners(oldVnode, vnode) {\n var oldOn = oldVnode.data.on, oldListener = oldVnode.listener, oldElm = oldVnode.elm, on = vnode && vnode.data.on, elm = (vnode && vnode.elm), name;\n // optimization for reused immutable handlers\n if (oldOn === on) {\n return;\n }\n // remove existing listeners which no longer used\n if (oldOn && oldListener) {\n // if element changed or deleted we remove all existing listeners unconditionally\n if (!on) {\n for (name in oldOn) {\n // remove listener if element was changed or existing listeners removed\n oldElm.removeEventListener(name, oldListener, false);\n }\n }\n else {\n for (name in oldOn) {\n // remove listener if existing listener removed\n if (!on[name]) {\n oldElm.removeEventListener(name, oldListener, false);\n }\n }\n }\n }\n // add new listeners which has not already attached\n if (on) {\n // reuse existing listener or create new\n var listener = vnode.listener = oldVnode.listener || createListener();\n // update vnode for listener\n listener.vnode = vnode;\n // if element changed or added we add all needed listeners unconditionally\n if (!oldOn) {\n for (name in on) {\n // add listener if element was changed or new listeners added\n elm.addEventListener(name, listener, false);\n }\n }\n else {\n for (name in on) {\n // add listener if new listener added\n if (!oldOn[name]) {\n elm.addEventListener(name, listener, false);\n }\n }\n }\n }\n}\nexports.eventListenersModule = {\n create: updateEventListeners,\n update: updateEventListeners,\n destroy: updateEventListeners\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = exports.eventListenersModule;\n\n},{}],7:[function(require,module,exports){\n\"use strict\";\nfunction updateProps(oldVnode, vnode) {\n var key, cur, old, elm = vnode.elm, oldProps = oldVnode.data.props, props = vnode.data.props;\n if (!oldProps && !props)\n return;\n if (oldProps === props)\n return;\n oldProps = oldProps || {};\n props = props || {};\n for (key in oldProps) {\n if (!props[key]) {\n delete elm[key];\n }\n }\n for (key in props) {\n cur = props[key];\n old = oldProps[key];\n if (old !== cur && (key !== 'value' || elm[key] !== cur)) {\n elm[key] = cur;\n }\n }\n}\nexports.propsModule = { create: updateProps, update: updateProps };\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = exports.propsModule;\n\n},{}],8:[function(require,module,exports){\n\"use strict\";\nvar raf = (typeof window !== 'undefined' && window.requestAnimationFrame) || setTimeout;\nvar nextFrame = function (fn) { raf(function () { raf(fn); }); };\nfunction setNextFrame(obj, prop, val) {\n nextFrame(function () { obj[prop] = val; });\n}\nfunction updateStyle(oldVnode, vnode) {\n var cur, name, elm = vnode.elm, oldStyle = oldVnode.data.style, style = vnode.data.style;\n if (!oldStyle && !style)\n return;\n if (oldStyle === style)\n return;\n oldStyle = oldStyle || {};\n style = style || {};\n var oldHasDel = 'delayed' in oldStyle;\n for (name in oldStyle) {\n if (!style[name]) {\n if (name[0] === '-' && name[1] === '-') {\n elm.style.removeProperty(name);\n }\n else {\n elm.style[name] = '';\n }\n }\n }\n for (name in style) {\n cur = style[name];\n if (name === 'delayed') {\n for (name in style.delayed) {\n cur = style.delayed[name];\n if (!oldHasDel || cur !== oldStyle.delayed[name]) {\n setNextFrame(elm.style, name, cur);\n }\n }\n }\n else if (name !== 'remove' && cur !== oldStyle[name]) {\n if (name[0] === '-' && name[1] === '-') {\n elm.style.setProperty(name, cur);\n }\n else {\n elm.style[name] = cur;\n }\n }\n }\n}\nfunction applyDestroyStyle(vnode) {\n var style, name, elm = vnode.elm, s = vnode.data.style;\n if (!s || !(style = s.destroy))\n return;\n for (name in style) {\n elm.style[name] = style[name];\n }\n}\nfunction applyRemoveStyle(vnode, rm) {\n var s = vnode.data.style;\n if (!s || !s.remove) {\n rm();\n return;\n }\n var name, elm = vnode.elm, i = 0, compStyle, style = s.remove, amount = 0, applied = [];\n for (name in style) {\n applied.push(name);\n elm.style[name] = style[name];\n }\n compStyle = getComputedStyle(elm);\n var props = compStyle['transition-property'].split(', ');\n for (; i < props.length; ++i) {\n if (applied.indexOf(props[i]) !== -1)\n amount++;\n }\n elm.addEventListener('transitionend', function (ev) {\n if (ev.target === elm)\n --amount;\n if (amount === 0)\n rm();\n });\n}\nexports.styleModule = {\n create: updateStyle,\n update: updateStyle,\n destroy: applyDestroyStyle,\n remove: applyRemoveStyle\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = exports.styleModule;\n\n},{}],9:[function(require,module,exports){\n\"use strict\";\nvar snabbdom_1 = require(\"./snabbdom\");\nvar attributes_1 = require(\"./modules/attributes\"); // for setting attributes on DOM elements\nvar class_1 = require(\"./modules/class\"); // makes it easy to toggle classes\nvar props_1 = require(\"./modules/props\"); // for setting properties on DOM elements\nvar style_1 = require(\"./modules/style\"); // handles styling on elements with support for animations\nvar eventlisteners_1 = require(\"./modules/eventlisteners\"); // attaches event listeners\nvar h_1 = require(\"./h\"); // helper function for creating vnodes\nvar patch = snabbdom_1.init([\n attributes_1.attributesModule,\n class_1.classModule,\n props_1.propsModule,\n style_1.styleModule,\n eventlisteners_1.eventListenersModule\n]);\nexports.snabbdomBundle = { patch: patch, h: h_1.h };\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = exports.snabbdomBundle;\n\n},{\"./h\":1,\"./modules/attributes\":4,\"./modules/class\":5,\"./modules/eventlisteners\":6,\"./modules/props\":7,\"./modules/style\":8,\"./snabbdom\":10}],10:[function(require,module,exports){\n\"use strict\";\nvar vnode_1 = require(\"./vnode\");\nvar is = require(\"./is\");\nvar htmldomapi_1 = require(\"./htmldomapi\");\nfunction isUndef(s) { return s === undefined; }\nfunction isDef(s) { return s !== undefined; }\nvar emptyNode = vnode_1.default('', {}, [], undefined, undefined);\nfunction sameVnode(vnode1, vnode2) {\n return vnode1.key === vnode2.key && vnode1.sel === vnode2.sel;\n}\nfunction isVnode(vnode) {\n return vnode.sel !== undefined;\n}\nfunction createKeyToOldIdx(children, beginIdx, endIdx) {\n var i, map = {}, key, ch;\n for (i = beginIdx; i <= endIdx; ++i) {\n ch = children[i];\n if (ch != null) {\n key = ch.key;\n if (key !== undefined)\n map[key] = i;\n }\n }\n return map;\n}\nvar hooks = ['create', 'update', 'remove', 'destroy', 'pre', 'post'];\nvar h_1 = require(\"./h\");\nexports.h = h_1.h;\nvar thunk_1 = require(\"./thunk\");\nexports.thunk = thunk_1.thunk;\nfunction init(modules, domApi) {\n var i, j, cbs = {};\n var api = domApi !== undefined ? domApi : htmldomapi_1.default;\n for (i = 0; i < hooks.length; ++i) {\n cbs[hooks[i]] = [];\n for (j = 0; j < modules.length; ++j) {\n var hook = modules[j][hooks[i]];\n if (hook !== undefined) {\n cbs[hooks[i]].push(hook);\n }\n }\n }\n function emptyNodeAt(elm) {\n var id = elm.id ? '#' + elm.id : '';\n var c = elm.className ? '.' + elm.className.split(' ').join('.') : '';\n return vnode_1.default(api.tagName(elm).toLowerCase() + id + c, {}, [], undefined, elm);\n }\n function createRmCb(childElm, listeners) {\n return function rmCb() {\n if (--listeners === 0) {\n var parent_1 = api.parentNode(childElm);\n api.removeChild(parent_1, childElm);\n }\n };\n }\n function createElm(vnode, insertedVnodeQueue) {\n var i, data = vnode.data;\n if (data !== undefined) {\n if (isDef(i = data.hook) && isDef(i = i.init)) {\n i(vnode);\n data = vnode.data;\n }\n }\n var children = vnode.children, sel = vnode.sel;\n if (sel === '!') {\n if (isUndef(vnode.text)) {\n vnode.text = '';\n }\n vnode.elm = api.createComment(vnode.text);\n }\n else if (sel !== undefined) {\n // Parse selector\n var hashIdx = sel.indexOf('#');\n var dotIdx = sel.indexOf('.', hashIdx);\n var hash = hashIdx > 0 ? hashIdx : sel.length;\n var dot = dotIdx > 0 ? dotIdx : sel.length;\n var tag = hashIdx !== -1 || dotIdx !== -1 ? sel.slice(0, Math.min(hash, dot)) : sel;\n var elm = vnode.elm = isDef(data) && isDef(i = data.ns) ? api.createElementNS(i, tag)\n : api.createElement(tag);\n if (hash < dot)\n elm.id = sel.slice(hash + 1, dot);\n if (dotIdx > 0)\n elm.className = sel.slice(dot + 1).replace(/\\./g, ' ');\n for (i = 0; i < cbs.create.length; ++i)\n cbs.create[i](emptyNode, vnode);\n if (is.array(children)) {\n for (i = 0; i < children.length; ++i) {\n var ch = children[i];\n if (ch != null) {\n api.appendChild(elm, createElm(ch, insertedVnodeQueue));\n }\n }\n }\n else if (is.primitive(vnode.text)) {\n api.appendChild(elm, api.createTextNode(vnode.text));\n }\n i = vnode.data.hook; // Reuse variable\n if (isDef(i)) {\n if (i.create)\n i.create(emptyNode, vnode);\n if (i.insert)\n insertedVnodeQueue.push(vnode);\n }\n }\n else {\n vnode.elm = api.createTextNode(vnode.text);\n }\n return vnode.elm;\n }\n function addVnodes(parentElm, before, vnodes, startIdx, endIdx, insertedVnodeQueue) {\n for (; startIdx <= endIdx; ++startIdx) {\n var ch = vnodes[startIdx];\n if (ch != null) {\n api.insertBefore(parentElm, createElm(ch, insertedVnodeQueue), before);\n }\n }\n }\n function invokeDestroyHook(vnode) {\n var i, j, data = vnode.data;\n if (data !== undefined) {\n if (isDef(i = data.hook) && isDef(i = i.destroy))\n i(vnode);\n for (i = 0; i < cbs.destroy.length; ++i)\n cbs.destroy[i](vnode);\n if (vnode.children !== undefined) {\n for (j = 0; j < vnode.children.length; ++j) {\n i = vnode.children[j];\n if (i != null && typeof i !== \"string\") {\n invokeDestroyHook(i);\n }\n }\n }\n }\n }\n function removeVnodes(parentElm, vnodes, startIdx, endIdx) {\n for (; startIdx <= endIdx; ++startIdx) {\n var i_1 = void 0, listeners = void 0, rm = void 0, ch = vnodes[startIdx];\n if (ch != null) {\n if (isDef(ch.sel)) {\n invokeDestroyHook(ch);\n listeners = cbs.remove.length + 1;\n rm = createRmCb(ch.elm, listeners);\n for (i_1 = 0; i_1 < cbs.remove.length; ++i_1)\n cbs.remove[i_1](ch, rm);\n if (isDef(i_1 = ch.data) && isDef(i_1 = i_1.hook) && isDef(i_1 = i_1.remove)) {\n i_1(ch, rm);\n }\n else {\n rm();\n }\n }\n else {\n api.removeChild(parentElm, ch.elm);\n }\n }\n }\n }\n function updateChildren(parentElm, oldCh, newCh, insertedVnodeQueue) {\n var oldStartIdx = 0, newStartIdx = 0;\n var oldEndIdx = oldCh.length - 1;\n var oldStartVnode = oldCh[0];\n var oldEndVnode = oldCh[oldEndIdx];\n var newEndIdx = newCh.length - 1;\n var newStartVnode = newCh[0];\n var newEndVnode = newCh[newEndIdx];\n var oldKeyToIdx;\n var idxInOld;\n var elmToMove;\n var before;\n while (oldStartIdx <= oldEndIdx && newStartIdx <= newEndIdx) {\n if (oldStartVnode == null) {\n oldStartVnode = oldCh[++oldStartIdx]; // Vnode might have been moved left\n }\n else if (oldEndVnode == null) {\n oldEndVnode = oldCh[--oldEndIdx];\n }\n else if (newStartVnode == null) {\n newStartVnode = newCh[++newStartIdx];\n }\n else if (newEndVnode == null) {\n newEndVnode = newCh[--newEndIdx];\n }\n else if (sameVnode(oldStartVnode, newStartVnode)) {\n patchVnode(oldStartVnode, newStartVnode, insertedVnodeQueue);\n oldStartVnode = oldCh[++oldStartIdx];\n newStartVnode = newCh[++newStartIdx];\n }\n else if (sameVnode(oldEndVnode, newEndVnode)) {\n patchVnode(oldEndVnode, newEndVnode, insertedVnodeQueue);\n oldEndVnode = oldCh[--oldEndIdx];\n newEndVnode = newCh[--newEndIdx];\n }\n else if (sameVnode(oldStartVnode, newEndVnode)) {\n patchVnode(oldStartVnode, newEndVnode, insertedVnodeQueue);\n api.insertBefore(parentElm, oldStartVnode.elm, api.nextSibling(oldEndVnode.elm));\n oldStartVnode = oldCh[++oldStartIdx];\n newEndVnode = newCh[--newEndIdx];\n }\n else if (sameVnode(oldEndVnode, newStartVnode)) {\n patchVnode(oldEndVnode, newStartVnode, insertedVnodeQueue);\n api.insertBefore(parentElm, oldEndVnode.elm, oldStartVnode.elm);\n oldEndVnode = oldCh[--oldEndIdx];\n newStartVnode = newCh[++newStartIdx];\n }\n else {\n if (oldKeyToIdx === undefined) {\n oldKeyToIdx = createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx);\n }\n idxInOld = oldKeyToIdx[newStartVnode.key];\n if (isUndef(idxInOld)) {\n api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);\n newStartVnode = newCh[++newStartIdx];\n }\n else {\n elmToMove = oldCh[idxInOld];\n if (elmToMove.sel !== newStartVnode.sel) {\n api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm);\n }\n else {\n patchVnode(elmToMove, newStartVnode, insertedVnodeQueue);\n oldCh[idxInOld] = undefined;\n api.insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm);\n }\n newStartVnode = newCh[++newStartIdx];\n }\n }\n }\n if (oldStartIdx > oldEndIdx) {\n before = newCh[newEndIdx + 1] == null ? null : newCh[newEndIdx + 1].elm;\n addVnodes(parentElm, before, newCh, newStartIdx, newEndIdx, insertedVnodeQueue);\n }\n else if (newStartIdx > newEndIdx) {\n removeVnodes(parentElm, oldCh, oldStartIdx, oldEndIdx);\n }\n }\n function patchVnode(oldVnode, vnode, insertedVnodeQueue) {\n var i, hook;\n if (isDef(i = vnode.data) && isDef(hook = i.hook) && isDef(i = hook.prepatch)) {\n i(oldVnode, vnode);\n }\n var elm = vnode.elm = oldVnode.elm;\n var oldCh = oldVnode.children;\n var ch = vnode.children;\n if (oldVnode === vnode)\n return;\n if (vnode.data !== undefined) {\n for (i = 0; i < cbs.update.length; ++i)\n cbs.update[i](oldVnode, vnode);\n i = vnode.data.hook;\n if (isDef(i) && isDef(i = i.update))\n i(oldVnode, vnode);\n }\n if (isUndef(vnode.text)) {\n if (isDef(oldCh) && isDef(ch)) {\n if (oldCh !== ch)\n updateChildren(elm, oldCh, ch, insertedVnodeQueue);\n }\n else if (isDef(ch)) {\n if (isDef(oldVnode.text))\n api.setTextContent(elm, '');\n addVnodes(elm, null, ch, 0, ch.length - 1, insertedVnodeQueue);\n }\n else if (isDef(oldCh)) {\n removeVnodes(elm, oldCh, 0, oldCh.length - 1);\n }\n else if (isDef(oldVnode.text)) {\n api.setTextContent(elm, '');\n }\n }\n else if (oldVnode.text !== vnode.text) {\n api.setTextContent(elm, vnode.text);\n }\n if (isDef(hook) && isDef(i = hook.postpatch)) {\n i(oldVnode, vnode);\n }\n }\n return function patch(oldVnode, vnode) {\n var i, elm, parent;\n var insertedVnodeQueue = [];\n for (i = 0; i < cbs.pre.length; ++i)\n cbs.pre[i]();\n if (!isVnode(oldVnode)) {\n oldVnode = emptyNodeAt(oldVnode);\n }\n if (sameVnode(oldVnode, vnode)) {\n patchVnode(oldVnode, vnode, insertedVnodeQueue);\n }\n else {\n elm = oldVnode.elm;\n parent = api.parentNode(elm);\n createElm(vnode, insertedVnodeQueue);\n if (parent !== null) {\n api.insertBefore(parent, vnode.elm, api.nextSibling(elm));\n removeVnodes(parent, [oldVnode], 0, 0);\n }\n }\n for (i = 0; i < insertedVnodeQueue.length; ++i) {\n insertedVnodeQueue[i].data.hook.insert(insertedVnodeQueue[i]);\n }\n for (i = 0; i < cbs.post.length; ++i)\n cbs.post[i]();\n return vnode;\n };\n}\nexports.init = init;\n\n},{\"./h\":1,\"./htmldomapi\":2,\"./is\":3,\"./thunk\":11,\"./vnode\":12}],11:[function(require,module,exports){\n\"use strict\";\nvar h_1 = require(\"./h\");\nfunction copyToThunk(vnode, thunk) {\n thunk.elm = vnode.elm;\n vnode.data.fn = thunk.data.fn;\n vnode.data.args = thunk.data.args;\n thunk.data = vnode.data;\n thunk.children = vnode.children;\n thunk.text = vnode.text;\n thunk.elm = vnode.elm;\n}\nfunction init(thunk) {\n var cur = thunk.data;\n var vnode = cur.fn.apply(undefined, cur.args);\n copyToThunk(vnode, thunk);\n}\nfunction prepatch(oldVnode, thunk) {\n var i, old = oldVnode.data, cur = thunk.data;\n var oldArgs = old.args, args = cur.args;\n if (old.fn !== cur.fn || oldArgs.length !== args.length) {\n copyToThunk(cur.fn.apply(undefined, args), thunk);\n }\n for (i = 0; i < args.length; ++i) {\n if (oldArgs[i] !== args[i]) {\n copyToThunk(cur.fn.apply(undefined, args), thunk);\n return;\n }\n }\n copyToThunk(oldVnode, thunk);\n}\nexports.thunk = function thunk(sel, key, fn, args) {\n if (args === undefined) {\n args = fn;\n fn = key;\n key = undefined;\n }\n return h_1.h(sel, {\n key: key,\n hook: { init: init, prepatch: prepatch },\n fn: fn,\n args: args\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = exports.thunk;\n\n},{\"./h\":1}],12:[function(require,module,exports){\n\"use strict\";\nfunction vnode(sel, data, children, text, elm) {\n var key = data === undefined ? undefined : data.key;\n return { sel: sel, data: data, children: children,\n text: text, elm: elm, key: key };\n}\nexports.vnode = vnode;\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.default = vnode;\n\n},{}]},{},[9])(9)\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJoLmpzIiwiaHRtbGRvbWFwaS5qcyIsImlzLmpzIiwibW9kdWxlcy9hdHRyaWJ1dGVzLmpzIiwibW9kdWxlcy9jbGFzcy5qcyIsIm1vZHVsZXMvZXZlbnRsaXN0ZW5lcnMuanMiLCJtb2R1bGVzL3Byb3BzLmpzIiwibW9kdWxlcy9zdHlsZS5qcyIsInNuYWJiZG9tLmJ1bmRsZS5qcyIsInNuYWJiZG9tLmpzIiwidGh1bmsuanMiLCJ2bm9kZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIlwidXNlIHN0cmljdFwiO1xudmFyIHZub2RlXzEgPSByZXF1aXJlKFwiLi92bm9kZVwiKTtcbnZhciBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xuZnVuY3Rpb24gYWRkTlMoZGF0YSwgY2hpbGRyZW4sIHNlbCkge1xuICAgIGRhdGEubnMgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnO1xuICAgIGlmIChzZWwgIT09ICdmb3JlaWduT2JqZWN0JyAmJiBjaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIHZhciBjaGlsZERhdGEgPSBjaGlsZHJlbltpXS5kYXRhO1xuICAgICAgICAgICAgaWYgKGNoaWxkRGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgYWRkTlMoY2hpbGREYXRhLCBjaGlsZHJlbltpXS5jaGlsZHJlbiwgY2hpbGRyZW5baV0uc2VsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGgoc2VsLCBiLCBjKSB7XG4gICAgdmFyIGRhdGEgPSB7fSwgY2hpbGRyZW4sIHRleHQsIGk7XG4gICAgaWYgKGMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBkYXRhID0gYjtcbiAgICAgICAgaWYgKGlzLmFycmF5KGMpKSB7XG4gICAgICAgICAgICBjaGlsZHJlbiA9IGM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXMucHJpbWl0aXZlKGMpKSB7XG4gICAgICAgICAgICB0ZXh0ID0gYztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChjICYmIGMuc2VsKSB7XG4gICAgICAgICAgICBjaGlsZHJlbiA9IFtjXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChiICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGlzLmFycmF5KGIpKSB7XG4gICAgICAgICAgICBjaGlsZHJlbiA9IGI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXMucHJpbWl0aXZlKGIpKSB7XG4gICAgICAgICAgICB0ZXh0ID0gYjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChiICYmIGIuc2VsKSB7XG4gICAgICAgICAgICBjaGlsZHJlbiA9IFtiXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGRhdGEgPSBiO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChpcy5hcnJheShjaGlsZHJlbikpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoaXMucHJpbWl0aXZlKGNoaWxkcmVuW2ldKSlcbiAgICAgICAgICAgICAgICBjaGlsZHJlbltpXSA9IHZub2RlXzEudm5vZGUodW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgY2hpbGRyZW5baV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChzZWxbMF0gPT09ICdzJyAmJiBzZWxbMV0gPT09ICd2JyAmJiBzZWxbMl0gPT09ICdnJyAmJlxuICAgICAgICAoc2VsLmxlbmd0aCA9PT0gMyB8fCBzZWxbM10gPT09ICcuJyB8fCBzZWxbM10gPT09ICcjJykpIHtcbiAgICAgICAgYWRkTlMoZGF0YSwgY2hpbGRyZW4sIHNlbCk7XG4gICAgfVxuICAgIHJldHVybiB2bm9kZV8xLnZub2RlKHNlbCwgZGF0YSwgY2hpbGRyZW4sIHRleHQsIHVuZGVmaW5lZCk7XG59XG5leHBvcnRzLmggPSBoO1xuO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gaDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWguanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5mdW5jdGlvbiBjcmVhdGVFbGVtZW50KHRhZ05hbWUpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwgcXVhbGlmaWVkTmFtZSk7XG59XG5mdW5jdGlvbiBjcmVhdGVUZXh0Tm9kZSh0ZXh0KSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQpO1xufVxuZnVuY3Rpb24gY3JlYXRlQ29tbWVudCh0ZXh0KSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQodGV4dCk7XG59XG5mdW5jdGlvbiBpbnNlcnRCZWZvcmUocGFyZW50Tm9kZSwgbmV3Tm9kZSwgcmVmZXJlbmNlTm9kZSkge1xuICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIHJlZmVyZW5jZU5vZGUpO1xufVxuZnVuY3Rpb24gcmVtb3ZlQ2hpbGQobm9kZSwgY2hpbGQpIHtcbiAgICBub2RlLnJlbW92ZUNoaWxkKGNoaWxkKTtcbn1cbmZ1bmN0aW9uIGFwcGVuZENoaWxkKG5vZGUsIGNoaWxkKSB7XG4gICAgbm9kZS5hcHBlbmRDaGlsZChjaGlsZCk7XG59XG5mdW5jdGlvbiBwYXJlbnROb2RlKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5wYXJlbnROb2RlO1xufVxuZnVuY3Rpb24gbmV4dFNpYmxpbmcobm9kZSkge1xuICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nO1xufVxuZnVuY3Rpb24gdGFnTmFtZShlbG0pIHtcbiAgICByZXR1cm4gZWxtLnRhZ05hbWU7XG59XG5mdW5jdGlvbiBzZXRUZXh0Q29udGVudChub2RlLCB0ZXh0KSB7XG4gICAgbm9kZS50ZXh0Q29udGVudCA9IHRleHQ7XG59XG5mdW5jdGlvbiBnZXRUZXh0Q29udGVudChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUudGV4dENvbnRlbnQ7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQobm9kZSkge1xuICAgIHJldHVybiBub2RlLm5vZGVUeXBlID09PSAxO1xufVxuZnVuY3Rpb24gaXNUZXh0KG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gMztcbn1cbmZ1bmN0aW9uIGlzQ29tbWVudChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IDg7XG59XG5leHBvcnRzLmh0bWxEb21BcGkgPSB7XG4gICAgY3JlYXRlRWxlbWVudDogY3JlYXRlRWxlbWVudCxcbiAgICBjcmVhdGVFbGVtZW50TlM6IGNyZWF0ZUVsZW1lbnROUyxcbiAgICBjcmVhdGVUZXh0Tm9kZTogY3JlYXRlVGV4dE5vZGUsXG4gICAgY3JlYXRlQ29tbWVudDogY3JlYXRlQ29tbWVudCxcbiAgICBpbnNlcnRCZWZvcmU6IGluc2VydEJlZm9yZSxcbiAgICByZW1vdmVDaGlsZDogcmVtb3ZlQ2hpbGQsXG4gICAgYXBwZW5kQ2hpbGQ6IGFwcGVuZENoaWxkLFxuICAgIHBhcmVudE5vZGU6IHBhcmVudE5vZGUsXG4gICAgbmV4dFNpYmxpbmc6IG5leHRTaWJsaW5nLFxuICAgIHRhZ05hbWU6IHRhZ05hbWUsXG4gICAgc2V0VGV4dENvbnRlbnQ6IHNldFRleHRDb250ZW50LFxuICAgIGdldFRleHRDb250ZW50OiBnZXRUZXh0Q29udGVudCxcbiAgICBpc0VsZW1lbnQ6IGlzRWxlbWVudCxcbiAgICBpc1RleHQ6IGlzVGV4dCxcbiAgICBpc0NvbW1lbnQ6IGlzQ29tbWVudCxcbn07XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmRlZmF1bHQgPSBleHBvcnRzLmh0bWxEb21BcGk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1odG1sZG9tYXBpLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuZXhwb3J0cy5hcnJheSA9IEFycmF5LmlzQXJyYXk7XG5mdW5jdGlvbiBwcmltaXRpdmUocykge1xuICAgIHJldHVybiB0eXBlb2YgcyA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHMgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5wcmltaXRpdmUgPSBwcmltaXRpdmU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pcy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciBOYW1lc3BhY2VVUklzID0ge1xuICAgIFwieGxpbmtcIjogXCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCJcbn07XG52YXIgYm9vbGVhbkF0dHJzID0gW1wiYWxsb3dmdWxsc2NyZWVuXCIsIFwiYXN5bmNcIiwgXCJhdXRvZm9jdXNcIiwgXCJhdXRvcGxheVwiLCBcImNoZWNrZWRcIiwgXCJjb21wYWN0XCIsIFwiY29udHJvbHNcIiwgXCJkZWNsYXJlXCIsXG4gICAgXCJkZWZhdWx0XCIsIFwiZGVmYXVsdGNoZWNrZWRcIiwgXCJkZWZhdWx0bXV0ZWRcIiwgXCJkZWZhdWx0c2VsZWN0ZWRcIiwgXCJkZWZlclwiLCBcImRpc2FibGVkXCIsIFwiZHJhZ2dhYmxlXCIsXG4gICAgXCJlbmFibGVkXCIsIFwiZm9ybW5vdmFsaWRhdGVcIiwgXCJoaWRkZW5cIiwgXCJpbmRldGVybWluYXRlXCIsIFwiaW5lcnRcIiwgXCJpc21hcFwiLCBcIml0ZW1zY29wZVwiLCBcImxvb3BcIiwgXCJtdWx0aXBsZVwiLFxuICAgIFwibXV0ZWRcIiwgXCJub2hyZWZcIiwgXCJub3Jlc2l6ZVwiLCBcIm5vc2hhZGVcIiwgXCJub3ZhbGlkYXRlXCIsIFwibm93cmFwXCIsIFwib3BlblwiLCBcInBhdXNlb25leGl0XCIsIFwicmVhZG9ubHlcIixcbiAgICBcInJlcXVpcmVkXCIsIFwicmV2ZXJzZWRcIiwgXCJzY29wZWRcIiwgXCJzZWFtbGVzc1wiLCBcInNlbGVjdGVkXCIsIFwic29ydGFibGVcIiwgXCJzcGVsbGNoZWNrXCIsIFwidHJhbnNsYXRlXCIsXG4gICAgXCJ0cnVlc3BlZWRcIiwgXCJ0eXBlbXVzdG1hdGNoXCIsIFwidmlzaWJsZVwiXTtcbnZhciBib29sZWFuQXR0cnNEaWN0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbmZvciAodmFyIGkgPSAwLCBsZW4gPSBib29sZWFuQXR0cnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBib29sZWFuQXR0cnNEaWN0W2Jvb2xlYW5BdHRyc1tpXV0gPSB0cnVlO1xufVxuZnVuY3Rpb24gdXBkYXRlQXR0cnMob2xkVm5vZGUsIHZub2RlKSB7XG4gICAgdmFyIGtleSwgY3VyLCBvbGQsIGVsbSA9IHZub2RlLmVsbSwgb2xkQXR0cnMgPSBvbGRWbm9kZS5kYXRhLmF0dHJzLCBhdHRycyA9IHZub2RlLmRhdGEuYXR0cnMsIG5hbWVzcGFjZVNwbGl0O1xuICAgIGlmICghb2xkQXR0cnMgJiYgIWF0dHJzKVxuICAgICAgICByZXR1cm47XG4gICAgaWYgKG9sZEF0dHJzID09PSBhdHRycylcbiAgICAgICAgcmV0dXJuO1xuICAgIG9sZEF0dHJzID0gb2xkQXR0cnMgfHwge307XG4gICAgYXR0cnMgPSBhdHRycyB8fCB7fTtcbiAgICAvLyB1cGRhdGUgbW9kaWZpZWQgYXR0cmlidXRlcywgYWRkIG5ldyBhdHRyaWJ1dGVzXG4gICAgZm9yIChrZXkgaW4gYXR0cnMpIHtcbiAgICAgICAgY3VyID0gYXR0cnNba2V5XTtcbiAgICAgICAgb2xkID0gb2xkQXR0cnNba2V5XTtcbiAgICAgICAgaWYgKG9sZCAhPT0gY3VyKSB7XG4gICAgICAgICAgICBpZiAoIWN1ciAmJiBib29sZWFuQXR0cnNEaWN0W2tleV0pXG4gICAgICAgICAgICAgICAgZWxtLnJlbW92ZUF0dHJpYnV0ZShrZXkpO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbmFtZXNwYWNlU3BsaXQgPSBrZXkuc3BsaXQoXCI6XCIpO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VTcGxpdC5sZW5ndGggPiAxICYmIE5hbWVzcGFjZVVSSXMuaGFzT3duUHJvcGVydHkobmFtZXNwYWNlU3BsaXRbMF0pKVxuICAgICAgICAgICAgICAgICAgICBlbG0uc2V0QXR0cmlidXRlTlMoTmFtZXNwYWNlVVJJc1tuYW1lc3BhY2VTcGxpdFswXV0sIGtleSwgY3VyKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGVsbS5zZXRBdHRyaWJ1dGUoa2V5LCBjdXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC8vcmVtb3ZlIHJlbW92ZWQgYXR0cmlidXRlc1xuICAgIC8vIHVzZSBgaW5gIG9wZXJhdG9yIHNpbmNlIHRoZSBwcmV2aW91cyBgZm9yYCBpdGVyYXRpb24gdXNlcyBpdCAoLmkuZS4gYWRkIGV2ZW4gYXR0cmlidXRlcyB3aXRoIHVuZGVmaW5lZCB2YWx1ZSlcbiAgICAvLyB0aGUgb3RoZXIgb3B0aW9uIGlzIHRvIHJlbW92ZSBhbGwgYXR0cmlidXRlcyB3aXRoIHZhbHVlID09IHVuZGVmaW5lZFxuICAgIGZvciAoa2V5IGluIG9sZEF0dHJzKSB7XG4gICAgICAgIGlmICghKGtleSBpbiBhdHRycykpIHtcbiAgICAgICAgICAgIGVsbS5yZW1vdmVBdHRyaWJ1dGUoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuYXR0cmlidXRlc01vZHVsZSA9IHsgY3JlYXRlOiB1cGRhdGVBdHRycywgdXBkYXRlOiB1cGRhdGVBdHRycyB9O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZXhwb3J0cy5hdHRyaWJ1dGVzTW9kdWxlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXR0cmlidXRlcy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbmZ1bmN0aW9uIHVwZGF0ZUNsYXNzKG9sZFZub2RlLCB2bm9kZSkge1xuICAgIHZhciBjdXIsIG5hbWUsIGVsbSA9IHZub2RlLmVsbSwgb2xkQ2xhc3MgPSBvbGRWbm9kZS5kYXRhLmNsYXNzLCBrbGFzcyA9IHZub2RlLmRhdGEuY2xhc3M7XG4gICAgaWYgKCFvbGRDbGFzcyAmJiAha2xhc3MpXG4gICAgICAgIHJldHVybjtcbiAgICBpZiAob2xkQ2xhc3MgPT09IGtsYXNzKVxuICAgICAgICByZXR1cm47XG4gICAgb2xkQ2xhc3MgPSBvbGRDbGFzcyB8fCB7fTtcbiAgICBrbGFzcyA9IGtsYXNzIHx8IHt9O1xuICAgIGZvciAobmFtZSBpbiBvbGRDbGFzcykge1xuICAgICAgICBpZiAoIWtsYXNzW25hbWVdKSB7XG4gICAgICAgICAgICBlbG0uY2xhc3NMaXN0LnJlbW92ZShuYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKG5hbWUgaW4ga2xhc3MpIHtcbiAgICAgICAgY3VyID0ga2xhc3NbbmFtZV07XG4gICAgICAgIGlmIChjdXIgIT09IG9sZENsYXNzW25hbWVdKSB7XG4gICAgICAgICAgICBlbG0uY2xhc3NMaXN0W2N1ciA/ICdhZGQnIDogJ3JlbW92ZSddKG5hbWUpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5jbGFzc01vZHVsZSA9IHsgY3JlYXRlOiB1cGRhdGVDbGFzcywgdXBkYXRlOiB1cGRhdGVDbGFzcyB9O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZXhwb3J0cy5jbGFzc01vZHVsZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNsYXNzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuZnVuY3Rpb24gaW52b2tlSGFuZGxlcihoYW5kbGVyLCB2bm9kZSwgZXZlbnQpIHtcbiAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAvLyBjYWxsIGZ1bmN0aW9uIGhhbmRsZXJcbiAgICAgICAgaGFuZGxlci5jYWxsKHZub2RlLCBldmVudCwgdm5vZGUpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAvLyBjYWxsIGhhbmRsZXIgd2l0aCBhcmd1bWVudHNcbiAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyWzBdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3Igc2luZ2xlIGFyZ3VtZW50IGZvciBwZXJmb3JtYW5jZVxuICAgICAgICAgICAgaWYgKGhhbmRsZXIubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgaGFuZGxlclswXS5jYWxsKHZub2RlLCBoYW5kbGVyWzFdLCBldmVudCwgdm5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBoYW5kbGVyLnNsaWNlKDEpO1xuICAgICAgICAgICAgICAgIGFyZ3MucHVzaChldmVudCk7XG4gICAgICAgICAgICAgICAgYXJncy5wdXNoKHZub2RlKTtcbiAgICAgICAgICAgICAgICBoYW5kbGVyWzBdLmFwcGx5KHZub2RlLCBhcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGNhbGwgbXVsdGlwbGUgaGFuZGxlcnNcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGludm9rZUhhbmRsZXIoaGFuZGxlcltpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiBoYW5kbGVFdmVudChldmVudCwgdm5vZGUpIHtcbiAgICB2YXIgbmFtZSA9IGV2ZW50LnR5cGUsIG9uID0gdm5vZGUuZGF0YS5vbjtcbiAgICAvLyBjYWxsIGV2ZW50IGhhbmRsZXIocykgaWYgZXhpc3RzXG4gICAgaWYgKG9uICYmIG9uW25hbWVdKSB7XG4gICAgICAgIGludm9rZUhhbmRsZXIob25bbmFtZV0sIHZub2RlLCBldmVudCk7XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlTGlzdGVuZXIoKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIGhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgaGFuZGxlRXZlbnQoZXZlbnQsIGhhbmRsZXIudm5vZGUpO1xuICAgIH07XG59XG5mdW5jdGlvbiB1cGRhdGVFdmVudExpc3RlbmVycyhvbGRWbm9kZSwgdm5vZGUpIHtcbiAgICB2YXIgb2xkT24gPSBvbGRWbm9kZS5kYXRhLm9uLCBvbGRMaXN0ZW5lciA9IG9sZFZub2RlLmxpc3RlbmVyLCBvbGRFbG0gPSBvbGRWbm9kZS5lbG0sIG9uID0gdm5vZGUgJiYgdm5vZGUuZGF0YS5vbiwgZWxtID0gKHZub2RlICYmIHZub2RlLmVsbSksIG5hbWU7XG4gICAgLy8gb3B0aW1pemF0aW9uIGZvciByZXVzZWQgaW1tdXRhYmxlIGhhbmRsZXJzXG4gICAgaWYgKG9sZE9uID09PSBvbikge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIHJlbW92ZSBleGlzdGluZyBsaXN0ZW5lcnMgd2hpY2ggbm8gbG9uZ2VyIHVzZWRcbiAgICBpZiAob2xkT24gJiYgb2xkTGlzdGVuZXIpIHtcbiAgICAgICAgLy8gaWYgZWxlbWVudCBjaGFuZ2VkIG9yIGRlbGV0ZWQgd2UgcmVtb3ZlIGFsbCBleGlzdGluZyBsaXN0ZW5lcnMgdW5jb25kaXRpb25hbGx5XG4gICAgICAgIGlmICghb24pIHtcbiAgICAgICAgICAgIGZvciAobmFtZSBpbiBvbGRPbikge1xuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBsaXN0ZW5lciBpZiBlbGVtZW50IHdhcyBjaGFuZ2VkIG9yIGV4aXN0aW5nIGxpc3RlbmVycyByZW1vdmVkXG4gICAgICAgICAgICAgICAgb2xkRWxtLnJlbW92ZUV2ZW50TGlzdGVuZXIobmFtZSwgb2xkTGlzdGVuZXIsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobmFtZSBpbiBvbGRPbikge1xuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBsaXN0ZW5lciBpZiBleGlzdGluZyBsaXN0ZW5lciByZW1vdmVkXG4gICAgICAgICAgICAgICAgaWYgKCFvbltuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICBvbGRFbG0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCBvbGRMaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBhZGQgbmV3IGxpc3RlbmVycyB3aGljaCBoYXMgbm90IGFscmVhZHkgYXR0YWNoZWRcbiAgICBpZiAob24pIHtcbiAgICAgICAgLy8gcmV1c2UgZXhpc3RpbmcgbGlzdGVuZXIgb3IgY3JlYXRlIG5ld1xuICAgICAgICB2YXIgbGlzdGVuZXIgPSB2bm9kZS5saXN0ZW5lciA9IG9sZFZub2RlLmxpc3RlbmVyIHx8IGNyZWF0ZUxpc3RlbmVyKCk7XG4gICAgICAgIC8vIHVwZGF0ZSB2bm9kZSBmb3IgbGlzdGVuZXJcbiAgICAgICAgbGlzdGVuZXIudm5vZGUgPSB2bm9kZTtcbiAgICAgICAgLy8gaWYgZWxlbWVudCBjaGFuZ2VkIG9yIGFkZGVkIHdlIGFkZCBhbGwgbmVlZGVkIGxpc3RlbmVycyB1bmNvbmRpdGlvbmFsbHlcbiAgICAgICAgaWYgKCFvbGRPbikge1xuICAgICAgICAgICAgZm9yIChuYW1lIGluIG9uKSB7XG4gICAgICAgICAgICAgICAgLy8gYWRkIGxpc3RlbmVyIGlmIGVsZW1lbnQgd2FzIGNoYW5nZWQgb3IgbmV3IGxpc3RlbmVycyBhZGRlZFxuICAgICAgICAgICAgICAgIGVsbS5hZGRFdmVudExpc3RlbmVyKG5hbWUsIGxpc3RlbmVyLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKG5hbWUgaW4gb24pIHtcbiAgICAgICAgICAgICAgICAvLyBhZGQgbGlzdGVuZXIgaWYgbmV3IGxpc3RlbmVyIGFkZGVkXG4gICAgICAgICAgICAgICAgaWYgKCFvbGRPbltuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICBlbG0uYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBsaXN0ZW5lciwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuZXZlbnRMaXN0ZW5lcnNNb2R1bGUgPSB7XG4gICAgY3JlYXRlOiB1cGRhdGVFdmVudExpc3RlbmVycyxcbiAgICB1cGRhdGU6IHVwZGF0ZUV2ZW50TGlzdGVuZXJzLFxuICAgIGRlc3Ryb3k6IHVwZGF0ZUV2ZW50TGlzdGVuZXJzXG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZXhwb3J0cy5ldmVudExpc3RlbmVyc01vZHVsZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWV2ZW50bGlzdGVuZXJzLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuZnVuY3Rpb24gdXBkYXRlUHJvcHMob2xkVm5vZGUsIHZub2RlKSB7XG4gICAgdmFyIGtleSwgY3VyLCBvbGQsIGVsbSA9IHZub2RlLmVsbSwgb2xkUHJvcHMgPSBvbGRWbm9kZS5kYXRhLnByb3BzLCBwcm9wcyA9IHZub2RlLmRhdGEucHJvcHM7XG4gICAgaWYgKCFvbGRQcm9wcyAmJiAhcHJvcHMpXG4gICAgICAgIHJldHVybjtcbiAgICBpZiAob2xkUHJvcHMgPT09IHByb3BzKVxuICAgICAgICByZXR1cm47XG4gICAgb2xkUHJvcHMgPSBvbGRQcm9wcyB8fCB7fTtcbiAgICBwcm9wcyA9IHByb3BzIHx8IHt9O1xuICAgIGZvciAoa2V5IGluIG9sZFByb3BzKSB7XG4gICAgICAgIGlmICghcHJvcHNba2V5XSkge1xuICAgICAgICAgICAgZGVsZXRlIGVsbVtrZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoa2V5IGluIHByb3BzKSB7XG4gICAgICAgIGN1ciA9IHByb3BzW2tleV07XG4gICAgICAgIG9sZCA9IG9sZFByb3BzW2tleV07XG4gICAgICAgIGlmIChvbGQgIT09IGN1ciAmJiAoa2V5ICE9PSAndmFsdWUnIHx8IGVsbVtrZXldICE9PSBjdXIpKSB7XG4gICAgICAgICAgICBlbG1ba2V5XSA9IGN1cjtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMucHJvcHNNb2R1bGUgPSB7IGNyZWF0ZTogdXBkYXRlUHJvcHMsIHVwZGF0ZTogdXBkYXRlUHJvcHMgfTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMucHJvcHNNb2R1bGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1wcm9wcy5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbnZhciByYWYgPSAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSkgfHwgc2V0VGltZW91dDtcbnZhciBuZXh0RnJhbWUgPSBmdW5jdGlvbiAoZm4pIHsgcmFmKGZ1bmN0aW9uICgpIHsgcmFmKGZuKTsgfSk7IH07XG5mdW5jdGlvbiBzZXROZXh0RnJhbWUob2JqLCBwcm9wLCB2YWwpIHtcbiAgICBuZXh0RnJhbWUoZnVuY3Rpb24gKCkgeyBvYmpbcHJvcF0gPSB2YWw7IH0pO1xufVxuZnVuY3Rpb24gdXBkYXRlU3R5bGUob2xkVm5vZGUsIHZub2RlKSB7XG4gICAgdmFyIGN1ciwgbmFtZSwgZWxtID0gdm5vZGUuZWxtLCBvbGRTdHlsZSA9IG9sZFZub2RlLmRhdGEuc3R5bGUsIHN0eWxlID0gdm5vZGUuZGF0YS5zdHlsZTtcbiAgICBpZiAoIW9sZFN0eWxlICYmICFzdHlsZSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGlmIChvbGRTdHlsZSA9PT0gc3R5bGUpXG4gICAgICAgIHJldHVybjtcbiAgICBvbGRTdHlsZSA9IG9sZFN0eWxlIHx8IHt9O1xuICAgIHN0eWxlID0gc3R5bGUgfHwge307XG4gICAgdmFyIG9sZEhhc0RlbCA9ICdkZWxheWVkJyBpbiBvbGRTdHlsZTtcbiAgICBmb3IgKG5hbWUgaW4gb2xkU3R5bGUpIHtcbiAgICAgICAgaWYgKCFzdHlsZVtuYW1lXSkge1xuICAgICAgICAgICAgaWYgKG5hbWVbMF0gPT09ICctJyAmJiBuYW1lWzFdID09PSAnLScpIHtcbiAgICAgICAgICAgICAgICBlbG0uc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBlbG0uc3R5bGVbbmFtZV0gPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKG5hbWUgaW4gc3R5bGUpIHtcbiAgICAgICAgY3VyID0gc3R5bGVbbmFtZV07XG4gICAgICAgIGlmIChuYW1lID09PSAnZGVsYXllZCcpIHtcbiAgICAgICAgICAgIGZvciAobmFtZSBpbiBzdHlsZS5kZWxheWVkKSB7XG4gICAgICAgICAgICAgICAgY3VyID0gc3R5bGUuZGVsYXllZFtuYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAoIW9sZEhhc0RlbCB8fCBjdXIgIT09IG9sZFN0eWxlLmRlbGF5ZWRbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0TmV4dEZyYW1lKGVsbS5zdHlsZSwgbmFtZSwgY3VyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmFtZSAhPT0gJ3JlbW92ZScgJiYgY3VyICE9PSBvbGRTdHlsZVtuYW1lXSkge1xuICAgICAgICAgICAgaWYgKG5hbWVbMF0gPT09ICctJyAmJiBuYW1lWzFdID09PSAnLScpIHtcbiAgICAgICAgICAgICAgICBlbG0uc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgY3VyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsbS5zdHlsZVtuYW1lXSA9IGN1cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmZ1bmN0aW9uIGFwcGx5RGVzdHJveVN0eWxlKHZub2RlKSB7XG4gICAgdmFyIHN0eWxlLCBuYW1lLCBlbG0gPSB2bm9kZS5lbG0sIHMgPSB2bm9kZS5kYXRhLnN0eWxlO1xuICAgIGlmICghcyB8fCAhKHN0eWxlID0gcy5kZXN0cm95KSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGZvciAobmFtZSBpbiBzdHlsZSkge1xuICAgICAgICBlbG0uc3R5bGVbbmFtZV0gPSBzdHlsZVtuYW1lXTtcbiAgICB9XG59XG5mdW5jdGlvbiBhcHBseVJlbW92ZVN0eWxlKHZub2RlLCBybSkge1xuICAgIHZhciBzID0gdm5vZGUuZGF0YS5zdHlsZTtcbiAgICBpZiAoIXMgfHwgIXMucmVtb3ZlKSB7XG4gICAgICAgIHJtKCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIG5hbWUsIGVsbSA9IHZub2RlLmVsbSwgaSA9IDAsIGNvbXBTdHlsZSwgc3R5bGUgPSBzLnJlbW92ZSwgYW1vdW50ID0gMCwgYXBwbGllZCA9IFtdO1xuICAgIGZvciAobmFtZSBpbiBzdHlsZSkge1xuICAgICAgICBhcHBsaWVkLnB1c2gobmFtZSk7XG4gICAgICAgIGVsbS5zdHlsZVtuYW1lXSA9IHN0eWxlW25hbWVdO1xuICAgIH1cbiAgICBjb21wU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsbSk7XG4gICAgdmFyIHByb3BzID0gY29tcFN0eWxlWyd0cmFuc2l0aW9uLXByb3BlcnR5J10uc3BsaXQoJywgJyk7XG4gICAgZm9yICg7IGkgPCBwcm9wcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoYXBwbGllZC5pbmRleE9mKHByb3BzW2ldKSAhPT0gLTEpXG4gICAgICAgICAgICBhbW91bnQrKztcbiAgICB9XG4gICAgZWxtLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCBmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgaWYgKGV2LnRhcmdldCA9PT0gZWxtKVxuICAgICAgICAgICAgLS1hbW91bnQ7XG4gICAgICAgIGlmIChhbW91bnQgPT09IDApXG4gICAgICAgICAgICBybSgpO1xuICAgIH0pO1xufVxuZXhwb3J0cy5zdHlsZU1vZHVsZSA9IHtcbiAgICBjcmVhdGU6IHVwZGF0ZVN0eWxlLFxuICAgIHVwZGF0ZTogdXBkYXRlU3R5bGUsXG4gICAgZGVzdHJveTogYXBwbHlEZXN0cm95U3R5bGUsXG4gICAgcmVtb3ZlOiBhcHBseVJlbW92ZVN0eWxlXG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZXhwb3J0cy5zdHlsZU1vZHVsZTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXN0eWxlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIHNuYWJiZG9tXzEgPSByZXF1aXJlKFwiLi9zbmFiYmRvbVwiKTtcbnZhciBhdHRyaWJ1dGVzXzEgPSByZXF1aXJlKFwiLi9tb2R1bGVzL2F0dHJpYnV0ZXNcIik7IC8vIGZvciBzZXR0aW5nIGF0dHJpYnV0ZXMgb24gRE9NIGVsZW1lbnRzXG52YXIgY2xhc3NfMSA9IHJlcXVpcmUoXCIuL21vZHVsZXMvY2xhc3NcIik7IC8vIG1ha2VzIGl0IGVhc3kgdG8gdG9nZ2xlIGNsYXNzZXNcbnZhciBwcm9wc18xID0gcmVxdWlyZShcIi4vbW9kdWxlcy9wcm9wc1wiKTsgLy8gZm9yIHNldHRpbmcgcHJvcGVydGllcyBvbiBET00gZWxlbWVudHNcbnZhciBzdHlsZV8xID0gcmVxdWlyZShcIi4vbW9kdWxlcy9zdHlsZVwiKTsgLy8gaGFuZGxlcyBzdHlsaW5nIG9uIGVsZW1lbnRzIHdpdGggc3VwcG9ydCBmb3IgYW5pbWF0aW9uc1xudmFyIGV2ZW50bGlzdGVuZXJzXzEgPSByZXF1aXJlKFwiLi9tb2R1bGVzL2V2ZW50bGlzdGVuZXJzXCIpOyAvLyBhdHRhY2hlcyBldmVudCBsaXN0ZW5lcnNcbnZhciBoXzEgPSByZXF1aXJlKFwiLi9oXCIpOyAvLyBoZWxwZXIgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIHZub2Rlc1xudmFyIHBhdGNoID0gc25hYmJkb21fMS5pbml0KFtcbiAgICBhdHRyaWJ1dGVzXzEuYXR0cmlidXRlc01vZHVsZSxcbiAgICBjbGFzc18xLmNsYXNzTW9kdWxlLFxuICAgIHByb3BzXzEucHJvcHNNb2R1bGUsXG4gICAgc3R5bGVfMS5zdHlsZU1vZHVsZSxcbiAgICBldmVudGxpc3RlbmVyc18xLmV2ZW50TGlzdGVuZXJzTW9kdWxlXG5dKTtcbmV4cG9ydHMuc25hYmJkb21CdW5kbGUgPSB7IHBhdGNoOiBwYXRjaCwgaDogaF8xLmggfTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGV4cG9ydHMuc25hYmJkb21CdW5kbGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zbmFiYmRvbS5idW5kbGUuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgdm5vZGVfMSA9IHJlcXVpcmUoXCIuL3Zub2RlXCIpO1xudmFyIGlzID0gcmVxdWlyZShcIi4vaXNcIik7XG52YXIgaHRtbGRvbWFwaV8xID0gcmVxdWlyZShcIi4vaHRtbGRvbWFwaVwiKTtcbmZ1bmN0aW9uIGlzVW5kZWYocykgeyByZXR1cm4gcyA9PT0gdW5kZWZpbmVkOyB9XG5mdW5jdGlvbiBpc0RlZihzKSB7IHJldHVybiBzICE9PSB1bmRlZmluZWQ7IH1cbnZhciBlbXB0eU5vZGUgPSB2bm9kZV8xLmRlZmF1bHQoJycsIHt9LCBbXSwgdW5kZWZpbmVkLCB1bmRlZmluZWQpO1xuZnVuY3Rpb24gc2FtZVZub2RlKHZub2RlMSwgdm5vZGUyKSB7XG4gICAgcmV0dXJuIHZub2RlMS5rZXkgPT09IHZub2RlMi5rZXkgJiYgdm5vZGUxLnNlbCA9PT0gdm5vZGUyLnNlbDtcbn1cbmZ1bmN0aW9uIGlzVm5vZGUodm5vZGUpIHtcbiAgICByZXR1cm4gdm5vZGUuc2VsICE9PSB1bmRlZmluZWQ7XG59XG5mdW5jdGlvbiBjcmVhdGVLZXlUb09sZElkeChjaGlsZHJlbiwgYmVnaW5JZHgsIGVuZElkeCkge1xuICAgIHZhciBpLCBtYXAgPSB7fSwga2V5LCBjaDtcbiAgICBmb3IgKGkgPSBiZWdpbklkeDsgaSA8PSBlbmRJZHg7ICsraSkge1xuICAgICAgICBjaCA9IGNoaWxkcmVuW2ldO1xuICAgICAgICBpZiAoY2ggIT0gbnVsbCkge1xuICAgICAgICAgICAga2V5ID0gY2gua2V5O1xuICAgICAgICAgICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIG1hcFtrZXldID0gaTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWFwO1xufVxudmFyIGhvb2tzID0gWydjcmVhdGUnLCAndXBkYXRlJywgJ3JlbW92ZScsICdkZXN0cm95JywgJ3ByZScsICdwb3N0J107XG52YXIgaF8xID0gcmVxdWlyZShcIi4vaFwiKTtcbmV4cG9ydHMuaCA9IGhfMS5oO1xudmFyIHRodW5rXzEgPSByZXF1aXJlKFwiLi90aHVua1wiKTtcbmV4cG9ydHMudGh1bmsgPSB0aHVua18xLnRodW5rO1xuZnVuY3Rpb24gaW5pdChtb2R1bGVzLCBkb21BcGkpIHtcbiAgICB2YXIgaSwgaiwgY2JzID0ge307XG4gICAgdmFyIGFwaSA9IGRvbUFwaSAhPT0gdW5kZWZpbmVkID8gZG9tQXBpIDogaHRtbGRvbWFwaV8xLmRlZmF1bHQ7XG4gICAgZm9yIChpID0gMDsgaSA8IGhvb2tzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGNic1tob29rc1tpXV0gPSBbXTtcbiAgICAgICAgZm9yIChqID0gMDsgaiA8IG1vZHVsZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIHZhciBob29rID0gbW9kdWxlc1tqXVtob29rc1tpXV07XG4gICAgICAgICAgICBpZiAoaG9vayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgY2JzW2hvb2tzW2ldXS5wdXNoKGhvb2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVtcHR5Tm9kZUF0KGVsbSkge1xuICAgICAgICB2YXIgaWQgPSBlbG0uaWQgPyAnIycgKyBlbG0uaWQgOiAnJztcbiAgICAgICAgdmFyIGMgPSBlbG0uY2xhc3NOYW1lID8gJy4nICsgZWxtLmNsYXNzTmFtZS5zcGxpdCgnICcpLmpvaW4oJy4nKSA6ICcnO1xuICAgICAgICByZXR1cm4gdm5vZGVfMS5kZWZhdWx0KGFwaS50YWdOYW1lKGVsbSkudG9Mb3dlckNhc2UoKSArIGlkICsgYywge30sIFtdLCB1bmRlZmluZWQsIGVsbSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJtQ2IoY2hpbGRFbG0sIGxpc3RlbmVycykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gcm1DYigpIHtcbiAgICAgICAgICAgIGlmICgtLWxpc3RlbmVycyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHZhciBwYXJlbnRfMSA9IGFwaS5wYXJlbnROb2RlKGNoaWxkRWxtKTtcbiAgICAgICAgICAgICAgICBhcGkucmVtb3ZlQ2hpbGQocGFyZW50XzEsIGNoaWxkRWxtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY3JlYXRlRWxtKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpIHtcbiAgICAgICAgdmFyIGksIGRhdGEgPSB2bm9kZS5kYXRhO1xuICAgICAgICBpZiAoZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoaXNEZWYoaSA9IGRhdGEuaG9vaykgJiYgaXNEZWYoaSA9IGkuaW5pdCkpIHtcbiAgICAgICAgICAgICAgICBpKHZub2RlKTtcbiAgICAgICAgICAgICAgICBkYXRhID0gdm5vZGUuZGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgY2hpbGRyZW4gPSB2bm9kZS5jaGlsZHJlbiwgc2VsID0gdm5vZGUuc2VsO1xuICAgICAgICBpZiAoc2VsID09PSAnIScpIHtcbiAgICAgICAgICAgIGlmIChpc1VuZGVmKHZub2RlLnRleHQpKSB7XG4gICAgICAgICAgICAgICAgdm5vZGUudGV4dCA9ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdm5vZGUuZWxtID0gYXBpLmNyZWF0ZUNvbW1lbnQodm5vZGUudGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc2VsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIFBhcnNlIHNlbGVjdG9yXG4gICAgICAgICAgICB2YXIgaGFzaElkeCA9IHNlbC5pbmRleE9mKCcjJyk7XG4gICAgICAgICAgICB2YXIgZG90SWR4ID0gc2VsLmluZGV4T2YoJy4nLCBoYXNoSWR4KTtcbiAgICAgICAgICAgIHZhciBoYXNoID0gaGFzaElkeCA+IDAgPyBoYXNoSWR4IDogc2VsLmxlbmd0aDtcbiAgICAgICAgICAgIHZhciBkb3QgPSBkb3RJZHggPiAwID8gZG90SWR4IDogc2VsLmxlbmd0aDtcbiAgICAgICAgICAgIHZhciB0YWcgPSBoYXNoSWR4ICE9PSAtMSB8fCBkb3RJZHggIT09IC0xID8gc2VsLnNsaWNlKDAsIE1hdGgubWluKGhhc2gsIGRvdCkpIDogc2VsO1xuICAgICAgICAgICAgdmFyIGVsbSA9IHZub2RlLmVsbSA9IGlzRGVmKGRhdGEpICYmIGlzRGVmKGkgPSBkYXRhLm5zKSA/IGFwaS5jcmVhdGVFbGVtZW50TlMoaSwgdGFnKVxuICAgICAgICAgICAgICAgIDogYXBpLmNyZWF0ZUVsZW1lbnQodGFnKTtcbiAgICAgICAgICAgIGlmIChoYXNoIDwgZG90KVxuICAgICAgICAgICAgICAgIGVsbS5pZCA9IHNlbC5zbGljZShoYXNoICsgMSwgZG90KTtcbiAgICAgICAgICAgIGlmIChkb3RJZHggPiAwKVxuICAgICAgICAgICAgICAgIGVsbS5jbGFzc05hbWUgPSBzZWwuc2xpY2UoZG90ICsgMSkucmVwbGFjZSgvXFwuL2csICcgJyk7XG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2JzLmNyZWF0ZS5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICBjYnMuY3JlYXRlW2ldKGVtcHR5Tm9kZSwgdm5vZGUpO1xuICAgICAgICAgICAgaWYgKGlzLmFycmF5KGNoaWxkcmVuKSkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSBjaGlsZHJlbltpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwaS5hcHBlbmRDaGlsZChlbG0sIGNyZWF0ZUVsbShjaCwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpcy5wcmltaXRpdmUodm5vZGUudGV4dCkpIHtcbiAgICAgICAgICAgICAgICBhcGkuYXBwZW5kQ2hpbGQoZWxtLCBhcGkuY3JlYXRlVGV4dE5vZGUodm5vZGUudGV4dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSA9IHZub2RlLmRhdGEuaG9vazsgLy8gUmV1c2UgdmFyaWFibGVcbiAgICAgICAgICAgIGlmIChpc0RlZihpKSkge1xuICAgICAgICAgICAgICAgIGlmIChpLmNyZWF0ZSlcbiAgICAgICAgICAgICAgICAgICAgaS5jcmVhdGUoZW1wdHlOb2RlLCB2bm9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKGkuaW5zZXJ0KVxuICAgICAgICAgICAgICAgICAgICBpbnNlcnRlZFZub2RlUXVldWUucHVzaCh2bm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2bm9kZS5lbG0gPSBhcGkuY3JlYXRlVGV4dE5vZGUodm5vZGUudGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZub2RlLmVsbTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYWRkVm5vZGVzKHBhcmVudEVsbSwgYmVmb3JlLCB2bm9kZXMsIHN0YXJ0SWR4LCBlbmRJZHgsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgICAgICBmb3IgKDsgc3RhcnRJZHggPD0gZW5kSWR4OyArK3N0YXJ0SWR4KSB7XG4gICAgICAgICAgICB2YXIgY2ggPSB2bm9kZXNbc3RhcnRJZHhdO1xuICAgICAgICAgICAgaWYgKGNoICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBhcGkuaW5zZXJ0QmVmb3JlKHBhcmVudEVsbSwgY3JlYXRlRWxtKGNoLCBpbnNlcnRlZFZub2RlUXVldWUpLCBiZWZvcmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGludm9rZURlc3Ryb3lIb29rKHZub2RlKSB7XG4gICAgICAgIHZhciBpLCBqLCBkYXRhID0gdm5vZGUuZGF0YTtcbiAgICAgICAgaWYgKGRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKGlzRGVmKGkgPSBkYXRhLmhvb2spICYmIGlzRGVmKGkgPSBpLmRlc3Ryb3kpKVxuICAgICAgICAgICAgICAgIGkodm5vZGUpO1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNicy5kZXN0cm95Lmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIGNicy5kZXN0cm95W2ldKHZub2RlKTtcbiAgICAgICAgICAgIGlmICh2bm9kZS5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHZub2RlLmNoaWxkcmVuLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGkgPSB2bm9kZS5jaGlsZHJlbltqXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gbnVsbCAmJiB0eXBlb2YgaSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlRGVzdHJveUhvb2soaSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcmVtb3ZlVm5vZGVzKHBhcmVudEVsbSwgdm5vZGVzLCBzdGFydElkeCwgZW5kSWR4KSB7XG4gICAgICAgIGZvciAoOyBzdGFydElkeCA8PSBlbmRJZHg7ICsrc3RhcnRJZHgpIHtcbiAgICAgICAgICAgIHZhciBpXzEgPSB2b2lkIDAsIGxpc3RlbmVycyA9IHZvaWQgMCwgcm0gPSB2b2lkIDAsIGNoID0gdm5vZGVzW3N0YXJ0SWR4XTtcbiAgICAgICAgICAgIGlmIChjaCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzRGVmKGNoLnNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaW52b2tlRGVzdHJveUhvb2soY2gpO1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMgPSBjYnMucmVtb3ZlLmxlbmd0aCArIDE7XG4gICAgICAgICAgICAgICAgICAgIHJtID0gY3JlYXRlUm1DYihjaC5lbG0sIGxpc3RlbmVycyk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaV8xID0gMDsgaV8xIDwgY2JzLnJlbW92ZS5sZW5ndGg7ICsraV8xKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2JzLnJlbW92ZVtpXzFdKGNoLCBybSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0RlZihpXzEgPSBjaC5kYXRhKSAmJiBpc0RlZihpXzEgPSBpXzEuaG9vaykgJiYgaXNEZWYoaV8xID0gaV8xLnJlbW92ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlfMShjaCwgcm0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm0oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYXBpLnJlbW92ZUNoaWxkKHBhcmVudEVsbSwgY2guZWxtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdXBkYXRlQ2hpbGRyZW4ocGFyZW50RWxtLCBvbGRDaCwgbmV3Q2gsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgICAgICB2YXIgb2xkU3RhcnRJZHggPSAwLCBuZXdTdGFydElkeCA9IDA7XG4gICAgICAgIHZhciBvbGRFbmRJZHggPSBvbGRDaC5sZW5ndGggLSAxO1xuICAgICAgICB2YXIgb2xkU3RhcnRWbm9kZSA9IG9sZENoWzBdO1xuICAgICAgICB2YXIgb2xkRW5kVm5vZGUgPSBvbGRDaFtvbGRFbmRJZHhdO1xuICAgICAgICB2YXIgbmV3RW5kSWR4ID0gbmV3Q2gubGVuZ3RoIC0gMTtcbiAgICAgICAgdmFyIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFswXTtcbiAgICAgICAgdmFyIG5ld0VuZFZub2RlID0gbmV3Q2hbbmV3RW5kSWR4XTtcbiAgICAgICAgdmFyIG9sZEtleVRvSWR4O1xuICAgICAgICB2YXIgaWR4SW5PbGQ7XG4gICAgICAgIHZhciBlbG1Ub01vdmU7XG4gICAgICAgIHZhciBiZWZvcmU7XG4gICAgICAgIHdoaWxlIChvbGRTdGFydElkeCA8PSBvbGRFbmRJZHggJiYgbmV3U3RhcnRJZHggPD0gbmV3RW5kSWR4KSB7XG4gICAgICAgICAgICBpZiAob2xkU3RhcnRWbm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgb2xkU3RhcnRWbm9kZSA9IG9sZENoWysrb2xkU3RhcnRJZHhdOyAvLyBWbm9kZSBtaWdodCBoYXZlIGJlZW4gbW92ZWQgbGVmdFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob2xkRW5kVm5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmV3U3RhcnRWbm9kZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbmV3U3RhcnRWbm9kZSA9IG5ld0NoWysrbmV3U3RhcnRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobmV3RW5kVm5vZGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG5ld0VuZFZub2RlID0gbmV3Q2hbLS1uZXdFbmRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc2FtZVZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld1N0YXJ0Vm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgcGF0Y2hWbm9kZShvbGRTdGFydFZub2RlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICAgICAgICAgIG9sZFN0YXJ0Vm5vZGUgPSBvbGRDaFsrK29sZFN0YXJ0SWR4XTtcbiAgICAgICAgICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChzYW1lVm5vZGUob2xkRW5kVm5vZGUsIG5ld0VuZFZub2RlKSkge1xuICAgICAgICAgICAgICAgIHBhdGNoVm5vZGUob2xkRW5kVm5vZGUsIG5ld0VuZFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICAgICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdO1xuICAgICAgICAgICAgICAgIG5ld0VuZFZub2RlID0gbmV3Q2hbLS1uZXdFbmRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc2FtZVZub2RlKG9sZFN0YXJ0Vm5vZGUsIG5ld0VuZFZub2RlKSkge1xuICAgICAgICAgICAgICAgIHBhdGNoVm5vZGUob2xkU3RhcnRWbm9kZSwgbmV3RW5kVm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgICAgICAgYXBpLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtLCBhcGkubmV4dFNpYmxpbmcob2xkRW5kVm5vZGUuZWxtKSk7XG4gICAgICAgICAgICAgICAgb2xkU3RhcnRWbm9kZSA9IG9sZENoWysrb2xkU3RhcnRJZHhdO1xuICAgICAgICAgICAgICAgIG5ld0VuZFZub2RlID0gbmV3Q2hbLS1uZXdFbmRJZHhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoc2FtZVZub2RlKG9sZEVuZFZub2RlLCBuZXdTdGFydFZub2RlKSkge1xuICAgICAgICAgICAgICAgIHBhdGNoVm5vZGUob2xkRW5kVm5vZGUsIG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgICAgICAgYXBpLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIG9sZEVuZFZub2RlLmVsbSwgb2xkU3RhcnRWbm9kZS5lbG0pO1xuICAgICAgICAgICAgICAgIG9sZEVuZFZub2RlID0gb2xkQ2hbLS1vbGRFbmRJZHhdO1xuICAgICAgICAgICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChvbGRLZXlUb0lkeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG9sZEtleVRvSWR4ID0gY3JlYXRlS2V5VG9PbGRJZHgob2xkQ2gsIG9sZFN0YXJ0SWR4LCBvbGRFbmRJZHgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZHhJbk9sZCA9IG9sZEtleVRvSWR4W25ld1N0YXJ0Vm5vZGUua2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoaXNVbmRlZihpZHhJbk9sZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXBpLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIGNyZWF0ZUVsbShuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpLCBvbGRTdGFydFZub2RlLmVsbSk7XG4gICAgICAgICAgICAgICAgICAgIG5ld1N0YXJ0Vm5vZGUgPSBuZXdDaFsrK25ld1N0YXJ0SWR4XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGVsbVRvTW92ZSA9IG9sZENoW2lkeEluT2xkXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsbVRvTW92ZS5zZWwgIT09IG5ld1N0YXJ0Vm5vZGUuc2VsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcGkuaW5zZXJ0QmVmb3JlKHBhcmVudEVsbSwgY3JlYXRlRWxtKG5ld1N0YXJ0Vm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSksIG9sZFN0YXJ0Vm5vZGUuZWxtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoVm5vZGUoZWxtVG9Nb3ZlLCBuZXdTdGFydFZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2xkQ2hbaWR4SW5PbGRdID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBpLmluc2VydEJlZm9yZShwYXJlbnRFbG0sIGVsbVRvTW92ZS5lbG0sIG9sZFN0YXJ0Vm5vZGUuZWxtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBuZXdTdGFydFZub2RlID0gbmV3Q2hbKytuZXdTdGFydElkeF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChvbGRTdGFydElkeCA+IG9sZEVuZElkeCkge1xuICAgICAgICAgICAgYmVmb3JlID0gbmV3Q2hbbmV3RW5kSWR4ICsgMV0gPT0gbnVsbCA/IG51bGwgOiBuZXdDaFtuZXdFbmRJZHggKyAxXS5lbG07XG4gICAgICAgICAgICBhZGRWbm9kZXMocGFyZW50RWxtLCBiZWZvcmUsIG5ld0NoLCBuZXdTdGFydElkeCwgbmV3RW5kSWR4LCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5ld1N0YXJ0SWR4ID4gbmV3RW5kSWR4KSB7XG4gICAgICAgICAgICByZW1vdmVWbm9kZXMocGFyZW50RWxtLCBvbGRDaCwgb2xkU3RhcnRJZHgsIG9sZEVuZElkeCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gcGF0Y2hWbm9kZShvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSkge1xuICAgICAgICB2YXIgaSwgaG9vaztcbiAgICAgICAgaWYgKGlzRGVmKGkgPSB2bm9kZS5kYXRhKSAmJiBpc0RlZihob29rID0gaS5ob29rKSAmJiBpc0RlZihpID0gaG9vay5wcmVwYXRjaCkpIHtcbiAgICAgICAgICAgIGkob2xkVm5vZGUsIHZub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgZWxtID0gdm5vZGUuZWxtID0gb2xkVm5vZGUuZWxtO1xuICAgICAgICB2YXIgb2xkQ2ggPSBvbGRWbm9kZS5jaGlsZHJlbjtcbiAgICAgICAgdmFyIGNoID0gdm5vZGUuY2hpbGRyZW47XG4gICAgICAgIGlmIChvbGRWbm9kZSA9PT0gdm5vZGUpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICh2bm9kZS5kYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjYnMudXBkYXRlLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIGNicy51cGRhdGVbaV0ob2xkVm5vZGUsIHZub2RlKTtcbiAgICAgICAgICAgIGkgPSB2bm9kZS5kYXRhLmhvb2s7XG4gICAgICAgICAgICBpZiAoaXNEZWYoaSkgJiYgaXNEZWYoaSA9IGkudXBkYXRlKSlcbiAgICAgICAgICAgICAgICBpKG9sZFZub2RlLCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzVW5kZWYodm5vZGUudGV4dCkpIHtcbiAgICAgICAgICAgIGlmIChpc0RlZihvbGRDaCkgJiYgaXNEZWYoY2gpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9sZENoICE9PSBjaClcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ2hpbGRyZW4oZWxtLCBvbGRDaCwgY2gsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc0RlZihjaCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNEZWYob2xkVm5vZGUudGV4dCkpXG4gICAgICAgICAgICAgICAgICAgIGFwaS5zZXRUZXh0Q29udGVudChlbG0sICcnKTtcbiAgICAgICAgICAgICAgICBhZGRWbm9kZXMoZWxtLCBudWxsLCBjaCwgMCwgY2gubGVuZ3RoIC0gMSwgaW5zZXJ0ZWRWbm9kZVF1ZXVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzRGVmKG9sZENoKSkge1xuICAgICAgICAgICAgICAgIHJlbW92ZVZub2RlcyhlbG0sIG9sZENoLCAwLCBvbGRDaC5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzRGVmKG9sZFZub2RlLnRleHQpKSB7XG4gICAgICAgICAgICAgICAgYXBpLnNldFRleHRDb250ZW50KGVsbSwgJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG9sZFZub2RlLnRleHQgIT09IHZub2RlLnRleHQpIHtcbiAgICAgICAgICAgIGFwaS5zZXRUZXh0Q29udGVudChlbG0sIHZub2RlLnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0RlZihob29rKSAmJiBpc0RlZihpID0gaG9vay5wb3N0cGF0Y2gpKSB7XG4gICAgICAgICAgICBpKG9sZFZub2RlLCB2bm9kZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHBhdGNoKG9sZFZub2RlLCB2bm9kZSkge1xuICAgICAgICB2YXIgaSwgZWxtLCBwYXJlbnQ7XG4gICAgICAgIHZhciBpbnNlcnRlZFZub2RlUXVldWUgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNicy5wcmUubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICBjYnMucHJlW2ldKCk7XG4gICAgICAgIGlmICghaXNWbm9kZShvbGRWbm9kZSkpIHtcbiAgICAgICAgICAgIG9sZFZub2RlID0gZW1wdHlOb2RlQXQob2xkVm5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzYW1lVm5vZGUob2xkVm5vZGUsIHZub2RlKSkge1xuICAgICAgICAgICAgcGF0Y2hWbm9kZShvbGRWbm9kZSwgdm5vZGUsIGluc2VydGVkVm5vZGVRdWV1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBlbG0gPSBvbGRWbm9kZS5lbG07XG4gICAgICAgICAgICBwYXJlbnQgPSBhcGkucGFyZW50Tm9kZShlbG0pO1xuICAgICAgICAgICAgY3JlYXRlRWxtKHZub2RlLCBpbnNlcnRlZFZub2RlUXVldWUpO1xuICAgICAgICAgICAgaWYgKHBhcmVudCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGFwaS5pbnNlcnRCZWZvcmUocGFyZW50LCB2bm9kZS5lbG0sIGFwaS5uZXh0U2libGluZyhlbG0pKTtcbiAgICAgICAgICAgICAgICByZW1vdmVWbm9kZXMocGFyZW50LCBbb2xkVm5vZGVdLCAwLCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5zZXJ0ZWRWbm9kZVF1ZXVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpbnNlcnRlZFZub2RlUXVldWVbaV0uZGF0YS5ob29rLmluc2VydChpbnNlcnRlZFZub2RlUXVldWVbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjYnMucG9zdC5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgIGNicy5wb3N0W2ldKCk7XG4gICAgICAgIHJldHVybiB2bm9kZTtcbiAgICB9O1xufVxuZXhwb3J0cy5pbml0ID0gaW5pdDtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNuYWJiZG9tLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xudmFyIGhfMSA9IHJlcXVpcmUoXCIuL2hcIik7XG5mdW5jdGlvbiBjb3B5VG9UaHVuayh2bm9kZSwgdGh1bmspIHtcbiAgICB0aHVuay5lbG0gPSB2bm9kZS5lbG07XG4gICAgdm5vZGUuZGF0YS5mbiA9IHRodW5rLmRhdGEuZm47XG4gICAgdm5vZGUuZGF0YS5hcmdzID0gdGh1bmsuZGF0YS5hcmdzO1xuICAgIHRodW5rLmRhdGEgPSB2bm9kZS5kYXRhO1xuICAgIHRodW5rLmNoaWxkcmVuID0gdm5vZGUuY2hpbGRyZW47XG4gICAgdGh1bmsudGV4dCA9IHZub2RlLnRleHQ7XG4gICAgdGh1bmsuZWxtID0gdm5vZGUuZWxtO1xufVxuZnVuY3Rpb24gaW5pdCh0aHVuaykge1xuICAgIHZhciBjdXIgPSB0aHVuay5kYXRhO1xuICAgIHZhciB2bm9kZSA9IGN1ci5mbi5hcHBseSh1bmRlZmluZWQsIGN1ci5hcmdzKTtcbiAgICBjb3B5VG9UaHVuayh2bm9kZSwgdGh1bmspO1xufVxuZnVuY3Rpb24gcHJlcGF0Y2gob2xkVm5vZGUsIHRodW5rKSB7XG4gICAgdmFyIGksIG9sZCA9IG9sZFZub2RlLmRhdGEsIGN1ciA9IHRodW5rLmRhdGE7XG4gICAgdmFyIG9sZEFyZ3MgPSBvbGQuYXJncywgYXJncyA9IGN1ci5hcmdzO1xuICAgIGlmIChvbGQuZm4gIT09IGN1ci5mbiB8fCBvbGRBcmdzLmxlbmd0aCAhPT0gYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY29weVRvVGh1bmsoY3VyLmZuLmFwcGx5KHVuZGVmaW5lZCwgYXJncyksIHRodW5rKTtcbiAgICB9XG4gICAgZm9yIChpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKG9sZEFyZ3NbaV0gIT09IGFyZ3NbaV0pIHtcbiAgICAgICAgICAgIGNvcHlUb1RodW5rKGN1ci5mbi5hcHBseSh1bmRlZmluZWQsIGFyZ3MpLCB0aHVuayk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29weVRvVGh1bmsob2xkVm5vZGUsIHRodW5rKTtcbn1cbmV4cG9ydHMudGh1bmsgPSBmdW5jdGlvbiB0aHVuayhzZWwsIGtleSwgZm4sIGFyZ3MpIHtcbiAgICBpZiAoYXJncyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFyZ3MgPSBmbjtcbiAgICAgICAgZm4gPSBrZXk7XG4gICAgICAgIGtleSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIGhfMS5oKHNlbCwge1xuICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgaG9vazogeyBpbml0OiBpbml0LCBwcmVwYXRjaDogcHJlcGF0Y2ggfSxcbiAgICAgICAgZm46IGZuLFxuICAgICAgICBhcmdzOiBhcmdzXG4gICAgfSk7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gZXhwb3J0cy50aHVuaztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRodW5rLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuZnVuY3Rpb24gdm5vZGUoc2VsLCBkYXRhLCBjaGlsZHJlbiwgdGV4dCwgZWxtKSB7XG4gICAgdmFyIGtleSA9IGRhdGEgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IGRhdGEua2V5O1xuICAgIHJldHVybiB7IHNlbDogc2VsLCBkYXRhOiBkYXRhLCBjaGlsZHJlbjogY2hpbGRyZW4sXG4gICAgICAgIHRleHQ6IHRleHQsIGVsbTogZWxtLCBrZXk6IGtleSB9O1xufVxuZXhwb3J0cy52bm9kZSA9IHZub2RlO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kZWZhdWx0ID0gdm5vZGU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD12bm9kZS5qcy5tYXAiXX0=\n"]}