@mml-io/networked-dom-web-runner 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/index.js +1 -1
- package/package.json +2 -2
package/build/index.js
CHANGED
|
@@ -29,7 +29,7 @@ module.exports = __toCommonJS(src_exports);
|
|
|
29
29
|
__reExport(src_exports, require("@mml-io/networked-dom-document"), module.exports);
|
|
30
30
|
|
|
31
31
|
// runner-iframe-js-text-namespace:/Users/marcuslongmuir/workspace/mml/packages/networked-dom-web-runner/networked-dom-web-runner-iframe/build/index.js
|
|
32
|
-
var build_default = 'var __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b ||= {})\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\n\n// ../../observable-dom/src/utils.ts\nfunction virtualDomElementToStatic(el) {\n return {\n nodeId: el.nodeId,\n tag: el.tag,\n attributes: el.attributes,\n childNodes: el.childNodes.map((child) => virtualDomElementToStatic(child)),\n textContent: el.textContent\n };\n}\n\n// ../../observable-dom/src/ObservableDom.ts\nvar ObservableDom = class {\n constructor(observableDOMParameters, callback, runnerFactory) {\n this.nodeToNodeId = /* @__PURE__ */ new Map();\n this.nodeIdToNode = /* @__PURE__ */ new Map();\n this.realElementToVirtualElement = /* @__PURE__ */ new Map();\n this.ignoreTextNodes = true;\n this.nextNodeId = 1;\n this.htmlPath = observableDOMParameters.htmlPath;\n this.ignoreTextNodes = observableDOMParameters.ignoreTextNodes;\n this.callback = callback;\n this.documentTimeIntervalTimer = setInterval(() => {\n this.callback({\n documentTime: this.getDocumentTime()\n });\n }, observableDOMParameters.pingIntervalMilliseconds || 5e3);\n this.domRunner = runnerFactory(\n observableDOMParameters.htmlPath,\n observableDOMParameters.htmlContents,\n observableDOMParameters.params,\n (domRunnerMessage) => {\n if (domRunnerMessage.loaded) {\n this.createVirtualDomElementWithChildren(\n this.domRunner.getDocument(),\n null\n );\n const snapshot = virtualDomElementToStatic(\n this.getVirtualDomElementForRealElementOrThrow(\n this.domRunner.getDocument()\n )\n );\n this.callback({\n snapshot,\n documentTime: this.getDocumentTime()\n });\n } else if (domRunnerMessage.mutationList) {\n this.processModificationList(domRunnerMessage.mutationList);\n } else if (domRunnerMessage.logMessage) {\n this.callback({\n logMessage: domRunnerMessage.logMessage,\n documentTime: this.getDocumentTime()\n });\n }\n }\n );\n }\n addIPCWebsocket(webSocket) {\n return this.domRunner.addIPCWebsocket(webSocket);\n }\n addConnectedUserId(connectionId) {\n this.domRunner.getWindow().dispatchEvent(\n new (this.domRunner.getWindow()).CustomEvent("connected", {\n detail: { connectionId }\n })\n );\n }\n removeConnectedUserId(connectionId) {\n this.domRunner.getWindow().dispatchEvent(\n new (this.domRunner.getWindow()).CustomEvent("disconnected", {\n detail: { connectionId }\n })\n );\n }\n processModificationList(mutationList) {\n const documentEl = this.domRunner.getDocument();\n const documentVirtualDomElement = this.realElementToVirtualElement.get(documentEl);\n if (!documentVirtualDomElement) {\n throw new Error(`document not created in processModificationList`);\n }\n if (mutationList.length > 1) {\n console.error(\n "More than one mutation record received. It is possible that intermediate states are incorrect."\n );\n }\n for (const mutation of mutationList) {\n if (this.isIgnoredElement(mutation.target)) {\n continue;\n }\n if (mutation.type === "attributes" && // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.isIgnoredAttribute(mutation.target, mutation.attributeName)) {\n continue;\n }\n this.addKnownNodesInMutation(mutation);\n const firstNonIgnoredPreviousSibling = mutation.previousSibling ? this.getFirstNonIgnoredPreviousSibling(mutation.previousSibling) : null;\n const targetElement = this.getVirtualDomElementForRealElementOrThrow(\n mutation.target\n );\n const addedNodes = [];\n for (const node of mutation.addedNodes) {\n if (this.isIgnoredElement(node)) {\n continue;\n }\n const virtualDomElement = this.getVirtualDomElementForRealElementOrThrow(\n node\n );\n addedNodes.push(virtualDomElementToStatic(virtualDomElement));\n }\n const removedNodeIds = [];\n for (const node of mutation.removedNodes) {\n if (this.isIgnoredElement(node)) {\n continue;\n }\n const virtualDomElement = this.getVirtualDomElementForRealElementOrThrow(\n node\n );\n removedNodeIds.push(virtualDomElement.nodeId);\n }\n const mutationRecord = {\n type: mutation.type,\n targetId: targetElement.nodeId,\n addedNodes,\n removedNodeIds,\n previousSiblingId: firstNonIgnoredPreviousSibling !== null ? this.getVirtualDomElementForRealElementOrThrow(firstNonIgnoredPreviousSibling).nodeId : null,\n attribute: mutation.attributeName ? {\n attributeName: mutation.attributeName,\n value: mutation.target.getAttribute(mutation.attributeName)\n } : null\n };\n this.callback({\n mutation: mutationRecord,\n documentTime: this.getDocumentTime()\n });\n this.removeKnownNodesInMutation(mutation);\n }\n }\n addKnownNodesInMutation(mutation) {\n const targetNode = mutation.target;\n const virtualDomElement = this.realElementToVirtualElement.get(targetNode);\n if (!virtualDomElement) {\n throw new Error(\n "Unknown node in addKnownNodesInMutation:" + targetNode + "," + mutation.type\n );\n }\n if (mutation.type === "childList") {\n let previousSibling = mutation.previousSibling;\n let index = 0;\n while (previousSibling && this.isIgnoredElement(previousSibling)) {\n previousSibling = previousSibling.previousSibling;\n }\n if (previousSibling) {\n const previousSiblingElement = this.realElementToVirtualElement.get(\n previousSibling\n );\n if (!previousSiblingElement) {\n throw new Error("Unknown previous sibling");\n }\n index = virtualDomElement.childNodes.indexOf(previousSiblingElement);\n if (index === -1) {\n throw new Error("Previous sibling is not currently a child of the parent element");\n }\n index += 1;\n }\n mutation.addedNodes.forEach((node) => {\n const asElementOrText = node;\n const childVirtualDomElement = this.createVirtualDomElementWithChildren(\n asElementOrText,\n virtualDomElement\n );\n if (childVirtualDomElement) {\n if (virtualDomElement.childNodes.indexOf(childVirtualDomElement) === -1) {\n virtualDomElement.childNodes.splice(index, 0, childVirtualDomElement);\n index++;\n }\n }\n });\n } else if (mutation.type === "attributes") {\n const attributeName = mutation.attributeName;\n if (this.isIgnoredAttribute(targetNode, attributeName)) {\n return;\n }\n const attributeValue = targetNode.getAttribute(attributeName);\n if (attributeValue === null) {\n delete virtualDomElement.attributes[attributeName];\n } else {\n virtualDomElement.attributes[attributeName] = attributeValue;\n }\n } else if (mutation.type === "characterData") {\n virtualDomElement.textContent = targetNode.textContent ? targetNode.textContent : void 0;\n }\n }\n removeKnownNodesInMutation(mutation) {\n const targetNode = mutation.target;\n const virtualDomElement = this.realElementToVirtualElement.get(targetNode);\n if (!virtualDomElement) {\n throw new Error("Unknown node in mutation list:" + targetNode + ", " + mutation.type);\n }\n if (mutation.type === "childList") {\n for (const node of mutation.removedNodes) {\n const asElementOrText = node;\n if (this.isIgnoredElement(asElementOrText)) {\n continue;\n }\n const childDomElement = this.realElementToVirtualElement.get(asElementOrText);\n if (!childDomElement) {\n console.warn(this.htmlPath, "Unknown node in removeKnownNodesInMutation");\n continue;\n } else {\n this.removeVirtualDomElement(childDomElement);\n const index = virtualDomElement.childNodes.indexOf(childDomElement);\n virtualDomElement.childNodes.splice(index, 1);\n }\n }\n return;\n }\n }\n removeVirtualDomElement(virtualDomElement) {\n this.nodeIdToNode.delete(virtualDomElement.nodeId);\n this.nodeToNodeId.delete(virtualDomElement);\n this.realElementToVirtualElement.delete(virtualDomElement.realElement);\n for (const child of virtualDomElement.childNodes) {\n this.removeVirtualDomElement(child);\n }\n }\n createVirtualDomElementWithChildren(node, parent) {\n const virtualElement = this.createVirtualDomElement(node, parent);\n if (!virtualElement) {\n return null;\n }\n if (node.childNodes) {\n for (let i = 0; i < node.childNodes.length; i++) {\n const child = node.childNodes[i];\n const childVirtualElement = this.createVirtualDomElementWithChildren(\n child,\n virtualElement\n );\n if (childVirtualElement) {\n virtualElement.childNodes.push(childVirtualElement);\n }\n }\n }\n return virtualElement;\n }\n createVirtualDomElement(node, parent) {\n if (this.isIgnoredElement(node)) {\n return null;\n }\n const existingValue = this.realElementToVirtualElement.get(node);\n if (existingValue !== void 0) {\n throw new Error("Node already has a virtual element: " + node.nodeName);\n }\n if (!node) {\n throw new Error("Cannot assign node id to null");\n }\n const attributes = {};\n if (node.attributes) {\n const asHTMLElement = node;\n for (const key of asHTMLElement.getAttributeNames()) {\n const value = asHTMLElement.getAttribute(key);\n if (value === null) {\n throw new Error("Null attribute value for key: " + key);\n }\n if (!this.isIgnoredAttribute(node, key)) {\n attributes[key] = value;\n }\n }\n }\n const nodeId = this.nextNodeId++;\n const virtualElement = {\n nodeId,\n tag: node.nodeName,\n attributes,\n childNodes: [],\n realElement: node,\n parent\n };\n if (node instanceof this.domRunner.getWindow().Text && node.textContent) {\n virtualElement.textContent = node.textContent;\n }\n this.nodeToNodeId.set(virtualElement, nodeId);\n this.nodeIdToNode.set(nodeId, virtualElement);\n this.realElementToVirtualElement.set(node, virtualElement);\n return virtualElement;\n }\n getFirstNonIgnoredPreviousSibling(node) {\n let currentNode = node;\n if (!this.isIgnoredElement(currentNode)) {\n return currentNode;\n }\n while (currentNode && currentNode.previousSibling) {\n currentNode = currentNode.previousSibling;\n if (!this.isIgnoredElement(currentNode)) {\n return currentNode;\n }\n }\n return null;\n }\n getVirtualDomElementForRealElementOrThrow(realElement) {\n const virtualElement = this.realElementToVirtualElement.get(realElement);\n if (!virtualElement) {\n throw new Error(`Virtual element not found for real element`);\n }\n return virtualElement;\n }\n isIgnoredElement(node) {\n if (this.ignoreTextNodes && node instanceof this.domRunner.getWindow().Text) {\n return true;\n } else if (node instanceof this.domRunner.getWindow().HTMLScriptElement) {\n return true;\n } else if (node instanceof this.domRunner.getWindow().Comment) {\n return true;\n }\n return false;\n }\n isIgnoredAttribute(node, attributeName) {\n return attributeName.startsWith("on");\n }\n dispatchRemoteEventFromConnectionId(connectionId, remoteEvent) {\n const domNode = this.nodeIdToNode.get(remoteEvent.nodeId);\n if (!domNode) {\n console.error("Unknown node ID in remote event: " + remoteEvent.nodeId);\n return;\n }\n if (domNode instanceof this.domRunner.getWindow().Text) {\n console.warn("Cannot dispatch remote event to text node");\n return;\n }\n this.domRunner.dispatchRemoteEventFromConnectionId(\n connectionId,\n domNode.realElement,\n remoteEvent\n );\n }\n dispose() {\n clearInterval(this.documentTimeIntervalTimer);\n this.domRunner.dispose();\n }\n getDocumentTime() {\n return this.domRunner.getDocumentTime();\n }\n};\n\n// src/WebBrowserDOMRunner.ts\nvar WebBrowserDOMRunnerFactory = (htmlPath, htmlContents, params, callback) => {\n return new WebBrowserDOMRunner(htmlPath, htmlContents, params, callback);\n};\nvar documentLoadTime = Date.now();\nvar WebBrowserDOMRunner = class {\n constructor(htmlPath, htmlContents, params, callback) {\n this.htmlPath = htmlPath;\n this.callback = callback;\n let didSendLoad = false;\n this.mutationObserver = new window.MutationObserver((mutationList) => {\n if (!document) {\n return;\n }\n if (!didSendLoad) {\n throw new Error("MutationObserver called before load");\n }\n this.callback({\n mutationList\n });\n });\n window.params = params;\n const finishLoad = () => {\n if (didSendLoad) {\n throw new Error("finishLoad called twice");\n }\n didSendLoad = true;\n this.callback({\n loaded: true\n });\n this.mutationObserver.observe(window.document, {\n attributes: true,\n childList: true,\n subtree: true,\n characterData: true\n });\n };\n if (document.body) {\n setTimeout(finishLoad, 0);\n } else {\n window.addEventListener("DOMContentLoaded", finishLoad);\n }\n }\n addIPCWebsocket() {\n throw new Error("Not implemented.");\n }\n dispatchRemoteEventFromConnectionId(connectionId, realElement, remoteEvent) {\n const bubbles = remoteEvent.bubbles || false;\n const remoteEventObject = new CustomEvent(remoteEvent.name, {\n bubbles,\n detail: __spreadProps(__spreadValues({}, remoteEvent.params), { connectionId })\n });\n realElement.dispatchEvent(remoteEventObject);\n }\n dispose() {\n console.log("WebBrowserDOMRunner.dispose");\n }\n getDocument() {\n return document;\n }\n getDocumentTime() {\n if (document.timeline && document.timeline.currentTime) {\n return document.timeline.currentTime;\n }\n return Date.now() - documentLoadTime;\n }\n // TODO - resolve types (Window needs to expose classes such as CustomEvent as properties)\n getWindow() {\n return window;\n }\n};\n\n// src/IframeWebRunner.ts\nfunction setupIframeWebRunner(argsString) {\n const observableDOMParams = JSON.parse(atob(argsString));\n const sendMessageToHandler = (message) => {\n window.parent.postMessage(JSON.stringify(message), "*");\n };\n const observableDOM = new ObservableDom(\n __spreadProps(__spreadValues({}, observableDOMParams), {\n htmlContents: ""\n // This must be empty as the contents are assumed to be provided by the srcdoc\n }),\n (observableDomMessage) => {\n sendMessageToHandler({\n type: "dom",\n message: observableDomMessage\n });\n },\n WebBrowserDOMRunnerFactory\n );\n window.addEventListener("message", (e) => {\n const parsed = JSON.parse(e.data);\n if (parsed.type === "dispatchRemoteEventFromConnectionId") {\n observableDOM.dispatchRemoteEventFromConnectionId(parsed.connectionId, parsed.event);\n }\n });\n}\n\n// src/index.ts\nvar args = window.args;\nsetupIframeWebRunner(args);\n//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vb2JzZXJ2YWJsZS1kb20vc3JjL3V0aWxzLnRzIiwgIi4uLy4uLy4uL29ic2VydmFibGUtZG9tL3NyYy9PYnNlcnZhYmxlRG9tLnRzIiwgIi4uL3NyYy9XZWJCcm93c2VyRE9NUnVubmVyLnRzIiwgIi4uL3NyYy9JZnJhbWVXZWJSdW5uZXIudHMiLCAiLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBTdGF0aWNWaXJ0dWFsRG9tRWxlbWVudCB9IGZyb20gXCJAbW1sLWlvL29ic2VydmFibGUtZG9tLWNvbW1vblwiO1xuXG5pbXBvcnQgeyBMaXZlVmlydHVhbERvbUVsZW1lbnQgfSBmcm9tIFwiLi9PYnNlcnZhYmxlRG9tXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXJ0dWFsRG9tRWxlbWVudFRvU3RhdGljKGVsOiBMaXZlVmlydHVhbERvbUVsZW1lbnQpOiBTdGF0aWNWaXJ0dWFsRG9tRWxlbWVudCB7XG4gIHJldHVybiB7XG4gICAgbm9kZUlkOiBlbC5ub2RlSWQsXG4gICAgdGFnOiBlbC50YWcsXG4gICAgYXR0cmlidXRlczogZWwuYXR0cmlidXRlcyxcbiAgICBjaGlsZE5vZGVzOiBlbC5jaGlsZE5vZGVzLm1hcCgoY2hpbGQpID0+IHZpcnR1YWxEb21FbGVtZW50VG9TdGF0aWMoY2hpbGQpKSxcbiAgICB0ZXh0Q29udGVudDogZWwudGV4dENvbnRlbnQsXG4gIH07XG59XG4iLCAiaW1wb3J0IHtcbiAgTG9nTWVzc2FnZSxcbiAgT2JzZXJ2YWJsZURvbUludGVyZmFjZSxcbiAgT2JzZXJ2YWJsZURvbU1lc3NhZ2UsXG4gIE9ic2VydmFibGVET01QYXJhbWV0ZXJzLFxuICBSZW1vdGVFdmVudCxcbiAgU3RhdGljVmlydHVhbERvbUVsZW1lbnQsXG4gIFN0YXRpY1ZpcnR1YWxEb21NdXRhdGlvbklkc1JlY29yZCxcbn0gZnJvbSBcIkBtbWwtaW8vb2JzZXJ2YWJsZS1kb20tY29tbW9uXCI7XG5cbmltcG9ydCB7IHZpcnR1YWxEb21FbGVtZW50VG9TdGF0aWMgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgdHlwZSBET01SdW5uZXJNZXNzYWdlID0ge1xuICBsb2FkZWQ/OiBib29sZWFuO1xuICBtdXRhdGlvbkxpc3Q/OiBBcnJheTxNdXRhdGlvblJlY29yZD47XG4gIGxvZ01lc3NhZ2U/OiBMb2dNZXNzYWdlO1xufTtcblxuZXhwb3J0IHR5cGUgRE9NUnVubmVySW50ZXJmYWNlID0ge1xuICBnZXREb2N1bWVudCgpOiBEb2N1bWVudDtcbiAgZ2V0V2luZG93KCk6IFdpbmRvdyAmIHtcbiAgICBDdXN0b21FdmVudDogdHlwZW9mIEN1c3RvbUV2ZW50O1xuICAgIFRleHQ6IHR5cGVvZiBUZXh0O1xuICAgIEhUTUxTY3JpcHRFbGVtZW50OiB0eXBlb2YgSFRNTFNjcmlwdEVsZW1lbnQ7XG4gICAgQ29tbWVudDogdHlwZW9mIENvbW1lbnQ7XG4gIH07IC8vIFRPRE8gLSBEZWZpbmUgdGhpcyB3aXRob3V0IHVzaW5nIEpTRE9NIHR5cGVzXG4gIGFkZElQQ1dlYnNvY2tldCh3ZWJTb2NrZXQ6IFdlYlNvY2tldCk6IHZvaWQ7XG4gIGRpc3BhdGNoUmVtb3RlRXZlbnRGcm9tQ29ubmVjdGlvbklkKFxuICAgIGNvbm5lY3Rpb25JZDogbnVtYmVyLFxuICAgIHJlYWxFbGVtZW50OiBFbGVtZW50LFxuICAgIHJlbW90ZUV2ZW50OiBSZW1vdGVFdmVudCxcbiAgKTogdm9pZDtcbiAgZGlzcG9zZSgpOiB2b2lkO1xuICBnZXREb2N1bWVudFRpbWUoKTogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgRE9NUnVubmVyRmFjdG9yeSA9IChcbiAgaHRtbFBhdGg6IHN0cmluZyxcbiAgaHRtbENvbnRlbnRzOiBzdHJpbmcsXG4gIHBhcmFtczogb2JqZWN0LFxuICBjYWxsYmFjazogKGRvbVJ1bm5lck1lc3NhZ2U6IERPTVJ1bm5lck1lc3NhZ2UpID0+IHZvaWQsXG4pID0+IERPTVJ1bm5lckludGVyZmFjZTtcblxuZXhwb3J0IHR5cGUgTGl2ZVZpcnR1YWxEb21FbGVtZW50ID0gT21pdDxTdGF0aWNWaXJ0dWFsRG9tRWxlbWVudCwgXCJjaGlsZE5vZGVzXCI+ICYge1xuICByZWFsRWxlbWVudDogRWxlbWVudCB8IFRleHQ7XG4gIGNoaWxkTm9kZXM6IEFycmF5PExpdmVWaXJ0dWFsRG9tRWxlbWVudD47XG4gIHBhcmVudDogTGl2ZVZpcnR1YWxEb21FbGVtZW50IHwgbnVsbDtcbn07XG5cbmV4cG9ydCBjbGFzcyBPYnNlcnZhYmxlRG9tIGltcGxlbWVudHMgT2JzZXJ2YWJsZURvbUludGVyZmFjZSB7XG4gIHByaXZhdGUgbm9kZVRvTm9kZUlkID0gbmV3IE1hcDxMaXZlVmlydHVhbERvbUVsZW1lbnQsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSBub2RlSWRUb05vZGUgPSBuZXcgTWFwPG51bWJlciwgTGl2ZVZpcnR1YWxEb21FbGVtZW50PigpO1xuICBwcml2YXRlIHJlYWxFbGVtZW50VG9WaXJ0dWFsRWxlbWVudCA9IG5ldyBNYXA8RWxlbWVudCB8IFRleHQsIExpdmVWaXJ0dWFsRG9tRWxlbWVudD4oKTtcbiAgcHJpdmF0ZSBpZ25vcmVUZXh0Tm9kZXMgPSB0cnVlO1xuICBwcml2YXRlIGNhbGxiYWNrOiAobWVzc2FnZTogT2JzZXJ2YWJsZURvbU1lc3NhZ2UpID0+IHZvaWQ7XG4gIHByaXZhdGUgbmV4dE5vZGVJZCA9IDE7XG4gIHByaXZhdGUgaHRtbFBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSBkb21SdW5uZXI6IERPTVJ1bm5lckludGVyZmFjZTtcblxuICBwcml2YXRlIGRvY3VtZW50VGltZUludGVydmFsVGltZXI6IE5vZGVKUy5UaW1lcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBvYnNlcnZhYmxlRE9NUGFyYW1ldGVyczogT2JzZXJ2YWJsZURPTVBhcmFtZXRlcnMsXG4gICAgY2FsbGJhY2s6IChtZXNzYWdlOiBPYnNlcnZhYmxlRG9tTWVzc2FnZSkgPT4gdm9pZCxcbiAgICBydW5uZXJGYWN0b3J5OiBET01SdW5uZXJGYWN0b3J5LFxuICApIHtcbiAgICB0aGlzLmh0bWxQYXRoID0gb2JzZXJ2YWJsZURPTVBhcmFtZXRlcnMuaHRtbFBhdGg7XG4gICAgdGhpcy5pZ25vcmVUZXh0Tm9kZXMgPSBvYnNlcnZhYmxlRE9NUGFyYW1ldGVycy5pZ25vcmVUZXh0Tm9kZXM7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgdGhpcy5kb2N1bWVudFRpbWVJbnRlcnZhbFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5jYWxsYmFjayh7XG4gICAgICAgIGRvY3VtZW50VGltZTogdGhpcy5nZXREb2N1bWVudFRpbWUoKSxcbiAgICAgIH0pO1xuICAgIH0sIG9ic2VydmFibGVET01QYXJhbWV0ZXJzLnBpbmdJbnRlcnZhbE1pbGxpc2Vjb25kcyB8fCA1MDAwKTtcblxuICAgIHRoaXMuZG9tUnVubmVyID0gcnVubmVyRmFjdG9yeShcbiAgICAgIG9ic2VydmFibGVET01QYXJhbWV0ZXJzLmh0bWxQYXRoLFxuICAgICAgb2JzZXJ2YWJsZURPTVBhcmFtZXRlcnMuaHRtbENvbnRlbnRzLFxuICAgICAgb2JzZXJ2YWJsZURPTVBhcmFtZXRlcnMucGFyYW1zLFxuICAgICAgKGRvbVJ1bm5lck1lc3NhZ2U6IERPTVJ1bm5lck1lc3NhZ2UpID0+IHtcbiAgICAgICAgaWYgKGRvbVJ1bm5lck1lc3NhZ2UubG9hZGVkKSB7XG4gICAgICAgICAgdGhpcy5jcmVhdGVWaXJ0dWFsRG9tRWxlbWVudFdpdGhDaGlsZHJlbihcbiAgICAgICAgICAgIHRoaXMuZG9tUnVubmVyLmdldERvY3VtZW50KCkgYXMgdW5rbm93biBhcyBFbGVtZW50LFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3Qgc25hcHNob3QgPSB2aXJ0dWFsRG9tRWxlbWVudFRvU3RhdGljKFxuICAgICAgICAgICAgdGhpcy5nZXRWaXJ0dWFsRG9tRWxlbWVudEZvclJlYWxFbGVtZW50T3JUaHJvdyhcbiAgICAgICAgICAgICAgdGhpcy5kb21SdW5uZXIuZ2V0RG9jdW1lbnQoKSBhcyB1bmtub3duIGFzIEVsZW1lbnQsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB0aGlzLmNhbGxiYWNrKHtcbiAgICAgICAgICAgIHNuYXBzaG90LFxuICAgICAgICAgICAgZG9jdW1lbnRUaW1lOiB0aGlzLmdldERvY3VtZW50VGltZSgpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGRvbVJ1bm5lck1lc3NhZ2UubXV0YXRpb25MaXN0KSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzTW9kaWZpY2F0aW9uTGlzdChkb21SdW5uZXJNZXNzYWdlLm11dGF0aW9uTGlzdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZG9tUnVubmVyTWVzc2FnZS5sb2dNZXNzYWdlKSB7XG4gICAgICAgICAgdGhpcy5jYWxsYmFjayh7XG4gICAgICAgICAgICBsb2dNZXNzYWdlOiBkb21SdW5uZXJNZXNzYWdlLmxvZ01lc3NhZ2UsXG4gICAgICAgICAgICBkb2N1bWVudFRpbWU6IHRoaXMuZ2V0RG9jdW1lbnRUaW1lKCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRJUENXZWJzb2NrZXQod2ViU29ja2V0OiBXZWJTb2NrZXQpIHtcbiAgICByZXR1cm4gdGhpcy5kb21SdW5uZXIuYWRkSVBDV2Vic29ja2V0KHdlYlNvY2tldCk7XG4gIH1cblxuICBwdWJsaWMgYWRkQ29ubmVjdGVkVXNlcklkKGNvbm5lY3Rpb25JZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5kb21SdW5uZXIuZ2V0V2luZG93KCkuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyAodGhpcy5kb21SdW5uZXIuZ2V0V2luZG93KCkuQ3VzdG9tRXZlbnQpKFwiY29ubmVjdGVkXCIsIHtcbiAgICAgICAgZGV0YWlsOiB7IGNvbm5lY3Rpb25JZCB9LFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVDb25uZWN0ZWRVc2VySWQoY29ubmVjdGlvbklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmRvbVJ1bm5lci5nZXRXaW5kb3coKS5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3ICh0aGlzLmRvbVJ1bm5lci5nZXRXaW5kb3coKS5DdXN0b21FdmVudCkoXCJkaXNjb25uZWN0ZWRcIiwge1xuICAgICAgICBkZXRhaWw6IHsgY29ubmVjdGlvbklkIH0sXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzTW9kaWZpY2F0aW9uTGlzdChtdXRhdGlvbkxpc3Q6IEFycmF5PE11dGF0aW9uUmVjb3JkPik6IHZvaWQge1xuICAgIGNvbnN0IGRvY3VtZW50RWwgPSB0aGlzLmRvbVJ1bm5lci5nZXREb2N1bWVudCgpIGFzIHVua25vd24gYXMgRWxlbWVudDtcbiAgICBjb25zdCBkb2N1bWVudFZpcnR1YWxEb21FbGVtZW50ID0gdGhpcy5yZWFsRWxlbWVudFRvVmlydHVhbEVsZW1lbnQuZ2V0KGRvY3VtZW50RWwpO1xuICAgIGlmICghZG9jdW1lbnRWaXJ0dWFsRG9tRWxlbWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBkb2N1bWVudCBub3QgY3JlYXRlZCBpbiBwcm9jZXNzTW9kaWZpY2F0aW9uTGlzdGApO1xuICAgIH1cblxuICAgIGlmIChtdXRhdGlvbkxpc3QubGVuZ3RoID4gMSkge1xuICAgICAgLy8gVE9ETyAtIHdhbGsgYmFjayB0aHJvdWdoIHRoZSByZWNvcmRzIHRvIGRlcml2ZSB0aGUgaW50ZXJtZWRpYXRlIHN0YXRlcyAoZS5nLiBpZiBhbiBhdHRyaWJ1dGUgaXMgbGF0ZXIgYWRkZWQgdG9cbiAgICAgIC8vICBhbiBlbGVtZW50IGNyZWF0ZWQgaW4gYW4gZWFybGllciByZWNvcmQgdGhlbiBpdCBzaG91bGQgbm90IGhhdmUgdGhhdCBhdHRyaWJ1dGUgd2hlbiB0aGUgZWxlbWVudCBpcyBhZGRlZC5cbiAgICAgIC8vICBUaGlzIGlzIGltcG9ydGFudCBhcyBpbmNvcnJlY3QgYXR0cmlidXRlIHNldHMgY2FuIGFmZmVjdCB2aXNpYmlsaXR5IGFuZCBleHBlY3RlZCBjbGllbnQgcGVyZm9ybWFuY2UuXG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBcIk1vcmUgdGhhbiBvbmUgbXV0YXRpb24gcmVjb3JkIHJlY2VpdmVkLiBJdCBpcyBwb3NzaWJsZSB0aGF0IGludGVybWVkaWF0ZSBzdGF0ZXMgYXJlIGluY29ycmVjdC5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBtdXRhdGlvbiBvZiBtdXRhdGlvbkxpc3QpIHtcbiAgICAgIGlmICh0aGlzLmlzSWdub3JlZEVsZW1lbnQobXV0YXRpb24udGFyZ2V0IGFzIEVsZW1lbnQgfCBUZXh0KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBtdXRhdGlvbi50eXBlID09PSBcImF0dHJpYnV0ZXNcIiAmJlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICB0aGlzLmlzSWdub3JlZEF0dHJpYnV0ZShtdXRhdGlvbi50YXJnZXQgYXMgRWxlbWVudCB8IFRleHQsIG11dGF0aW9uLmF0dHJpYnV0ZU5hbWUhKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFkZEtub3duTm9kZXNJbk11dGF0aW9uKG11dGF0aW9uKTtcblxuICAgICAgLy8gQ29udmVydCB0aGUgXCJyZWFsXCIgRE9NIE11dGF0aW9uUmVjb3JkIGludG8gYSBcInZpcnR1YWxcIiBET00gTXV0YXRpb25SZWNvcmQgdGhhdCByZWZlcmVuY2VzIHRoZSBWaXJ0dWFsRE9NRWxlbWVudHNcbiAgICAgIC8vIFRoaXMgaXMgZG9uZSBzbyB0aGF0IHRoZSBzYW1lIHByb2Nlc3MgZm9yIGhhbmRsaW5nIG11dGF0aW9ucyBjYW4gYmUgdXNlZCBmb3IgYm90aCBjaGFuZ2VzIHRvIGEgbGl2ZSBET00gYW5kIGFsc29cbiAgICAgIC8vIHRvIGRpZmZzIGJldHdlZW4gRE9NIHNuYXBzaG90cyB3aGVuIHJlbG9hZGluZ1xuICAgICAgY29uc3QgZmlyc3ROb25JZ25vcmVkUHJldmlvdXNTaWJsaW5nID0gbXV0YXRpb24ucHJldmlvdXNTaWJsaW5nXG4gICAgICAgID8gdGhpcy5nZXRGaXJzdE5vbklnbm9yZWRQcmV2aW91c1NpYmxpbmcobXV0YXRpb24ucHJldmlvdXNTaWJsaW5nIGFzIEVsZW1lbnQgfCBUZXh0KVxuICAgICAgICA6IG51bGw7XG4gICAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gdGhpcy5nZXRWaXJ0dWFsRG9tRWxlbWVudEZvclJlYWxFbGVtZW50T3JUaHJvdyhcbiAgICAgICAgbXV0YXRpb24udGFyZ2V0IGFzIEVsZW1lbnQgfCBUZXh0LFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGFkZGVkTm9kZXM6IEFycmF5PFN0YXRpY1ZpcnR1YWxEb21FbGVtZW50PiA9IFtdO1xuICAgICAgZm9yIChjb25zdCBub2RlIG9mIG11dGF0aW9uLmFkZGVkTm9kZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNJZ25vcmVkRWxlbWVudChub2RlIGFzIEVsZW1lbnQgfCBUZXh0KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZpcnR1YWxEb21FbGVtZW50ID0gdGhpcy5nZXRWaXJ0dWFsRG9tRWxlbWVudEZvclJlYWxFbGVtZW50T3JUaHJvdyhcbiAgICAgICAgICBub2RlIGFzIEVsZW1lbnQgfCBUZXh0LFxuICAgICAgICApO1xuICAgICAgICBhZGRlZE5vZGVzLnB1c2godmlydHVhbERvbUVsZW1lbnRUb1N0YXRpYyh2aXJ0dWFsRG9tRWxlbWVudCkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZW1vdmVkTm9kZUlkczogQXJyYXk8bnVtYmVyPiA9IFtdO1xuICAgICAgZm9yIChjb25zdCBub2RlIG9mIG11dGF0aW9uLnJlbW92ZWROb2Rlcykge1xuICAgICAgICBpZiAodGhpcy5pc0lnbm9yZWRFbGVtZW50KG5vZGUgYXMgRWxlbWVudCB8IFRleHQpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmlydHVhbERvbUVsZW1lbnQgPSB0aGlzLmdldFZpcnR1YWxEb21FbGVtZW50Rm9yUmVhbEVsZW1lbnRPclRocm93KFxuICAgICAgICAgIG5vZGUgYXMgRWxlbWVudCB8IFRleHQsXG4gICAgICAgICk7XG4gICAgICAgIHJlbW92ZWROb2RlSWRzLnB1c2godmlydHVhbERvbUVsZW1lbnQubm9kZUlkKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbXV0YXRpb25SZWNvcmQ6IFN0YXRpY1ZpcnR1YWxEb21NdXRhdGlvbklkc1JlY29yZCA9IHtcbiAgICAgICAgdHlwZTogbXV0YXRpb24udHlwZSxcbiAgICAgICAgdGFyZ2V0SWQ6IHRhcmdldEVsZW1lbnQubm9kZUlkLFxuICAgICAgICBhZGRlZE5vZGVzLFxuICAgICAgICByZW1vdmVkTm9kZUlkcyxcbiAgICAgICAgcHJldmlvdXNTaWJsaW5nSWQ6XG4gICAgICAgICAgZmlyc3ROb25JZ25vcmVkUHJldmlvdXNTaWJsaW5nICE9PSBudWxsXG4gICAgICAgICAgICA/IHRoaXMuZ2V0VmlydHVhbERvbUVsZW1lbnRGb3JSZWFsRWxlbWVudE9yVGhyb3coZmlyc3ROb25JZ25vcmVkUHJldmlvdXNTaWJsaW5nKS5ub2RlSWRcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgYXR0cmlidXRlOiBtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWU6IG11dGF0aW9uLmF0dHJpYnV0ZU5hbWUsXG4gICAgICAgICAgICAgIHZhbHVlOiAobXV0YXRpb24udGFyZ2V0IGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IG51bGwsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmNhbGxiYWNrKHtcbiAgICAgICAgbXV0YXRpb246IG11dGF0aW9uUmVjb3JkLFxuICAgICAgICBkb2N1bWVudFRpbWU6IHRoaXMuZ2V0RG9jdW1lbnRUaW1lKCksXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5yZW1vdmVLbm93bk5vZGVzSW5NdXRhdGlvbihtdXRhdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRLbm93bk5vZGVzSW5NdXRhdGlvbihtdXRhdGlvbjogTXV0YXRpb25SZWNvcmQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXROb2RlID0gbXV0YXRpb24udGFyZ2V0IGFzIEVsZW1lbnQgfCBUZXh0O1xuICAgIGNvbnN0IHZpcnR1YWxEb21FbGVtZW50ID0gdGhpcy5yZWFsRWxlbWVudFRvVmlydHVhbEVsZW1lbnQuZ2V0KHRhcmdldE5vZGUpO1xuICAgIGlmICghdmlydHVhbERvbUVsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJVbmtub3duIG5vZGUgaW4gYWRkS25vd25Ob2Rlc0luTXV0YXRpb246XCIgKyB0YXJnZXROb2RlICsgXCIsXCIgKyBtdXRhdGlvbi50eXBlLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG11dGF0aW9uLnR5cGUgPT09IFwiY2hpbGRMaXN0XCIpIHtcbiAgICAgIGxldCBwcmV2aW91c1NpYmxpbmcgPSBtdXRhdGlvbi5wcmV2aW91c1NpYmxpbmc7XG4gICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgd2hpbGUgKHByZXZpb3VzU2libGluZyAmJiB0aGlzLmlzSWdub3JlZEVsZW1lbnQocHJldmlvdXNTaWJsaW5nIGFzIEVsZW1lbnQgfCBUZXh0KSkge1xuICAgICAgICBwcmV2aW91c1NpYmxpbmcgPSBwcmV2aW91c1NpYmxpbmcucHJldmlvdXNTaWJsaW5nO1xuICAgICAgfVxuICAgICAgaWYgKHByZXZpb3VzU2libGluZykge1xuICAgICAgICBjb25zdCBwcmV2aW91c1NpYmxpbmdFbGVtZW50ID0gdGhpcy5yZWFsRWxlbWVudFRvVmlydHVhbEVsZW1lbnQuZ2V0KFxuICAgICAgICAgIHByZXZpb3VzU2libGluZyBhcyBFbGVtZW50IHwgVGV4dCxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFwcmV2aW91c1NpYmxpbmdFbGVtZW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBwcmV2aW91cyBzaWJsaW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gdmlydHVhbERvbUVsZW1lbnQuY2hpbGROb2Rlcy5pbmRleE9mKHByZXZpb3VzU2libGluZ0VsZW1lbnQpO1xuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJldmlvdXMgc2libGluZyBpcyBub3QgY3VycmVudGx5IGEgY2hpbGQgb2YgdGhlIHBhcmVudCBlbGVtZW50XCIpO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgICB9XG4gICAgICBtdXRhdGlvbi5hZGRlZE5vZGVzLmZvckVhY2goKG5vZGU6IE5vZGUpID0+IHtcbiAgICAgICAgY29uc3QgYXNFbGVtZW50T3JUZXh0ID0gbm9kZSBhcyBFbGVtZW50IHwgVGV4dDtcbiAgICAgICAgY29uc3QgY2hpbGRWaXJ0dWFsRG9tRWxlbWVudCA9IHRoaXMuY3JlYXRlVmlydHVhbERvbUVsZW1lbnRXaXRoQ2hpbGRyZW4oXG4gICAgICAgICAgYXNFbGVtZW50T3JUZXh0LFxuICAgICAgICAgIHZpcnR1YWxEb21FbGVtZW50LFxuICAgICAgICApO1xuICAgICAgICBpZiAoY2hpbGRWaXJ0dWFsRG9tRWxlbWVudCkge1xuICAgICAgICAgIGlmICh2aXJ0dWFsRG9tRWxlbWVudC5jaGlsZE5vZGVzLmluZGV4T2YoY2hpbGRWaXJ0dWFsRG9tRWxlbWVudCkgPT09IC0xKSB7XG4gICAgICAgICAgICB2aXJ0dWFsRG9tRWxlbWVudC5jaGlsZE5vZGVzLnNwbGljZShpbmRleCwgMCwgY2hpbGRWaXJ0dWFsRG9tRWxlbWVudCk7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChtdXRhdGlvbi50eXBlID09PSBcImF0dHJpYnV0ZXNcIikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSBtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lITtcbiAgICAgIGlmICh0aGlzLmlzSWdub3JlZEF0dHJpYnV0ZSh0YXJnZXROb2RlLCBhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9ICh0YXJnZXROb2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBkZWxldGUgdmlydHVhbERvbUVsZW1lbnQuYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZpcnR1YWxEb21FbGVtZW50LmF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0gPSBhdHRyaWJ1dGVWYWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG11dGF0aW9uLnR5cGUgPT09IFwiY2hhcmFjdGVyRGF0YVwiKSB7XG4gICAgICB2aXJ0dWFsRG9tRWxlbWVudC50ZXh0Q29udGVudCA9IHRhcmdldE5vZGUudGV4dENvbnRlbnQgPyB0YXJnZXROb2RlLnRleHRDb250ZW50IDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlS25vd25Ob2Rlc0luTXV0YXRpb24obXV0YXRpb246IE11dGF0aW9uUmVjb3JkKTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0Tm9kZSA9IG11dGF0aW9uLnRhcmdldCBhcyBFbGVtZW50IHwgVGV4dDtcbiAgICBjb25zdCB2aXJ0dWFsRG9tRWxlbWVudCA9IHRoaXMucmVhbEVsZW1lbnRUb1ZpcnR1YWxFbGVtZW50LmdldCh0YXJnZXROb2RlKTtcbiAgICBpZiAoIXZpcnR1YWxEb21FbGVtZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIG5vZGUgaW4gbXV0YXRpb24gbGlzdDpcIiArIHRhcmdldE5vZGUgKyBcIiwgXCIgKyBtdXRhdGlvbi50eXBlKTtcbiAgICB9XG4gICAgaWYgKG11dGF0aW9uLnR5cGUgPT09IFwiY2hpbGRMaXN0XCIpIHtcbiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBtdXRhdGlvbi5yZW1vdmVkTm9kZXMpIHtcbiAgICAgICAgY29uc3QgYXNFbGVtZW50T3JUZXh0ID0gbm9kZSBhcyBFbGVtZW50IHwgVGV4dDtcbiAgICAgICAgaWYgKHRoaXMuaXNJZ25vcmVkRWxlbWVudChhc0VsZW1lbnRPclRleHQpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hpbGREb21FbGVtZW50ID0gdGhpcy5yZWFsRWxlbWVudFRvVmlydHVhbEVsZW1lbnQuZ2V0KGFzRWxlbWVudE9yVGV4dCk7XG4gICAgICAgIGlmICghY2hpbGREb21FbGVtZW50KSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKHRoaXMuaHRtbFBhdGgsIFwiVW5rbm93biBub2RlIGluIHJlbW92ZUtub3duTm9kZXNJbk11dGF0aW9uXCIpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVtb3ZlVmlydHVhbERvbUVsZW1lbnQoY2hpbGREb21FbGVtZW50KTtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHZpcnR1YWxEb21FbGVtZW50LmNoaWxkTm9kZXMuaW5kZXhPZihjaGlsZERvbUVsZW1lbnQpO1xuICAgICAgICAgIHZpcnR1YWxEb21FbGVtZW50LmNoaWxkTm9kZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlVmlydHVhbERvbUVsZW1lbnQodmlydHVhbERvbUVsZW1lbnQ6IExpdmVWaXJ0dWFsRG9tRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMubm9kZUlkVG9Ob2RlLmRlbGV0ZSh2aXJ0dWFsRG9tRWxlbWVudC5ub2RlSWQpO1xuICAgIHRoaXMubm9kZVRvTm9kZUlkLmRlbGV0ZSh2aXJ0dWFsRG9tRWxlbWVudCk7XG4gICAgdGhpcy5yZWFsRWxlbWVudFRvVmlydHVhbEVsZW1lbnQuZGVsZXRlKHZpcnR1YWxEb21FbGVtZW50LnJlYWxFbGVtZW50KTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHZpcnR1YWxEb21FbGVtZW50LmNoaWxkTm9kZXMpIHtcbiAgICAgIHRoaXMucmVtb3ZlVmlydHVhbERvbUVsZW1lbnQoY2hpbGQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVmlydHVhbERvbUVsZW1lbnRXaXRoQ2hpbGRyZW4oXG4gICAgbm9kZTogRWxlbWVudCB8IFRleHQsXG4gICAgcGFyZW50OiBMaXZlVmlydHVhbERvbUVsZW1lbnQgfCBudWxsLFxuICApOiBMaXZlVmlydHVhbERvbUVsZW1lbnQgfCBudWxsIHtcbiAgICBjb25zdCB2aXJ0dWFsRWxlbWVudCA9IHRoaXMuY3JlYXRlVmlydHVhbERvbUVsZW1lbnQobm9kZSwgcGFyZW50KTtcbiAgICBpZiAoIXZpcnR1YWxFbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKChub2RlIGFzIEVsZW1lbnQpLmNoaWxkTm9kZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgKG5vZGUgYXMgRWxlbWVudCkuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IChub2RlIGFzIEVsZW1lbnQpLmNoaWxkTm9kZXNbaV07XG4gICAgICAgIGNvbnN0IGNoaWxkVmlydHVhbEVsZW1lbnQgPSB0aGlzLmNyZWF0ZVZpcnR1YWxEb21FbGVtZW50V2l0aENoaWxkcmVuKFxuICAgICAgICAgIGNoaWxkIGFzIEVsZW1lbnQgfCBUZXh0LFxuICAgICAgICAgIHZpcnR1YWxFbGVtZW50LFxuICAgICAgICApO1xuICAgICAgICBpZiAoY2hpbGRWaXJ0dWFsRWxlbWVudCkge1xuICAgICAgICAgIHZpcnR1YWxFbGVtZW50LmNoaWxkTm9kZXMucHVzaChjaGlsZFZpcnR1YWxFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2aXJ0dWFsRWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVmlydHVhbERvbUVsZW1lbnQoXG4gICAgbm9kZTogRWxlbWVudCB8IFRleHQsXG4gICAgcGFyZW50OiBMaXZlVmlydHVhbERvbUVsZW1lbnQgfCBudWxsLFxuICApOiBMaXZlVmlydHVhbERvbUVsZW1lbnQgfCBudWxsIHtcbiAgICBpZiAodGhpcy5pc0lnbm9yZWRFbGVtZW50KG5vZGUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmdWYWx1ZSA9IHRoaXMucmVhbEVsZW1lbnRUb1ZpcnR1YWxFbGVtZW50LmdldChub2RlKTtcbiAgICBpZiAoZXhpc3RpbmdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGFscmVhZHkgaGFzIGEgdmlydHVhbCBlbGVtZW50OiBcIiArIG5vZGUubm9kZU5hbWUpO1xuICAgIH1cbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBhc3NpZ24gbm9kZSBpZCB0byBudWxsXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0ZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICBpZiAoKG5vZGUgYXMgYW55KS5hdHRyaWJ1dGVzKSB7XG4gICAgICBjb25zdCBhc0hUTUxFbGVtZW50ID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGFzSFRNTEVsZW1lbnQuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGFzSFRNTEVsZW1lbnQuZ2V0QXR0cmlidXRlKGtleSk7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk51bGwgYXR0cmlidXRlIHZhbHVlIGZvciBrZXk6IFwiICsga2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaXNJZ25vcmVkQXR0cmlidXRlKG5vZGUsIGtleSkpIHtcbiAgICAgICAgICBhdHRyaWJ1dGVzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG5vZGVJZCA9IHRoaXMubmV4dE5vZGVJZCsrO1xuICAgIGNvbnN0IHZpcnR1YWxFbGVtZW50OiBMaXZlVmlydHVhbERvbUVsZW1lbnQgPSB7XG4gICAgICBub2RlSWQsXG4gICAgICB0YWc6IG5vZGUubm9kZU5hbWUsXG4gICAgICBhdHRyaWJ1dGVzLFxuICAgICAgY2hpbGROb2RlczogW10sXG4gICAgICByZWFsRWxlbWVudDogbm9kZSxcbiAgICAgIHBhcmVudCxcbiAgICB9O1xuICAgIGlmIChub2RlIGluc3RhbmNlb2YgdGhpcy5kb21SdW5uZXIuZ2V0V2luZG93KCkuVGV4dCAmJiBub2RlLnRleHRDb250ZW50KSB7XG4gICAgICB2aXJ0dWFsRWxlbWVudC50ZXh0Q29udGVudCA9IG5vZGUudGV4dENvbnRlbnQ7XG4gICAgfVxuICAgIHRoaXMubm9kZVRvTm9kZUlkLnNldCh2aXJ0dWFsRWxlbWVudCwgbm9kZUlkKTtcbiAgICB0aGlzLm5vZGVJZFRvTm9kZS5zZXQobm9kZUlkLCB2aXJ0dWFsRWxlbWVudCk7XG4gICAgdGhpcy5yZWFsRWxlbWVudFRvVmlydHVhbEVsZW1lbnQuc2V0KG5vZGUsIHZpcnR1YWxFbGVtZW50KTtcbiAgICByZXR1cm4gdmlydHVhbEVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIGdldEZpcnN0Tm9uSWdub3JlZFByZXZpb3VzU2libGluZyhub2RlOiBFbGVtZW50IHwgVGV4dCk6IEVsZW1lbnQgfCBUZXh0IHwgbnVsbCB7XG4gICAgbGV0IGN1cnJlbnROb2RlID0gbm9kZTtcbiAgICBpZiAoIXRoaXMuaXNJZ25vcmVkRWxlbWVudChjdXJyZW50Tm9kZSkpIHtcbiAgICAgIHJldHVybiBjdXJyZW50Tm9kZTtcbiAgICB9XG4gICAgd2hpbGUgKGN1cnJlbnROb2RlICYmIGN1cnJlbnROb2RlLnByZXZpb3VzU2libGluZykge1xuICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wcmV2aW91c1NpYmxpbmcgYXMgRWxlbWVudCB8IFRleHQ7XG4gICAgICBpZiAoIXRoaXMuaXNJZ25vcmVkRWxlbWVudChjdXJyZW50Tm9kZSkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmlydHVhbERvbUVsZW1lbnRGb3JSZWFsRWxlbWVudE9yVGhyb3coXG4gICAgcmVhbEVsZW1lbnQ6IEVsZW1lbnQgfCBUZXh0LFxuICApOiBMaXZlVmlydHVhbERvbUVsZW1lbnQge1xuICAgIGNvbnN0IHZpcnR1YWxFbGVtZW50ID0gdGhpcy5yZWFsRWxlbWVudFRvVmlydHVhbEVsZW1lbnQuZ2V0KHJlYWxFbGVtZW50KTtcbiAgICBpZiAoIXZpcnR1YWxFbGVtZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFZpcnR1YWwgZWxlbWVudCBub3QgZm91bmQgZm9yIHJlYWwgZWxlbWVudGApO1xuICAgIH1cbiAgICByZXR1cm4gdmlydHVhbEVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIGlzSWdub3JlZEVsZW1lbnQobm9kZTogRWxlbWVudCB8IFRleHQpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pZ25vcmVUZXh0Tm9kZXMgJiYgbm9kZSBpbnN0YW5jZW9mIHRoaXMuZG9tUnVubmVyLmdldFdpbmRvdygpLlRleHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIHRoaXMuZG9tUnVubmVyLmdldFdpbmRvdygpLkhUTUxTY3JpcHRFbGVtZW50KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiB0aGlzLmRvbVJ1bm5lci5nZXRXaW5kb3coKS5Db21tZW50KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0lnbm9yZWRBdHRyaWJ1dGUobm9kZTogRWxlbWVudCB8IFRleHQsIGF0dHJpYnV0ZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhdHRyaWJ1dGVOYW1lLnN0YXJ0c1dpdGgoXCJvblwiKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwYXRjaFJlbW90ZUV2ZW50RnJvbUNvbm5lY3Rpb25JZChjb25uZWN0aW9uSWQ6IG51bWJlciwgcmVtb3RlRXZlbnQ6IFJlbW90ZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgZG9tTm9kZSA9IHRoaXMubm9kZUlkVG9Ob2RlLmdldChyZW1vdGVFdmVudC5ub2RlSWQpO1xuICAgIGlmICghZG9tTm9kZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIlVua25vd24gbm9kZSBJRCBpbiByZW1vdGUgZXZlbnQ6IFwiICsgcmVtb3RlRXZlbnQubm9kZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZG9tTm9kZSBpbnN0YW5jZW9mIHRoaXMuZG9tUnVubmVyLmdldFdpbmRvdygpLlRleHQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkNhbm5vdCBkaXNwYXRjaCByZW1vdGUgZXZlbnQgdG8gdGV4dCBub2RlXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZG9tUnVubmVyLmRpc3BhdGNoUmVtb3RlRXZlbnRGcm9tQ29ubmVjdGlvbklkKFxuICAgICAgY29ubmVjdGlvbklkLFxuICAgICAgZG9tTm9kZS5yZWFsRWxlbWVudCBhcyBFbGVtZW50LFxuICAgICAgcmVtb3RlRXZlbnQsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5kb2N1bWVudFRpbWVJbnRlcnZhbFRpbWVyKTtcbiAgICB0aGlzLmRvbVJ1bm5lci5kaXNwb3NlKCk7XG4gIH1cblxuICBwcml2YXRlIGdldERvY3VtZW50VGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kb21SdW5uZXIuZ2V0RG9jdW1lbnRUaW1lKCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBSZW1vdGVFdmVudCB9IGZyb20gXCJAbW1sLWlvL25ldHdvcmtlZC1kb20tcHJvdG9jb2xcIjtcbmltcG9ydCB7IERPTVJ1bm5lckZhY3RvcnksIERPTVJ1bm5lckludGVyZmFjZSwgRE9NUnVubmVyTWVzc2FnZSB9IGZyb20gXCJAbW1sLWlvL29ic2VydmFibGUtZG9tXCI7XG5cbmV4cG9ydCBjb25zdCBXZWJCcm93c2VyRE9NUnVubmVyRmFjdG9yeTogRE9NUnVubmVyRmFjdG9yeSA9IChcbiAgaHRtbFBhdGg6IHN0cmluZyxcbiAgaHRtbENvbnRlbnRzOiBzdHJpbmcsXG4gIHBhcmFtczogb2JqZWN0LFxuICBjYWxsYmFjazogKG11dGF0aW9uTGlzdDogRE9NUnVubmVyTWVzc2FnZSkgPT4gdm9pZCxcbik6IERPTVJ1bm5lckludGVyZmFjZSA9PiB7XG4gIHJldHVybiBuZXcgV2ViQnJvd3NlckRPTVJ1bm5lcihodG1sUGF0aCwgaHRtbENvbnRlbnRzLCBwYXJhbXMsIGNhbGxiYWNrKTtcbn07XG5cbmNvbnN0IGRvY3VtZW50TG9hZFRpbWUgPSBEYXRlLm5vdygpO1xuXG5leHBvcnQgY2xhc3MgV2ViQnJvd3NlckRPTVJ1bm5lciBpbXBsZW1lbnRzIERPTVJ1bm5lckludGVyZmFjZSB7XG4gIHByaXZhdGUgbXV0YXRpb25PYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcbiAgcHJpdmF0ZSBodG1sUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIGNhbGxiYWNrOiAoZG9tUnVubmVyTWVzc2FnZTogRE9NUnVubmVyTWVzc2FnZSkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBodG1sUGF0aDogc3RyaW5nLFxuICAgIGh0bWxDb250ZW50czogc3RyaW5nLFxuICAgIHBhcmFtczogb2JqZWN0LFxuICAgIGNhbGxiYWNrOiAoZG9tUnVubmVyTWVzc2FnZTogRE9NUnVubmVyTWVzc2FnZSkgPT4gdm9pZCxcbiAgKSB7XG4gICAgdGhpcy5odG1sUGF0aCA9IGh0bWxQYXRoO1xuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICAgIGxldCBkaWRTZW5kTG9hZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5tdXRhdGlvbk9ic2VydmVyID0gbmV3IHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbkxpc3QpID0+IHtcbiAgICAgIGlmICghZG9jdW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFkaWRTZW5kTG9hZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNdXRhdGlvbk9ic2VydmVyIGNhbGxlZCBiZWZvcmUgbG9hZFwiKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2FsbGJhY2soe1xuICAgICAgICBtdXRhdGlvbkxpc3QsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgICh3aW5kb3cgYXMgYW55KS5wYXJhbXMgPSBwYXJhbXM7XG5cbiAgICBjb25zdCBmaW5pc2hMb2FkID0gKCkgPT4ge1xuICAgICAgaWYgKGRpZFNlbmRMb2FkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImZpbmlzaExvYWQgY2FsbGVkIHR3aWNlXCIpO1xuICAgICAgfVxuICAgICAgZGlkU2VuZExvYWQgPSB0cnVlO1xuICAgICAgdGhpcy5jYWxsYmFjayh7XG4gICAgICAgIGxvYWRlZDogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5tdXRhdGlvbk9ic2VydmVyLm9ic2VydmUod2luZG93LmRvY3VtZW50LCB7XG4gICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICAgIGNoaWxkTGlzdDogdHJ1ZSxcbiAgICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgaWYgKGRvY3VtZW50LmJvZHkpIHtcbiAgICAgIHNldFRpbWVvdXQoZmluaXNoTG9hZCwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCBmaW5pc2hMb2FkKTtcbiAgICB9XG4gIH1cblxuICBhZGRJUENXZWJzb2NrZXQoKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm90IGltcGxlbWVudGVkLlwiKTtcbiAgfVxuXG4gIGRpc3BhdGNoUmVtb3RlRXZlbnRGcm9tQ29ubmVjdGlvbklkKFxuICAgIGNvbm5lY3Rpb25JZDogbnVtYmVyLFxuICAgIHJlYWxFbGVtZW50OiBFbGVtZW50LFxuICAgIHJlbW90ZUV2ZW50OiBSZW1vdGVFdmVudCxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgYnViYmxlcyA9IHJlbW90ZUV2ZW50LmJ1YmJsZXMgfHwgZmFsc2U7XG4gICAgY29uc3QgcmVtb3RlRXZlbnRPYmplY3QgPSBuZXcgQ3VzdG9tRXZlbnQocmVtb3RlRXZlbnQubmFtZSwge1xuICAgICAgYnViYmxlcyxcbiAgICAgIGRldGFpbDogeyAuLi5yZW1vdGVFdmVudC5wYXJhbXMsIGNvbm5lY3Rpb25JZCB9LFxuICAgIH0pO1xuXG4gICAgLy8gRGlzcGF0Y2ggdGhlIGV2ZW50IHZpYSBKYXZhU2NyaXB0LlxuICAgIHJlYWxFbGVtZW50LmRpc3BhdGNoRXZlbnQocmVtb3RlRXZlbnRPYmplY3QpO1xuICB9XG5cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAvLyBUT0RPIC0gaGFuZGxlIGRpc3Bvc2VcbiAgICBjb25zb2xlLmxvZyhcIldlYkJyb3dzZXJET01SdW5uZXIuZGlzcG9zZVwiKTtcbiAgfVxuXG4gIGdldERvY3VtZW50KCk6IERvY3VtZW50IHtcbiAgICByZXR1cm4gZG9jdW1lbnQ7XG4gIH1cblxuICBnZXREb2N1bWVudFRpbWUoKTogbnVtYmVyIHtcbiAgICBpZiAoZG9jdW1lbnQudGltZWxpbmUgJiYgZG9jdW1lbnQudGltZWxpbmUuY3VycmVudFRpbWUpIHtcbiAgICAgIHJldHVybiBkb2N1bWVudC50aW1lbGluZS5jdXJyZW50VGltZTtcbiAgICB9XG4gICAgcmV0dXJuIERhdGUubm93KCkgLSBkb2N1bWVudExvYWRUaW1lO1xuICB9XG5cbiAgLy8gVE9ETyAtIHJlc29sdmUgdHlwZXMgKFdpbmRvdyBuZWVkcyB0byBleHBvc2UgY2xhc3NlcyBzdWNoIGFzIEN1c3RvbUV2ZW50IGFzIHByb3BlcnRpZXMpXG4gIGdldFdpbmRvdygpOiBhbnkge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBGcm9tSW5zdGFuY2VNZXNzYWdlVHlwZXMsXG4gIFRvSW5zdGFuY2VNZXNzYWdlVHlwZXMsXG59IGZyb20gXCJAbW1sLWlvL25ldHdvcmtlZC1kb20td2ViLXJ1bm5lci9zcmMvbWVzc2FnZS10eXBlc1wiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZURvbSB9IGZyb20gXCJAbW1sLWlvL29ic2VydmFibGUtZG9tL3NyYy9PYnNlcnZhYmxlRG9tXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlRG9tTWVzc2FnZSwgT2JzZXJ2YWJsZURPTVBhcmFtZXRlcnMgfSBmcm9tIFwiQG1tbC1pby9vYnNlcnZhYmxlLWRvbS1jb21tb25cIjtcblxuaW1wb3J0IHsgV2ViQnJvd3NlckRPTVJ1bm5lckZhY3RvcnkgfSBmcm9tIFwiLi9XZWJCcm93c2VyRE9NUnVubmVyXCI7XG5cbi8vIFRoaXMgcnVucyBpbiB0aGUgaWZyYW1lIHRoYXQgd2lsbCBleGVjdXRlIHRoZSBkb2N1bWVudCBzY3JpcHQgdG8gc2V0dXAgdGhlIGxpc3RlbmluZyBmb3IgZXZlbnRzIG1lc3NhZ2VzXG5leHBvcnQgZnVuY3Rpb24gc2V0dXBJZnJhbWVXZWJSdW5uZXIoYXJnc1N0cmluZzogc3RyaW5nKSB7XG4gIGNvbnN0IG9ic2VydmFibGVET01QYXJhbXMgPSBKU09OLnBhcnNlKGF0b2IoYXJnc1N0cmluZykpIGFzIE9ic2VydmFibGVET01QYXJhbWV0ZXJzO1xuXG4gIGNvbnN0IHNlbmRNZXNzYWdlVG9IYW5kbGVyID0gKG1lc3NhZ2U6IEZyb21JbnN0YW5jZU1lc3NhZ2VUeXBlcykgPT4ge1xuICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkobWVzc2FnZSksIFwiKlwiKTtcbiAgfTtcblxuICBjb25zdCBvYnNlcnZhYmxlRE9NID0gbmV3IE9ic2VydmFibGVEb20oXG4gICAge1xuICAgICAgLi4ub2JzZXJ2YWJsZURPTVBhcmFtcyxcbiAgICAgIGh0bWxDb250ZW50czogXCJcIiwgLy8gVGhpcyBtdXN0IGJlIGVtcHR5IGFzIHRoZSBjb250ZW50cyBhcmUgYXNzdW1lZCB0byBiZSBwcm92aWRlZCBieSB0aGUgc3JjZG9jXG4gICAgfSxcbiAgICAob2JzZXJ2YWJsZURvbU1lc3NhZ2U6IE9ic2VydmFibGVEb21NZXNzYWdlKSA9PiB7XG4gICAgICBzZW5kTWVzc2FnZVRvSGFuZGxlcih7XG4gICAgICAgIHR5cGU6IFwiZG9tXCIsXG4gICAgICAgIG1lc3NhZ2U6IG9ic2VydmFibGVEb21NZXNzYWdlLFxuICAgICAgfSk7XG4gICAgfSxcbiAgICBXZWJCcm93c2VyRE9NUnVubmVyRmFjdG9yeSxcbiAgKTtcblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgKGUpID0+IHtcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGUuZGF0YSkgYXMgVG9JbnN0YW5jZU1lc3NhZ2VUeXBlcztcbiAgICBpZiAocGFyc2VkLnR5cGUgPT09IFwiZGlzcGF0Y2hSZW1vdGVFdmVudEZyb21Db25uZWN0aW9uSWRcIikge1xuICAgICAgb2JzZXJ2YWJsZURPTS5kaXNwYXRjaFJlbW90ZUV2ZW50RnJvbUNvbm5lY3Rpb25JZChwYXJzZWQuY29ubmVjdGlvbklkLCBwYXJzZWQuZXZlbnQpO1xuICAgIH1cbiAgfSk7XG59XG4iLCAiaW1wb3J0IHsgc2V0dXBJZnJhbWVXZWJSdW5uZXIgfSBmcm9tIFwiLi9JZnJhbWVXZWJSdW5uZXJcIjtcblxuY29uc3QgYXJncyA9ICh3aW5kb3cgYXMgYW55KS5hcmdzO1xuc2V0dXBJZnJhbWVXZWJSdW5uZXIoYXJncyk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJTyxTQUFTLDBCQUEwQixJQUFvRDtBQUM1RixTQUFPO0FBQUEsSUFDTCxRQUFRLEdBQUc7QUFBQSxJQUNYLEtBQUssR0FBRztBQUFBLElBQ1IsWUFBWSxHQUFHO0FBQUEsSUFDZixZQUFZLEdBQUcsV0FBVyxJQUFJLENBQUMsVUFBVSwwQkFBMEIsS0FBSyxDQUFDO0FBQUEsSUFDekUsYUFBYSxHQUFHO0FBQUEsRUFDbEI7QUFDRjs7O0FDcUNPLElBQU0sZ0JBQU4sTUFBc0Q7QUFBQSxFQVkzRCxZQUNFLHlCQUNBLFVBQ0EsZUFDQTtBQWZGLFNBQVEsZUFBZSxvQkFBSSxJQUFtQztBQUM5RCxTQUFRLGVBQWUsb0JBQUksSUFBbUM7QUFDOUQsU0FBUSw4QkFBOEIsb0JBQUksSUFBMkM7QUFDckYsU0FBUSxrQkFBa0I7QUFFMUIs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\n';
|
|
32
|
+
var build_default = 'var __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n for (var prop in b ||= {})\n if (__hasOwnProp.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n if (__getOwnPropSymbols)\n for (var prop of __getOwnPropSymbols(b)) {\n if (__propIsEnum.call(b, prop))\n __defNormalProp(a, prop, b[prop]);\n }\n return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\n\n// ../../observable-dom/src/utils.ts\nfunction virtualDomElementToStatic(el) {\n return {\n nodeId: el.nodeId,\n tag: el.tag,\n attributes: el.attributes,\n childNodes: el.childNodes.map((child) => virtualDomElementToStatic(child)),\n textContent: el.textContent\n };\n}\n\n// ../../observable-dom/src/ObservableDom.ts\nvar ObservableDom = class {\n constructor(observableDOMParameters, callback, runnerFactory) {\n this.nodeToNodeId = /* @__PURE__ */ new Map();\n this.nodeIdToNode = /* @__PURE__ */ new Map();\n this.realElementToVirtualElement = /* @__PURE__ */ new Map();\n this.ignoreTextNodes = true;\n this.nextNodeId = 1;\n this.htmlPath = observableDOMParameters.htmlPath;\n this.ignoreTextNodes = observableDOMParameters.ignoreTextNodes;\n this.callback = callback;\n this.documentTimeIntervalTimer = setInterval(() => {\n this.callback({\n documentTime: this.getDocumentTime()\n });\n }, observableDOMParameters.pingIntervalMilliseconds || 5e3);\n this.domRunner = runnerFactory(\n observableDOMParameters.htmlPath,\n observableDOMParameters.htmlContents,\n observableDOMParameters.params,\n (domRunnerMessage) => {\n if (domRunnerMessage.loaded) {\n this.createVirtualDomElementWithChildren(\n this.domRunner.getDocument(),\n null\n );\n const snapshot = virtualDomElementToStatic(\n this.getVirtualDomElementForRealElementOrThrow(\n this.domRunner.getDocument()\n )\n );\n this.callback({\n snapshot,\n documentTime: this.getDocumentTime()\n });\n } else if (domRunnerMessage.mutationList) {\n this.processModificationList(domRunnerMessage.mutationList);\n } else if (domRunnerMessage.logMessage) {\n this.callback({\n logMessage: domRunnerMessage.logMessage,\n documentTime: this.getDocumentTime()\n });\n }\n }\n );\n }\n addIPCWebsocket(webSocket) {\n return this.domRunner.addIPCWebsocket(webSocket);\n }\n addConnectedUserId(connectionId) {\n this.domRunner.getWindow().dispatchEvent(\n new (this.domRunner.getWindow()).CustomEvent("connected", {\n detail: { connectionId }\n })\n );\n }\n removeConnectedUserId(connectionId) {\n this.domRunner.getWindow().dispatchEvent(\n new (this.domRunner.getWindow()).CustomEvent("disconnected", {\n detail: { connectionId }\n })\n );\n }\n processModificationList(mutationList) {\n const documentEl = this.domRunner.getDocument();\n const documentVirtualDomElement = this.realElementToVirtualElement.get(documentEl);\n if (!documentVirtualDomElement) {\n throw new Error(`document not created in processModificationList`);\n }\n if (mutationList.length > 1) {\n console.error(\n "More than one mutation record received. It is possible that intermediate states are incorrect."\n );\n }\n for (const mutation of mutationList) {\n if (this.isIgnoredElement(mutation.target)) {\n continue;\n }\n if (mutation.type === "attributes" && // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.isIgnoredAttribute(mutation.target, mutation.attributeName)) {\n continue;\n }\n this.addKnownNodesInMutation(mutation);\n const firstNonIgnoredPreviousSibling = mutation.previousSibling ? this.getFirstNonIgnoredPreviousSibling(mutation.previousSibling) : null;\n const targetElement = this.getVirtualDomElementForRealElementOrThrow(\n mutation.target\n );\n const addedNodes = [];\n for (const node of mutation.addedNodes) {\n if (this.isIgnoredElement(node)) {\n continue;\n }\n const virtualDomElement = this.getVirtualDomElementForRealElementOrThrow(\n node\n );\n addedNodes.push(virtualDomElementToStatic(virtualDomElement));\n }\n const removedNodeIds = [];\n for (const node of mutation.removedNodes) {\n if (this.isIgnoredElement(node)) {\n continue;\n }\n const virtualDomElement = this.getVirtualDomElementForRealElementOrThrow(\n node\n );\n removedNodeIds.push(virtualDomElement.nodeId);\n }\n const mutationRecord = {\n type: mutation.type,\n targetId: targetElement.nodeId,\n addedNodes,\n removedNodeIds,\n previousSiblingId: firstNonIgnoredPreviousSibling !== null ? this.getVirtualDomElementForRealElementOrThrow(firstNonIgnoredPreviousSibling).nodeId : null,\n attribute: mutation.attributeName ? {\n attributeName: mutation.attributeName,\n value: mutation.target.getAttribute(mutation.attributeName)\n } : null\n };\n this.callback({\n mutation: mutationRecord,\n documentTime: this.getDocumentTime()\n });\n this.removeKnownNodesInMutation(mutation);\n }\n }\n addKnownNodesInMutation(mutation) {\n const targetNode = mutation.target;\n const virtualDomElement = this.realElementToVirtualElement.get(targetNode);\n if (!virtualDomElement) {\n throw new Error(\n "Unknown node in addKnownNodesInMutation:" + targetNode + "," + mutation.type\n );\n }\n if (mutation.type === "childList") {\n let previousSibling = mutation.previousSibling;\n let index = 0;\n while (previousSibling && this.isIgnoredElement(previousSibling)) {\n previousSibling = previousSibling.previousSibling;\n }\n if (previousSibling) {\n const previousSiblingElement = this.realElementToVirtualElement.get(\n previousSibling\n );\n if (!previousSiblingElement) {\n throw new Error("Unknown previous sibling");\n }\n index = virtualDomElement.childNodes.indexOf(previousSiblingElement);\n if (index === -1) {\n throw new Error("Previous sibling is not currently a child of the parent element");\n }\n index += 1;\n }\n mutation.addedNodes.forEach((node) => {\n const asElementOrText = node;\n const childVirtualDomElement = this.createVirtualDomElementWithChildren(\n asElementOrText,\n virtualDomElement\n );\n if (childVirtualDomElement) {\n if (virtualDomElement.childNodes.indexOf(childVirtualDomElement) === -1) {\n virtualDomElement.childNodes.splice(index, 0, childVirtualDomElement);\n index++;\n }\n }\n });\n } else if (mutation.type === "attributes") {\n const attributeName = mutation.attributeName;\n if (this.isIgnoredAttribute(targetNode, attributeName)) {\n return;\n }\n const attributeValue = targetNode.getAttribute(attributeName);\n if (attributeValue === null) {\n delete virtualDomElement.attributes[attributeName];\n } else {\n virtualDomElement.attributes[attributeName] = attributeValue;\n }\n } else if (mutation.type === "characterData") {\n virtualDomElement.textContent = targetNode.textContent ? targetNode.textContent : void 0;\n }\n }\n removeKnownNodesInMutation(mutation) {\n const targetNode = mutation.target;\n const virtualDomElement = this.realElementToVirtualElement.get(targetNode);\n if (!virtualDomElement) {\n throw new Error("Unknown node in mutation list:" + targetNode + ", " + mutation.type);\n }\n if (mutation.type === "childList") {\n for (const node of mutation.removedNodes) {\n const asElementOrText = node;\n if (this.isIgnoredElement(asElementOrText)) {\n continue;\n }\n const childDomElement = this.realElementToVirtualElement.get(asElementOrText);\n if (!childDomElement) {\n console.warn(this.htmlPath, "Unknown node in removeKnownNodesInMutation");\n continue;\n } else {\n this.removeVirtualDomElement(childDomElement);\n const index = virtualDomElement.childNodes.indexOf(childDomElement);\n virtualDomElement.childNodes.splice(index, 1);\n }\n }\n return;\n }\n }\n removeVirtualDomElement(virtualDomElement) {\n this.nodeIdToNode.delete(virtualDomElement.nodeId);\n this.nodeToNodeId.delete(virtualDomElement);\n this.realElementToVirtualElement.delete(virtualDomElement.realElement);\n for (const child of virtualDomElement.childNodes) {\n this.removeVirtualDomElement(child);\n }\n }\n createVirtualDomElementWithChildren(node, parent) {\n const virtualElement = this.createVirtualDomElement(node, parent);\n if (!virtualElement) {\n return null;\n }\n if (node.childNodes) {\n for (let i = 0; i < node.childNodes.length; i++) {\n const child = node.childNodes[i];\n const childVirtualElement = this.createVirtualDomElementWithChildren(\n child,\n virtualElement\n );\n if (childVirtualElement) {\n virtualElement.childNodes.push(childVirtualElement);\n }\n }\n }\n return virtualElement;\n }\n createVirtualDomElement(node, parent) {\n if (this.isIgnoredElement(node)) {\n return null;\n }\n const existingValue = this.realElementToVirtualElement.get(node);\n if (existingValue !== void 0) {\n throw new Error("Node already has a virtual element: " + node.nodeName);\n }\n if (!node) {\n throw new Error("Cannot assign node id to null");\n }\n const attributes = {};\n if (node.attributes) {\n const asHTMLElement = node;\n for (const key of asHTMLElement.getAttributeNames()) {\n const value = asHTMLElement.getAttribute(key);\n if (value === null) {\n throw new Error("Null attribute value for key: " + key);\n }\n if (!this.isIgnoredAttribute(node, key)) {\n attributes[key] = value;\n }\n }\n }\n const nodeId = this.nextNodeId++;\n const virtualElement = {\n nodeId,\n tag: node.nodeName,\n attributes,\n childNodes: [],\n realElement: node,\n parent\n };\n if (node instanceof this.domRunner.getWindow().Text && node.textContent) {\n virtualElement.textContent = node.textContent;\n }\n this.nodeToNodeId.set(virtualElement, nodeId);\n this.nodeIdToNode.set(nodeId, virtualElement);\n this.realElementToVirtualElement.set(node, virtualElement);\n return virtualElement;\n }\n getFirstNonIgnoredPreviousSibling(node) {\n let currentNode = node;\n if (!this.isIgnoredElement(currentNode)) {\n return currentNode;\n }\n while (currentNode && currentNode.previousSibling) {\n currentNode = currentNode.previousSibling;\n if (!this.isIgnoredElement(currentNode)) {\n return currentNode;\n }\n }\n return null;\n }\n getVirtualDomElementForRealElementOrThrow(realElement) {\n const virtualElement = this.realElementToVirtualElement.get(realElement);\n if (!virtualElement) {\n throw new Error(`Virtual element not found for real element`);\n }\n return virtualElement;\n }\n isIgnoredElement(node) {\n if (this.ignoreTextNodes && node instanceof this.domRunner.getWindow().Text) {\n return true;\n } else if (node instanceof this.domRunner.getWindow().HTMLScriptElement) {\n return true;\n } else if (node instanceof this.domRunner.getWindow().Comment) {\n return true;\n }\n return false;\n }\n isIgnoredAttribute(node, attributeName) {\n return attributeName.startsWith("on");\n }\n dispatchRemoteEventFromConnectionId(connectionId, remoteEvent) {\n const domNode = this.nodeIdToNode.get(remoteEvent.nodeId);\n if (!domNode) {\n console.error("Unknown node ID in remote event: " + remoteEvent.nodeId);\n return;\n }\n if (domNode instanceof this.domRunner.getWindow().Text) {\n console.warn("Cannot dispatch remote event to text node");\n return;\n }\n this.domRunner.dispatchRemoteEventFromConnectionId(\n connectionId,\n domNode.realElement,\n remoteEvent\n );\n }\n dispose() {\n clearInterval(this.documentTimeIntervalTimer);\n this.domRunner.dispose();\n }\n getDocumentTime() {\n return this.domRunner.getDocumentTime();\n }\n};\n\n// src/WebBrowserDOMRunner.ts\nvar WebBrowserDOMRunnerFactory = (htmlPath, htmlContents, params, callback) => {\n return new WebBrowserDOMRunner(htmlPath, htmlContents, params, callback);\n};\nvar documentLoadTime = Date.now();\nvar WebBrowserDOMRunner = class {\n constructor(htmlPath, htmlContents, params, callback) {\n this.htmlPath = htmlPath;\n this.callback = callback;\n for (const level of ["error", "warn", "info", "log"]) {\n const defaultFn = window.console[level];\n window.console[level] = (...args2) => {\n callback({\n logMessage: {\n level,\n content: args2\n }\n });\n defaultFn(...args2);\n };\n }\n window.onerror = (message, source, line, column, error) => {\n callback({\n logMessage: {\n level: "system",\n content: [\n {\n message,\n type: error == null ? void 0 : error.name,\n line,\n column\n }\n ]\n }\n });\n return false;\n };\n let didSendLoad = false;\n this.mutationObserver = new window.MutationObserver((mutationList) => {\n if (!document) {\n return;\n }\n if (!didSendLoad) {\n throw new Error("MutationObserver called before load");\n }\n this.callback({\n mutationList\n });\n });\n window.params = params;\n const finishLoad = () => {\n if (didSendLoad) {\n throw new Error("finishLoad called twice");\n }\n didSendLoad = true;\n this.callback({\n loaded: true\n });\n this.mutationObserver.observe(window.document, {\n attributes: true,\n childList: true,\n subtree: true,\n characterData: true\n });\n };\n if (document.body) {\n setTimeout(finishLoad, 0);\n } else {\n window.addEventListener("DOMContentLoaded", finishLoad);\n }\n }\n addIPCWebsocket() {\n throw new Error("Not implemented.");\n }\n dispatchRemoteEventFromConnectionId(connectionId, realElement, remoteEvent) {\n const bubbles = remoteEvent.bubbles || false;\n const remoteEventObject = new CustomEvent(remoteEvent.name, {\n bubbles,\n detail: __spreadProps(__spreadValues({}, remoteEvent.params), { connectionId })\n });\n realElement.dispatchEvent(remoteEventObject);\n }\n dispose() {\n console.log("WebBrowserDOMRunner.dispose");\n }\n getDocument() {\n return document;\n }\n getDocumentTime() {\n if (document.timeline && document.timeline.currentTime) {\n return document.timeline.currentTime;\n }\n return Date.now() - documentLoadTime;\n }\n // TODO - resolve types (Window needs to expose classes such as CustomEvent as properties)\n getWindow() {\n return window;\n }\n};\n\n// src/IframeWebRunner.ts\nfunction setupIframeWebRunner(argsString) {\n const observableDOMParams = JSON.parse(atob(argsString));\n const sendMessageToHandler = (message) => {\n window.parent.postMessage(JSON.stringify(message), "*");\n };\n const observableDOM = new ObservableDom(\n __spreadProps(__spreadValues({}, observableDOMParams), {\n htmlContents: ""\n // This must be empty as the contents are assumed to be provided by the srcdoc\n }),\n (observableDomMessage) => {\n sendMessageToHandler({\n type: "dom",\n message: observableDomMessage\n });\n },\n WebBrowserDOMRunnerFactory\n );\n window.addEventListener("message", (e) => {\n const parsed = JSON.parse(e.data);\n if (parsed.type === "dispatchRemoteEventFromConnectionId") {\n observableDOM.dispatchRemoteEventFromConnectionId(parsed.connectionId, parsed.event);\n }\n });\n}\n\n// src/index.ts\nvar args = window.args;\nsetupIframeWebRunner(args);\n//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vb2JzZXJ2YWJsZS1kb20vc3JjL3V0aWxzLnRzIiwgIi4uLy4uLy4uL29ic2VydmFibGUtZG9tL3NyYy9PYnNlcnZhYmxlRG9tLnRzIiwgIi4uL3NyYy9XZWJCcm93c2VyRE9NUnVubmVyLnRzIiwgIi4uL3NyYy9JZnJhbWVXZWJSdW5uZXIudHMiLCAiLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBTdGF0aWNWaXJ0dWFsRG9tRWxlbWVudCB9IGZyb20gXCJAbW1sLWlvL29ic2VydmFibGUtZG9tLWNvbW1vblwiO1xuXG5pbXBvcnQgeyBMaXZlVmlydHVhbERvbUVsZW1lbnQgfSBmcm9tIFwiLi9PYnNlcnZhYmxlRG9tXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB2aXJ0dWFsRG9tRWxlbWVudFRvU3RhdGljKGVsOiBMaXZlVmlydHVhbERvbUVsZW1lbnQpOiBTdGF0aWNWaXJ0dWFsRG9tRWxlbWVudCB7XG4gIHJldHVybiB7XG4gICAgbm9kZUlkOiBlbC5ub2RlSWQsXG4gICAgdGFnOiBlbC50YWcsXG4gICAgYXR0cmlidXRlczogZWwuYXR0cmlidXRlcyxcbiAgICBjaGlsZE5vZGVzOiBlbC5jaGlsZE5vZGVzLm1hcCgoY2hpbGQpID0+IHZpcnR1YWxEb21FbGVtZW50VG9TdGF0aWMoY2hpbGQpKSxcbiAgICB0ZXh0Q29udGVudDogZWwudGV4dENvbnRlbnQsXG4gIH07XG59XG4iLCAiaW1wb3J0IHtcbiAgTG9nTWVzc2FnZSxcbiAgT2JzZXJ2YWJsZURvbUludGVyZmFjZSxcbiAgT2JzZXJ2YWJsZURvbU1lc3NhZ2UsXG4gIE9ic2VydmFibGVET01QYXJhbWV0ZXJzLFxuICBSZW1vdGVFdmVudCxcbiAgU3RhdGljVmlydHVhbERvbUVsZW1lbnQsXG4gIFN0YXRpY1ZpcnR1YWxEb21NdXRhdGlvbklkc1JlY29yZCxcbn0gZnJvbSBcIkBtbWwtaW8vb2JzZXJ2YWJsZS1kb20tY29tbW9uXCI7XG5cbmltcG9ydCB7IHZpcnR1YWxEb21FbGVtZW50VG9TdGF0aWMgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgdHlwZSBET01SdW5uZXJNZXNzYWdlID0ge1xuICBsb2FkZWQ/OiBib29sZWFuO1xuICBtdXRhdGlvbkxpc3Q/OiBBcnJheTxNdXRhdGlvblJlY29yZD47XG4gIGxvZ01lc3NhZ2U/OiBMb2dNZXNzYWdlO1xufTtcblxuZXhwb3J0IHR5cGUgRE9NUnVubmVySW50ZXJmYWNlID0ge1xuICBnZXREb2N1bWVudCgpOiBEb2N1bWVudDtcbiAgZ2V0V2luZG93KCk6IFdpbmRvdyAmIHtcbiAgICBDdXN0b21FdmVudDogdHlwZW9mIEN1c3RvbUV2ZW50O1xuICAgIFRleHQ6IHR5cGVvZiBUZXh0O1xuICAgIEhUTUxTY3JpcHRFbGVtZW50OiB0eXBlb2YgSFRNTFNjcmlwdEVsZW1lbnQ7XG4gICAgQ29tbWVudDogdHlwZW9mIENvbW1lbnQ7XG4gIH07IC8vIFRPRE8gLSBEZWZpbmUgdGhpcyB3aXRob3V0IHVzaW5nIEpTRE9NIHR5cGVzXG4gIGFkZElQQ1dlYnNvY2tldCh3ZWJTb2NrZXQ6IFdlYlNvY2tldCk6IHZvaWQ7XG4gIGRpc3BhdGNoUmVtb3RlRXZlbnRGcm9tQ29ubmVjdGlvbklkKFxuICAgIGNvbm5lY3Rpb25JZDogbnVtYmVyLFxuICAgIHJlYWxFbGVtZW50OiBFbGVtZW50LFxuICAgIHJlbW90ZUV2ZW50OiBSZW1vdGVFdmVudCxcbiAgKTogdm9pZDtcbiAgZGlzcG9zZSgpOiB2b2lkO1xuICBnZXREb2N1bWVudFRpbWUoKTogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgRE9NUnVubmVyRmFjdG9yeSA9IChcbiAgaHRtbFBhdGg6IHN0cmluZyxcbiAgaHRtbENvbnRlbnRzOiBzdHJpbmcsXG4gIHBhcmFtczogb2JqZWN0LFxuICBjYWxsYmFjazogKGRvbVJ1bm5lck1lc3NhZ2U6IERPTVJ1bm5lck1lc3NhZ2UpID0+IHZvaWQsXG4pID0+IERPTVJ1bm5lckludGVyZmFjZTtcblxuZXhwb3J0IHR5cGUgTGl2ZVZpcnR1YWxEb21FbGVtZW50ID0gT21pdDxTdGF0aWNWaXJ0dWFsRG9tRWxlbWVudCwgXCJjaGlsZE5vZGVzXCI+ICYge1xuICByZWFsRWxlbWVudDogRWxlbWVudCB8IFRleHQ7XG4gIGNoaWxkTm9kZXM6IEFycmF5PExpdmVWaXJ0dWFsRG9tRWxlbWVudD47XG4gIHBhcmVudDogTGl2ZVZpcnR1YWxEb21FbGVtZW50IHwgbnVsbDtcbn07XG5cbmV4cG9ydCBjbGFzcyBPYnNlcnZhYmxlRG9tIGltcGxlbWVudHMgT2JzZXJ2YWJsZURvbUludGVyZmFjZSB7XG4gIHByaXZhdGUgbm9kZVRvTm9kZUlkID0gbmV3IE1hcDxMaXZlVmlydHVhbERvbUVsZW1lbnQsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSBub2RlSWRUb05vZGUgPSBuZXcgTWFwPG51bWJlciwgTGl2ZVZpcnR1YWxEb21FbGVtZW50PigpO1xuICBwcml2YXRlIHJlYWxFbGVtZW50VG9WaXJ0dWFsRWxlbWVudCA9IG5ldyBNYXA8RWxlbWVudCB8IFRleHQsIExpdmVWaXJ0dWFsRG9tRWxlbWVudD4oKTtcbiAgcHJpdmF0ZSBpZ25vcmVUZXh0Tm9kZXMgPSB0cnVlO1xuICBwcml2YXRlIGNhbGxiYWNrOiAobWVzc2FnZTogT2JzZXJ2YWJsZURvbU1lc3NhZ2UpID0+IHZvaWQ7XG4gIHByaXZhdGUgbmV4dE5vZGVJZCA9IDE7XG4gIHByaXZhdGUgaHRtbFBhdGg6IHN0cmluZztcbiAgcHJpdmF0ZSBkb21SdW5uZXI6IERPTVJ1bm5lckludGVyZmFjZTtcblxuICBwcml2YXRlIGRvY3VtZW50VGltZUludGVydmFsVGltZXI6IE5vZGVKUy5UaW1lcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBvYnNlcnZhYmxlRE9NUGFyYW1ldGVyczogT2JzZXJ2YWJsZURPTVBhcmFtZXRlcnMsXG4gICAgY2FsbGJhY2s6IChtZXNzYWdlOiBPYnNlcnZhYmxlRG9tTWVzc2FnZSkgPT4gdm9pZCxcbiAgICBydW5uZXJGYWN0b3J5OiBET01SdW5uZXJGYWN0b3J5LFxuICApIHtcbiAgICB0aGlzLmh0bWxQYXRoID0gb2JzZXJ2YWJsZURPTVBhcmFtZXRlcnMuaHRtbFBhdGg7XG4gICAgdGhpcy5pZ25vcmVUZXh0Tm9kZXMgPSBvYnNlcnZhYmxlRE9NUGFyYW1ldGVycy5pZ25vcmVUZXh0Tm9kZXM7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuXG4gICAgdGhpcy5kb2N1bWVudFRpbWVJbnRlcnZhbFRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgdGhpcy5jYWxsYmFjayh7XG4gICAgICAgIGRvY3VtZW50VGltZTogdGhpcy5nZXREb2N1bWVudFRpbWUoKSxcbiAgICAgIH0pO1xuICAgIH0sIG9ic2VydmFibGVET01QYXJhbWV0ZXJzLnBpbmdJbnRlcnZhbE1pbGxpc2Vjb25kcyB8fCA1MDAwKTtcblxuICAgIHRoaXMuZG9tUnVubmVyID0gcnVubmVyRmFjdG9yeShcbiAgICAgIG9ic2VydmFibGVET01QYXJhbWV0ZXJzLmh0bWxQYXRoLFxuICAgICAgb2JzZXJ2YWJsZURPTVBhcmFtZXRlcnMuaHRtbENvbnRlbnRzLFxuICAgICAgb2JzZXJ2YWJsZURPTVBhcmFtZXRlcnMucGFyYW1zLFxuICAgICAgKGRvbVJ1bm5lck1lc3NhZ2U6IERPTVJ1bm5lck1lc3NhZ2UpID0+IHtcbiAgICAgICAgaWYgKGRvbVJ1bm5lck1lc3NhZ2UubG9hZGVkKSB7XG4gICAgICAgICAgdGhpcy5jcmVhdGVWaXJ0dWFsRG9tRWxlbWVudFdpdGhDaGlsZHJlbihcbiAgICAgICAgICAgIHRoaXMuZG9tUnVubmVyLmdldERvY3VtZW50KCkgYXMgdW5rbm93biBhcyBFbGVtZW50LFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3Qgc25hcHNob3QgPSB2aXJ0dWFsRG9tRWxlbWVudFRvU3RhdGljKFxuICAgICAgICAgICAgdGhpcy5nZXRWaXJ0dWFsRG9tRWxlbWVudEZvclJlYWxFbGVtZW50T3JUaHJvdyhcbiAgICAgICAgICAgICAgdGhpcy5kb21SdW5uZXIuZ2V0RG9jdW1lbnQoKSBhcyB1bmtub3duIGFzIEVsZW1lbnQsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB0aGlzLmNhbGxiYWNrKHtcbiAgICAgICAgICAgIHNuYXBzaG90LFxuICAgICAgICAgICAgZG9jdW1lbnRUaW1lOiB0aGlzLmdldERvY3VtZW50VGltZSgpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGRvbVJ1bm5lck1lc3NhZ2UubXV0YXRpb25MaXN0KSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzTW9kaWZpY2F0aW9uTGlzdChkb21SdW5uZXJNZXNzYWdlLm11dGF0aW9uTGlzdCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZG9tUnVubmVyTWVzc2FnZS5sb2dNZXNzYWdlKSB7XG4gICAgICAgICAgdGhpcy5jYWxsYmFjayh7XG4gICAgICAgICAgICBsb2dNZXNzYWdlOiBkb21SdW5uZXJNZXNzYWdlLmxvZ01lc3NhZ2UsXG4gICAgICAgICAgICBkb2N1bWVudFRpbWU6IHRoaXMuZ2V0RG9jdW1lbnRUaW1lKCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRJUENXZWJzb2NrZXQod2ViU29ja2V0OiBXZWJTb2NrZXQpIHtcbiAgICByZXR1cm4gdGhpcy5kb21SdW5uZXIuYWRkSVBDV2Vic29ja2V0KHdlYlNvY2tldCk7XG4gIH1cblxuICBwdWJsaWMgYWRkQ29ubmVjdGVkVXNlcklkKGNvbm5lY3Rpb25JZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5kb21SdW5uZXIuZ2V0V2luZG93KCkuZGlzcGF0Y2hFdmVudChcbiAgICAgIG5ldyAodGhpcy5kb21SdW5uZXIuZ2V0V2luZG93KCkuQ3VzdG9tRXZlbnQpKFwiY29ubmVjdGVkXCIsIHtcbiAgICAgICAgZGV0YWlsOiB7IGNvbm5lY3Rpb25JZCB9LFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVDb25uZWN0ZWRVc2VySWQoY29ubmVjdGlvbklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmRvbVJ1bm5lci5nZXRXaW5kb3coKS5kaXNwYXRjaEV2ZW50KFxuICAgICAgbmV3ICh0aGlzLmRvbVJ1bm5lci5nZXRXaW5kb3coKS5DdXN0b21FdmVudCkoXCJkaXNjb25uZWN0ZWRcIiwge1xuICAgICAgICBkZXRhaWw6IHsgY29ubmVjdGlvbklkIH0sXG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzTW9kaWZpY2F0aW9uTGlzdChtdXRhdGlvbkxpc3Q6IEFycmF5PE11dGF0aW9uUmVjb3JkPik6IHZvaWQge1xuICAgIGNvbnN0IGRvY3VtZW50RWwgPSB0aGlzLmRvbVJ1bm5lci5nZXREb2N1bWVudCgpIGFzIHVua25vd24gYXMgRWxlbWVudDtcbiAgICBjb25zdCBkb2N1bWVudFZpcnR1YWxEb21FbGVtZW50ID0gdGhpcy5yZWFsRWxlbWVudFRvVmlydHVhbEVsZW1lbnQuZ2V0KGRvY3VtZW50RWwpO1xuICAgIGlmICghZG9jdW1lbnRWaXJ0dWFsRG9tRWxlbWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBkb2N1bWVudCBub3QgY3JlYXRlZCBpbiBwcm9jZXNzTW9kaWZpY2F0aW9uTGlzdGApO1xuICAgIH1cblxuICAgIGlmIChtdXRhdGlvbkxpc3QubGVuZ3RoID4gMSkge1xuICAgICAgLy8gVE9ETyAtIHdhbGsgYmFjayB0aHJvdWdoIHRoZSByZWNvcmRzIHRvIGRlcml2ZSB0aGUgaW50ZXJtZWRpYXRlIHN0YXRlcyAoZS5nLiBpZiBhbiBhdHRyaWJ1dGUgaXMgbGF0ZXIgYWRkZWQgdG9cbiAgICAgIC8vICBhbiBlbGVtZW50IGNyZWF0ZWQgaW4gYW4gZWFybGllciByZWNvcmQgdGhlbiBpdCBzaG91bGQgbm90IGhhdmUgdGhhdCBhdHRyaWJ1dGUgd2hlbiB0aGUgZWxlbWVudCBpcyBhZGRlZC5cbiAgICAgIC8vICBUaGlzIGlzIGltcG9ydGFudCBhcyBpbmNvcnJlY3QgYXR0cmlidXRlIHNldHMgY2FuIGFmZmVjdCB2aXNpYmlsaXR5IGFuZCBleHBlY3RlZCBjbGllbnQgcGVyZm9ybWFuY2UuXG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBcIk1vcmUgdGhhbiBvbmUgbXV0YXRpb24gcmVjb3JkIHJlY2VpdmVkLiBJdCBpcyBwb3NzaWJsZSB0aGF0IGludGVybWVkaWF0ZSBzdGF0ZXMgYXJlIGluY29ycmVjdC5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBtdXRhdGlvbiBvZiBtdXRhdGlvbkxpc3QpIHtcbiAgICAgIGlmICh0aGlzLmlzSWdub3JlZEVsZW1lbnQobXV0YXRpb24udGFyZ2V0IGFzIEVsZW1lbnQgfCBUZXh0KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBtdXRhdGlvbi50eXBlID09PSBcImF0dHJpYnV0ZXNcIiAmJlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICB0aGlzLmlzSWdub3JlZEF0dHJpYnV0ZShtdXRhdGlvbi50YXJnZXQgYXMgRWxlbWVudCB8IFRleHQsIG11dGF0aW9uLmF0dHJpYnV0ZU5hbWUhKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFkZEtub3duTm9kZXNJbk11dGF0aW9uKG11dGF0aW9uKTtcblxuICAgICAgLy8gQ29udmVydCB0aGUgXCJyZWFsXCIgRE9NIE11dGF0aW9uUmVjb3JkIGludG8gYSBcInZpcnR1YWxcIiBET00gTXV0YXRpb25SZWNvcmQgdGhhdCByZWZlcmVuY2VzIHRoZSBWaXJ0dWFsRE9NRWxlbWVudHNcbiAgICAgIC8vIFRoaXMgaXMgZG9uZSBzbyB0aGF0IHRoZSBzYW1lIHByb2Nlc3MgZm9yIGhhbmRsaW5nIG11dGF0aW9ucyBjYW4gYmUgdXNlZCBmb3IgYm90aCBjaGFuZ2VzIHRvIGEgbGl2ZSBET00gYW5kIGFsc29cbiAgICAgIC8vIHRvIGRpZmZzIGJldHdlZW4gRE9NIHNuYXBzaG90cyB3aGVuIHJlbG9hZGluZ1xuICAgICAgY29uc3QgZmlyc3ROb25JZ25vcmVkUHJldmlvdXNTaWJsaW5nID0gbXV0YXRpb24ucHJldmlvdXNTaWJsaW5nXG4gICAgICAgID8gdGhpcy5nZXRGaXJzdE5vbklnbm9yZWRQcmV2aW91c1NpYmxpbmcobXV0YXRpb24ucHJldmlvdXNTaWJsaW5nIGFzIEVsZW1lbnQgfCBUZXh0KVxuICAgICAgICA6IG51bGw7XG4gICAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gdGhpcy5nZXRWaXJ0dWFsRG9tRWxlbWVudEZvclJlYWxFbGVtZW50T3JUaHJvdyhcbiAgICAgICAgbXV0YXRpb24udGFyZ2V0IGFzIEVsZW1lbnQgfCBUZXh0LFxuICAgICAgKTtcbiAgICAgIGNvbnN0IGFkZGVkTm9kZXM6IEFycmF5PFN0YXRpY1ZpcnR1YWxEb21FbGVtZW50PiA9IFtdO1xuICAgICAgZm9yIChjb25zdCBub2RlIG9mIG11dGF0aW9uLmFkZGVkTm9kZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNJZ25vcmVkRWxlbWVudChub2RlIGFzIEVsZW1lbnQgfCBUZXh0KSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZpcnR1YWxEb21FbGVtZW50ID0gdGhpcy5nZXRWaXJ0dWFsRG9tRWxlbWVudEZvclJlYWxFbGVtZW50T3JUaHJvdyhcbiAgICAgICAgICBub2RlIGFzIEVsZW1lbnQgfCBUZXh0LFxuICAgICAgICApO1xuICAgICAgICBhZGRlZE5vZGVzLnB1c2godmlydHVhbERvbUVsZW1lbnRUb1N0YXRpYyh2aXJ0dWFsRG9tRWxlbWVudCkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZW1vdmVkTm9kZUlkczogQXJyYXk8bnVtYmVyPiA9IFtdO1xuICAgICAgZm9yIChjb25zdCBub2RlIG9mIG11dGF0aW9uLnJlbW92ZWROb2Rlcykge1xuICAgICAgICBpZiAodGhpcy5pc0lnbm9yZWRFbGVtZW50KG5vZGUgYXMgRWxlbWVudCB8IFRleHQpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmlydHVhbERvbUVsZW1lbnQgPSB0aGlzLmdldFZpcnR1YWxEb21FbGVtZW50Rm9yUmVhbEVsZW1lbnRPclRocm93KFxuICAgICAgICAgIG5vZGUgYXMgRWxlbWVudCB8IFRleHQsXG4gICAgICAgICk7XG4gICAgICAgIHJlbW92ZWROb2RlSWRzLnB1c2godmlydHVhbERvbUVsZW1lbnQubm9kZUlkKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbXV0YXRpb25SZWNvcmQ6IFN0YXRpY1ZpcnR1YWxEb21NdXRhdGlvbklkc1JlY29yZCA9IHtcbiAgICAgICAgdHlwZTogbXV0YXRpb24udHlwZSxcbiAgICAgICAgdGFyZ2V0SWQ6IHRhcmdldEVsZW1lbnQubm9kZUlkLFxuICAgICAgICBhZGRlZE5vZGVzLFxuICAgICAgICByZW1vdmVkTm9kZUlkcyxcbiAgICAgICAgcHJldmlvdXNTaWJsaW5nSWQ6XG4gICAgICAgICAgZmlyc3ROb25JZ25vcmVkUHJldmlvdXNTaWJsaW5nICE9PSBudWxsXG4gICAgICAgICAgICA/IHRoaXMuZ2V0VmlydHVhbERvbUVsZW1lbnRGb3JSZWFsRWxlbWVudE9yVGhyb3coZmlyc3ROb25JZ25vcmVkUHJldmlvdXNTaWJsaW5nKS5ub2RlSWRcbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgYXR0cmlidXRlOiBtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWU6IG11dGF0aW9uLmF0dHJpYnV0ZU5hbWUsXG4gICAgICAgICAgICAgIHZhbHVlOiAobXV0YXRpb24udGFyZ2V0IGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IG51bGwsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLmNhbGxiYWNrKHtcbiAgICAgICAgbXV0YXRpb246IG11dGF0aW9uUmVjb3JkLFxuICAgICAgICBkb2N1bWVudFRpbWU6IHRoaXMuZ2V0RG9jdW1lbnRUaW1lKCksXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5yZW1vdmVLbm93bk5vZGVzSW5NdXRhdGlvbihtdXRhdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRLbm93bk5vZGVzSW5NdXRhdGlvbihtdXRhdGlvbjogTXV0YXRpb25SZWNvcmQpOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXROb2RlID0gbXV0YXRpb24udGFyZ2V0IGFzIEVsZW1lbnQgfCBUZXh0O1xuICAgIGNvbnN0IHZpcnR1YWxEb21FbGVtZW50ID0gdGhpcy5yZWFsRWxlbWVudFRvVmlydHVhbEVsZW1lbnQuZ2V0KHRhcmdldE5vZGUpO1xuICAgIGlmICghdmlydHVhbERvbUVsZW1lbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJVbmtub3duIG5vZGUgaW4gYWRkS25vd25Ob2Rlc0luTXV0YXRpb246XCIgKyB0YXJnZXROb2RlICsgXCIsXCIgKyBtdXRhdGlvbi50eXBlLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG11dGF0aW9uLnR5cGUgPT09IFwiY2hpbGRMaXN0XCIpIHtcbiAgICAgIGxldCBwcmV2aW91c1NpYmxpbmcgPSBtdXRhdGlvbi5wcmV2aW91c1NpYmxpbmc7XG4gICAgICBsZXQgaW5kZXggPSAwO1xuICAgICAgd2hpbGUgKHByZXZpb3VzU2libGluZyAmJiB0aGlzLmlzSWdub3JlZEVsZW1lbnQocHJldmlvdXNTaWJsaW5nIGFzIEVsZW1lbnQgfCBUZXh0KSkge1xuICAgICAgICBwcmV2aW91c1NpYmxpbmcgPSBwcmV2aW91c1NpYmxpbmcucHJldmlvdXNTaWJsaW5nO1xuICAgICAgfVxuICAgICAgaWYgKHByZXZpb3VzU2libGluZykge1xuICAgICAgICBjb25zdCBwcmV2aW91c1NpYmxpbmdFbGVtZW50ID0gdGhpcy5yZWFsRWxlbWVudFRvVmlydHVhbEVsZW1lbnQuZ2V0KFxuICAgICAgICAgIHByZXZpb3VzU2libGluZyBhcyBFbGVtZW50IHwgVGV4dCxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFwcmV2aW91c1NpYmxpbmdFbGVtZW50KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBwcmV2aW91cyBzaWJsaW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ID0gdmlydHVhbERvbUVsZW1lbnQuY2hpbGROb2Rlcy5pbmRleE9mKHByZXZpb3VzU2libGluZ0VsZW1lbnQpO1xuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJldmlvdXMgc2libGluZyBpcyBub3QgY3VycmVudGx5IGEgY2hpbGQgb2YgdGhlIHBhcmVudCBlbGVtZW50XCIpO1xuICAgICAgICB9XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgICB9XG4gICAgICBtdXRhdGlvbi5hZGRlZE5vZGVzLmZvckVhY2goKG5vZGU6IE5vZGUpID0+IHtcbiAgICAgICAgY29uc3QgYXNFbGVtZW50T3JUZXh0ID0gbm9kZSBhcyBFbGVtZW50IHwgVGV4dDtcbiAgICAgICAgY29uc3QgY2hpbGRWaXJ0dWFsRG9tRWxlbWVudCA9IHRoaXMuY3JlYXRlVmlydHVhbERvbUVsZW1lbnRXaXRoQ2hpbGRyZW4oXG4gICAgICAgICAgYXNFbGVtZW50T3JUZXh0LFxuICAgICAgICAgIHZpcnR1YWxEb21FbGVtZW50LFxuICAgICAgICApO1xuICAgICAgICBpZiAoY2hpbGRWaXJ0dWFsRG9tRWxlbWVudCkge1xuICAgICAgICAgIGlmICh2aXJ0dWFsRG9tRWxlbWVudC5jaGlsZE5vZGVzLmluZGV4T2YoY2hpbGRWaXJ0dWFsRG9tRWxlbWVudCkgPT09IC0xKSB7XG4gICAgICAgICAgICB2aXJ0dWFsRG9tRWxlbWVudC5jaGlsZE5vZGVzLnNwbGljZShpbmRleCwgMCwgY2hpbGRWaXJ0dWFsRG9tRWxlbWVudCk7XG4gICAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChtdXRhdGlvbi50eXBlID09PSBcImF0dHJpYnV0ZXNcIikge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSBtdXRhdGlvbi5hdHRyaWJ1dGVOYW1lITtcbiAgICAgIGlmICh0aGlzLmlzSWdub3JlZEF0dHJpYnV0ZSh0YXJnZXROb2RlLCBhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9ICh0YXJnZXROb2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgIGlmIChhdHRyaWJ1dGVWYWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICBkZWxldGUgdmlydHVhbERvbUVsZW1lbnQuYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZpcnR1YWxEb21FbGVtZW50LmF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0gPSBhdHRyaWJ1dGVWYWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG11dGF0aW9uLnR5cGUgPT09IFwiY2hhcmFjdGVyRGF0YVwiKSB7XG4gICAgICB2aXJ0dWFsRG9tRWxlbWVudC50ZXh0Q29udGVudCA9IHRhcmdldE5vZGUudGV4dENvbnRlbnQgPyB0YXJnZXROb2RlLnRleHRDb250ZW50IDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlS25vd25Ob2Rlc0luTXV0YXRpb24obXV0YXRpb246IE11dGF0aW9uUmVjb3JkKTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0Tm9kZSA9IG11dGF0aW9uLnRhcmdldCBhcyBFbGVtZW50IHwgVGV4dDtcbiAgICBjb25zdCB2aXJ0dWFsRG9tRWxlbWVudCA9IHRoaXMucmVhbEVsZW1lbnRUb1ZpcnR1YWxFbGVtZW50LmdldCh0YXJnZXROb2RlKTtcbiAgICBpZiAoIXZpcnR1YWxEb21FbGVtZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIG5vZGUgaW4gbXV0YXRpb24gbGlzdDpcIiArIHRhcmdldE5vZGUgKyBcIiwgXCIgKyBtdXRhdGlvbi50eXBlKTtcbiAgICB9XG4gICAgaWYgKG11dGF0aW9uLnR5cGUgPT09IFwiY2hpbGRMaXN0XCIpIHtcbiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBtdXRhdGlvbi5yZW1vdmVkTm9kZXMpIHtcbiAgICAgICAgY29uc3QgYXNFbGVtZW50T3JUZXh0ID0gbm9kZSBhcyBFbGVtZW50IHwgVGV4dDtcbiAgICAgICAgaWYgKHRoaXMuaXNJZ25vcmVkRWxlbWVudChhc0VsZW1lbnRPclRleHQpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hpbGREb21FbGVtZW50ID0gdGhpcy5yZWFsRWxlbWVudFRvVmlydHVhbEVsZW1lbnQuZ2V0KGFzRWxlbWVudE9yVGV4dCk7XG4gICAgICAgIGlmICghY2hpbGREb21FbGVtZW50KSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKHRoaXMuaHRtbFBhdGgsIFwiVW5rbm93biBub2RlIGluIHJlbW92ZUtub3duTm9kZXNJbk11dGF0aW9uXCIpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVtb3ZlVmlydHVhbERvbUVsZW1lbnQoY2hpbGREb21FbGVtZW50KTtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHZpcnR1YWxEb21FbGVtZW50LmNoaWxkTm9kZXMuaW5kZXhPZihjaGlsZERvbUVsZW1lbnQpO1xuICAgICAgICAgIHZpcnR1YWxEb21FbGVtZW50LmNoaWxkTm9kZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlVmlydHVhbERvbUVsZW1lbnQodmlydHVhbERvbUVsZW1lbnQ6IExpdmVWaXJ0dWFsRG9tRWxlbWVudCk6IHZvaWQge1xuICAgIHRoaXMubm9kZUlkVG9Ob2RlLmRlbGV0ZSh2aXJ0dWFsRG9tRWxlbWVudC5ub2RlSWQpO1xuICAgIHRoaXMubm9kZVRvTm9kZUlkLmRlbGV0ZSh2aXJ0dWFsRG9tRWxlbWVudCk7XG4gICAgdGhpcy5yZWFsRWxlbWVudFRvVmlydHVhbEVsZW1lbnQuZGVsZXRlKHZpcnR1YWxEb21FbGVtZW50LnJlYWxFbGVtZW50KTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHZpcnR1YWxEb21FbGVtZW50LmNoaWxkTm9kZXMpIHtcbiAgICAgIHRoaXMucmVtb3ZlVmlydHVhbERvbUVsZW1lbnQoY2hpbGQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVmlydHVhbERvbUVsZW1lbnRXaXRoQ2hpbGRyZW4oXG4gICAgbm9kZTogRWxlbWVudCB8IFRleHQsXG4gICAgcGFyZW50OiBMaXZlVmlydHVhbERvbUVsZW1lbnQgfCBudWxsLFxuICApOiBMaXZlVmlydHVhbERvbUVsZW1lbnQgfCBudWxsIHtcbiAgICBjb25zdCB2aXJ0dWFsRWxlbWVudCA9IHRoaXMuY3JlYXRlVmlydHVhbERvbUVsZW1lbnQobm9kZSwgcGFyZW50KTtcbiAgICBpZiAoIXZpcnR1YWxFbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKChub2RlIGFzIEVsZW1lbnQpLmNoaWxkTm9kZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgKG5vZGUgYXMgRWxlbWVudCkuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjaGlsZCA9IChub2RlIGFzIEVsZW1lbnQpLmNoaWxkTm9kZXNbaV07XG4gICAgICAgIGNvbnN0IGNoaWxkVmlydHVhbEVsZW1lbnQgPSB0aGlzLmNyZWF0ZVZpcnR1YWxEb21FbGVtZW50V2l0aENoaWxkcmVuKFxuICAgICAgICAgIGNoaWxkIGFzIEVsZW1lbnQgfCBUZXh0LFxuICAgICAgICAgIHZpcnR1YWxFbGVtZW50LFxuICAgICAgICApO1xuICAgICAgICBpZiAoY2hpbGRWaXJ0dWFsRWxlbWVudCkge1xuICAgICAgICAgIHZpcnR1YWxFbGVtZW50LmNoaWxkTm9kZXMucHVzaChjaGlsZFZpcnR1YWxFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB2aXJ0dWFsRWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVmlydHVhbERvbUVsZW1lbnQoXG4gICAgbm9kZTogRWxlbWVudCB8IFRleHQsXG4gICAgcGFyZW50OiBMaXZlVmlydHVhbERvbUVsZW1lbnQgfCBudWxsLFxuICApOiBMaXZlVmlydHVhbERvbUVsZW1lbnQgfCBudWxsIHtcbiAgICBpZiAodGhpcy5pc0lnbm9yZWRFbGVtZW50KG5vZGUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmdWYWx1ZSA9IHRoaXMucmVhbEVsZW1lbnRUb1ZpcnR1YWxFbGVtZW50LmdldChub2RlKTtcbiAgICBpZiAoZXhpc3RpbmdWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb2RlIGFscmVhZHkgaGFzIGEgdmlydHVhbCBlbGVtZW50OiBcIiArIG5vZGUubm9kZU5hbWUpO1xuICAgIH1cbiAgICBpZiAoIW5vZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBhc3NpZ24gbm9kZSBpZCB0byBudWxsXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0ZXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICBpZiAoKG5vZGUgYXMgYW55KS5hdHRyaWJ1dGVzKSB7XG4gICAgICBjb25zdCBhc0hUTUxFbGVtZW50ID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGFzSFRNTEVsZW1lbnQuZ2V0QXR0cmlidXRlTmFtZXMoKSkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGFzSFRNTEVsZW1lbnQuZ2V0QXR0cmlidXRlKGtleSk7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk51bGwgYXR0cmlidXRlIHZhbHVlIGZvciBrZXk6IFwiICsga2V5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaXNJZ25vcmVkQXR0cmlidXRlKG5vZGUsIGtleSkpIHtcbiAgICAgICAgICBhdHRyaWJ1dGVzW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG5vZGVJZCA9IHRoaXMubmV4dE5vZGVJZCsrO1xuICAgIGNvbnN0IHZpcnR1YWxFbGVtZW50OiBMaXZlVmlydHVhbERvbUVsZW1lbnQgPSB7XG4gICAgICBub2RlSWQsXG4gICAgICB0YWc6IG5vZGUubm9kZU5hbWUsXG4gICAgICBhdHRyaWJ1dGVzLFxuICAgICAgY2hpbGROb2RlczogW10sXG4gICAgICByZWFsRWxlbWVudDogbm9kZSxcbiAgICAgIHBhcmVudCxcbiAgICB9O1xuICAgIGlmIChub2RlIGluc3RhbmNlb2YgdGhpcy5kb21SdW5uZXIuZ2V0V2luZG93KCkuVGV4dCAmJiBub2RlLnRleHRDb250ZW50KSB7XG4gICAgICB2aXJ0dWFsRWxlbWVudC50ZXh0Q29udGVudCA9IG5vZGUudGV4dENvbnRlbnQ7XG4gICAgfVxuICAgIHRoaXMubm9kZVRvTm9kZUlkLnNldCh2aXJ0dWFsRWxlbWVudCwgbm9kZUlkKTtcbiAgICB0aGlzLm5vZGVJZFRvTm9kZS5zZXQobm9kZUlkLCB2aXJ0dWFsRWxlbWVudCk7XG4gICAgdGhpcy5yZWFsRWxlbWVudFRvVmlydHVhbEVsZW1lbnQuc2V0KG5vZGUsIHZpcnR1YWxFbGVtZW50KTtcbiAgICByZXR1cm4gdmlydHVhbEVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIGdldEZpcnN0Tm9uSWdub3JlZFByZXZpb3VzU2libGluZyhub2RlOiBFbGVtZW50IHwgVGV4dCk6IEVsZW1lbnQgfCBUZXh0IHwgbnVsbCB7XG4gICAgbGV0IGN1cnJlbnROb2RlID0gbm9kZTtcbiAgICBpZiAoIXRoaXMuaXNJZ25vcmVkRWxlbWVudChjdXJyZW50Tm9kZSkpIHtcbiAgICAgIHJldHVybiBjdXJyZW50Tm9kZTtcbiAgICB9XG4gICAgd2hpbGUgKGN1cnJlbnROb2RlICYmIGN1cnJlbnROb2RlLnByZXZpb3VzU2libGluZykge1xuICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5wcmV2aW91c1NpYmxpbmcgYXMgRWxlbWVudCB8IFRleHQ7XG4gICAgICBpZiAoIXRoaXMuaXNJZ25vcmVkRWxlbWVudChjdXJyZW50Tm9kZSkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmlydHVhbERvbUVsZW1lbnRGb3JSZWFsRWxlbWVudE9yVGhyb3coXG4gICAgcmVhbEVsZW1lbnQ6IEVsZW1lbnQgfCBUZXh0LFxuICApOiBMaXZlVmlydHVhbERvbUVsZW1lbnQge1xuICAgIGNvbnN0IHZpcnR1YWxFbGVtZW50ID0gdGhpcy5yZWFsRWxlbWVudFRvVmlydHVhbEVsZW1lbnQuZ2V0KHJlYWxFbGVtZW50KTtcbiAgICBpZiAoIXZpcnR1YWxFbGVtZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFZpcnR1YWwgZWxlbWVudCBub3QgZm91bmQgZm9yIHJlYWwgZWxlbWVudGApO1xuICAgIH1cbiAgICByZXR1cm4gdmlydHVhbEVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIGlzSWdub3JlZEVsZW1lbnQobm9kZTogRWxlbWVudCB8IFRleHQpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pZ25vcmVUZXh0Tm9kZXMgJiYgbm9kZSBpbnN0YW5jZW9mIHRoaXMuZG9tUnVubmVyLmdldFdpbmRvdygpLlRleHQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIHRoaXMuZG9tUnVubmVyLmdldFdpbmRvdygpLkhUTUxTY3JpcHRFbGVtZW50KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiB0aGlzLmRvbVJ1bm5lci5nZXRXaW5kb3coKS5Db21tZW50KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0lnbm9yZWRBdHRyaWJ1dGUobm9kZTogRWxlbWVudCB8IFRleHQsIGF0dHJpYnV0ZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhdHRyaWJ1dGVOYW1lLnN0YXJ0c1dpdGgoXCJvblwiKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwYXRjaFJlbW90ZUV2ZW50RnJvbUNvbm5lY3Rpb25JZChjb25uZWN0aW9uSWQ6IG51bWJlciwgcmVtb3RlRXZlbnQ6IFJlbW90ZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgZG9tTm9kZSA9IHRoaXMubm9kZUlkVG9Ob2RlLmdldChyZW1vdGVFdmVudC5ub2RlSWQpO1xuICAgIGlmICghZG9tTm9kZSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIlVua25vd24gbm9kZSBJRCBpbiByZW1vdGUgZXZlbnQ6IFwiICsgcmVtb3RlRXZlbnQubm9kZUlkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZG9tTm9kZSBpbnN0YW5jZW9mIHRoaXMuZG9tUnVubmVyLmdldFdpbmRvdygpLlRleHQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkNhbm5vdCBkaXNwYXRjaCByZW1vdGUgZXZlbnQgdG8gdGV4dCBub2RlXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZG9tUnVubmVyLmRpc3BhdGNoUmVtb3RlRXZlbnRGcm9tQ29ubmVjdGlvbklkKFxuICAgICAgY29ubmVjdGlvbklkLFxuICAgICAgZG9tTm9kZS5yZWFsRWxlbWVudCBhcyBFbGVtZW50LFxuICAgICAgcmVtb3RlRXZlbnQsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5kb2N1bWVudFRpbWVJbnRlcnZhbFRpbWVyKTtcbiAgICB0aGlzLmRvbVJ1bm5lci5kaXNwb3NlKCk7XG4gIH1cblxuICBwcml2YXRlIGdldERvY3VtZW50VGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy5kb21SdW5uZXIuZ2V0RG9jdW1lbnRUaW1lKCk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBSZW1vdGVFdmVudCB9IGZyb20gXCJAbW1sLWlvL25ldHdvcmtlZC1kb20tcHJvdG9jb2xcIjtcbmltcG9ydCB7IERPTVJ1bm5lckZhY3RvcnksIERPTVJ1bm5lckludGVyZmFjZSwgRE9NUnVubmVyTWVzc2FnZSB9IGZyb20gXCJAbW1sLWlvL29ic2VydmFibGUtZG9tXCI7XG5cbmV4cG9ydCBjb25zdCBXZWJCcm93c2VyRE9NUnVubmVyRmFjdG9yeTogRE9NUnVubmVyRmFjdG9yeSA9IChcbiAgaHRtbFBhdGg6IHN0cmluZyxcbiAgaHRtbENvbnRlbnRzOiBzdHJpbmcsXG4gIHBhcmFtczogb2JqZWN0LFxuICBjYWxsYmFjazogKG11dGF0aW9uTGlzdDogRE9NUnVubmVyTWVzc2FnZSkgPT4gdm9pZCxcbik6IERPTVJ1bm5lckludGVyZmFjZSA9PiB7XG4gIHJldHVybiBuZXcgV2ViQnJvd3NlckRPTVJ1bm5lcihodG1sUGF0aCwgaHRtbENvbnRlbnRzLCBwYXJhbXMsIGNhbGxiYWNrKTtcbn07XG5cbmNvbnN0IGRvY3VtZW50TG9hZFRpbWUgPSBEYXRlLm5vdygpO1xuXG5leHBvcnQgY2xhc3MgV2ViQnJvd3NlckRPTVJ1bm5lciBpbXBsZW1lbnRzIERPTVJ1bm5lckludGVyZmFjZSB7XG4gIHByaXZhdGUgbXV0YXRpb25PYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcbiAgcHJpdmF0ZSBodG1sUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIGNhbGxiYWNrOiAoZG9tUnVubmVyTWVzc2FnZTogRE9NUnVubmVyTWVzc2FnZSkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBodG1sUGF0aDogc3RyaW5nLFxuICAgIGh0bWxDb250ZW50czogc3RyaW5nLFxuICAgIHBhcmFtczogb2JqZWN0LFxuICAgIGNhbGxiYWNrOiAoZG9tUnVubmVyTWVzc2FnZTogRE9NUnVubmVyTWVzc2FnZSkgPT4gdm9pZCxcbiAgKSB7XG4gICAgdGhpcy5odG1sUGF0aCA9IGh0bWxQYXRoO1xuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcblxuICAgIC8vIEZvcndhcmQgY29uc29sZSBtZXNzYWdlc1xuICAgIGZvciAoY29uc3QgbGV2ZWwgb2YgW1wiZXJyb3JcIiwgXCJ3YXJuXCIsIFwiaW5mb1wiLCBcImxvZ1wiXSBhcyBjb25zdCkge1xuICAgICAgY29uc3QgZGVmYXVsdEZuID0gd2luZG93LmNvbnNvbGVbbGV2ZWxdO1xuXG4gICAgICB3aW5kb3cuY29uc29sZVtsZXZlbF0gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICBjYWxsYmFjayh7XG4gICAgICAgICAgbG9nTWVzc2FnZToge1xuICAgICAgICAgICAgbGV2ZWwsXG4gICAgICAgICAgICBjb250ZW50OiBhcmdzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBkZWZhdWx0Rm4oLi4uYXJncyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEZvcndhcmQgdW5jYXVnaHQgZXJyb3JzXG4gICAgd2luZG93Lm9uZXJyb3IgPSAobWVzc2FnZSwgc291cmNlLCBsaW5lLCBjb2x1bW4sIGVycm9yKSA9PiB7XG4gICAgICBjYWxsYmFjayh7XG4gICAgICAgIGxvZ01lc3NhZ2U6IHtcbiAgICAgICAgICBsZXZlbDogXCJzeXN0ZW1cIixcbiAgICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgIHR5cGU6IGVycm9yPy5uYW1lLFxuICAgICAgICAgICAgICBsaW5lLFxuICAgICAgICAgICAgICBjb2x1bW4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgbGV0IGRpZFNlbmRMb2FkID0gZmFsc2U7XG5cbiAgICB0aGlzLm11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9uTGlzdCkgPT4ge1xuICAgICAgaWYgKCFkb2N1bWVudCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWRpZFNlbmRMb2FkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk11dGF0aW9uT2JzZXJ2ZXIgY2FsbGVkIGJlZm9yZSBsb2FkXCIpO1xuICAgICAgfVxuICAgICAgdGhpcy5jYWxsYmFjayh7XG4gICAgICAgIG11dGF0aW9uTGlzdCxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgKHdpbmRvdyBhcyBhbnkpLnBhcmFtcyA9IHBhcmFtcztcblxuICAgIGNvbnN0IGZpbmlzaExvYWQgPSAoKSA9PiB7XG4gICAgICBpZiAoZGlkU2VuZExvYWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmluaXNoTG9hZCBjYWxsZWQgdHdpY2VcIik7XG4gICAgICB9XG4gICAgICBkaWRTZW5kTG9hZCA9IHRydWU7XG4gICAgICB0aGlzLmNhbGxiYWNrKHtcbiAgICAgICAgbG9hZGVkOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICB0aGlzLm11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZSh3aW5kb3cuZG9jdW1lbnQsIHtcbiAgICAgICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfTtcbiAgICBpZiAoZG9jdW1lbnQuYm9keSkge1xuICAgICAgc2V0VGltZW91dChmaW5pc2hMb2FkLCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsIGZpbmlzaExvYWQpO1xuICAgIH1cbiAgfVxuXG4gIGFkZElQQ1dlYnNvY2tldCgpOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWQuXCIpO1xuICB9XG5cbiAgZGlzcGF0Y2hSZW1vdGVFdmVudEZyb21Db25uZWN0aW9uSWQoXG4gICAgY29ubmVjdGlvbklkOiBudW1iZXIsXG4gICAgcmVhbEVsZW1lbnQ6IEVsZW1lbnQsXG4gICAgcmVtb3RlRXZlbnQ6IFJlbW90ZUV2ZW50LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBidWJibGVzID0gcmVtb3RlRXZlbnQuYnViYmxlcyB8fCBmYWxzZTtcbiAgICBjb25zdCByZW1vdGVFdmVudE9iamVjdCA9IG5ldyBDdXN0b21FdmVudChyZW1vdGVFdmVudC5uYW1lLCB7XG4gICAgICBidWJibGVzLFxuICAgICAgZGV0YWlsOiB7IC4uLnJlbW90ZUV2ZW50LnBhcmFtcywgY29ubmVjdGlvbklkIH0sXG4gICAgfSk7XG5cbiAgICAvLyBEaXNwYXRjaCB0aGUgZXZlbnQgdmlhIEphdmFTY3JpcHQuXG4gICAgcmVhbEVsZW1lbnQuZGlzcGF0Y2hFdmVudChyZW1vdGVFdmVudE9iamVjdCk7XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIC8vIFRPRE8gLSBoYW5kbGUgZGlzcG9zZVxuICAgIGNvbnNvbGUubG9nKFwiV2ViQnJvd3NlckRPTVJ1bm5lci5kaXNwb3NlXCIpO1xuICB9XG5cbiAgZ2V0RG9jdW1lbnQoKTogRG9jdW1lbnQge1xuICAgIHJldHVybiBkb2N1bWVudDtcbiAgfVxuXG4gIGdldERvY3VtZW50VGltZSgpOiBudW1iZXIge1xuICAgIGlmIChkb2N1bWVudC50aW1lbGluZSAmJiBkb2N1bWVudC50aW1lbGluZS5jdXJyZW50VGltZSkge1xuICAgICAgcmV0dXJuIGRvY3VtZW50LnRpbWVsaW5lLmN1cnJlbnRUaW1lO1xuICAgIH1cbiAgICByZXR1cm4gRGF0ZS5ub3coKSAtIGRvY3VtZW50TG9hZFRpbWU7XG4gIH1cblxuICAvLyBUT0RPIC0gcmVzb2x2ZSB0eXBlcyAoV2luZG93IG5lZWRzIHRvIGV4cG9zZSBjbGFzc2VzIHN1Y2ggYXMgQ3VzdG9tRXZlbnQgYXMgcHJvcGVydGllcylcbiAgZ2V0V2luZG93KCk6IGFueSB7XG4gICAgcmV0dXJuIHdpbmRvdztcbiAgfVxufVxuIiwgImltcG9ydCB7XG4gIEZyb21JbnN0YW5jZU1lc3NhZ2VUeXBlcyxcbiAgVG9JbnN0YW5jZU1lc3NhZ2VUeXBlcyxcbn0gZnJvbSBcIkBtbWwtaW8vbmV0d29ya2VkLWRvbS13ZWItcnVubmVyL3NyYy9tZXNzYWdlLXR5cGVzXCI7XG5pbXBvcnQgeyBPYnNlcnZhYmxlRG9tIH0gZnJvbSBcIkBtbWwtaW8vb2JzZXJ2YWJsZS1kb20vc3JjL09ic2VydmFibGVEb21cIjtcbmltcG9ydCB7IE9ic2VydmFibGVEb21NZXNzYWdlLCBPYnNlcnZhYmxlRE9NUGFyYW1ldGVycyB9IGZyb20gXCJAbW1sLWlvL29ic2VydmFibGUtZG9tLWNvbW1vblwiO1xuXG5pbXBvcnQgeyBXZWJCcm93c2VyRE9NUnVubmVyRmFjdG9yeSB9IGZyb20gXCIuL1dlYkJyb3dzZXJET01SdW5uZXJcIjtcblxuLy8gVGhpcyBydW5zIGluIHRoZSBpZnJhbWUgdGhhdCB3aWxsIGV4ZWN1dGUgdGhlIGRvY3VtZW50IHNjcmlwdCB0byBzZXR1cCB0aGUgbGlzdGVuaW5nIGZvciBldmVudHMgbWVzc2FnZXNcbmV4cG9ydCBmdW5jdGlvbiBzZXR1cElmcmFtZVdlYlJ1bm5lcihhcmdzU3RyaW5nOiBzdHJpbmcpIHtcbiAgY29uc3Qgb2JzZXJ2YWJsZURPTVBhcmFtcyA9IEpTT04ucGFyc2UoYXRvYihhcmdzU3RyaW5nKSkgYXMgT2JzZXJ2YWJsZURPTVBhcmFtZXRlcnM7XG5cbiAgY29uc3Qgc2VuZE1lc3NhZ2VUb0hhbmRsZXIgPSAobWVzc2FnZTogRnJvbUluc3RhbmNlTWVzc2FnZVR5cGVzKSA9PiB7XG4gICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShtZXNzYWdlKSwgXCIqXCIpO1xuICB9O1xuXG4gIGNvbnN0IG9ic2VydmFibGVET00gPSBuZXcgT2JzZXJ2YWJsZURvbShcbiAgICB7XG4gICAgICAuLi5vYnNlcnZhYmxlRE9NUGFyYW1zLFxuICAgICAgaHRtbENvbnRlbnRzOiBcIlwiLCAvLyBUaGlzIG11c3QgYmUgZW1wdHkgYXMgdGhlIGNvbnRlbnRzIGFyZSBhc3N1bWVkIHRvIGJlIHByb3ZpZGVkIGJ5IHRoZSBzcmNkb2NcbiAgICB9LFxuICAgIChvYnNlcnZhYmxlRG9tTWVzc2FnZTogT2JzZXJ2YWJsZURvbU1lc3NhZ2UpID0+IHtcbiAgICAgIHNlbmRNZXNzYWdlVG9IYW5kbGVyKHtcbiAgICAgICAgdHlwZTogXCJkb21cIixcbiAgICAgICAgbWVzc2FnZTogb2JzZXJ2YWJsZURvbU1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICB9LFxuICAgIFdlYkJyb3dzZXJET01SdW5uZXJGYWN0b3J5LFxuICApO1xuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCAoZSkgPT4ge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoZS5kYXRhKSBhcyBUb0luc3RhbmNlTWVzc2FnZVR5cGVzO1xuICAgIGlmIChwYXJzZWQudHlwZSA9PT0gXCJkaXNwYXRjaFJlbW90ZUV2ZW50RnJvbUNvbm5lY3Rpb25JZFwiKSB7XG4gICAgICBvYnNlcnZhYmxlRE9NLmRpc3BhdGNoUmVtb3RlRXZlbnRGcm9tQ29ubmVjdGlvbklkKHBhcnNlZC5jb25uZWN0aW9uSWQsIHBhcnNlZC5ldmVudCk7XG4gICAgfVxuICB9KTtcbn1cbiIsICJpbXBvcnQgeyBzZXR1cElmcmFtZVdlYlJ1bm5lciB9IGZyb20gXCIuL0lmcmFtZVdlYlJ1bm5lclwiO1xuXG5jb25zdCBhcmdzID0gKHdpbmRvdyBhcyBhbnkpLmFyZ3M7XG5zZXR1cElmcmFtZVdlYlJ1bm5lcihhcmdzKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUlPLFNBQVMsMEJBQTBCLElBQW9EO0FBQzVGLFNBQU87QUFBQSxJQUNMLFFBQVEsR0FBRztBQUFBLElBQ1gsS0FBSyxHQUFHO0FBQUEsSUFDUixZQUFZLEdBQUc7QUFBQSxJQUNmLFlBQVksR0FBRyxXQUFXLElBQUksQ0FBQyxVQUFVLDBCQUEwQixLQUFLLENBQUM7QUFBQSxJQUN6RSxhQUFhLEdBQUc7QUFBQSxFQUNsQjtBQUNGOzs7QUNxQ08sSUFBTSxnQkFBTixNQUFzRDtBQUFBLEVBWTNELFlBQ0UseUJBQ0EsVUFDQSxlQUNBO0FBZkYsU0FBUSxlQUFlLG9CQUFJLElBQW1DO0FBQzlELFNBQVEsZUFBZSxvQkFBSSxJQUFtQztBQUM5RCxTQUFRLDhCQUE4QixvQkFBSSxJQUEyQztBQUNyRixTQUFRLGtCQUFrQjtBQUUxQixTQUFRLGFBQWE7QUFXbkIsU0FBSyxXQUFXLHdCQUF3QjtBQUN4QyxTQUFLLGtCQUFrQix3QkFBd0I7QUFDL0MsU0FBSyxXQUFXO0FBRWhCLFNBQUssNEJBQTRCLFlBQVksTUFBTTtBQUNqRCxXQUFLLFNBQVM7QUFBQSxRQUNaLGNBQWMs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\n';
|
|
33
33
|
|
|
34
34
|
// src/RunnerIframe.ts
|
|
35
35
|
var RunnerIframe = class {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mml-io/networked-dom-web-runner",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"main": "./build/index.js",
|
|
5
5
|
"types": "./build/index.d.ts",
|
|
6
6
|
"files": [
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"test-iterate": "jest --watch"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@mml-io/networked-dom-web": "^0.1.
|
|
21
|
+
"@mml-io/networked-dom-web": "^0.1.3"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"@mml-io/networked-dom-web-runner-iframe": "file:../networked-dom-web-runner-iframe",
|