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.
		
		
		
		
		
			
		
			
				
	
	
		
			25 lines
		
	
	
		
			64 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			25 lines
		
	
	
		
			64 KiB
		
	
	
	
		
			JavaScript
		
	
| "use strict";
 | |
| /*
 | |
|  * ATTENTION: An "eval-source-map" devtool has been used.
 | |
|  * This devtool is neither made for production nor for readable output files.
 | |
|  * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
 | |
|  * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
 | |
|  * or disable the default devtool with "devtool: false".
 | |
|  * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
 | |
|  */
 | |
| exports.id = "vendor-chunks/cytoscape-cose-bilkent";
 | |
| exports.ids = ["vendor-chunks/cytoscape-cose-bilkent"];
 | |
| exports.modules = {
 | |
| 
 | |
| /***/ "(ssr)/./node_modules/cytoscape-cose-bilkent/cytoscape-cose-bilkent.js":
 | |
| /*!***********************************************************************!*\
 | |
|   !*** ./node_modules/cytoscape-cose-bilkent/cytoscape-cose-bilkent.js ***!
 | |
|   \***********************************************************************/
 | |
| /***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 | |
| 
 | |
| eval("\n(function webpackUniversalModuleDefinition(root, factory) {\n    if (true) module.exports = factory(__webpack_require__(/*! cose-base */ \"(ssr)/./node_modules/cose-base/cose-base.js\"));\n    else {}\n})(void 0, function(__WEBPACK_EXTERNAL_MODULE_0__) {\n    return /******/ function(modules) {\n        /******/ // The module cache\n        /******/ var installedModules = {};\n        /******/ /******/ // The require function\n        /******/ function __nested_webpack_require_707__(moduleId) {\n            /******/ /******/ // Check if module is in cache\n            /******/ if (installedModules[moduleId]) {\n                /******/ return installedModules[moduleId].exports;\n            /******/ }\n            /******/ // Create a new module (and put it into the cache)\n            /******/ var module1 = installedModules[moduleId] = {\n                /******/ i: moduleId,\n                /******/ l: false,\n                /******/ exports: {}\n            };\n            /******/ /******/ // Execute the module function\n            /******/ modules[moduleId].call(module1.exports, module1, module1.exports, __nested_webpack_require_707__);\n            /******/ /******/ // Flag the module as loaded\n            /******/ module1.l = true;\n            /******/ /******/ // Return the exports of the module\n            /******/ return module1.exports;\n        /******/ }\n        /******/ /******/ /******/ // expose the modules object (__webpack_modules__)\n        /******/ __nested_webpack_require_707__.m = modules;\n        /******/ /******/ // expose the module cache\n        /******/ __nested_webpack_require_707__.c = installedModules;\n        /******/ /******/ // identity function for calling harmony imports with the correct context\n        /******/ __nested_webpack_require_707__.i = function(value) {\n            return value;\n        };\n        /******/ /******/ // define getter function for harmony exports\n        /******/ __nested_webpack_require_707__.d = function(exports1, name, getter) {\n            /******/ if (!__nested_webpack_require_707__.o(exports1, name)) {\n                /******/ Object.defineProperty(exports1, name, {\n                    /******/ configurable: false,\n                    /******/ enumerable: true,\n                    /******/ get: getter\n                });\n            /******/ }\n        /******/ };\n        /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules\n        /******/ __nested_webpack_require_707__.n = function(module1) {\n            /******/ var getter = module1 && module1.__esModule ? /******/ function getDefault() {\n                return module1[\"default\"];\n            } : /******/ function getModuleExports() {\n                return module1;\n            };\n            /******/ __nested_webpack_require_707__.d(getter, \"a\", getter);\n            /******/ return getter;\n        /******/ };\n        /******/ /******/ // Object.prototype.hasOwnProperty.call\n        /******/ __nested_webpack_require_707__.o = function(object, property) {\n            return Object.prototype.hasOwnProperty.call(object, property);\n        };\n        /******/ /******/ // __webpack_public_path__\n        /******/ __nested_webpack_require_707__.p = \"\";\n        /******/ /******/ // Load entry module and return exports\n        /******/ return __nested_webpack_require_707__(__nested_webpack_require_707__.s = 1);\n    /******/ }([\n        /* 0 */ /***/ function(module1, exports1) {\n            module1.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n        /***/ },\n        /* 1 */ /***/ function(module1, exports1, __nested_webpack_require_3720__) {\n            \"use strict\";\n            var LayoutConstants = __nested_webpack_require_3720__(0).layoutBase.LayoutConstants;\n            var FDLayoutConstants = __nested_webpack_require_3720__(0).layoutBase.FDLayoutConstants;\n            var CoSEConstants = __nested_webpack_require_3720__(0).CoSEConstants;\n            var CoSELayout = __nested_webpack_require_3720__(0).CoSELayout;\n            var CoSENode = __nested_webpack_require_3720__(0).CoSENode;\n            var PointD = __nested_webpack_require_3720__(0).layoutBase.PointD;\n            var DimensionD = __nested_webpack_require_3720__(0).layoutBase.DimensionD;\n            var defaults = {\n                // Called on `layoutready`\n                ready: function ready() {},\n                // Called on `layoutstop`\n                stop: function stop() {},\n                // 'draft', 'default' or 'proof\" \n                // - 'draft' fast cooling rate \n                // - 'default' moderate cooling rate \n                // - \"proof\" slow cooling rate\n                quality: \"default\",\n                // include labels in node dimensions\n                nodeDimensionsIncludeLabels: false,\n                // number of ticks per frame; higher is faster but more jerky\n                refresh: 30,\n                // Whether to fit the network view after when done\n                fit: true,\n                // Padding on fit\n                padding: 10,\n                // Whether to enable incremental mode\n                randomize: true,\n                // Node repulsion (non overlapping) multiplier\n                nodeRepulsion: 4500,\n                // Ideal edge (non nested) length\n                idealEdgeLength: 50,\n                // Divisor to compute edge forces\n                edgeElasticity: 0.45,\n                // Nesting factor (multiplier) to compute ideal edge length for nested edges\n                nestingFactor: 0.1,\n                // Gravity force (constant)\n                gravity: 0.25,\n                // Maximum number of iterations to perform\n                numIter: 2500,\n                // For enabling tiling\n                tile: true,\n                // Type of layout animation. The option set is {'during', 'end', false}\n                animate: \"end\",\n                // Duration for animate:end\n                animationDuration: 500,\n                // Represents the amount of the vertical space to put between the zero degree members during the tiling operation(can also be a function)\n                tilingPaddingVertical: 10,\n                // Represents the amount of the horizontal space to put between the zero degree members during the tiling operation(can also be a function)\n                tilingPaddingHorizontal: 10,\n                // Gravity range (constant) for compounds\n                gravityRangeCompound: 1.5,\n                // Gravity force (constant) for compounds\n                gravityCompound: 1.0,\n                // Gravity range (constant)\n                gravityRange: 3.8,\n                // Initial cooling factor for incremental layout\n                initialEnergyOnIncremental: 0.5\n            };\n            function extend(defaults, options) {\n                var obj = {};\n                for(var i in defaults){\n                    obj[i] = defaults[i];\n                }\n                for(var i in options){\n                    obj[i] = options[i];\n                }\n                return obj;\n            }\n            ;\n            function _CoSELayout(_options) {\n                this.options = extend(defaults, _options);\n                getUserOptions(this.options);\n            }\n            var getUserOptions = function getUserOptions(options) {\n                if (options.nodeRepulsion != null) CoSEConstants.DEFAULT_REPULSION_STRENGTH = FDLayoutConstants.DEFAULT_REPULSION_STRENGTH = options.nodeRepulsion;\n                if (options.idealEdgeLength != null) CoSEConstants.DEFAULT_EDGE_LENGTH = FDLayoutConstants.DEFAULT_EDGE_LENGTH = options.idealEdgeLength;\n                if (options.edgeElasticity != null) CoSEConstants.DEFAULT_SPRING_STRENGTH = FDLayoutConstants.DEFAULT_SPRING_STRENGTH = options.edgeElasticity;\n                if (options.nestingFactor != null) CoSEConstants.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR = FDLayoutConstants.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR = options.nestingFactor;\n                if (options.gravity != null) CoSEConstants.DEFAULT_GRAVITY_STRENGTH = FDLayoutConstants.DEFAULT_GRAVITY_STRENGTH = options.gravity;\n                if (options.numIter != null) CoSEConstants.MAX_ITERATIONS = FDLayoutConstants.MAX_ITERATIONS = options.numIter;\n                if (options.gravityRange != null) CoSEConstants.DEFAULT_GRAVITY_RANGE_FACTOR = FDLayoutConstants.DEFAULT_GRAVITY_RANGE_FACTOR = options.gravityRange;\n                if (options.gravityCompound != null) CoSEConstants.DEFAULT_COMPOUND_GRAVITY_STRENGTH = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_STRENGTH = options.gravityCompound;\n                if (options.gravityRangeCompound != null) CoSEConstants.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR = FDLayoutConstants.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR = options.gravityRangeCompound;\n                if (options.initialEnergyOnIncremental != null) CoSEConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL = FDLayoutConstants.DEFAULT_COOLING_FACTOR_INCREMENTAL = options.initialEnergyOnIncremental;\n                if (options.quality == \"draft\") LayoutConstants.QUALITY = 0;\n                else if (options.quality == \"proof\") LayoutConstants.QUALITY = 2;\n                else LayoutConstants.QUALITY = 1;\n                CoSEConstants.NODE_DIMENSIONS_INCLUDE_LABELS = FDLayoutConstants.NODE_DIMENSIONS_INCLUDE_LABELS = LayoutConstants.NODE_DIMENSIONS_INCLUDE_LABELS = options.nodeDimensionsIncludeLabels;\n                CoSEConstants.DEFAULT_INCREMENTAL = FDLayoutConstants.DEFAULT_INCREMENTAL = LayoutConstants.DEFAULT_INCREMENTAL = !options.randomize;\n                CoSEConstants.ANIMATE = FDLayoutConstants.ANIMATE = LayoutConstants.ANIMATE = options.animate;\n                CoSEConstants.TILE = options.tile;\n                CoSEConstants.TILING_PADDING_VERTICAL = typeof options.tilingPaddingVertical === \"function\" ? options.tilingPaddingVertical.call() : options.tilingPaddingVertical;\n                CoSEConstants.TILING_PADDING_HORIZONTAL = typeof options.tilingPaddingHorizontal === \"function\" ? options.tilingPaddingHorizontal.call() : options.tilingPaddingHorizontal;\n            };\n            _CoSELayout.prototype.run = function() {\n                var ready;\n                var frameId;\n                var options = this.options;\n                var idToLNode = this.idToLNode = {};\n                var layout = this.layout = new CoSELayout();\n                var self = this;\n                self.stopped = false;\n                this.cy = this.options.cy;\n                this.cy.trigger({\n                    type: \"layoutstart\",\n                    layout: this\n                });\n                var gm = layout.newGraphManager();\n                this.gm = gm;\n                var nodes = this.options.eles.nodes();\n                var edges = this.options.eles.edges();\n                this.root = gm.addRoot();\n                this.processChildrenList(this.root, this.getTopMostNodes(nodes), layout);\n                for(var i = 0; i < edges.length; i++){\n                    var edge = edges[i];\n                    var sourceNode = this.idToLNode[edge.data(\"source\")];\n                    var targetNode = this.idToLNode[edge.data(\"target\")];\n                    if (sourceNode !== targetNode && sourceNode.getEdgesBetween(targetNode).length == 0) {\n                        var e1 = gm.add(layout.newEdge(), sourceNode, targetNode);\n                        e1.id = edge.id();\n                    }\n                }\n                var getPositions = function getPositions(ele, i) {\n                    if (typeof ele === \"number\") {\n                        ele = i;\n                    }\n                    var theId = ele.data(\"id\");\n                    var lNode = self.idToLNode[theId];\n                    return {\n                        x: lNode.getRect().getCenterX(),\n                        y: lNode.getRect().getCenterY()\n                    };\n                };\n                /*\n   * Reposition nodes in iterations animatedly\n   */ var iterateAnimated = function iterateAnimated() {\n                    // Thigs to perform after nodes are repositioned on screen\n                    var afterReposition = function afterReposition() {\n                        if (options.fit) {\n                            options.cy.fit(options.eles, options.padding);\n                        }\n                        if (!ready) {\n                            ready = true;\n                            self.cy.one(\"layoutready\", options.ready);\n                            self.cy.trigger({\n                                type: \"layoutready\",\n                                layout: self\n                            });\n                        }\n                    };\n                    var ticksPerFrame = self.options.refresh;\n                    var isDone;\n                    for(var i = 0; i < ticksPerFrame && !isDone; i++){\n                        isDone = self.stopped || self.layout.tick();\n                    }\n                    // If layout is done\n                    if (isDone) {\n                        // If the layout is not a sublayout and it is successful perform post layout.\n                        if (layout.checkLayoutSuccess() && !layout.isSubLayout) {\n                            layout.doPostLayout();\n                        }\n                        // If layout has a tilingPostLayout function property call it.\n                        if (layout.tilingPostLayout) {\n                            layout.tilingPostLayout();\n                        }\n                        layout.isLayoutFinished = true;\n                        self.options.eles.nodes().positions(getPositions);\n                        afterReposition();\n                        // trigger layoutstop when the layout stops (e.g. finishes)\n                        self.cy.one(\"layoutstop\", self.options.stop);\n                        self.cy.trigger({\n                            type: \"layoutstop\",\n                            layout: self\n                        });\n                        if (frameId) {\n                            cancelAnimationFrame(frameId);\n                        }\n                        ready = false;\n                        return;\n                    }\n                    var animationData = self.layout.getPositionsData(); // Get positions of layout nodes note that all nodes may not be layout nodes because of tiling\n                    // Position nodes, for the nodes whose id does not included in data (because they are removed from their parents and included in dummy compounds)\n                    // use position of their ancestors or dummy ancestors\n                    options.eles.nodes().positions(function(ele, i) {\n                        if (typeof ele === \"number\") {\n                            ele = i;\n                        }\n                        // If ele is a compound node, then its position will be defined by its children\n                        if (!ele.isParent()) {\n                            var theId = ele.id();\n                            var pNode = animationData[theId];\n                            var temp = ele;\n                            // If pNode is undefined search until finding position data of its first ancestor (It may be dummy as well)\n                            while(pNode == null){\n                                pNode = animationData[temp.data(\"parent\")] || animationData[\"DummyCompound_\" + temp.data(\"parent\")];\n                                animationData[theId] = pNode;\n                                temp = temp.parent()[0];\n                                if (temp == undefined) {\n                                    break;\n                                }\n                            }\n                            if (pNode != null) {\n                                return {\n                                    x: pNode.x,\n                                    y: pNode.y\n                                };\n                            } else {\n                                return {\n                                    x: ele.position(\"x\"),\n                                    y: ele.position(\"y\")\n                                };\n                            }\n                        }\n                    });\n                    afterReposition();\n                    frameId = requestAnimationFrame(iterateAnimated);\n                };\n                /*\n  * Listen 'layoutstarted' event and start animated iteration if animate option is 'during'\n  */ layout.addListener(\"layoutstarted\", function() {\n                    if (self.options.animate === \"during\") {\n                        frameId = requestAnimationFrame(iterateAnimated);\n                    }\n                });\n                layout.runLayout(); // Run cose layout\n                /*\n   * If animate option is not 'during' ('end' or false) perform these here (If it is 'during' similar things are already performed)\n   */ if (this.options.animate !== \"during\") {\n                    self.options.eles.nodes().not(\":parent\").layoutPositions(self, self.options, getPositions); // Use layout positions to reposition the nodes it considers the options parameter\n                    ready = false;\n                }\n                return this; // chaining\n            };\n            //Get the top most ones of a list of nodes\n            _CoSELayout.prototype.getTopMostNodes = function(nodes) {\n                var nodesMap = {};\n                for(var i = 0; i < nodes.length; i++){\n                    nodesMap[nodes[i].id()] = true;\n                }\n                var roots = nodes.filter(function(ele, i) {\n                    if (typeof ele === \"number\") {\n                        ele = i;\n                    }\n                    var parent = ele.parent()[0];\n                    while(parent != null){\n                        if (nodesMap[parent.id()]) {\n                            return false;\n                        }\n                        parent = parent.parent()[0];\n                    }\n                    return true;\n                });\n                return roots;\n            };\n            _CoSELayout.prototype.processChildrenList = function(parent, children, layout) {\n                var size = children.length;\n                for(var i = 0; i < size; i++){\n                    var theChild = children[i];\n                    var children_of_children = theChild.children();\n                    var theNode;\n                    var dimensions = theChild.layoutDimensions({\n                        nodeDimensionsIncludeLabels: this.options.nodeDimensionsIncludeLabels\n                    });\n                    if (theChild.outerWidth() != null && theChild.outerHeight() != null) {\n                        theNode = parent.add(new CoSENode(layout.graphManager, new PointD(theChild.position(\"x\") - dimensions.w / 2, theChild.position(\"y\") - dimensions.h / 2), new DimensionD(parseFloat(dimensions.w), parseFloat(dimensions.h))));\n                    } else {\n                        theNode = parent.add(new CoSENode(this.graphManager));\n                    }\n                    // Attach id to the layout node\n                    theNode.id = theChild.data(\"id\");\n                    // Attach the paddings of cy node to layout node\n                    theNode.paddingLeft = parseInt(theChild.css(\"padding\"));\n                    theNode.paddingTop = parseInt(theChild.css(\"padding\"));\n                    theNode.paddingRight = parseInt(theChild.css(\"padding\"));\n                    theNode.paddingBottom = parseInt(theChild.css(\"padding\"));\n                    //Attach the label properties to compound if labels will be included in node dimensions  \n                    if (this.options.nodeDimensionsIncludeLabels) {\n                        if (theChild.isParent()) {\n                            var labelWidth = theChild.boundingBox({\n                                includeLabels: true,\n                                includeNodes: false\n                            }).w;\n                            var labelHeight = theChild.boundingBox({\n                                includeLabels: true,\n                                includeNodes: false\n                            }).h;\n                            var labelPos = theChild.css(\"text-halign\");\n                            theNode.labelWidth = labelWidth;\n                            theNode.labelHeight = labelHeight;\n                            theNode.labelPos = labelPos;\n                        }\n                    }\n                    // Map the layout node\n                    this.idToLNode[theChild.data(\"id\")] = theNode;\n                    if (isNaN(theNode.rect.x)) {\n                        theNode.rect.x = 0;\n                    }\n                    if (isNaN(theNode.rect.y)) {\n                        theNode.rect.y = 0;\n                    }\n                    if (children_of_children != null && children_of_children.length > 0) {\n                        var theNewGraph;\n                        theNewGraph = layout.getGraphManager().add(layout.newGraph(), theNode);\n                        this.processChildrenList(theNewGraph, children_of_children, layout);\n                    }\n                }\n            };\n            /**\n * @brief : called on continuous layouts to stop them before they finish\n */ _CoSELayout.prototype.stop = function() {\n                this.stopped = true;\n                return this; // chaining\n            };\n            var register = function register(cytoscape1) {\n                //  var Layout = getLayout( cytoscape );\n                cytoscape1(\"layout\", \"cose-bilkent\", _CoSELayout);\n            };\n            // auto reg for globals\n            if (typeof cytoscape !== \"undefined\") {\n                register(cytoscape);\n            }\n            module1.exports = register;\n        /***/ }\n    ]);\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvY3l0b3NjYXBlLWNvc2UtYmlsa2VudC9jeXRvc2NhcGUtY29zZS1iaWxrZW50LmpzIiwibWFwcGluZ3MiOiI7QUFBQyxVQUFTQSxpQ0FBaUNDLElBQUksRUFBRUMsT0FBTztJQUN2RCxJQUFHLElBQWlELEVBQ25ERSxPQUFPRCxPQUFPLEdBQUdELFFBQVFHLG1CQUFPQSxDQUFDLDhEQUFXO1NBQ3hDLEVBS3FEO0FBQzNELEdBQUcsUUFBTSxTQUFTRyw2QkFBNkI7SUFDL0MsT0FBZ0IsTUFBSCxHQUFJLFNBQVNDLE9BQU87UUFDakMsTUFBTSxHQUFJLG1CQUFtQjtRQUM3QixNQUFNLEdBQUksSUFBSUMsbUJBQW1CLENBQUM7UUFDbEMsTUFBTSxHQUNOLE1BQU0sR0FBSSx1QkFBdUI7UUFDakMsTUFBTSxHQUFJLFNBQVNDLDhCQUFtQkEsQ0FBQ0MsUUFBUTtZQUMvQyxNQUFNLEdBQ04sTUFBTSxHQUFLLDhCQUE4QjtZQUN6QyxNQUFNLEdBQUssSUFBR0YsZ0JBQWdCLENBQUNFLFNBQVMsRUFBRTtnQkFDMUMsTUFBTSxHQUFNLE9BQU9GLGdCQUFnQixDQUFDRSxTQUFTLENBQUNULE9BQU87WUFDckQsTUFBTSxHQUFLO1lBQ1gsTUFBTSxHQUFLLGtEQUFrRDtZQUM3RCxNQUFNLEdBQUssSUFBSUMsVUFBU00sZ0JBQWdCLENBQUNFLFNBQVMsR0FBRztnQkFDckQsTUFBTSxHQUFNQyxHQUFHRDtnQkFDZixNQUFNLEdBQU1FLEdBQUc7Z0JBQ2YsTUFBTSxHQUFNWCxTQUFTLENBQUM7WUFDWDtZQUNYLE1BQU0sR0FDTixNQUFNLEdBQUssOEJBQThCO1lBQ3pDLE1BQU0sR0FBS00sT0FBTyxDQUFDRyxTQUFTLENBQUNHLElBQUksQ0FBQ1gsUUFBT0QsT0FBTyxFQUFFQyxTQUFRQSxRQUFPRCxPQUFPLEVBQUVRLDhCQUFtQkE7WUFDN0YsTUFBTSxHQUNOLE1BQU0sR0FBSyw0QkFBNEI7WUFDdkMsTUFBTSxHQUFLUCxRQUFPVSxDQUFDLEdB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R0FBR0E7NEJBQ3JCZixRQUFRbUIsV0FBVyxHQUFHQTs0QkFDdEJuQixRQUFRb0IsUUFBUSxHQUFHQTt3QkFDckI7b0JBQ0Y7b0JBRUEsc0JBQXNCO29CQUN0QixJQUFJLENBQUN2RixTQUFTLENBQUNpRSxTQUFTL0MsSUFBSSxDQUFDLE1BQU0sR0FBR2lEO29CQUV0QyxJQUFJcUIsTUFBTXJCLFFBQVFzQixJQUFJLENBQUM1RCxDQUFDLEdBQUc7d0JBQ3pCc0MsUUFBUXNCLElBQUksQ0FBQzVELENBQUMsR0FBRztvQkFDbkI7b0JBRUEsSUFBSTJELE1BQU1yQixRQUFRc0IsSUFBSSxDQUFDekQsQ0FBQyxHQUFHO3dCQUN6Qm1DLFFBQVFzQixJQUFJLENBQUN6RCxDQUFDLEdBQUc7b0JBQ25CO29CQUVBLElBQUlrQyx3QkFBd0IsUUFBUUEscUJBQXFCbkQsTUFBTSxHQUFHLEdBQUc7d0JBQ25FLElBQUkyRTt3QkFDSkEsY0FBY3pGLE9BQU8wRixlQUFlLEdBQUdyRSxHQUFHLENBQUNyQixPQUFPMkYsUUFBUSxJQUFJekI7d0JBQzlELElBQUksQ0FBQ3RELG1CQUFtQixDQUFDNkUsYUFBYXhCLHNCQUFzQmpFO29CQUM5RDtnQkFDRjtZQUNGO1lBRUE7O0NBRUMsR0FDRHZCLFlBQVl2QyxTQUFTLENBQUNjLElBQUksR0FBRztnQkFDM0IsSUFBSSxDQUFDa0QsT0FBTyxHQUFHO2dCQUVmLE9BQU8sSUFBSSxFQUFFLFdBQVc7WUFDMUI7WUFFQSxJQUFJMEYsV0FBVyxTQUFTQSxTQUFTQyxVQUFTO2dCQUN4Qyx3Q0FBd0M7Z0JBRXhDQSxXQUFVLFVBQVUsZ0JBQWdCcEg7WUFDdEM7WUFFQSx1QkFBdUI7WUFDdkIsSUFBSSxPQUFPb0gsY0FBYyxhQUFhO2dCQUNwQ0QsU0FBU0M7WUFDWDtZQUVBekwsUUFBT0QsT0FBTyxHQUFHeUw7UUFFakIsR0FBRyxHQUFHO0tBQ0k7QUFDViIsInNvdXJjZXMiOlsid2VicGFjazovL25leHRjaGF0Ly4vbm9kZV9tb2R1bGVzL2N5dG9zY2FwZS1jb3NlLWJpbGtlbnQvY3l0b3NjYXBlLWNvc2UtYmlsa2VudC5qcz8wYTE0Il0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZShcImNvc2UtYmFzZVwiKSk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXCJjb3NlLWJhc2VcIl0sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiY3l0b3NjYXBlQ29zZUJpbGtlbnRcIl0gPSBmYWN0b3J5KHJlcXVpcmUoXCJjb3NlLWJhc2VcIikpO1xuXHRlbHNlXG5cdFx0cm9vdFtcImN5dG9zY2FwZUNvc2VCaWxrZW50XCJdID0gZmFjdG9yeShyb290W1wiY29zZUJhc2VcIl0pO1xufSkodGhpcywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8wX18pIHtcbnJldHVybiAvKioqKioqLyAoZnVuY3Rpb24obW9kdWxlcykgeyAvLyB3ZWJwYWNrQm9vdHN0cmFwXG4vKioqKioqLyBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbi8qKioqKiovIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4vKioqKioqLyBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4vKioqKioqLyBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbi8qKioqKiovIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuLyoqKioqKi8gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbi8qKioqKiovIFx0XHRcdGk6IG1vZHVsZUlkLFxuLyoqKioqKi8gXHRcdFx0bDogZmFsc2UsXG4vKioqKioqLyBcdFx0XHRleHBvcnRzOiB7fVxuLyoqKioqKi8gXHRcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuLyoqKioqKi8gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4vKioqKioqLyBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuLyoqKioqKi8gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbi8qKioqKiovIFx0fVxuLyoqKioqKi9cbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gaWRlbnRpdHkgZnVuY3Rpb24gZm9yIGNhbGxpbmcgaGFybW9ueSBpbXBvcnRzIHdpdGggdGhlIGNvcnJlY3QgY29udGV4dFxuLyoqKioqKi8gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmkgPSBmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSAxKTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMpIHtcblxubW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzBfXztcblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbnZhciBMYXlvdXRDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApLmxheW91dEJhc2UuTGF5b3V0Q29uc3RhbnRzO1xudmFyIEZETGF5b3V0Q29uc3RhbnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKS5sYXlvdXRCYXNlLkZETGF5b3V0Q29uc3RhbnRzO1xudmFyIENvU0VDb25zdGFudHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDApLkNvU0VDb25zdGFudHM7XG52YXIgQ29TRUxheW91dCA9IF9fd2VicGFja19yZXF1aXJlX18oMCkuQ29TRUxheW91dDtcbnZhciBDb1NFTm9kZSA9IF9fd2VicGFja19yZXF1aXJlX18oMCkuQ29TRU5vZGU7XG52YXIgUG9pbnREID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKS5sYXlvdXRCYXNlLlBvaW50RDtcbnZhciBEaW1lbnNpb25EID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKS5sYXlvdXRCYXNlLkRpbWVuc2lvbkQ7XG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgLy8gQ2FsbGVkIG9uIGBsYXlvdXRyZWFkeWBcbiAgcmVhZHk6IGZ1bmN0aW9uIHJlYWR5KCkge30sXG4gIC8vIENhbGxlZCBvbiBgbGF5b3V0c3RvcGBcbiAgc3RvcDogZnVuY3Rpb24gc3RvcCgpIHt9LFxuICAvLyAnZHJhZnQnLCAnZGVmYXVsdCcgb3IgJ3Byb29mXCIgXG4gIC8vIC0gJ2RyYWZ0JyBmYXN0IGNvb2xpbmcgcmF0ZSBcbiAgLy8gLSAnZGVmYXVsdCcgbW9kZXJhdGUgY29vbGluZyByYXRlIFxuICAvLyAtIFwicHJvb2ZcIiBzbG93IGNvb2xpbmcgcmF0ZVxuICBxdWFsaXR5OiAnZGVmYXVsdCcsXG4gIC8vIGluY2x1ZGUgbGFiZWxzIGluIG5vZGUgZGltZW5zaW9uc1xuICBub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHM6IGZhbHNlLFxuICAvLyBudW1iZXIgb2YgdGlja3MgcGVyIGZyYW1lOyBoaWdoZXIgaXMgZmFzdGVyIGJ1dCBtb3JlIGplcmt5XG4gIHJlZnJlc2g6IDMwLFxuICAvLyBXaGV0aGVyIHRvIGZpdCB0aGUgbmV0d29yayB2aWV3IGFmdGVyIHdoZW4gZG9uZVxuICBmaXQ6IHRydWUsXG4gIC8vIFBhZGRpbmcgb24gZml0XG4gIHBhZGRpbmc6IDEwLFxuICAvLyBXaGV0aGVyIHRvIGVuYWJsZSBpbmNyZW1lbnRhbCBtb2RlXG4gIHJhbmRvbWl6ZTogdHJ1ZSxcbiAgLy8gTm9kZSByZXB1bHNpb24gKG5vbiBvdmVybGFwcGluZykgbXVsdGlwbGllclxuICBub2RlUmVwdWxzaW9uOiA0NTAwLFxuICAvLyBJZGVhbCBlZGdlIChub24gbmVzdGVkKSBsZW5ndGhcbiAgaWRlYWxFZGdlTGVuZ3RoOiA1MCxcbiAgLy8gRGl2aXNvciB0byBjb21wdXRlIGVkZ2UgZm9yY2VzXG4gIGVkZ2VFbGFzdGljaXR5OiAwLjQ1LFxuICAvLyBOZXN0aW5nIGZhY3RvciAobXVsdGlwbGllcikgdG8gY29tcHV0ZSBpZGVhbCBlZGdlIGxlbmd0aCBmb3IgbmVzdGVkIGVkZ2VzXG4gIG5lc3RpbmdGYWN0b3I6IDAuMSxcbiAgLy8gR3Jhdml0eSBmb3JjZSAoY29uc3RhbnQpXG4gIGdyYXZpdHk6IDAuMjUsXG4gIC8vIE1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gcGVyZm9ybVxuICBudW1JdGVyOiAyNTAwLFxuICAvLyBGb3IgZW5hYmxpbmcgdGlsaW5nXG4gIHRpbGU6IHRydWUsXG4gIC8vIFR5cGUgb2YgbGF5b3V0IGFuaW1hdGlvbi4gVGhlIG9wdGlvbiBzZXQgaXMgeydkdXJpbmcnLCAnZW5kJywgZmFsc2V9XG4gIGFuaW1hdGU6ICdlbmQnLFxuICAvLyBEdXJhdGlvbiBmb3IgYW5pbWF0ZTplbmRcbiAgYW5pbWF0aW9uRHVyYXRpb246IDUwMCxcbiAgLy8gUmVwcmVzZW50cyB0aGUgYW1vdW50IG9mIHRoZSB2ZXJ0aWNhbCBzcGFjZSB0byBwdXQgYmV0d2VlbiB0aGUgemVybyBkZWdyZWUgbWVtYmVycyBkdXJpbmcgdGhlIHRpbGluZyBvcGVyYXRpb24oY2FuIGFsc28gYmUgYSBmdW5jdGlvbilcbiAgdGlsaW5nUGFkZGluZ1ZlcnRpY2FsOiAxMCxcbiAgLy8gUmVwcmVzZW50cyB0aGUgYW1vdW50IG9mIHRoZSBob3Jpem9udGFsIHNwYWNlIHRvIHB1dCBiZXR3ZWVuIHRoZSB6ZXJvIGRlZ3JlZSBtZW1iZXJzIGR1cmluZyB0aGUgdGlsaW5nIG9wZXJhdGlvbihjYW4gYWxzbyBiZSBhIGZ1bmN0aW9uKVxuICB0aWxpbmdQYWRkaW5nSG9yaXpvbnRhbDogMTAsXG4gIC8vIEdyYXZpdHkgcmFuZ2UgKGNvbnN0YW50KSBmb3IgY29tcG91bmRzXG4gIGdyYXZpdHlSYW5nZUNvbXBvdW5kOiAxLjUsXG4gIC8vIEdyYXZpdHkgZm9yY2UgKGNvbnN0YW50KSBmb3IgY29tcG91bmRzXG4gIGdyYXZpdHlDb21wb3VuZDogMS4wLFxuICAvLyBHcmF2aXR5IHJhbmdlIChjb25zdGFudClcbiAgZ3Jhdml0eVJhbmdlOiAzLjgsXG4gIC8vIEluaXRpYWwgY29vbGluZyBmYWN0b3IgZm9yIGluY3JlbWVudGFsIGxheW91dFxuICBpbml0aWFsRW5lcmd5T25JbmNyZW1lbnRhbDogMC41XG59O1xuXG5mdW5jdGlvbiBleHRlbmQoZGVmYXVsdHMsIG9wdGlvbnMpIHtcbiAgdmFyIG9iaiA9IHt9O1xuXG4gIGZvciAodmFyIGkgaW4gZGVmYXVsdHMpIHtcbiAgICBvYmpbaV0gPSBkZWZhdWx0c1tpXTtcbiAgfVxuXG4gIGZvciAodmFyIGkgaW4gb3B0aW9ucykge1xuICAgIG9ialtpXSA9IG9wdGlvbnNbaV07XG4gIH1cblxuICByZXR1cm4gb2JqO1xufTtcblxuZnVuY3Rpb24gX0NvU0VMYXlvdXQoX29wdGlvbnMpIHtcbiAgdGhpcy5vcHRpb25zID0gZXh0ZW5kKGRlZmF1bHRzLCBfb3B0aW9ucyk7XG4gIGdldFVzZXJPcHRpb25zKHRoaXMub3B0aW9ucyk7XG59XG5cbnZhciBnZXRVc2VyT3B0aW9ucyA9IGZ1bmN0aW9uIGdldFVzZXJPcHRpb25zKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMubm9kZVJlcHVsc2lvbiAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfUkVQVUxTSU9OX1NUUkVOR1RIID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9SRVBVTFNJT05fU1RSRU5HVEggPSBvcHRpb25zLm5vZGVSZXB1bHNpb247XG4gIGlmIChvcHRpb25zLmlkZWFsRWRnZUxlbmd0aCAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfRURHRV9MRU5HVEggPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0VER0VfTEVOR1RIID0gb3B0aW9ucy5pZGVhbEVkZ2VMZW5ndGg7XG4gIGlmIChvcHRpb25zLmVkZ2VFbGFzdGljaXR5ICE9IG51bGwpIENvU0VDb25zdGFudHMuREVGQVVMVF9TUFJJTkdfU1RSRU5HVEggPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX1NQUklOR19TVFJFTkdUSCA9IG9wdGlvbnMuZWRnZUVsYXN0aWNpdHk7XG4gIGlmIChvcHRpb25zLm5lc3RpbmdGYWN0b3IgIT0gbnVsbCkgQ29TRUNvbnN0YW50cy5QRVJfTEVWRUxfSURFQUxfRURHRV9MRU5HVEhfRkFDVE9SID0gRkRMYXlvdXRDb25zdGFudHMuUEVSX0xFVkVMX0lERUFMX0VER0VfTEVOR1RIX0ZBQ1RPUiA9IG9wdGlvbnMubmVzdGluZ0ZhY3RvcjtcbiAgaWYgKG9wdGlvbnMuZ3Jhdml0eSAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9TVFJFTkdUSCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9TVFJFTkdUSCA9IG9wdGlvbnMuZ3Jhdml0eTtcbiAgaWYgKG9wdGlvbnMubnVtSXRlciAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLk1BWF9JVEVSQVRJT05TID0gRkRMYXlvdXRDb25zdGFudHMuTUFYX0lURVJBVElPTlMgPSBvcHRpb25zLm51bUl0ZXI7XG4gIGlmIChvcHRpb25zLmdyYXZpdHlSYW5nZSAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfR1JBVklUWV9SQU5HRV9GQUNUT1IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0dSQVZJVFlfUkFOR0VfRkFDVE9SID0gb3B0aW9ucy5ncmF2aXR5UmFuZ2U7XG4gIGlmIChvcHRpb25zLmdyYXZpdHlDb21wb3VuZCAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9TVFJFTkdUSCA9IEZETGF5b3V0Q29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9TVFJFTkdUSCA9IG9wdGlvbnMuZ3Jhdml0eUNvbXBvdW5kO1xuICBpZiAob3B0aW9ucy5ncmF2aXR5UmFuZ2VDb21wb3VuZCAhPSBudWxsKSBDb1NFQ29uc3RhbnRzLkRFRkFVTFRfQ09NUE9VTkRfR1JBVklUWV9SQU5HRV9GQUNUT1IgPSBGRExheW91dENvbnN0YW50cy5ERUZBVUxUX0NPTVBPVU5EX0dSQVZJVFlfUkFOR0VfRkFDVE9SID0gb3B0aW9ucy5ncmF2aXR5UmFuZ2VDb21wb3VuZDtcbiAgaWYgKG9wdGlvbnMuaW5pdGlhbEVuZXJneU9uSW5jcmVtZW50YWwgIT0gbnVsbCkgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0NPT0xJTkdfRkFDVE9SX0lOQ1JFTUVOVEFMID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9DT09MSU5HX0ZBQ1RPUl9JTkNSRU1FTlRBTCA9IG9wdGlvbnMuaW5pdGlhbEVuZXJneU9uSW5jcmVtZW50YWw7XG5cbiAgaWYgKG9wdGlvbnMucXVhbGl0eSA9PSAnZHJhZnQnKSBMYXlvdXRDb25zdGFudHMuUVVBTElUWSA9IDA7ZWxzZSBpZiAob3B0aW9ucy5xdWFsaXR5ID09ICdwcm9vZicpIExheW91dENvbnN0YW50cy5RVUFMSVRZID0gMjtlbHNlIExheW91dENvbnN0YW50cy5RVUFMSVRZID0gMTtcblxuICBDb1NFQ29uc3RhbnRzLk5PREVfRElNRU5TSU9OU19JTkNMVURFX0xBQkVMUyA9IEZETGF5b3V0Q29uc3RhbnRzLk5PREVfRElNRU5TSU9OU19JTkNMVURFX0xBQkVMUyA9IExheW91dENvbnN0YW50cy5OT0RFX0RJTUVOU0lPTlNfSU5DTFVERV9MQUJFTFMgPSBvcHRpb25zLm5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVscztcbiAgQ29TRUNvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMID0gRkRMYXlvdXRDb25zdGFudHMuREVGQVVMVF9JTkNSRU1FTlRBTCA9IExheW91dENvbnN0YW50cy5ERUZBVUxUX0lOQ1JFTUVOVEFMID0gIW9wdGlvbnMucmFuZG9taXplO1xuICBDb1NFQ29uc3RhbnRzLkFOSU1BVEUgPSBGRExheW91dENvbnN0YW50cy5BTklNQVRFID0gTGF5b3V0Q29uc3RhbnRzLkFOSU1BVEUgPSBvcHRpb25zLmFuaW1hdGU7XG4gIENvU0VDb25zdGFudHMuVElMRSA9IG9wdGlvbnMudGlsZTtcbiAgQ29TRUNvbnN0YW50cy5USUxJTkdfUEFERElOR19WRVJUSUNBTCA9IHR5cGVvZiBvcHRpb25zLnRpbGluZ1BhZGRpbmdWZXJ0aWNhbCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMudGlsaW5nUGFkZGluZ1ZlcnRpY2FsLmNhbGwoKSA6IG9wdGlvbnMudGlsaW5nUGFkZGluZ1ZlcnRpY2FsO1xuICBDb1NFQ29uc3RhbnRzLlRJTElOR19QQURESU5HX0hPUklaT05UQUwgPSB0eXBlb2Ygb3B0aW9ucy50aWxpbmdQYWRkaW5nSG9yaXpvbnRhbCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMudGlsaW5nUGFkZGluZ0hvcml6b250YWwuY2FsbCgpIDogb3B0aW9ucy50aWxpbmdQYWRkaW5nSG9yaXpvbnRhbDtcbn07XG5cbl9Db1NFTGF5b3V0LnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gIHZhciByZWFkeTtcbiAgdmFyIGZyYW1lSWQ7XG4gIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICB2YXIgaWRUb0xOb2RlID0gdGhpcy5pZFRvTE5vZGUgPSB7fTtcbiAgdmFyIGxheW91dCA9IHRoaXMubGF5b3V0ID0gbmV3IENvU0VMYXlvdXQoKTtcbiAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gIHNlbGYuc3RvcHBlZCA9IGZhbHNlO1xuXG4gIHRoaXMuY3kgPSB0aGlzLm9wdGlvbnMuY3k7XG5cbiAgdGhpcy5jeS50cmlnZ2VyKHsgdHlwZTogJ2xheW91dHN0YXJ0JywgbGF5b3V0OiB0aGlzIH0pO1xuXG4gIHZhciBnbSA9IGxheW91dC5uZXdHcmFwaE1hbmFnZXIoKTtcbiAgdGhpcy5nbSA9IGdtO1xuXG4gIHZhciBub2RlcyA9IHRoaXMub3B0aW9ucy5lbGVzLm5vZGVzKCk7XG4gIHZhciBlZGdlcyA9IHRoaXMub3B0aW9ucy5lbGVzLmVkZ2VzKCk7XG5cbiAgdGhpcy5yb290ID0gZ20uYWRkUm9vdCgpO1xuICB0aGlzLnByb2Nlc3NDaGlsZHJlbkxpc3QodGhpcy5yb290LCB0aGlzLmdldFRvcE1vc3ROb2Rlcyhub2RlcyksIGxheW91dCk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBlZGdlID0gZWRnZXNbaV07XG4gICAgdmFyIHNvdXJjZU5vZGUgPSB0aGlzLmlkVG9MTm9kZVtlZGdlLmRhdGEoXCJzb3VyY2VcIildO1xuICAgIHZhciB0YXJnZXROb2RlID0gdGhpcy5pZFRvTE5vZGVbZWRnZS5kYXRhKFwidGFyZ2V0XCIpXTtcbiAgICBpZiAoc291cmNlTm9kZSAhPT0gdGFyZ2V0Tm9kZSAmJiBzb3VyY2VOb2RlLmdldEVkZ2VzQmV0d2Vlbih0YXJnZXROb2RlKS5sZW5ndGggPT0gMCkge1xuICAgICAgdmFyIGUxID0gZ20uYWRkKGxheW91dC5uZXdFZGdlKCksIHNvdXJjZU5vZGUsIHRhcmdldE5vZGUpO1xuICAgICAgZTEuaWQgPSBlZGdlLmlkKCk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGdldFBvc2l0aW9ucyA9IGZ1bmN0aW9uIGdldFBvc2l0aW9ucyhlbGUsIGkpIHtcbiAgICBpZiAodHlwZW9mIGVsZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgZWxlID0gaTtcbiAgICB9XG4gICAgdmFyIHRoZUlkID0gZWxlLmRhdGEoJ2lkJyk7XG4gICAgdmFyIGxOb2RlID0gc2VsZi5pZFRvTE5vZGVbdGhlSWRdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGxOb2RlLmdldFJlY3QoKS5nZXRDZW50ZXJYKCksXG4gICAgICB5OiBsTm9kZS5nZXRSZWN0KCkuZ2V0Q2VudGVyWSgpXG4gICAgfTtcbiAgfTtcblxuICAvKlxuICAgKiBSZXBvc2l0aW9uIG5vZGVzIGluIGl0ZXJhdGlvbnMgYW5pbWF0ZWRseVxuICAgKi9cbiAgdmFyIGl0ZXJhdGVBbmltYXRlZCA9IGZ1bmN0aW9uIGl0ZXJhdGVBbmltYXRlZCgpIHtcbiAgICAvLyBUaGlncyB0byBwZXJmb3JtIGFmdGVyIG5vZGVzIGFyZSByZXBvc2l0aW9uZWQgb24gc2NyZWVuXG4gICAgdmFyIGFmdGVyUmVwb3NpdGlvbiA9IGZ1bmN0aW9uIGFmdGVyUmVwb3NpdGlvbigpIHtcbiAgICAgIGlmIChvcHRpb25zLmZpdCkge1xuICAgICAgICBvcHRpb25zLmN5LmZpdChvcHRpb25zLmVsZXMsIG9wdGlvbnMucGFkZGluZyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghcmVhZHkpIHtcbiAgICAgICAgcmVhZHkgPSB0cnVlO1xuICAgICAgICBzZWxmLmN5Lm9uZSgnbGF5b3V0cmVhZHknLCBvcHRpb25zLnJlYWR5KTtcbiAgICAgICAgc2VsZi5jeS50cmlnZ2VyKHsgdHlwZTogJ2xheW91dHJlYWR5JywgbGF5b3V0OiBzZWxmIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB2YXIgdGlja3NQZXJGcmFtZSA9IHNlbGYub3B0aW9ucy5yZWZyZXNoO1xuICAgIHZhciBpc0RvbmU7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRpY2tzUGVyRnJhbWUgJiYgIWlzRG9uZTsgaSsrKSB7XG4gICAgICBpc0RvbmUgPSBzZWxmLnN0b3BwZWQgfHwgc2VsZi5sYXlvdXQudGljaygpO1xuICAgIH1cblxuICAgIC8vIElmIGxheW91dCBpcyBkb25lXG4gICAgaWYgKGlzRG9uZSkge1xuICAgICAgLy8gSWYgdGhlIGxheW91dCBpcyBub3QgYSBzdWJsYXlvdXQgYW5kIGl0IGlzIHN1Y2Nlc3NmdWwgcGVyZm9ybSBwb3N0IGxheW91dC5cbiAgICAgIGlmIChsYXlvdXQuY2hlY2tMYXlvdXRTdWNjZXNzKCkgJiYgIWxheW91dC5pc1N1YkxheW91dCkge1xuICAgICAgICBsYXlvdXQuZG9Qb3N0TGF5b3V0KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGxheW91dCBoYXMgYSB0aWxpbmdQb3N0TGF5b3V0IGZ1bmN0aW9uIHByb3BlcnR5IGNhbGwgaXQuXG4gICAgICBpZiAobGF5b3V0LnRpbGluZ1Bvc3RMYXlvdXQpIHtcbiAgICAgICAgbGF5b3V0LnRpbGluZ1Bvc3RMYXlvdXQoKTtcbiAgICAgIH1cblxuICAgICAgbGF5b3V0LmlzTGF5b3V0RmluaXNoZWQgPSB0cnVlO1xuXG4gICAgICBzZWxmLm9wdGlvbnMuZWxlcy5ub2RlcygpLnBvc2l0aW9ucyhnZXRQb3NpdGlvbnMpO1xuXG4gICAgICBhZnRlclJlcG9zaXRpb24oKTtcblxuICAgICAgLy8gdHJpZ2dlciBsYXlvdXRzdG9wIHdoZW4gdGhlIGxheW91dCBzdG9wcyAoZS5nLiBmaW5pc2hlcylcbiAgICAgIHNlbGYuY3kub25lKCdsYXlvdXRzdG9wJywgc2VsZi5vcHRpb25zLnN0b3ApO1xuICAgICAgc2VsZi5jeS50cmlnZ2VyKHsgdHlwZTogJ2xheW91dHN0b3AnLCBsYXlvdXQ6IHNlbGYgfSk7XG5cbiAgICAgIGlmIChmcmFtZUlkKSB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGZyYW1lSWQpO1xuICAgICAgfVxuXG4gICAgICByZWFkeSA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBhbmltYXRpb25EYXRhID0gc2VsZi5sYXlvdXQuZ2V0UG9zaXRpb25zRGF0YSgpOyAvLyBHZXQgcG9zaXRpb25zIG9mIGxheW91dCBub2RlcyBub3RlIHRoYXQgYWxsIG5vZGVzIG1heSBub3QgYmUgbGF5b3V0IG5vZGVzIGJlY2F1c2Ugb2YgdGlsaW5nXG5cbiAgICAvLyBQb3NpdGlvbiBub2RlcywgZm9yIHRoZSBub2RlcyB3aG9zZSBpZCBkb2VzIG5vdCBpbmNsdWRlZCBpbiBkYXRhIChiZWNhdXNlIHRoZXkgYXJlIHJlbW92ZWQgZnJvbSB0aGVpciBwYXJlbnRzIGFuZCBpbmNsdWRlZCBpbiBkdW1teSBjb21wb3VuZHMpXG4gICAgLy8gdXNlIHBvc2l0aW9uIG9mIHRoZWlyIGFuY2VzdG9ycyBvciBkdW1teSBhbmNlc3RvcnNcbiAgICBvcHRpb25zLmVsZXMubm9kZXMoKS5wb3NpdGlvbnMoZnVuY3Rpb24gKGVsZSwgaSkge1xuICAgICAgaWYgKHR5cGVvZiBlbGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgZWxlID0gaTtcbiAgICAgIH1cbiAgICAgIC8vIElmIGVsZSBpcyBhIGNvbXBvdW5kIG5vZGUsIHRoZW4gaXRzIHBvc2l0aW9uIHdpbGwgYmUgZGVmaW5lZCBieSBpdHMgY2hpbGRyZW5cbiAgICAgIGlmICghZWxlLmlzUGFyZW50KCkpIHtcbiAgICAgICAgdmFyIHRoZUlkID0gZWxlLmlkKCk7XG4gICAgICAgIHZhciBwTm9kZSA9IGFuaW1hdGlvbkRhdGFbdGhlSWRdO1xuICAgICAgICB2YXIgdGVtcCA9IGVsZTtcbiAgICAgICAgLy8gSWYgcE5vZGUgaXMgdW5kZWZpbmVkIHNlYXJjaCB1bnRpbCBmaW5kaW5nIHBvc2l0aW9uIGRhdGEgb2YgaXRzIGZpcnN0IGFuY2VzdG9yIChJdCBtYXkgYmUgZHVtbXkgYXMgd2VsbClcbiAgICAgICAgd2hpbGUgKHBOb2RlID09IG51bGwpIHtcbiAgICAgICAgICBwTm9kZSA9IGFuaW1hdGlvbkRhdGFbdGVtcC5kYXRhKCdwYXJlbnQnKV0gfHwgYW5pbWF0aW9uRGF0YVsnRHVtbXlDb21wb3VuZF8nICsgdGVtcC5kYXRhKCdwYXJlbnQnKV07XG4gICAgICAgICAgYW5pbWF0aW9uRGF0YVt0aGVJZF0gPSBwTm9kZTtcbiAgICAgICAgICB0ZW1wID0gdGVtcC5wYXJlbnQoKVswXTtcbiAgICAgICAgICBpZiAodGVtcCA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocE5vZGUgIT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBwTm9kZS54LFxuICAgICAgICAgICAgeTogcE5vZGUueVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IGVsZS5wb3NpdGlvbigneCcpLFxuICAgICAgICAgICAgeTogZWxlLnBvc2l0aW9uKCd5JylcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBhZnRlclJlcG9zaXRpb24oKTtcblxuICAgIGZyYW1lSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaXRlcmF0ZUFuaW1hdGVkKTtcbiAgfTtcblxuICAvKlxuICAqIExpc3RlbiAnbGF5b3V0c3RhcnRlZCcgZXZlbnQgYW5kIHN0YXJ0IGFuaW1hdGVkIGl0ZXJhdGlvbiBpZiBhbmltYXRlIG9wdGlvbiBpcyAnZHVyaW5nJ1xuICAqL1xuICBsYXlvdXQuYWRkTGlzdGVuZXIoJ2xheW91dHN0YXJ0ZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNlbGYub3B0aW9ucy5hbmltYXRlID09PSAnZHVyaW5nJykge1xuICAgICAgZnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShpdGVyYXRlQW5pbWF0ZWQpO1xuICAgIH1cbiAgfSk7XG5cbiAgbGF5b3V0LnJ1bkxheW91dCgpOyAvLyBSdW4gY29zZSBsYXlvdXRcblxuICAvKlxuICAgKiBJZiBhbmltYXRlIG9wdGlvbiBpcyBub3QgJ2R1cmluZycgKCdlbmQnIG9yIGZhbHNlKSBwZXJmb3JtIHRoZXNlIGhlcmUgKElmIGl0IGlzICdkdXJpbmcnIHNpbWlsYXIgdGhpbmdzIGFyZSBhbHJlYWR5IHBlcmZvcm1lZClcbiAgICovXG4gIGlmICh0aGlzLm9wdGlvbnMuYW5pbWF0ZSAhPT0gXCJkdXJpbmdcIikge1xuICAgIHNlbGYub3B0aW9ucy5lbGVzLm5vZGVzKCkubm90KFwiOnBhcmVudFwiKS5sYXlvdXRQb3NpdGlvbnMoc2VsZiwgc2VsZi5vcHRpb25zLCBnZXRQb3NpdGlvbnMpOyAvLyBVc2UgbGF5b3V0IHBvc2l0aW9ucyB0byByZXBvc2l0aW9uIHRoZSBub2RlcyBpdCBjb25zaWRlcnMgdGhlIG9wdGlvbnMgcGFyYW1ldGVyXG4gICAgcmVhZHkgPSBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0aGlzOyAvLyBjaGFpbmluZ1xufTtcblxuLy9HZXQgdGhlIHRvcCBtb3N0IG9uZXMgb2YgYSBsaXN0IG9mIG5vZGVzXG5fQ29TRUxheW91dC5wcm90b3R5cGUuZ2V0VG9wTW9zdE5vZGVzID0gZnVuY3Rpb24gKG5vZGVzKSB7XG4gIHZhciBub2Rlc01hcCA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgbm9kZXNNYXBbbm9kZXNbaV0uaWQoKV0gPSB0cnVlO1xuICB9XG4gIHZhciByb290cyA9IG5vZGVzLmZpbHRlcihmdW5jdGlvbiAoZWxlLCBpKSB7XG4gICAgaWYgKHR5cGVvZiBlbGUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGVsZSA9IGk7XG4gICAgfVxuICAgIHZhciBwYXJlbnQgPSBlbGUucGFyZW50KClbMF07XG4gICAgd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7XG4gICAgICBpZiAobm9kZXNNYXBbcGFyZW50LmlkKCldKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQoKVswXTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiByb290cztcbn07XG5cbl9Db1NFTGF5b3V0LnByb3RvdHlwZS5wcm9jZXNzQ2hpbGRyZW5MaXN0ID0gZnVuY3Rpb24gKHBhcmVudCwgY2hpbGRyZW4sIGxheW91dCkge1xuICB2YXIgc2l6ZSA9IGNoaWxkcmVuLmxlbmd0aDtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICB2YXIgdGhlQ2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICB2YXIgY2hpbGRyZW5fb2ZfY2hpbGRyZW4gPSB0aGVDaGlsZC5jaGlsZHJlbigpO1xuICAgIHZhciB0aGVOb2RlO1xuXG4gICAgdmFyIGRpbWVuc2lvbnMgPSB0aGVDaGlsZC5sYXlvdXREaW1lbnNpb25zKHtcbiAgICAgIG5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVsczogdGhpcy5vcHRpb25zLm5vZGVEaW1lbnNpb25zSW5jbHVkZUxhYmVsc1xuICAgIH0pO1xuXG4gICAgaWYgKHRoZUNoaWxkLm91dGVyV2lkdGgoKSAhPSBudWxsICYmIHRoZUNoaWxkLm91dGVySGVpZ2h0KCkgIT0gbnVsbCkge1xuICAgICAgdGhlTm9kZSA9IHBhcmVudC5hZGQobmV3IENvU0VOb2RlKGxheW91dC5ncmFwaE1hbmFnZXIsIG5ldyBQb2ludEQodGhlQ2hpbGQucG9zaXRpb24oJ3gnKSAtIGRpbWVuc2lvbnMudyAvIDIsIHRoZUNoaWxkLnBvc2l0aW9uKCd5JykgLSBkaW1lbnNpb25zLmggLyAyKSwgbmV3IERpbWVuc2lvbkQocGFyc2VGbG9hdChkaW1lbnNpb25zLncpLCBwYXJzZUZsb2F0KGRpbWVuc2lvbnMuaCkpKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoZU5vZGUgPSBwYXJlbnQuYWRkKG5ldyBDb1NFTm9kZSh0aGlzLmdyYXBoTWFuYWdlcikpO1xuICAgIH1cbiAgICAvLyBBdHRhY2ggaWQgdG8gdGhlIGxheW91dCBub2RlXG4gICAgdGhlTm9kZS5pZCA9IHRoZUNoaWxkLmRhdGEoXCJpZFwiKTtcbiAgICAvLyBBdHRhY2ggdGhlIHBhZGRpbmdzIG9mIGN5IG5vZGUgdG8gbGF5b3V0IG5vZGVcbiAgICB0aGVOb2RlLnBhZGRpbmdMZWZ0ID0gcGFyc2VJbnQodGhlQ2hpbGQuY3NzKCdwYWRkaW5nJykpO1xuICAgIHRoZU5vZGUucGFkZGluZ1RvcCA9IHBhcnNlSW50KHRoZUNoaWxkLmNzcygncGFkZGluZycpKTtcbiAgICB0aGVOb2RlLnBhZGRpbmdSaWdodCA9IHBhcnNlSW50KHRoZUNoaWxkLmNzcygncGFkZGluZycpKTtcbiAgICB0aGVOb2RlLnBhZGRpbmdCb3R0b20gPSBwYXJzZUludCh0aGVDaGlsZC5jc3MoJ3BhZGRpbmcnKSk7XG5cbiAgICAvL0F0dGFjaCB0aGUgbGFiZWwgcHJvcGVydGllcyB0byBjb21wb3VuZCBpZiBsYWJlbHMgd2lsbCBiZSBpbmNsdWRlZCBpbiBub2RlIGRpbWVuc2lvbnMgIFxuICAgIGlmICh0aGlzLm9wdGlvbnMubm9kZURpbWVuc2lvbnNJbmNsdWRlTGFiZWxzKSB7XG4gICAgICBpZiAodGhlQ2hpbGQuaXNQYXJlbnQoKSkge1xuICAgICAgICB2YXIgbGFiZWxXaWR0aCA9IHRoZUNoaWxkLmJvdW5kaW5nQm94KHsgaW5jbHVkZUxhYmVsczogdHJ1ZSwgaW5jbHVkZU5vZGVzOiBmYWxzZSB9KS53O1xuICAgICAgICB2YXIgbGFiZWxIZWlnaHQgPSB0aGVDaGlsZC5ib3VuZGluZ0JveCh7IGluY2x1ZGVMYWJlbHM6IHRydWUsIGluY2x1ZGVOb2RlczogZmFsc2UgfSkuaDtcbiAgICAgICAgdmFyIGxhYmVsUG9zID0gdGhlQ2hpbGQuY3NzKFwidGV4dC1oYWxpZ25cIik7XG4gICAgICAgIHRoZU5vZGUubGFiZWxXaWR0aCA9IGxhYmVsV2lkdGg7XG4gICAgICAgIHRoZU5vZGUubGFiZWxIZWlnaHQgPSBsYWJlbEhlaWdodDtcbiAgICAgICAgdGhlTm9kZS5sYWJlbFBvcyA9IGxhYmVsUG9zO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1hcCB0aGUgbGF5b3V0IG5vZGVcbiAgICB0aGlzLmlkVG9MTm9kZVt0aGVDaGlsZC5kYXRhKFwiaWRcIildID0gdGhlTm9kZTtcblxuICAgIGlmIChpc05hTih0aGVOb2RlLnJlY3QueCkpIHtcbiAgICAgIHRoZU5vZGUucmVjdC54ID0gMDtcbiAgICB9XG5cbiAgICBpZiAoaXNOYU4odGhlTm9kZS5yZWN0LnkpKSB7XG4gICAgICB0aGVOb2RlLnJlY3QueSA9IDA7XG4gICAgfVxuXG4gICAgaWYgKGNoaWxkcmVuX29mX2NoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW5fb2ZfY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIHRoZU5ld0dyYXBoO1xuICAgICAgdGhlTmV3R3JhcGggPSBsYXlvdXQuZ2V0R3JhcGhNYW5hZ2VyKCkuYWRkKGxheW91dC5uZXdHcmFwaCgpLCB0aGVOb2RlKTtcbiAgICAgIHRoaXMucHJvY2Vzc0NoaWxkcmVuTGlzdCh0aGVOZXdHcmFwaCwgY2hpbGRyZW5fb2ZfY2hpbGRyZW4sIGxheW91dCk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEBicmllZiA6IGNhbGxlZCBvbiBjb250aW51b3VzIGxheW91dHMgdG8gc3RvcCB0aGVtIGJlZm9yZSB0aGV5IGZpbmlzaFxuICovXG5fQ29TRUxheW91dC5wcm90b3R5cGUuc3RvcCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5zdG9wcGVkID0gdHJ1ZTtcblxuICByZXR1cm4gdGhpczsgLy8gY2hhaW5pbmdcbn07XG5cbnZhciByZWdpc3RlciA9IGZ1bmN0aW9uIHJlZ2lzdGVyKGN5dG9zY2FwZSkge1xuICAvLyAgdmFyIExheW91dCA9IGdldExheW91dCggY3l0b3NjYXBlICk7XG5cbiAgY3l0b3NjYXBlKCdsYXlvdXQnLCAnY29zZS1iaWxrZW50JywgX0NvU0VMYXlvdXQpO1xufTtcblxuLy8gYXV0byByZWcgZm9yIGdsb2JhbHNcbmlmICh0eXBlb2YgY3l0b3NjYXBlICE9PSAndW5kZWZpbmVkJykge1xuICByZWdpc3RlcihjeXRvc2NhcGUpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHJlZ2lzdGVyO1xuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG59KTsiXSwibmFtZXMiOlsid2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJyb290IiwiZmFjdG9yeSIsImV4cG9ydHMiLCJtb2R1bGUiLCJyZXF1aXJlIiwiZGVmaW5lIiwiYW1kIiwiX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8wX18iLCJtb2R1bGVzIiwiaW5zdGFsbGVkTW9kdWxlcyIsIl9fd2VicGFja19yZXF1aXJlX18iLCJtb2R1bGVJZCIsImkiLCJsIiwiY2FsbCIsIm0iLCJjIiwidmFsdWUiLCJkIiwibmFtZSIsImdldHRlciIsIm8iLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImNvbmZpZ3VyYWJsZSIsImVudW1lcmFibGUiLCJnZXQiLCJuIiwiX19lc01vZHVsZSIsImdldERlZmF1bHQiLCJnZXRNb2R1bGVFeHBvcnRzIiwib2JqZWN0IiwicHJvcGVydHkiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsInAiLCJzIiwiTGF5b3V0Q29uc3RhbnRzIiwibGF5b3V0QmFzZSIsIkZETGF5b3V0Q29uc3RhbnRzIiwiQ29TRUNvbnN0YW50cyIsIkNvU0VMYXlvdXQiLCJDb1NFTm9kZSIsIlBvaW50RCIsIkRpbWVuc2lvbkQiLCJkZWZhdWx0cyIsInJlYWR5Iiwic3RvcCIsInF1YWxpdHkiLCJub2RlRGltZW5zaW9uc0luY2x1ZGVMYWJlbHMiLCJyZWZyZXNoIiwiZml0IiwicGFkZGluZyIsInJhbmRvbWl6ZSIsIm5vZGVSZXB1bHNpb24iLCJpZGVhbEVkZ2VMZW5ndGgiLCJlZGdlRWxhc3RpY2l0eSIsIm5lc3RpbmdGYWN0b3IiLCJncmF2aXR5IiwibnVtSXRlciIsInRpbGUiLCJhbmltYXRlIiwiYW5pbWF0aW9uRHVyYXRpb24iLCJ0aWxpbmdQYWRkaW5nVmVydGljYWwiLCJ0aWxpbmdQYWRkaW5nSG9yaXpvbnRhbCIsImdyYXZpdHlSYW5nZUNvbXBvdW5kIiwiZ3Jhdml0eUNvbXBvdW5kIiwiZ3Jhdml0eVJhbmdlIiwiaW5pdGlhbEVuZXJneU9uSW5jcmVtZW50YWwiLCJleHRlbmQiLCJvcHRpb25zIiwib2JqIiwiX0NvU0VMYXlvdXQiLCJfb3B0aW9ucyIsImdldFVzZXJPcHRpb25zIiwiREVGQVVMVF9SRVBVTFNJT05fU1RSRU5HVEgiLCJERUZBVUxUX0VER0VfTEVOR1RIIiwiREVGQVVMVF9TUFJJTkdfU1RSRU5HVEgiLCJQRVJfTEVWRUxfSURFQUxfRURHRV9MRU5HVEhfRkFDVE9SIiwiREVGQVVMVF9HUkFWSVRZX1NUUkVOR1RIIiwiTUFYX0lURVJBVElPTlMiLCJERUZBVUxUX0dSQVZJVFlfUkFOR0VfRkFDVE9SIiwiREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1NUUkVOR1RIIiwiREVGQVVMVF9DT01QT1VORF9HUkFWSVRZX1JBTkdFX0ZBQ1RPUiIsIkRFRkFVTFRfQ09PTElOR19GQUNUT1JfSU5DUkVNRU5UQUwiLCJRVUFMSVRZIiwiTk9ERV9ESU1FTlNJT05TX0lOQ0xVREVfTEFCRUxTIiwiREVGQVVMVF9JTkNSRU1FTlRBTCIsIkFOSU1BVEUiLCJUSUxFIiwiVElMSU5HX1BBRERJTkdfVkVSVElDQUwiLCJUSUxJTkdfUEFERElOR19IT1JJWk9OVEFMIiwicnVuIiwiZnJhbWVJZCIsImlkVG9MTm9kZSIsImxheW91dCIsInNlbGYiLCJzdG9wcGVkIiwiY3kiLCJ0cmlnZ2VyIiwidHlwZSIsImdtIiwibmV3R3JhcGhNYW5hZ2VyIiwibm9kZXMiLCJlbGVzIiwiZWRnZXMiLCJhZGRSb290IiwicHJvY2Vzc0NoaWxkcmVuTGlzdCIsImdldFRvcE1vc3ROb2RlcyIsImxlbmd0aCIsImVkZ2UiLCJzb3VyY2VOb2RlIiwiZGF0YSIsInRhcmdldE5vZGUiLCJnZXRFZGdlc0JldHdlZW4iLCJlMSIsImFkZCIsIm5ld0VkZ2UiLCJpZCIsImdldFBvc2l0aW9ucyIsImVsZSIsInRoZUlkIiwibE5vZGUiLCJ4IiwiZ2V0UmVjdCIsImdldENlbnRlclgiLCJ5IiwiZ2V0Q2VudGVyWSIsIml0ZXJhdGVBbmltYXRlZCIsImFmdGVyUmVwb3NpdGlvbiIsIm9uZSIsInRpY2tzUGVyRnJhbWUiLCJpc0RvbmUiLCJ0aWNrIiwiY2hlY2tMYXlvdXRTdWNjZXNzIiwiaXNTdWJMYXlvdXQiLCJkb1Bvc3RMYXlvdXQiLCJ0aWxpbmdQb3N0TGF5b3V0IiwiaXNMYXlvdXRGaW5pc2hlZCIsInBvc2l0aW9ucyIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwiYW5pbWF0aW9uRGF0YSIsImdldFBvc2l0aW9uc0RhdGEiLCJpc1BhcmVudCIsInBOb2RlIiwidGVtcCIsInBhcmVudCIsInVuZGVmaW5lZCIsInBvc2l0aW9uIiwicmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiYWRkTGlzdGVuZXIiLCJydW5MYXlvdXQiLCJub3QiLCJsYXlvdXRQb3NpdGlvbnMiLCJub2Rlc01hcCIsInJvb3RzIiwiZmlsdGVyIiwiY2hpbGRyZW4iLCJzaXplIiwidGhlQ2hpbGQiLCJjaGlsZHJlbl9vZl9jaGlsZHJlbiIsInRoZU5vZGUiLCJkaW1lbnNpb25zIiwibGF5b3V0RGltZW5zaW9ucyIsIm91dGVyV2lkdGgiLCJvdXRlckhlaWdodCIsImdyYXBoTWFuYWdlciIsInciLCJoIiwicGFyc2VGbG9hdCIsInBhZGRpbmdMZWZ0IiwicGFyc2VJbnQiLCJjc3MiLCJwYWRkaW5nVG9wIiwicGFkZGluZ1JpZ2h0IiwicGFkZGluZ0JvdHRvbSIsImxhYmVsV2lkdGgiLCJib3VuZGluZ0JveCIsImluY2x1ZGVMYWJlbHMiLCJpbmNsdWRlTm9kZXMiLCJsYWJlbEhlaWdodCIsImxhYmVsUG9zIiwiaXNOYU4iLCJyZWN0IiwidGhlTmV3R3JhcGgiLCJnZXRHcmFwaE1hbmFnZXIiLCJuZXdHcmFwaCIsInJlZ2lzdGVyIiwiY3l0b3NjYXBlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/cytoscape-cose-bilkent/cytoscape-cose-bilkent.js\n");
 | |
| 
 | |
| /***/ })
 | |
| 
 | |
| };
 | |
| ; |