{"version":3,"sources":["jsdelivr-header.js","/npm/d3-org-chart-jc@2.6.16/build/d3-org-chart.js"],"names":[],"mappings":"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","file":"/npm/d3-org-chart-jc@2.6.16/build/d3-org-chart.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/d3-org-chart-jc@2.6.16/build/d3-org-chart.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('d3-array'), require('d3-flextree'), require('d3-hierarchy'), require('d3-selection'), require('d3-shape'), require('d3-zoom')) :\n    typeof define === 'function' && define.amd ? define(['exports', 'd3-array', 'd3-flextree', 'd3-hierarchy', 'd3-selection', 'd3-shape', 'd3-zoom'], factory) :\n    (factory((global.d3 = global.d3 || {}),global.d3,global.d3,global.d3,global.d3,global.d3,global.d3));\n}(this, function (exports,d3Array,d3Flextree,d3Hierarchy,d3Selection,d3Shape,d3Zoom) { 'use strict';\n\n    const d3 = {\n        selection: d3Selection.selection,\n        select: d3Selection.select,\n        max: d3Array.max,\n        min: d3Array.min,\n        sum: d3Array.sum,\n        cumsum: d3Array.cumsum,\n        tree: d3Hierarchy.tree,\n        stratify: d3Hierarchy.stratify,\n        zoom: d3Zoom.zoom,\n        zoomIdentity: d3Zoom.zoomIdentity,\n        linkHorizontal: d3Shape.linkHorizontal,\n    }\n    class OrgChart {\n        constructor() {\n            // Exposed variables \n            const attrs = {\n                id: `ID${Math.floor(Math.random() * 1000000)}`, // Id for event handlings\n                firstDraw: true,\n                svgWidth: 800,\n                svgHeight: window.innerHeight - 100,\n                scaleExtent:[0.001, 20],\n                container: \"body\",\n                defaultTextFill: \"#2C3E50\",\n                defaultFont: \"Helvetica\",\n                ctx: document.createElement('canvas').getContext('2d'),\n                data: null,\n                duration: 400,\n                setActiveNodeCentered: true,\n                expandLevel: 1,\n                compact: true,\n                rootMargin: 40,\n                nodeDefaultBackground: 'none',\n                connections: [],\n                lastTransform: { x: 0, y: 0, k: 1 },\n                nodeId: d => d.nodeId || d.id,\n                parentNodeId: d => d.parentNodeId || d.parentId,\n                backgroundColor: 'none',\n                zoomBehavior: null,\n                defs: function (state, visibleConnections) {\n                    return `<defs>\n                    ${visibleConnections.map(conn => {\n                        const labelWidth = this.getTextWidth(conn.label, { ctx: state.ctx, fontSize: 2, defaultFont: state.defaultFont });\n                        return `\n                       <marker id=\"${conn.from + \"_\" + conn.to}\" refX=\"${conn._source.x < conn._target.x ? -7 : 7}\" refY=\"5\" markerWidth=\"500\"  markerHeight=\"500\"  orient=\"${conn._source.x < conn._target.x ? \"auto\" : \"auto-start-reverse\"}\" >\n                       <rect rx=0.5 width=${conn.label ? labelWidth + 3 : 0} height=3 y=1  fill=\"#152785\"></rect>\n                       <text font-size=\"2px\" x=1 fill=\"white\" y=3>${conn.label || ''}</text>\n                       </marker>\n\n                       <marker id=\"arrow-${conn.from + \"_\" + conn.to}\"  markerWidth=\"500\"  markerHeight=\"500\"  refY=\"2\"  refX=\"1\" orient=\"${conn._source.x < conn._target.x ? \"auto\" : \"auto-start-reverse\"}\" >\n                       <path transform=\"translate(0)\" d='M0,0 V4 L2,2 Z' fill='#152785' />\n                       </marker>\n                    `}).join(\"\")}\n                    </defs>\n                    `},\n                connectionsUpdate: function (d, i, arr) {\n                    d3.select(this)\n                        .attr(\"stroke\", d => '#152785')\n                        .attr('stroke-linecap', 'round')\n                        .attr(\"stroke-width\", d => '5')\n                        .attr('pointer-events', 'none')\n                        .attr(\"marker-start\", d => `url(#${d.from + \"_\" + d.to})`)\n                        .attr(\"marker-end\", d => `url(#arrow-${d.from + \"_\" + d.to})`)\n                },\n                linkUpdate: function (d, i, arr) {\n                    d3.select(this)\n                        .attr(\"stroke\", d => d.data._upToTheRootHighlighted ? '#152785' : 'lightgray')\n                        .attr(\"stroke-width\", d => d.data._upToTheRootHighlighted ? 5 : 2)\n\n                    if (d.data._upToTheRootHighlighted) {\n                        d3.select(this).raise()\n                    }\n                },\n                nodeUpdate: function (d, i, arr) {\n                    d3.select(this)\n                        .select('.node-rect')\n                        .attr(\"stroke\", d => d.data._highlighted || d.data._upToTheRootHighlighted ? '#152785' : 'none')\n                        .attr(\"stroke-width\", d.data._highlighted || d.data._upToTheRootHighlighted ? 10 : 1)\n                },\n\n                nodeWidth: d3Node => 250,\n                nodeHeight: d => 150,\n                siblingsMargin: d3Node => 20,\n                childrenMargin: d => 60,\n                neightbourMargin: (n1, n2) => 80,\n                compactMarginPair: d => 100,\n                compactMarginBetween: (d3Node => 20),\n                onNodeClick: (d) => d,\n                linkGroupArc: d3.linkHorizontal().x(d => d.x).y(d => d.y),\n                // ({ source, target }) => {\n                //     return \n                //     return `M ${source.x} , ${source.y} Q ${(source.x + target.x) / 2 + 100},${source.y-100}  ${target.x}, ${target.y}`;\n                // },\n                nodeContent: d => `<div style=\"padding:5px;font-size:10px;\">Sample Node(id=${d.id}), override using <br/> <br/> \n            <code>chart<br/>\n            &nbsp;.nodeContent({data}=>{ <br/>\n             &nbsp;&nbsp;&nbsp;&nbsp;return '' // Custom HTML <br/>\n             &nbsp;})</code>\n             <br/> <br/>\n             Or check different <a href=\"https://github.com/bumbeishvili/org-chart#jump-to-examples\" target=\"_blank\">layout examples</a>\n             \n             </div>`,\n                layout: \"top\",// top, left,right, bottom\n                buttonContent: ({ node, state }) => {\n                    const icons = {\n                        \"left\": d => d ? `<div style=\"margin-top:-10px;line-height:1.2;font-size:25px;height:22px\">‹</div>` : `<div style=\"margin-top:-10px;font-size:25px;height:23px\">›</div>`,\n                        \"bottom\": d => d ? `<div style=\"margin-top:-20px;font-size:25px\">ˬ</div>` : `<div style=\"margin-top:0px;line-height:1.2;height:11px;font-size:25px\">ˆ</div>`,\n                        \"right\": d => d ? `<div style=\"margin-top:-10px;font-size:25px;height:23px\">›</div>` : `<div style=\"margin-top:-10px;line-height:1.2;font-size:25px;height:22px\">‹</div>`,\n                        \"top\": d => d ? `<div style=\"margin-top:0px;line-height:1.2;height:11px;font-size:25px\">ˆ</div>` : `<div style=\"margin-top:-20px;font-size:25px\">ˬ</div>`,\n                    }\n                    return `<div style=\"border-radius:3px;padding:3px;font-size:10px;margin:auto auto;background-color:lightgray\"> ${icons[state.layout](node.children)}  </div>`\n                },\n                layoutBindings: {\n                    \"left\": {\n                        \"nodeLeftX\": node => 0,\n                        \"nodeRightX\": node => node.width,\n                        \"nodeTopY\": node => - node.height / 2,\n                        \"nodeBottomY\": node => node.height / 2,\n                        \"nodeJoinX\": node => node.x + node.width,\n                        \"nodeJoinY\": node => node.y - node.height / 2,\n                        \"linkJoinX\": node => node.x + node.width,\n                        \"linkJoinY\": node => node.y,\n                        \"linkX\": node => node.x,\n                        \"linkY\": node => node.y,\n                        \"linkCompactXStart\": node => node.x + node.width / 2,//node.x + (node.compactEven ? node.width / 2 : -node.width / 2),\n                        \"linkCompactYStart\": node => node.y + (node.compactEven ? node.height / 2 : -node.height / 2),\n                        \"compactLinkMidX\": (node, state) => node.firstCompactNode.x,// node.firstCompactNode.x + node.firstCompactNode.flexCompactDim[0] / 4 + state.compactMarginPair(node) / 4,\n                        \"compactLinkMidY\": (node, state) => node.firstCompactNode.y + node.firstCompactNode.flexCompactDim[0] / 4 + state.compactMarginPair(node) / 4,\n                        \"linkParentX\": node => node.parent.x + node.parent.width,\n                        \"linkParentY\": node => node.parent.y,\n                        \"buttonX\": node => node.width,\n                        \"buttonY\": node => node.height / 2,\n                        \"centerTransform\": ({ root, rootMargin, centerY, scale, centerX }) => `translate(${rootMargin},${centerY}) scale(${scale})`,\n                        \"compactDimension\": {\n                            sizeColumn: node => node.height,\n                            sizeRow: node => node.width,\n                            reverse: arr => arr.slice().reverse()\n                        },\n                        \"nodeFlexSize\": ({ height, width, siblingsMargin, childrenMargin, state, node }) => {\n                            if (state.compact && node.flexCompactDim) {\n                                const result = [node.flexCompactDim[0], node.flexCompactDim[1]]\n                                return result;\n                            };\n                            return [height + siblingsMargin, width + childrenMargin]\n                        },\n                        \"zoomTransform\": ({ centerY, scale }) => `translate(${0},${centerY}) scale(${scale})`,\n                        \"diagonal\": this.hdiagonal.bind(this),\n                        \"swap\": d => { const x = d.x; d.x = d.y; d.y = x; },\n                        \"nodeUpdateTransform\": ({ x, y, width, height }) => `translate(${x},${y - height / 2})`,\n                    },\n                    \"top\": {\n                        \"nodeLeftX\": node => -node.width / 2,\n                        \"nodeRightX\": node => node.width / 2,\n                        \"nodeTopY\": node => 0,\n                        \"nodeBottomY\": node => node.height,\n                        \"nodeJoinX\": node => node.x - node.width / 2,\n                        \"nodeJoinY\": node => node.y + node.height,\n                        \"linkJoinX\": node => node.x,\n                        \"linkJoinY\": node => node.y + node.height,\n                        \"linkCompactXStart\": node => node.x + (node.compactEven ? node.width / 2 : -node.width / 2),\n                        \"linkCompactYStart\": node => node.y + node.height / 2,\n                        \"compactLinkMidX\": (node, state) => node.firstCompactNode.x + node.firstCompactNode.flexCompactDim[0] / 4 + state.compactMarginPair(node) / 4,\n                        \"compactLinkMidY\": node => node.firstCompactNode.y,\n                        \"compactDimension\": {\n                            sizeColumn: node => node.width,\n                            sizeRow: node => node.height,\n                            reverse: arr => arr,\n                        },\n                        \"linkX\": node => node.x,\n                        \"linkY\": node => node.y,\n                        \"linkParentX\": node => node.parent.x,\n                        \"linkParentY\": node => node.parent.y + node.parent.height,\n                        \"buttonX\": node => node.width / 2,\n                        \"buttonY\": node => node.height,\n                        \"centerTransform\": ({ root, rootMargin, centerY, scale, centerX }) => `translate(${centerX},${rootMargin}) scale(${scale})`,\n                        \"nodeFlexSize\": ({ height, width, siblingsMargin, childrenMargin, state, node, compactViewIndex }) => {\n                            if (state.compact && node.flexCompactDim) {\n                                const result = [node.flexCompactDim[0], node.flexCompactDim[1]]\n                                return result;\n                            };\n                            return [width + siblingsMargin, height + childrenMargin];\n                        },\n                        \"zoomTransform\": ({ centerX, scale }) => `translate(${centerX},0}) scale(${scale})`,\n                        \"diagonal\": this.diagonal.bind(this),\n                        \"swap\": d => { },\n                        \"nodeUpdateTransform\": ({ x, y, width, height }) => `translate(${x - width / 2},${y})`,\n\n                    },\n                    \"bottom\": {\n                        \"nodeLeftX\": node => -node.width / 2,\n                        \"nodeRightX\": node => node.width / 2,\n                        \"nodeTopY\": node => -node.height,\n                        \"nodeBottomY\": node => 0,\n                        \"nodeJoinX\": node => node.x - node.width / 2,\n                        \"nodeJoinY\": node => node.y - node.height - node.height,\n                        \"linkJoinX\": node => node.x,\n                        \"linkJoinY\": node => node.y - node.height,\n                        \"linkCompactXStart\": node => node.x + (node.compactEven ? node.width / 2 : -node.width / 2),\n                        \"linkCompactYStart\": node => node.y - node.height / 2,\n                        \"compactLinkMidX\": (node, state) => node.firstCompactNode.x + node.firstCompactNode.flexCompactDim[0] / 4 + state.compactMarginPair(node) / 4,\n                        \"compactLinkMidY\": node => node.firstCompactNode.y,\n                        \"linkX\": node => node.x,\n                        \"linkY\": node => node.y,\n                        \"compactDimension\": {\n                            sizeColumn: node => node.width,\n                            sizeRow: node => node.height,\n                            reverse: arr => arr,\n                        },\n                        \"linkParentX\": node => node.parent.x,\n                        \"linkParentY\": node => node.parent.y - node.parent.height,\n                        \"buttonX\": node => node.width / 2,\n                        \"buttonY\": node => 0,\n                        \"centerTransform\": ({ root, rootMargin, centerY, scale, centerX, chartHeight }) => `translate(${centerX},${chartHeight - rootMargin}) scale(${scale})`,\n                        \"nodeFlexSize\": ({ height, width, siblingsMargin, childrenMargin, state, node }) => {\n                            if (state.compact && node.flexCompactDim) {\n                                const result = [node.flexCompactDim[0], node.flexCompactDim[1]]\n                                return result;\n                            };\n                            return [width + siblingsMargin, height + childrenMargin]\n                        },\n                        \"zoomTransform\": ({ centerX, scale }) => `translate(${centerX},0}) scale(${scale})`,\n                        \"diagonal\": this.diagonal.bind(this),\n                        \"swap\": d => { d.y = -d.y; },\n                        \"nodeUpdateTransform\": ({ x, y, width, height }) => `translate(${x - width / 2},${y - height})`,\n                    },\n                    \"right\": {\n                        \"nodeLeftX\": node => -node.width,\n                        \"nodeRightX\": node => 0,\n                        \"nodeTopY\": node => - node.height / 2,\n                        \"nodeBottomY\": node => node.height / 2,\n                        \"nodeJoinX\": node => node.x - node.width - node.width,\n                        \"nodeJoinY\": node => node.y - node.height / 2,\n                        \"linkJoinX\": node => node.x - node.width,\n                        \"linkJoinY\": node => node.y,\n                        \"linkX\": node => node.x,\n                        \"linkY\": node => node.y,\n                        \"linkParentX\": node => node.parent.x - node.parent.width,\n                        \"linkParentY\": node => node.parent.y,\n                        \"buttonX\": node => 0,\n                        \"buttonY\": node => node.height / 2,\n                        \"linkCompactXStart\": node => node.x - node.width / 2,//node.x + (node.compactEven ? node.width / 2 : -node.width / 2),\n                        \"linkCompactYStart\": node => node.y + (node.compactEven ? node.height / 2 : -node.height / 2),\n                        \"compactLinkMidX\": (node, state) => node.firstCompactNode.x,// node.firstCompactNode.x + node.firstCompactNode.flexCompactDim[0] / 4 + state.compactMarginPair(node) / 4,\n                        \"compactLinkMidY\": (node, state) => node.firstCompactNode.y + node.firstCompactNode.flexCompactDim[0] / 4 + state.compactMarginPair(node) / 4,\n                        \"centerTransform\": ({ root, rootMargin, centerY, scale, centerX, chartWidth }) => `translate(${chartWidth - rootMargin},${centerY}) scale(${scale})`,\n                        \"nodeFlexSize\": ({ height, width, siblingsMargin, childrenMargin, state, node }) => {\n                            if (state.compact && node.flexCompactDim) {\n                                const result = [node.flexCompactDim[0], node.flexCompactDim[1]]\n                                return result;\n                            };\n                            return [height + siblingsMargin, width + childrenMargin]\n                        },\n                        \"compactDimension\": {\n                            sizeColumn: node => node.height,\n                            sizeRow: node => node.width,\n                            reverse: arr => arr.slice().reverse()\n                        },\n                        \"zoomTransform\": ({ centerY, scale }) => `translate(${0},${centerY}) scale(${scale})`,\n                        \"diagonal\": this.hdiagonal.bind(this),\n                        \"swap\": d => { const x = d.x; d.x = -d.y; d.y = x; },\n                        \"nodeUpdateTransform\": ({ x, y, width, height }) => `translate(${x - width},${y - height / 2})`,\n                    },\n                }\n            };\n\n            this.getChartState = () => attrs;\n\n            // Dynamically set getter and setter functions for Chart class\n            Object.keys(attrs).forEach((key) => {\n                //@ts-ignore\n                this[key] = function (_) {\n                    if (!arguments.length) {\n                        return attrs[key];\n                    } else {\n                        attrs[key] = _;\n                    }\n                    return this;\n                };\n            });\n\n            this.initializeEnterExitUpdatePattern();\n        }\n\n        actions(actions) {\n\n            /* \n                interface action {\n                    selector: string; // css selector for the element within nodeContent\n                    onClick?: (event, node, state) => void // on Click Callback\n                    onHover?: (event, node, state) => void // on Hover Callback\n                }\n             */\n            const attrs = this.getChartState();\n            const actionsMap = {};\n            attrs.actions = [];\n\n            actions.forEach((action, i) => {\n                if (!action.onClick && !action.onHover) {\n                    throw new Error('Action requiers an event handler. Either [onClick] or [onHover]');\n                }\n                \n                if (!action.selector) {\n                    throw new Error('Action requiers a selector');\n                }\n                \n                if (actionsMap[action.selector]) {\n                    throw new Error(`Action with selector [${action.selector}] already exists`);\n                }\n\n                attrs.actions.push(action);\n            });\n\n            return this;\n        }\n\n        initializeEnterExitUpdatePattern() {\n            d3.selection.prototype.patternify = function (params) {\n                var container = this;\n                var selector = params.selector;\n                var elementTag = params.tag;\n                var data = params.data || [selector];\n\n                // Pattern in action\n                var selection = container.selectAll(\".\" + selector).data(data, (d, i) => {\n                    if (typeof d === \"object\") {\n                        if (d.id) { return d.id; }\n                    }\n                    return i;\n                });\n                selection.exit().remove();\n                selection = selection.enter().append(elementTag).merge(selection);\n                selection.attr(\"class\", selector);\n                return selection;\n            };\n        }\n\n        // This method retrieves passed node's children IDs (including node)\n        getNodeChildren({ data, children, _children }, nodeStore) {\n            // Store current node ID\n            nodeStore.push(data);\n\n            // Loop over children and recursively store descendants id (expanded nodes)\n            if (children) {\n                children.forEach((d) => {\n                    this.getNodeChildren(d, nodeStore);\n                });\n            }\n\n            // Loop over _children and recursively store descendants id (collapsed nodes)\n            if (_children) {\n                _children.forEach((d) => {\n                    this.getNodeChildren(d, nodeStore);\n                });\n            }\n\n            // Return result\n            return nodeStore;\n        }\n\n        // This method can be invoked via chart.setZoomFactor API, it zooms to particulat scale\n        initialZoom(zoomLevel) {\n            const attrs = this.getChartState();\n            attrs.lastTransform.k = zoomLevel;\n            return this;\n        }\n\n        render() {\n            //InnerFunctions which will update visuals\n            const attrs = this.getChartState();\n            if (!attrs.data || attrs.data.length == 0) {\n                console.log('ORG CHART - Data is empty')\n                return this;\n            }\n\n            //Drawing containers\n            const container = d3.select(attrs.container);\n            const containerRect = container.node().getBoundingClientRect();\n            if (containerRect.width > 0) attrs.svgWidth = containerRect.width;\n\n            //Calculated properties\n            const calc = {\n                id: `ID${Math.floor(Math.random() * 1000000)}`, // id for event handlings,\n                chartWidth: attrs.svgWidth,\n                chartHeight: attrs.svgHeight\n            };\n            attrs.calc = calc;\n\n            // Calculate max node depth (it's needed for layout heights calculation)\n            calc.centerX = calc.chartWidth / 2;\n            calc.centerY = calc.chartHeight / 2;\n\n            // ******************* BEHAVIORS  **********************\n            if (attrs.firstDraw) {\n                const behaviors = {\n                    zoom: null\n                };\n\n                // Get zooming function\n                behaviors.zoom = d3.zoom().on(\"zoom\", (event, d) => this.zoomed(event, d)).scaleExtent(attrs.scaleExtent)\n                attrs.zoomBehavior = behaviors.zoom;\n            }\n\n            //****************** ROOT node work ************************\n\n            attrs.flexTreeLayout = d3Flextree.flextree({\n                nodeSize: node => {\n                    const width = attrs.nodeWidth(node);;\n                    const height = attrs.nodeHeight(node);\n                    const siblingsMargin = attrs.siblingsMargin(node)\n                    const childrenMargin = attrs.childrenMargin(node);\n                    return attrs.layoutBindings[attrs.layout].nodeFlexSize({\n                        state: attrs,\n                        node: node,\n                        width,\n                        height,\n                        siblingsMargin,\n                        childrenMargin\n                    });\n                }\n            })\n                .spacing((nodeA, nodeB) => nodeA.parent == nodeB.parent ? 0 : attrs.neightbourMargin(nodeA, nodeB));\n\n            this.setLayouts({ expandNodesFirst: false });\n\n            // *************************  DRAWING **************************\n            //Add svg\n            const svg = container\n                .patternify({\n                    tag: \"svg\",\n                    selector: \"svg-chart-container\"\n                })\n                .style('background-color', attrs.backgroundColor)\n                .attr(\"width\", attrs.svgWidth)\n                .attr(\"height\", attrs.svgHeight)\n                .attr(\"font-family\", attrs.defaultFont)\n\n            if (attrs.firstDraw) {\n                svg.call(attrs.zoomBehavior)\n                    .on(\"dblclick.zoom\", null)\n                    .attr(\"cursor\", \"move\")\n            }\n\n            attrs.svg = svg;\n\n            //Add container g element\n            const chart = svg\n                .patternify({\n                    tag: \"g\",\n                    selector: \"chart\"\n                })\n\n            // Add one more container g element, for better positioning controls\n            attrs.centerG = chart\n                .patternify({\n                    tag: \"g\",\n                    selector: \"center-group\"\n                })\n\n            attrs.linksWrapper = attrs.centerG.patternify({\n                tag: \"g\",\n                selector: \"links-wrapper\"\n            })\n\n            attrs.nodesWrapper = attrs.centerG.patternify({\n                tag: \"g\",\n                selector: \"nodes-wrapper\"\n            })\n\n            attrs.connectionsWrapper = attrs.centerG.patternify({\n                tag: \"g\",\n                selector: \"connections-wrapper\"\n            })\n\n            attrs.defsWrapper = svg.patternify({\n                tag: \"g\",\n                selector: \"defs-wrapper\"\n            })\n\n            if (attrs.firstDraw) {\n                attrs.centerG.attr(\"transform\", () => {\n                    return attrs.layoutBindings[attrs.layout].centerTransform({\n                        centerX: calc.centerX,\n                        centerY: calc.centerY,\n                        scale: attrs.lastTransform.k,\n                        rootMargin: attrs.rootMargin,\n                        root: attrs.root,\n                        chartHeight: calc.chartHeight,\n                        chartWidth: calc.chartWidth\n                    })\n                });\n            }\n\n            attrs.chart = chart;\n\n            // Display tree contenrs\n            this.update(attrs.root);\n\n\n            //#########################################  UTIL FUNCS ##################################\n            // This function restyles foreign object elements ()\n\n            d3.select(window).on(`resize.${attrs.id}`, () => {\n                const containerRect = d3.select(attrs.container).node().getBoundingClientRect();\n                attrs.svg.attr('width', containerRect.width)\n            });\n\n            if (attrs.firstDraw) {\n                attrs.firstDraw = false;\n            }\n\n            return this;\n        }\n\n        // This function can be invoked via chart.addNode API, and it adds node in tree at runtime\n        addNode(obj) {\n            const attrs = this.getChartState();\n            const nodeFound = attrs.allNodes.filter(({ data }) => attrs.nodeId(data) === attrs.nodeId(obj))[0];\n            const parentFound = attrs.allNodes.filter(({ data }) => attrs.nodeId(data) === attrs.parentNodeId(obj))[0];\n            if (nodeFound) {\n                console.log(`ORG CHART - ADD - Node with id \"${attrs.nodeId(obj)}\" already exists in tree`)\n                return this;\n            }\n            if (!parentFound) {\n                console.log(`ORG CHART - ADD - Parent node with id \"${attrs.parentNodeId(obj)}\" not found in the tree`)\n                return this;\n            }\n            if (obj._centered && !obj._expanded) obj._expanded = true;\n            attrs.data.push(obj);\n\n            // Update state of nodes and redraw graph\n            this.updateNodesState();\n\n            return this;\n        }\n\n        // This function can be invoked via chart.removeNode API, and it removes node from tree at runtime\n        removeNode(nodeId) {\n            const attrs = this.getChartState();\n            const node = attrs.allNodes.filter(({ data }) => attrs.nodeId(data) == nodeId)[0];\n            if (!node) {\n                console.log(`ORG CHART - REMOVE - Node with id \"${nodeId}\" not found in the tree`);\n                return this;\n            }\n\n            // Remove all node childs\n            // Retrieve all children nodes ids (including current node itself)\n            node.descendants()\n                .forEach(d => d.data._filteredOut = true)\n\n            const descendants = this.getNodeChildren(node, [], attrs.nodeId);\n            descendants.forEach(d => d._filtered = true)\n\n            // Filter out retrieved nodes and reassign data\n            attrs.data = attrs.data.filter(d => !d._filtered);\n\n            const updateNodesState = this.updateNodesState.bind(this);\n            // Update state of nodes and redraw graph\n            updateNodesState();\n\n            return this;\n        }\n\n        groupBy(array, accessor, aggegator) {\n            const grouped = {}\n            array.forEach(item => {\n                const key = accessor(item)\n                if (!grouped[key]) {\n                    grouped[key] = []\n                }\n                grouped[key].push(item)\n            })\n\n            Object.keys(grouped).forEach(key => {\n                grouped[key] = aggegator(grouped[key])\n            })\n            return Object.entries(grouped);\n        }\n        calculateCompactFlexDimensions(root) {\n            const attrs = this.getChartState();\n            root.eachBefore(node => {\n                node.firstCompact = null;\n                node.compactEven = null;\n                node.flexCompactDim = null;\n                node.firstCompactNode = null;\n            })\n            root.eachBefore(node => {\n                if (node.children && node.children.length > 1) {\n                    const compactChildren = node.children.filter(d => !d.children);\n                    if (compactChildren.length < 2) return;\n                    compactChildren.forEach((child, i) => {\n                        if (!i) child.firstCompact = true;\n                        if (i % 2) child.compactEven = false;\n                        else child.compactEven = true;\n                        child.row = Math.floor(i / 2);\n                    })\n                    const evenMaxColumnDimension = d3.max(compactChildren.filter(d => d.compactEven), attrs.layoutBindings[attrs.layout].compactDimension.sizeColumn);\n                    const oddMaxColumnDimension = d3.max(compactChildren.filter(d => !d.compactEven), attrs.layoutBindings[attrs.layout].compactDimension.sizeColumn);\n                    const columnSize = Math.max(evenMaxColumnDimension, oddMaxColumnDimension) * 2;\n                    const rowsMapNew = this.groupBy(compactChildren, d => d.row, reducedGroup => d3.max(reducedGroup, d => attrs.layoutBindings[attrs.layout].compactDimension.sizeRow(d) + attrs.compactMarginBetween(d)));\n                    const rowSize = d3.sum(rowsMapNew.map(v => v[1]))\n                    compactChildren.forEach(node => {\n                        node.firstCompactNode = compactChildren[0];\n                        if (node.firstCompact) {\n                            node.flexCompactDim = [\n                                columnSize + attrs.compactMarginPair(node),\n                                rowSize - attrs.compactMarginBetween(node)\n                            ];\n                        } else {\n                            node.flexCompactDim = [0, 0];\n                        }\n                    })\n                    node.flexCompactDim = null;\n                }\n            })\n        }\n\n        calculateCompactFlexPositions(root) {\n            const attrs = this.getChartState();\n            root.eachBefore(node => {\n                if (node.children) {\n                    const compactChildren = node.children.filter(d => d.flexCompactDim);\n                    const fch = compactChildren[0];\n                    if (!fch) return;\n                    compactChildren.forEach((child, i, arr) => {\n                        if (i == 0) fch.x -= fch.flexCompactDim[0] / 2;\n                        if (i & i % 2 - 1) child.x = fch.x + fch.flexCompactDim[0] * 0.25 - attrs.compactMarginPair(child) / 4;\n                        else if (i) child.x = fch.x + fch.flexCompactDim[0] * 0.75 + attrs.compactMarginPair(child) / 4;\n                    })\n                    const centerX = fch.x + fch.flexCompactDim[0] * 0.5;\n                    fch.x = fch.x + fch.flexCompactDim[0] * 0.25 - attrs.compactMarginPair(fch) / 4;\n                    const offsetX = node.x - centerX;\n                    if (Math.abs(offsetX) < 10) {\n                        compactChildren.forEach(d => d.x += offsetX);\n                    }\n\n                    const rowsMapNew = this.groupBy(compactChildren, d => d.row, reducedGroup => d3.max(reducedGroup, d => attrs.layoutBindings[attrs.layout].compactDimension.sizeRow(d)));\n                    const cumSum = d3.cumsum(rowsMapNew.map(d => d[1] + attrs.compactMarginBetween(d)));\n                    compactChildren\n                        .forEach((node, i) => {\n                            if (node.row) {\n                                node.y = fch.y + cumSum[node.row - 1]\n                            } else {\n                                node.y = fch.y;\n                            }\n                        })\n\n                }\n            })\n        }\n\n        // This function basically redraws visible graph, based on nodes state\n        update({ x0, y0, x = 0, y = 0, width, height }) {\n            const attrs = this.getChartState();\n            const calc = attrs.calc;\n\n\n            if (attrs.compact) {\n                this.calculateCompactFlexDimensions(attrs.root);\n            }\n\n            //  Assigns the x and y position for the nodes\n            const treeData = attrs.flexTreeLayout(attrs.root);\n\n            // Reassigns the x and y position for the based on the compact layout\n            if (attrs.compact) {\n                this.calculateCompactFlexPositions(attrs.root);\n            }\n\n            const nodes = treeData.descendants();\n\n            // console.table(nodes.map(d => ({ x: d.x, y: d.y, width: d.width, height: d.height, flexCompactDim: d.flexCompactDim + \"\" })))\n\n            // Get all links\n            const links = treeData.descendants().slice(1);\n            nodes.forEach(attrs.layoutBindings[attrs.layout].swap)\n\n            // Connections\n            const connections = attrs.connections;\n            const allNodesMap = {};\n            attrs.allNodes.forEach(d => allNodesMap[attrs.nodeId(d.data)] = d);\n\n            const visibleNodesMap = {}\n            nodes.forEach(d => visibleNodesMap[attrs.nodeId(d.data)] = d);\n\n            connections.forEach(connection => {\n                const source = allNodesMap[connection.from];\n                const target = allNodesMap[connection.to];\n                connection._source = source;\n                connection._target = target;\n            })\n            const visibleConnections = connections.filter(d => visibleNodesMap[d.from] && visibleNodesMap[d.to]);\n            const defsString = attrs.defs.bind(this)(attrs, visibleConnections);\n            const existingString = attrs.defsWrapper.html();\n            if (defsString !== existingString) {\n                attrs.defsWrapper.html(defsString)\n            }\n\n            // --------------------------  LINKS ----------------------\n            // Get links selection\n            const linkSelection = attrs.linksWrapper\n                .selectAll(\"path.link\")\n                .data(links, (d) => attrs.nodeId(d.data));\n\n            // Enter any new links at the parent's previous position.\n            const linkEnter = linkSelection\n                .enter()\n                .insert(\"path\", \"g\")\n                .attr(\"class\", \"link\")\n                .attr(\"d\", (d) => {\n                    const xo = attrs.layoutBindings[attrs.layout].linkJoinX({ x: x0, y: y0, width, height });\n                    const yo = attrs.layoutBindings[attrs.layout].linkJoinY({ x: x0, y: y0, width, height });\n                    const o = { x: xo, y: yo };\n                    return attrs.layoutBindings[attrs.layout].diagonal(o, o, o);\n                });\n\n            // Get links update selection\n            const linkUpdate = linkEnter.merge(linkSelection);\n\n            // Styling links\n            linkUpdate\n                .attr(\"fill\", \"none\")\n\n            // Allow external modifications\n            linkUpdate.each(attrs.linkUpdate);\n\n            // Transition back to the parent element position\n            linkUpdate\n                .transition()\n                .duration(attrs.duration)\n                .attr(\"d\", (d) => {\n                    const n = attrs.compact && d.flexCompactDim ?\n                        {\n                            x: attrs.layoutBindings[attrs.layout].compactLinkMidX(d, attrs),\n                            y: attrs.layoutBindings[attrs.layout].compactLinkMidY(d, attrs)\n                        } :\n                        {\n                            x: attrs.layoutBindings[attrs.layout].linkX(d),\n                            y: attrs.layoutBindings[attrs.layout].linkY(d)\n                        };\n\n                    const p = {\n                        x: attrs.layoutBindings[attrs.layout].linkParentX(d),\n                        y: attrs.layoutBindings[attrs.layout].linkParentY(d),\n                    };\n\n                    const m = attrs.compact && d.flexCompactDim ? {\n                        x: attrs.layoutBindings[attrs.layout].linkCompactXStart(d),\n                        y: attrs.layoutBindings[attrs.layout].linkCompactYStart(d),\n                    } : n;\n                    return attrs.layoutBindings[attrs.layout].diagonal(n, p, m);\n                });\n\n            // Remove any  links which is exiting after animation\n            const linkExit = linkSelection\n                .exit()\n                .transition()\n                .duration(attrs.duration)\n                .attr(\"d\", (d) => {\n                    const xo = attrs.layoutBindings[attrs.layout].linkJoinX({ x, y, width, height });\n                    const yo = attrs.layoutBindings[attrs.layout].linkJoinY({ x, y, width, height });\n                    const o = { x: xo, y: yo };\n                    return attrs.layoutBindings[attrs.layout].diagonal(o, o);\n                })\n                .remove();\n\n\n            // --------------------------  CONNECTIONS ----------------------\n\n            const connectionsSel = attrs.connectionsWrapper\n                .selectAll(\"path.connection\")\n                .data(visibleConnections)\n\n            // Enter any new connections at the parent's previous position.\n            const connEnter = connectionsSel\n                .enter()\n                .insert(\"path\", \"g\")\n                .attr(\"class\", \"connection\")\n                .attr(\"d\", (d) => {\n                    const xo = attrs.layoutBindings[attrs.layout].linkJoinX({ x: x0, y: y0, width, height });\n                    const yo = attrs.layoutBindings[attrs.layout].linkJoinY({ x: x0, y: y0, width, height });\n                    const o = { x: xo, y: yo };\n                    return attrs.layoutBindings[attrs.layout].diagonal(o, o);\n                });\n\n\n            // Get connections update selection\n            const connUpdate = connEnter.merge(connectionsSel);\n\n            // Styling connections\n            connUpdate.attr(\"fill\", \"none\")\n\n            // Transition back to the parent element position\n            connUpdate\n                .transition()\n                .duration(attrs.duration)\n                .attr('d', (d) => {\n                    const xs = attrs.layoutBindings[attrs.layout].linkX({ x: d._source.x, y: d._source.y, width: d._source.width, height: d._source.height });\n                    const ys = attrs.layoutBindings[attrs.layout].linkY({ x: d._source.x, y: d._source.y, width: d._source.width, height: d._source.height });\n                    const xt = attrs.layoutBindings[attrs.layout].linkJoinX({ x: d._target.x, y: d._target.y, width: d._target.width, height: d._target.height });\n                    const yt = attrs.layoutBindings[attrs.layout].linkJoinY({ x: d._target.x, y: d._target.y, width: d._target.width, height: d._target.height });\n                    return attrs.linkGroupArc({ source: { x: xs, y: ys }, target: { x: xt, y: yt } })\n                })\n\n            // Allow external modifications\n            connUpdate.each(attrs.connectionsUpdate);\n\n            // Remove any  links which is exiting after animation\n            const connExit = connectionsSel\n                .exit()\n                .transition()\n                .duration(attrs.duration)\n                .attr('opacity', 0)\n                .remove();\n\n            // --------------------------  NODES ----------------------\n            // Get nodes selection\n            const nodesSelection = attrs.nodesWrapper\n                .selectAll(\"g.node\")\n                .data(nodes, ({ data }) => attrs.nodeId(data));\n\n            // Enter any new nodes at the parent's previous position.\n            const nodeEnter = nodesSelection\n                .enter()\n                .append(\"g\")\n                .attr(\"class\", \"node\")\n                .attr(\"transform\", (d) => {\n                    if (d == attrs.root) return `translate(${x0},${y0})`\n                    const xj = attrs.layoutBindings[attrs.layout].nodeJoinX({ x: x0, y: y0, width, height });\n                    const yj = attrs.layoutBindings[attrs.layout].nodeJoinY({ x: x0, y: y0, width, height });\n                    return `translate(${xj},${yj})`\n                })\n                .attr(\"cursor\", \"pointer\")\n                .on(\"click\", (event, { data }) => {\n                    if ([...event.srcElement.classList].includes(\"node-button-foreign-object\")) {\n                        return;\n                    }\n                    attrs.onNodeClick(attrs.nodeId(data));\n                });\n\n            // Add background rectangle for the nodes\n            nodeEnter\n                .patternify({\n                    tag: \"rect\",\n                    selector: \"node-rect\",\n                    data: (d) => [d]\n                })\n\n            // Node update styles\n            const nodeUpdate = nodeEnter\n                .merge(nodesSelection)\n                .style(\"font\", \"12px sans-serif\");\n\n            // Add foreignObject element inside rectangle\n            const fo = nodeUpdate.patternify({\n                tag: \"foreignObject\",\n                selector: \"node-foreign-object\",\n                data: (d) => [d]\n            })\n                .style('overflow', 'visible')\n\n            // Add foreign object\n            fo.patternify({\n                tag: \"xhtml:div\",\n                selector: \"node-foreign-object-div\",\n                data: (d) => [d]\n            })\n\n            this.restyleForeignObjectElements();\n\n            // Add Node button circle's group (expand-collapse button)\n            const nodeButtonGroups = nodeEnter\n                .patternify({\n                    tag: \"g\",\n                    selector: \"node-button-g\",\n                    data: (d) => [d]\n                })\n                .on(\"click\", (event, d) => this.onButtonClick(event, d));\n\n            if (attrs.actions) {\n                attrs.actions.forEach(action => {\n                    const selected = nodeEnter.select(action.selector);\n                    if (action.onClick) {\n                        selected.on('click', (event, d) => {\n                            event.stopPropagation();\n                            action.onClick(event, d, attrs);\n                        });\n                    }\n                    if (action.onHover) {\n                        selected.on('mouseenter', (event, d) => {\n                            event.stopPropagation();\n                            action.onHover(event, d, attrs);\n                        });\n                    }\n                })\n            }\n\n            nodeButtonGroups.patternify({\n                tag: 'rect',\n                selector: 'node-button-rect',\n                data: (d) => [d]\n            })\n                .attr('opacity', 0)\n                .attr('pointer-events', 'all')\n                .attr('width', 40)\n                .attr('height', 40)\n                .attr('x', -20)\n                .attr('y', -20)\n\n            // Add expand collapse button content\n            const nodeFo = nodeButtonGroups\n                .patternify({\n                    tag: \"foreignObject\",\n                    selector: \"node-button-foreign-object\",\n                    data: (d) => [d]\n                })\n                .attr('width', 40)\n                .attr('height', 40)\n                .attr('x', -20)\n                .attr('y', -20)\n                .style('overflow', 'visible')\n                .patternify({\n                    tag: \"xhtml:div\",\n                    selector: \"node-button-div\",\n                    data: (d) => [d]\n                })\n                .style('pointer-events', 'none')\n                .style('display', 'flex')\n                .style('width', '100%')\n                .style('height', '100%')\n\n\n\n            // Transition to the proper position for the node\n            nodeUpdate\n                .transition()\n                .attr(\"opacity\", 0)\n                .duration(attrs.duration)\n                .attr(\"transform\", ({ x, y, width, height }) => {\n                    return attrs.layoutBindings[attrs.layout].nodeUpdateTransform({ x, y, width, height });\n\n                })\n                .attr(\"opacity\", 1);\n\n            // Style node rectangles\n            nodeUpdate\n                .select(\".node-rect\")\n                .attr(\"width\", ({ width }) => width)\n                .attr(\"height\", ({ height }) => height)\n                .attr(\"x\", ({ width }) => 0)\n                .attr(\"y\", ({ height }) => 0)\n                .attr(\"cursor\", \"pointer\")\n                .attr('rx', 3)\n                .attr(\"fill\", attrs.nodeDefaultBackground)\n\n            // Move node button group to the desired position\n            nodeUpdate\n                .select(\".node-button-g\")\n                .attr(\"transform\", ({ data, width, height }) => {\n                    const x = attrs.layoutBindings[attrs.layout].buttonX({ width, height });\n                    const y = attrs.layoutBindings[attrs.layout].buttonY({ width, height });\n                    return `translate(${x},${y})`\n                })\n                .attr(\"display\", ({ data }) => {\n                    return data._directSubordinates > 0 ? null : 'none';\n                })\n                .attr(\"opacity\", ({ children, _children }) => {\n                    if (children || _children) {\n                        return 1;\n                    }\n                    return 0;\n                });\n\n            // Restyle node button circle\n            nodeUpdate\n                .select(\".node-button-foreign-object .node-button-div\")\n                .html((node) => {\n                    return attrs.buttonContent({ node, state: attrs })\n                })\n\n            // Restyle button texts\n            nodeUpdate\n                .select(\".node-button-text\")\n                .attr(\"text-anchor\", \"middle\")\n                .attr(\"alignment-baseline\", \"middle\")\n                .attr(\"fill\", attrs.defaultTextFill)\n                .attr(\"font-size\", ({ children }) => {\n                    if (children) return 40;\n                    return 26;\n                })\n                .text(({ children }) => {\n                    if (children) return \"-\";\n                    return \"+\";\n                })\n                .attr(\"y\", this.isEdge() ? 10 : 0);\n\n            nodeUpdate.each(attrs.nodeUpdate)\n\n            // Remove any exiting nodes after transition\n            const nodeExitTransition = nodesSelection\n                .exit()\n                .attr(\"opacity\", 1)\n                .transition()\n                .duration(attrs.duration)\n                .attr(\"transform\", (d) => {\n                    const ex = attrs.layoutBindings[attrs.layout].nodeJoinX({ x, y, width, height });\n                    const ey = attrs.layoutBindings[attrs.layout].nodeJoinY({ x, y, width, height });\n                    return `translate(${ex},${ey})`\n                })\n                .on(\"end\", function () {\n                    d3.select(this).remove();\n                })\n                .attr(\"opacity\", 0);\n\n            // Store the old positions for transition.\n            nodes.forEach((d) => {\n                d.x0 = d.x;\n                d.y0 = d.y;\n            });\n\n            // CHECK FOR CENTERING\n            const centeredNode = attrs.allNodes.filter(d => d.data._centered)[0]\n            if (centeredNode) {\n                const centeredNodes = centeredNode.data._centeredWithDescendants ? centeredNode.descendants().filter((d, i) => i < 7) : [centeredNode]\n                centeredNode.data._centeredWithDescendants = null;\n                centeredNode.data._centered = null;\n                this.fit({\n                    animate: true,\n                    scale: false,\n                    nodes: centeredNodes\n                })\n            }\n\n        }\n\n        // This function detects whether current browser is edge\n        isEdge() {\n            return window.navigator.userAgent.includes(\"Edge\");\n        }\n\n        // Generate horizontal diagonal - play with it here - https://observablehq.com/@bumbeishvili/curved-edges-horizontal-d3-v3-v4-v5-v6\n        hdiagonal(s, t, m) {\n            // Define source and target x,y coordinates\n            const x = s.x;\n            const y = s.y;\n            const ex = t.x;\n            const ey = t.y;\n\n            let mx = m && m.x || x;\n            let my = m && m.y || y;\n\n            // Values in case of top reversed and left reversed diagonals\n            let xrvs = ex - x < 0 ? -1 : 1;\n            let yrvs = ey - y < 0 ? -1 : 1;\n\n            // Define preferred curve radius\n            let rdef = 35;\n\n            // Reduce curve radius, if source-target x space is smaller\n            let r = Math.abs(ex - x) / 2 < rdef ? Math.abs(ex - x) / 2 : rdef;\n\n            // Further reduce curve radius, is y space is more small\n            r = Math.abs(ey - y) / 2 < r ? Math.abs(ey - y) / 2 : r;\n\n            // Defin width and height of link, excluding radius\n            let h = Math.abs(ey - y) / 2 - r;\n            let w = Math.abs(ex - x) / 2 - r;\n\n            // Build and return custom arc command\n            return `\n                  M ${mx} ${my}\n                  L ${mx} ${y}\n                  L ${x} ${y}\n                  L ${x + w * xrvs} ${y}\n                  C ${x + w * xrvs + r * xrvs} ${y} \n                    ${x + w * xrvs + r * xrvs} ${y} \n                    ${x + w * xrvs + r * xrvs} ${y + r * yrvs}\n                  L ${x + w * xrvs + r * xrvs} ${ey - r * yrvs} \n                  C ${x + w * xrvs + r * xrvs}  ${ey} \n                    ${x + w * xrvs + r * xrvs}  ${ey} \n                    ${ex - w * xrvs}  ${ey}\n                  L ${ex} ${ey}\n       `;\n        }\n\n        // Generate custom diagonal - play with it here - https://observablehq.com/@bumbeishvili/curved-edges\n        diagonal(s, t, m) {\n            const x = s.x;\n            const y = s.y;\n            const ex = t.x;\n            const ey = t.y;\n\n            let mx = m && m.x || x;\n            let my = m && m.y || y;\n\n            let xrvs = ex - x < 0 ? -1 : 1;\n            let yrvs = ey - y < 0 ? -1 : 1;\n\n            let rdef = 35;\n            let r = Math.abs(ex - x) / 2 < rdef ? Math.abs(ex - x) / 2 : rdef;\n\n            r = Math.abs(ey - y) / 2 < r ? Math.abs(ey - y) / 2 : r;\n\n            let h = Math.abs(ey - y) / 2 - r;\n            let w = Math.abs(ex - x) - r * 2;\n            //w=0;\n            const path = `\n                  M ${mx} ${my}\n                  L ${x} ${my}\n                  L ${x} ${y}\n                  L ${x} ${y + h * yrvs}\n                  C  ${x} ${y + h * yrvs + r * yrvs} ${x} ${y + h * yrvs + r * yrvs\n                } ${x + r * xrvs} ${y + h * yrvs + r * yrvs}\n                  L ${x + w * xrvs + r * xrvs} ${y + h * yrvs + r * yrvs}\n                  C  ${ex}  ${y + h * yrvs + r * yrvs} ${ex}  ${y + h * yrvs + r * yrvs\n                } ${ex} ${ey - h * yrvs}\n                  L ${ex} ${ey}\n       `;\n            return path;\n        }\n\n        restyleForeignObjectElements() {\n            const attrs = this.getChartState();\n\n            attrs.svg\n                .selectAll(\".node-foreign-object\")\n                .attr(\"width\", ({ width }) => width)\n                .attr(\"height\", ({ height }) => height)\n                .attr(\"x\", ({ width }) => 0)\n                .attr(\"y\", ({ height }) => 0);\n            attrs.svg\n                .selectAll(\".node-foreign-object-div\")\n                .style(\"width\", ({ width }) => `${width}px`)\n                .style(\"height\", ({ height }) => `${height}px`)\n                .html(function (d, i, arr) { return attrs.nodeContent.bind(this)(d, i, arr, attrs) })\n        }\n\n        // Toggle children on click.\n        onButtonClick(event, d) {\n            const attrs = this.getChartState();\n            if (attrs.setActiveNodeCentered) {\n                d.data._centered = true;\n                d.data._centeredWithDescendants = true;\n            }\n\n            // If childrens are expanded\n            if (d.children) {\n                //Collapse them\n                d._children = d.children;\n                d.children = null;\n\n                // Set descendants expanded property to false\n                this.setExpansionFlagToChildren(d, false);\n            } else {\n                // Expand children\n                d.children = d._children;\n                d._children = null;\n\n                // Set each children as expanded\n                if (d.children) {\n                    d.children.forEach(({ data }) => (data._expanded = true));\n                }\n            }\n\n            // Redraw Graph\n            this.update(d);\n        }\n\n        // This function changes `expanded` property to descendants\n        setExpansionFlagToChildren({ data, children, _children }, flag) {\n            // Set flag to the current property\n            data._expanded = flag;\n\n            // Loop over and recursively update expanded children's descendants\n            if (children) {\n                children.forEach((d) => {\n                    this.setExpansionFlagToChildren(d, flag);\n                });\n            }\n\n            // Loop over and recursively update collapsed children's descendants\n            if (_children) {\n                _children.forEach((d) => {\n                    this.setExpansionFlagToChildren(d, flag);\n                });\n            }\n        }\n\n\n        // Method which only expands nodes, which have property set \"expanded=true\"\n        expandSomeNodes(d) {\n            // If node has expanded property set\n            if (d.data._expanded) {\n                // Retrieve node's parent\n                let parent = d.parent;\n\n                // While we can go up\n                while (parent) {\n                    // Expand all current parent's children\n                    if (parent._children) {\n                        parent.children = parent._children;\n                    }\n\n                    // Replace current parent holding object\n                    parent = parent.parent;\n                }\n            }\n\n            // Recursivelly do the same for collapsed nodes\n            if (d._children) {\n                d._children.forEach((ch) => this.expandSomeNodes(ch));\n            }\n\n            // Recursivelly do the same for expanded nodes\n            if (d.children) {\n                d.children.forEach((ch) => this.expandSomeNodes(ch));\n            }\n        }\n\n        // This function updates nodes state and redraws graph, usually after data change\n        updateNodesState() {\n            const attrs = this.getChartState();\n\n            this.setLayouts({ expandNodesFirst: true });\n\n            // Redraw Graphs\n            this.update(attrs.root);\n        }\n\n        setLayouts({ expandNodesFirst = true }) {\n            const attrs = this.getChartState();\n            // Store new root by converting flat data to hierarchy\n            attrs.root = d3\n                .stratify()\n                .id((d) => attrs.nodeId(d))\n                .parentId(d => attrs.parentNodeId(d))(attrs.data);\n\n            attrs.root.each((node, i, arr) => {\n                let width = attrs.nodeWidth(node);\n                let height = attrs.nodeHeight(node);\n                Object.assign(node, { width, height })\n            })\n\n            // Store positions, where children appear during their enter animation\n            attrs.root.x0 = 0;\n            attrs.root.y0 = 0;\n            attrs.allNodes = attrs.root.descendants();\n\n            // Store direct and total descendants count\n            attrs.allNodes.forEach((d) => {\n                Object.assign(d.data, {\n                    _directSubordinates: d.children ? d.children.length : 0,\n                    _totalSubordinates: d.descendants().length - 1\n                });\n            });\n\n            if (attrs.root.children) {\n                if (expandNodesFirst) {\n                    // Expand all nodes first\n                    attrs.root.children.forEach(this.expand);\n                }\n                // Then collapse them all\n                attrs.root.children.forEach((d) => this.collapse(d));\n\n                // Collapse root if level is 0\n                if (attrs.expandLevel == 0) {\n                    attrs.root._children = attrs.root.children;\n                    attrs.root.children = null;\n                }\n\n                // Then only expand nodes, which have expanded proprty set to true\n                [attrs.root].forEach((ch) => this.expandSomeNodes(ch));\n            }\n        }\n\n        // Function which collapses passed node and it's descendants\n        collapse(d) {\n            if (d.children) {\n                d._children = d.children;\n                d._children.forEach((ch) => this.collapse(ch));\n                d.children = null;\n            }\n        }\n\n        // Function which expands passed node and it's descendants\n        expand(d) {\n            if (d._children) {\n                d.children = d._children;\n                d.children.forEach((ch) => this.expand(ch));\n                d._children = null;\n            }\n        }\n\n        // Zoom handler function\n        zoomed(event, d) {\n            const attrs = this.getChartState();\n            const chart = attrs.chart;\n\n            // Get d3 event's transform object\n            const transform = event.transform;\n\n            // Store it\n            attrs.lastTransform = transform;\n\n            // Reposition and rescale chart accordingly\n            chart.attr(\"transform\", transform);\n\n            // Apply new styles to the foreign object element\n            if (this.isEdge()) {\n                this.restyleForeignObjectElements();\n            }\n        }\n\n        zoomTreeBounds({ x0, x1, y0, y1, params = { animate: true, scale: true } }) {\n            const { centerG, svgWidth: w, svgHeight: h, svg, zoomBehavior, duration, lastTransform } = this.getChartState()\n            let scaleVal = Math.min(8, 0.9 / Math.max((x1 - x0) / w, (y1 - y0) / h));\n            let identity = d3.zoomIdentity.translate(w / 2, h / 2)\n            identity = identity.scale(params.scale ? scaleVal : lastTransform.k)\n\n            identity = identity.translate(-(x0 + x1) / 2, -(y0 + y1) / 2);\n            // Transition zoom wrapper component into specified bounds\n            svg.transition().duration(params.animate ? duration : 0).call(zoomBehavior.transform, identity);\n            centerG.transition().duration(params.animate ? duration : 0).attr('transform', 'translate(0,0)')\n        }\n\n        fit({ animate = true, nodes, scale = true } = {}) {\n            const attrs = this.getChartState();\n            const { root } = attrs;\n            let descendants = nodes ? nodes : root.descendants();\n            const minX = d3.min(descendants, d => d.x + attrs.layoutBindings[attrs.layout].nodeLeftX(d))\n            const maxX = d3.max(descendants, d => d.x + attrs.layoutBindings[attrs.layout].nodeRightX(d))\n            const minY = d3.min(descendants, d => d.y + attrs.layoutBindings[attrs.layout].nodeTopY(d))\n            const maxY = d3.max(descendants, d => d.y + attrs.layoutBindings[attrs.layout].nodeBottomY(d))\n\n            this.zoomTreeBounds({\n                params: { animate: animate, scale },\n                x0: minX - 50,\n                x1: maxX + 50,\n                y0: minY - 50,\n                y1: maxY + 50,\n            });\n            return this;\n        }\n\n        // This function can be invoked via chart.setExpanded API, it expands or collapses particular node\n        setExpanded(id, expandedFlag = true) {\n\n            const attrs = this.getChartState();\n            // Retrieve node by node Id\n            const node = attrs.allNodes.filter(({ data }) => attrs.nodeId(data) == id)[0];\n\n            if (!node) {\n                console.log(`ORG CHART - ${expandedFlag ? \"EXPAND\" : \"COLLAPSE\"} - Node with id (${id})  not found in the tree`)\n                return this;\n            }\n            node.data._expanded = expandedFlag;\n            return this;\n        }\n\n        setCentered(nodeId) {\n            const attrs = this.getChartState();\n            // this.setExpanded(nodeId)\n            const node = attrs.allNodes.filter(d => attrs.nodeId(d.data) === nodeId)[0];\n            if (!node) {\n                console.log(`ORG CHART - CENTER - Node with id (${nodeId}) not found in the tree`)\n                return this;\n            }\n            node.data._centered = true;\n            node.data._expanded = true;\n            return this;\n        }\n\n        setHighlighted(nodeId) {\n            const attrs = this.getChartState();\n            const node = attrs.allNodes.filter(d => attrs.nodeId(d.data) === nodeId)[0];\n            if (!node) {\n                console.log(`ORG CHART - HIGHLIGHT - Node with id (${nodeId})  not found in the tree`);\n                return this\n            }\n            node.data._highlighted = true;\n            node.data._expanded = true;\n            node.data._centered = true;\n            return this;\n        }\n\n        setUpToTheRootHighlighted(nodeId) {\n            const attrs = this.getChartState();\n            const node = attrs.allNodes.filter(d => attrs.nodeId(d.data) === nodeId)[0];\n            if (!node) {\n                console.log(`ORG CHART - HIGHLIGHTROOT - Node with id (${nodeId}) not found in the tree`)\n                return this;\n            }\n            node.data._upToTheRootHighlighted = true;\n            node.data._expanded = true;\n            node.ancestors().forEach(d => d.data._upToTheRootHighlighted = true)\n            return this;\n        }\n\n        clearHighlighting() {\n            const attrs = this.getChartState();\n            attrs.allNodes.forEach(d => {\n                d.data._highlighted = false;\n                d.data._upToTheRootHighlighted = false;\n            })\n            this.update(attrs.root)\n        }\n\n        // It can take selector which would go fullscreen\n        fullscreen(elem) {\n            const attrs = this.getChartState();\n            const el = d3.select(elem || attrs.container).node();\n\n            d3.select(document).on('fullscreenchange.' + attrs.id, function (d) {\n                const fsElement = document.fullscreenElement || document.mozFullscreenElement || document.webkitFullscreenElement;\n                if (fsElement == el) {\n                    setTimeout(d => {\n                        attrs.svg.attr('height', window.innerHeight - 40);\n                    }, 500)\n                } else {\n                    attrs.svg.attr('height', attrs.svgHeight)\n                }\n            })\n\n            if (el.requestFullscreen) {\n                el.requestFullscreen();\n            } else if (el.mozRequestFullScreen) {\n                el.mozRequestFullScreen();\n            } else if (el.webkitRequestFullscreen) {\n                el.webkitRequestFullscreen();\n            } else if (el.msRequestFullscreen) {\n                el.msRequestFullscreen();\n            }\n        }\n\n        // Zoom in exposed method\n        zoomIn() {\n            const { svg, zoomBehavior } = this.getChartState();\n            svg.transition().call(zoomBehavior.scaleBy, 1.3);\n        }\n\n        // Zoom out exposed method\n        zoomOut() {\n            const { svg, zoomBehavior } = this.getChartState();\n            svg.transition().call(zoomBehavior.scaleBy, 0.78);\n        }\n\n        toDataURL(url, callback) {\n            var xhr = new XMLHttpRequest();\n            xhr.onload = function () {\n                var reader = new FileReader();\n                reader.onloadend = function () {\n                    callback(reader.result);\n                }\n                reader.readAsDataURL(xhr.response);\n            };\n            xhr.open('GET', url);\n            xhr.responseType = 'blob';\n            xhr.send();\n        }\n\n        exportImg({ full = false, scale = 3, onLoad = d => d, save = true } = {}) {\n            const that = this;\n            const attrs = this.getChartState();\n            const { svg: svgImg, root } = attrs\n            let count = 0;\n            const selection = svgImg.selectAll('img')\n            let total = selection.size()\n\n            const exportImage = () => {\n                const transform = JSON.parse(JSON.stringify(that.lastTransform()));\n                const duration = that.duration();\n                if (full) {\n                    that.fit();\n                }\n                const { svg } = that.getChartState()\n\n                setTimeout(d => {\n                    that.downloadImage({\n                        node: svg.node(), scale, isSvg: false,\n                        onAlreadySerialized: d => {\n                            that.update(root)\n                        },\n                        onLoad: onLoad,\n                        save\n                    })\n                }, full ? duration + 10 : 0)\n            }\n\n            if (total > 0) {\n                selection\n                    .each(function () {\n                        that.toDataURL(this.src, (dataUrl) => {\n                            this.src = dataUrl;\n                            if (++count == total) {\n                                exportImage();\n                            }\n                        })\n                    })\n            } else {\n                exportImage();\n            }\n\n\n        }\n\n\n\n        exportSvg() {\n            const { svg } = this.getChartState();\n            this.downloadImage({ node: svg.node(), scale: 3, isSvg: true })\n            return this;\n        }\n\n        expandAll() {\n            const { allNodes, root } = this.getChartState();\n            allNodes.forEach(d => d.data._expanded = true);\n            this.render()\n            return this;\n        }\n\n        collapseAll() {\n            const { allNodes, root } = this.getChartState();\n            allNodes.forEach(d => d.data._expanded = false);\n            this.expandLevel(0)\n            this.render();\n            return this;\n        }\n\n        downloadImage({ node, scale = 2, isSvg = false, save = true, onAlreadySerialized = d => { }, onLoad = d => { } }) {\n            // Retrieve svg node\n            const svgNode = node;\n\n            if (isSvg) {\n                let source = serializeString(svgNode);\n                //add xml declaration\n                source = '<?xml version=\"1.0\" standalone=\"no\"?>\\r\\n' + source;\n                //convert svg source to URI data scheme.\n                var url = \"data:image/svg+xml;charset=utf-8,\" + encodeURIComponent(source);\n                saveAs(url, \"graph.svg\");\n                onAlreadySerialized()\n                return;\n            }\n            // Get image quality index (basically,  index you can zoom in)\n            const quality = scale\n            // Create image\n            const image = document.createElement('img');\n            image.onload = function () {\n                // Create image canvas\n                const canvas = document.createElement('canvas');\n                // Set width and height based on SVG node\n                const rect = svgNode.getBoundingClientRect();\n                canvas.width = rect.width * quality;\n                canvas.height = rect.height * quality;\n                // Draw background\n                const context = canvas.getContext('2d');\n                context.fillStyle = '#FAFAFA';\n                context.fillRect(0, 0, rect.width * quality, rect.height * quality);\n                context.drawImage(image, 0, 0, rect.width * quality, rect.height * quality);\n                // Set some image metadata\n                let dt = canvas.toDataURL('image/png');\n                if (onLoad) {\n                    onLoad(dt)\n                }\n                if (save) {\n                    // Invoke saving function\n                    saveAs(dt, 'graph.png');\n                }\n\n            };\n\n            var url = 'data:image/svg+xml; charset=utf8, ' + encodeURIComponent(serializeString(svgNode));\n\n            onAlreadySerialized()\n\n            image.src = url// URL.createObjectURL(blob);\n            // This function invokes save window\n            function saveAs(uri, filename) {\n                // create link\n                var link = document.createElement('a');\n                if (typeof link.download === 'string') {\n                    document.body.appendChild(link); // Firefox requires the link to be in the body\n                    link.download = filename;\n                    link.href = uri;\n                    link.click();\n                    document.body.removeChild(link); // remove the link when done\n                } else {\n                    location.replace(uri);\n                }\n            }\n            // This function serializes SVG and sets all necessary attributes\n            function serializeString(svg) {\n                const xmlns = 'http://www.w3.org/2000/xmlns/';\n                const xlinkns = 'http://www.w3.org/1999/xlink';\n                const svgns = 'http://www.w3.org/2000/svg';\n                svg = svg.cloneNode(true);\n                const fragment = window.location.href + '#';\n                const walker = document.createTreeWalker(svg, NodeFilter.SHOW_ELEMENT, null, false);\n                while (walker.nextNode()) {\n                    for (const attr of walker.currentNode.attributes) {\n                        if (attr.value.includes(fragment)) {\n                            attr.value = attr.value.replace(fragment, '#');\n                        }\n                    }\n                }\n                svg.setAttributeNS(xmlns, 'xmlns', svgns);\n                svg.setAttributeNS(xmlns, 'xmlns:xlink', xlinkns);\n                const serializer = new XMLSerializer();\n                const string = serializer.serializeToString(svg);\n                return string;\n            }\n        }\n\n        // Calculate what size text will take\n        getTextWidth(text, {\n            fontSize = 14,\n            fontWeight = 400,\n            defaultFont = \"Helvetice\",\n            ctx\n        } = {}) {\n            ctx.font = `${fontWeight || ''} ${fontSize}px ${defaultFont} `\n            const measurement = ctx.measureText(text);\n            return measurement.width;\n        }\n    }\n\n    exports.OrgChart = OrgChart;\n\n    Object.defineProperty(exports, '__esModule', { value: true });\n\n}));"]}