diff --git a/assets/templates/diagrams/sankey.json b/assets/templates/diagrams/sankey.json index 637c2a06..fc6b59d6 100644 --- a/assets/templates/diagrams/sankey.json +++ b/assets/templates/diagrams/sankey.json @@ -1 +1 @@ -{"name": "Sankey diagram", "description": "", "args": {"nodesData": {"type": "string", "value": "a1_1;x=0;y=0;|a1_2|a2", "name": "Nodes encoded", "hidden": true}, "diagramCode": {"type": "string", "value": "Wages [2000] Budget\nOther [120] Budget\nBudget [1000] Housing\nBudget [450] Taxes\n", "name": "Diagram", "textarea": true, "rows": 15}, "colorTheme": {"group": "Theme & Colors", "type": "choice", "value": "light", "options": ["default", "light", "dark"], "name": "Color theme"}, "conColorType": {"group": "Theme & Colors", "type": "choice", "value": "source", "options": ["source", "destination", "gradient", "custom"], "name": "Connection color type"}, "conColor": {"group": "Theme & Colors", "type": "advanced-color", "value": {"type": "solid", "color": "#aaaaaa"}, "name": "Connection color", "depends": {"conColorType": "custom"}}, "labelColor": {"group": "Theme & Colors", "type": "color", "value": "#222222", "name": "Label color"}, "nodeWidth": {"group": "Nodes", "type": "number", "value": 20, "name": "Node width", "min": 1}, "nodeSpacing": {"group": "Nodes", "type": "number", "value": 40, "name": "Nodes empty space (%)", "min": 0, "max": 90}, "nodeCornerRadius": {"group": "Nodes", "type": "number", "value": 5, "name": "Corner radius", "min": 0}, "nodeStrokeSize": {"group": "Nodes", "type": "number", "value": 1, "name": "Stroke size", "min": 0}, "nodeStrokeColor": {"group": "Nodes", "type": "color", "value": "rgba(255,255,255,1)", "name": "Stroke color"}, "conOpacity": {"group": "Connections", "type": "number", "value": 60, "name": "Connector opacity", "min": 0, "max": 100}, "conLabel": {"group": "Connections", "type": "boolean", "value": true, "name": "Connection labels enabled", "description": "Displays the value of the connection"}, "conLabelColor": {"group": "Connections", "type": "advanced-color", "value": {"type": "solid", "color": "rgba(255, 255, 255, 0.3)"}, "name": "Connection label color"}, "conLabelStroke": {"group": "Connections", "type": "color", "value": "rgba(120,120,120,0.6)", "name": "Connection label stroke"}, "conLabelStrokeSize": {"group": "Connections", "type": "number", "value": 1, "name": "Connection label stroke size"}, "conHoverStroke": {"group": "Connections", "type": "color", "value": "rgba(30,30,30,1)", "name": "Connection hover stroke"}, "conHoverStrokeSize": {"group": "Connections", "type": "number", "value": 1, "name": "Connection hover stroke size"}, "font": {"group": "Labels & Text", "type": "font", "value": "Arial", "name": "Font"}, "fontSize": {"group": "Labels & Text", "type": "number", "value": 14, "name": "Font size", "min": 1}, "magnify": {"group": "Labels & Text", "type": "number", "value": 0, "name": "Magnify value", "min": -50, "max": 50}, "valuePrefix": {"group": "Number formatting", "type": "string", "value": "", "name": "Value prefix"}, "valueSuffix": {"group": "Number formatting", "type": "string", "value": "", "name": "Value suffix"}, "numberFormat": {"group": "Number formatting", "type": "choice", "value": "1000000.00", "options": ["1000000.00", "1000000,00", "1,000,000.00", "1.000.000,00", "1 000 000.00", "1 000 000,00"], "name": "Number format"}}, "preview": "/assets/templates/previews/mind-map.svg", "defaultArea": {"x": 0, "y": 0, "w": 200, "h": 60}, "import": ["./src/item.sch", "./src/control.sch", "./src/sankey.sch"], "handlers": {"area": "onAreaUpdate(itemId, item, area)"}, "item": {"id": "root", "name": "Sankey diagram", "shape": "rect", "shapeProps": {"fill": {"type": "none"}, "strokeColor": "rgba(200,200,200,1)"}, "locked": false, "area": {"x": 0, "y": 0, "w": {"$-expr": "width"}, "h": {"$-expr": "height"}}, "childItems": [{"$-foreach": {"source": "connectorItems", "it": "it"}, "id": {"$-expr": "it.id"}, "tags": ["sankey-connector"], "name": {"$-expr": "it.name"}, "shape": {"$-expr": "it.shape"}, "shapeProps": {"$-expr": "toJSON(it.shapeProps)"}, "args": {"$-expr": "it.getArgs()"}, "locked": {"$-expr": "it.locked"}, "textSlots": {"$-expr": "toJSON(it.textSlots)"}, "selfOpacity": {"$-expr": "conOpacity"}, "area": {"x": {"$-expr": "it.x"}, "y": {"$-expr": "it.y"}, "w": {"$-expr": "it.w"}, "h": {"$-expr": "it.h"}}, "childItems": [{"$-foreach": {"source": "it.childItems", "it": "label"}, "id": {"$-expr": "label.id"}, "name": {"$-expr": "label.name"}, "shape": "rect", "tags": ["connector-label"], "shapeProps": {"$-expr": "toJSON(label.shapeProps)"}, "args": {"$-expr": "label.getArgs()"}, "locked": {"$-expr": "label.locked"}, "textSlots": {"$-expr": "toJSON(label.textSlots)"}, "visible": true, "opacity": 100, "area": {"x": {"$-expr": "label.x"}, "y": {"$-expr": "label.y"}, "w": {"$-expr": "label.w"}, "h": {"$-expr": "label.h"}}, "behavior": {"events": [{"id": "init", "event": "init", "actions": [{"id": "a1", "element": "self", "method": "hide", "args": {"animated": false}}]}]}}], "behavior": {"events": [{"id": "mousein", "event": "mousein", "actions": [{"id": "a1", "element": "self", "method": "set", "args": {"field": "shapeProps.strokeSize", "value": {"$-expr": "conHoverStrokeSize"}, "animated": true, "animationDuration": 0.2, "transition": "ease-in-out", "inBackground": true}}, {"id": "a2", "element": {"$-str": "#cl-${it.id}"}, "method": "show", "args": {"animated": true, "animationDuration": 0.2}}]}, {"id": "mouseout", "event": "mouseout", "actions": [{"id": "a1", "element": "self", "method": "set", "args": {"field": "shapeProps.strokeSize", "value": 0, "animated": true, "animationDuration": 0.2, "transition": "ease-in-out", "inBackground": true}}, {"id": "a2", "element": {"$-str": "#cl-${it.id}"}, "method": "hide", "args": {"animated": true, "animationDuration": 0.2}}]}]}}, {"$-foreach": {"source": "nodeItems", "it": "it"}, "id": {"$-expr": "it.id"}, "tags": ["sankey-node"], "name": {"$-expr": "it.name"}, "shape": {"$-expr": "it.shape"}, "shapeProps": {"$-expr": "toJSON(it.shapeProps)"}, "args": {"$-expr": "it.getArgs()"}, "locked": {"$-expr": "it.locked"}, "textSlots": {"$-expr": "toJSON(it.textSlots)"}, "area": {"x": {"$-expr": "it.x"}, "y": {"$-expr": "it.y"}, "w": {"$-expr": "it.w"}, "h": {"$-expr": "it.h"}}}, {"$-foreach": {"source": "nodeLabels", "it": "it"}, "id": {"$-expr": "it.id"}, "name": {"$-expr": "it.name"}, "shape": {"$-expr": "it.shape"}, "shapeProps": {"$-expr": "toJSON(it.shapeProps)"}, "args": {"$-expr": "it.getArgs()"}, "locked": {"$-expr": "it.locked"}, "textSlots": {"$-expr": "toJSON(it.textSlots)"}, "area": {"x": {"$-expr": "it.x"}, "y": {"$-expr": "it.y"}, "w": {"$-expr": "it.w"}, "h": {"$-expr": "it.h"}}}]}, "init": "\nstruct Item {\n id: uid()\n name: ''\n shape: 'rect'\n x: 0\n y: 0\n w: 100\n h: 50\n shapeProps: Map()\n childItems: List()\n args: Map()\n locked: true\n textSlots: Map()\n description: \"\"\n\n\n traverse(callback) {\n this.childItems.forEach((childItem) => {\n childItem.traverse(callback)\n })\n callback(this)\n }\n\n getArgs() {\n toJSON(this.args)\n }\n\n setText(slotName, text) {\n if (!this.textSlots.has(slotName)) {\n this.textSlots.set(slotName, Map('text', text))\n } else {\n this.textSlots.get(slotName).set('text', text)\n }\n }\n\n toJSON() {\n childItems = this.childItems.map((childItem) => { childItem.toJSON() })\n result = toJSON(Map(\n 'id', this.id,\n 'childItems', childItems,\n 'name', this.name,\n 'description', this.description,\n 'shape', this.shape,\n 'area', Map('x', this.x, 'y', this.y, 'w', this.w, 'h', this.h, 'r', 0, 'sx', 1, 'sy', 1, 'px', 0.5, 'py', 0.5),\n 'shapeProps', this.shapeProps,\n 'args', this.args,\n 'locked', this.locked,\n 'textSlots', this.textSlots,\n ))\n\n result\n }\n}\n\n\n\nstruct Control {\n name: \"\"\n data: Map()\n click: \"log('control clicked')\"\n x: 0\n y: 0\n width: 20\n height: 20\n text: \"+\"\n placement: \"TL\"\n selectedItemId: \"\"\n type: 'button'\n}\n\ngapRatio = nodeSpacing / 100\nlabelPadding = 5\n\nlabelFontSize = max(1, round(fontSize * (100 - magnify) / 100))\nvalueFontSize = max(1, round(fontSize * (100 + magnify) / 100))\n\nlocal nodesById = Map()\n\ncolorThemes = Map(\n 'default', List('#F16161', '#F1A261', '#F1EB61', '#71EB57', '#57EBB1', '#57C2EB', '#576BEB', '#A557EB', '#EB57C8', '#EB578E'),\n 'light', List('#FD9999', '#FDCA99', '#F9FD99', '#C2FD99', '#99FDA6', '#99FDE2', '#99EAFD', '#99BEFD', '#AE99FD', '#FD99F6'),\n 'dark', List('#921515', '#924E15', '#899215', '#4E9215', '#15922B', '#15926B', '#157F92', '#153F92', '#491592', '#921575')\n)\n\nstruct Node {\n id: uid()\n name: 'Unnamed'\n value: 0\n inValue: 0\n outValue: 0\n color: '#FD9999'\n x: 0\n y: 0\n level: 0\n sortOrder: 0 // Position inside of its level\n srcNodes: List()\n dstNodes: List()\n width: 0\n height: 0\n position: 0\n offset: 0\n unitSize: 1\n reservedIn: 0\n reservedOut: 0\n}\n\nfunc encodeNodes(nodes) {\n local result = ''\n\n nodes.forEach(n => {\n if (result != '') {\n result += '|'\n }\n result += `${n.id};x=${n.x};y=${n.y}`\n })\n result\n}\n\nfunc decodeNodesData(text) {\n local nodesById = Map()\n splitString(text, '|').forEach(singleNodeText => {\n local node = Node()\n local parts = splitString(singleNodeText, ';')\n for (local i = 0; i < parts.size; i++) {\n if (i == 0) {\n node.id = parts.get(0)\n } else {\n local varValue = splitString(parts.get(i), '=')\n if (varValue.size == 2) {\n local name = varValue.get(0)\n local value = varValue.get(1)\n if (name == 'x') {\n node.x = value\n } else if (name == 'y') {\n node.y = value\n }\n }\n }\n }\n nodesById.set(node.id, node)\n })\n nodesById\n}\n\n\nstruct Connection {\n id: uid()\n srcId: ''\n dstId: ''\n value: 0\n srcNode: null\n dstNode: null\n}\n\n\nfunc parseConnection(line) {\n local s1 = line.indexOf('[')\n local s2 = line.indexOf(']')\n\n if (s1 > 0 && s2 > s1) {\n local nodeName1 = line.substring(0, s1).trim()\n local nodeName2 = line.substring(s2+1).trim()\n local valueText = line.substring(s1+1, s2)\n\n if (nodeName1 != '' && nodeName2 != '') {\n local value = parseFloat(valueText)\n local id = nodeName1 + '[]' + nodeName2\n Connection(id, nodeName1, nodeName2, value)\n } else {\n null\n }\n } else {\n null\n }\n}\n\nfunc parseConnections(text, nodesData) {\n getOrCreateNode = (id) => {\n local node = nodesById.get(id)\n if (!node) {\n node = Node(id, id)\n nodesById.set(id, node)\n }\n local nData = nodesData.get(id)\n if (nData) {\n node.x = nData.x\n node.y = nData.y\n }\n node\n }\n\n local connections = List()\n splitString(text, '\\n').forEach(line => {\n line = line.trim()\n if (line != '' && !line.startsWith('//')) {\n local c = parseConnection(line)\n if (c) {\n c.srcNode = getOrCreateNode(c.srcId)\n c.dstNode = getOrCreateNode(c.dstId)\n if (c) {\n connections.add(c)\n }\n }\n }\n })\n connections\n}\n\nfunc extractNodesFromConnections(connections) {\n local nodeIds = Set()\n local list = List()\n\n connections.forEach(c => {\n if (!nodeIds.has(c.srcNode.id)) {\n nodeIds.add(c.srcNode.id)\n list.add(c.srcNode)\n }\n if (!nodeIds.has(c.dstNode.id)) {\n nodeIds.add(c.dstNode.id)\n list.add(c.dstNode)\n }\n })\n\n list\n}\n\n\n\n// Performs a recursive tree iteration and updates the levels in nodes\n// maxVisitCount is used in order to prevent from infinite loop in case there is a cyclic dependency\nfunc updateLevels(node, maxVisitCount) {\n if (maxVisitCount >= 0) {\n node.dstNodes.forEach(dstNode => {\n local newLevel = node.level + 1\n if (dstNode.level < newLevel) {\n dstNode.level = newLevel\n updateLevels(dstNode, maxVisitCount - 1)\n }\n })\n }\n}\n\nstruct Level {\n idx: 0\n nodes: List()\n nodesMap: Map()\n totalValue: 0\n height: 0\n}\n\nfunc readjustStarterNodeLevels(nodesMap) {\n // readjusting node levels for starter nodes\n nodesMap.forEach(node => {\n if (node.srcNodes.size == 0 && node.dstNodes.size > 0) {\n local minDstLevel = node.dstNodes.get(0).level\n node.dstNodes.forEach(dstNode => {\n if (minDstLevel > dstNode.level) {\n minDstLevel = dstNode.level\n }\n })\n if (minDstLevel - node.level > 1) {\n node.level = minDstLevel - 1\n }\n }\n })\n}\n\nfunc buildLevels(allNodes, allConnections) {\n local nodesMap = Map()\n allNodes.forEach(node => {\n nodesMap.set(node.id, node)\n })\n\n allConnections.forEach(c => {\n if (c.srcId != c.dstId) {\n local srcNode = nodesMap.get(c.srcId)\n if (!srcNode) {\n srcNode = Node(c.srcId)\n nodesMap.set(c.srcId, srcNode)\n }\n local dstNode = nodesMap.get(c.dstId)\n if (!dstNode) {\n dstNode = Node(c.dstId)\n nodesMap.set(c.dstId, dstNode)\n }\n\n local value = abs(c.value)\n srcNode.outValue += value\n dstNode.inValue += value\n srcNode.dstNodes.add(dstNode)\n dstNode.srcNodes.add(srcNode)\n }\n })\n\n nodesMap.forEach(node => {\n if (node.srcNodes.size == 0) {\n node.level = 0\n updateLevels(node, nodesMap.size)\n }\n })\n\n readjustStarterNodeLevels(nodesMap)\n\n local levels = Map()\n local maxLevel = 0\n nodesMap.forEach(node => {\n node.value = max(node.inValue, node.outValue)\n local level = levels.get(node.level)\n if (level) {\n level.nodes.add(node)\n } else {\n levels.set(node.level, Level(node.level, List(node), nodesMap))\n }\n if (maxLevel < node.level) {\n maxLevel = node.level\n }\n })\n\n local allLevels = List()\n for (local i = 0; i <= maxLevel; i++) {\n local level = levels.get(i)\n if (level) {\n level.nodes.sort((a, b) => {\n b.value - a.value\n })\n level.nodes.forEach((n, idx) => {\n n.sortOrder = idx\n })\n allLevels.add(level)\n level.totalValue = 0\n level.nodes.forEach(node => {\n level.totalValue += node.value\n })\n }\n }\n\n allLevels\n}\n\n\nfunc buildNodeItems(levels) {\n local colorPalette = colorThemes.get(colorTheme)\n log('Selected color palette', colorTheme, colorPalette)\n if (!colorPalette) {\n colorPalette = colorThemes.get('default')\n }\n\n local maxLevelValue = 0\n local maxNodesPerLevel = 0\n levels.forEach(level => {\n if (maxLevelValue < level.totalValue) {\n maxLevelValue = level.totalValue\n }\n if (maxNodesPerLevel < level.nodes.size) {\n maxNodesPerLevel = level.nodes.size\n }\n })\n\n local nodeItems = List()\n\n if (maxLevelValue > 0 && maxNodesPerLevel > 0) {\n local unitSize = height * (1 - gapRatio) / maxLevelValue\n local singleGap = height * gapRatio / maxNodesPerLevel\n\n levels.forEach(level => {\n local levelPosition = level.idx * max(1, width - nodeWidth) / (levels.size - 1)\n local levelSize = level.totalValue * unitSize + singleGap * (level.nodes.size - 1)\n local levelOffset = height / 2 - levelSize / 2\n\n local currentY = levelOffset\n level.nodes.forEach(node => {\n node.unitSize = unitSize\n node.height = unitSize * node.value\n node.width = nodeWidth\n node.position = levelPosition\n node.offset = currentY\n local hashCode = Strings.hashCode(node.name)\n node.color = colorPalette.get(abs(hashCode) % colorPalette.size)\n\n\n local nodeItem = Item('n-' + node.id, node.name, 'rect')\n nodeItem.w = node.width\n nodeItem.h = node.height\n nodeItem.x = node.position + node.x * width\n nodeItem.y = node.offset + node.y * height\n nodeItem.shapeProps.set('strokeSize', nodeStrokeSize)\n nodeItem.shapeProps.set('strokeColor', nodeStrokeColor)\n nodeItem.shapeProps.set('cornerRadius', nodeCornerRadius)\n nodeItem.shapeProps.set('fill', Fill.solid(node.color))\n nodeItem.args.set('tplArea', 'controlled')\n nodeItem.args.set('tplConnector', 'off')\n nodeItem.args.set('tplRotation', 'off')\n nodeItem.locked = false\n nodeItems.add(nodeItem)\n\n currentY += nodeItem.h + singleGap\n })\n })\n }\n nodeItems\n}\n\nfunc buildConnectorItems(levels, allConnections, allNodes) {\n local k2 = max(allConnections.size, allNodes.size)\n local k1 = k2 ^ 2\n local connectorItems = List()\n local connectionsBySource = Map()\n allConnections.forEach(c => {\n if (c.srcId != c.dstId) {\n local cs = connectionsBySource.get(c.srcId)\n if (cs) {\n cs.add(c)\n } else {\n connectionsBySource.set(c.srcId, List(c))\n }\n }\n })\n\n local cs = List()\n\n levels.forEach(level => {\n level.nodes.forEach(node => {\n local connections = connectionsBySource.get(node.id)\n if (connections) {\n connections.sort((a, b) => {\n a.dstNode.offset + a.dstNode.y * height - (b.dstNode.offset + b.dstNode.y * height)\n })\n connections.forEach(c => {\n local dstNode = level.nodesMap.get(c.dstId)\n if (dstNode) {\n cs.add(c)\n }\n })\n }\n })\n })\n\n cs.sort((a, b) => {\n a.srcNode.offset + a.srcNode.y * height - (b.srcNode.offset + b.srcNode.y * height)\n })\n\n cs.forEach(c => {\n connectorItems.add(buildSingleConnectorItem(c, c.srcNode, c.dstNode))\n })\n\n connectorItems\n}\n\n\nstruct PathPoint {\n t: 'B'\n x: 0\n y: 0\n x1: 0\n y1: 0\n x2: 0\n y2: 0\n}\n\nfunc buildSingleConnectorItem(connector, srcNode, dstNode) {\n local item = Item(connector.id, `${srcNode.id} -> ${dstNode.id}`, 'path')\n local connectorSize = srcNode.unitSize * connector.value\n\n local xs = srcNode.position + srcNode.x * width + srcNode.width\n local ys1 = srcNode.offset + srcNode.y * height + srcNode.reservedOut\n local ys2 = ys1 + connectorSize\n srcNode.reservedOut += connectorSize\n\n local xd = dstNode.position + dstNode.x * width\n local yd1 = dstNode.offset + dstNode.y * height + dstNode.reservedIn\n local yd2 = yd1 + connectorSize\n dstNode.reservedIn += connectorSize\n\n local minX = min(xs, xd)\n local maxX = max(xs, xd)\n local minY = min(ys1, ys2, yd1, yd2)\n local maxY = max(ys1, ys2, yd1, yd2)\n\n local dx = max(0.001, maxX - minX)\n local dy = max(0.001, maxY - minY)\n\n local points = List(\n PathPoint('B', xs, ys1, 0, (ys2 - ys1) / 3, (xd - xs) / 3, 0),\n PathPoint('B', xd, yd1, (xs - xd) / 3, 0, 0, (yd2 - yd1) / 3),\n PathPoint('B', xd, yd2, 0, (yd1 - yd2) / 3, (xs - xd) / 3, 0),\n PathPoint('B', xs, ys2, (xd - xs) / 3, 0, 0, (ys1 - ys2) / 3),\n ).map(p => {\n PathPoint('B',\n 100 * (p.x - minX) / dx, 100 * (p.y - minY) / dy,\n 100 * p.x1 / dx, 100 * p.y1 / dy,\n 100 * p.x2 / dx, 100 * p.y2 / dy\n )\n })\n\n item.x = minX\n item.y = minY\n item.w = dx\n item.h = dy\n\n if (conColorType == 'gradient') {\n item.shapeProps.set('fill', Fill.linearGradient(90, 0, srcNode.color, 100, dstNode.color))\n } else if (conColorType == 'source') {\n item.shapeProps.set('fill', Fill.solid(srcNode.color))\n } else if (conColorType == 'destination') {\n item.shapeProps.set('fill', Fill.solid(dstNode.color))\n } else {\n item.shapeProps.set('fill', conColor)\n }\n item.shapeProps.set('strokeSize', 0)\n item.shapeProps.set('strokeColor', conHoverStroke)\n item.shapeProps.set('paths', List(Map(\n 'id', 'p-' + connector.id,\n 'closed', true,\n 'pos', 'relative',\n 'points', points\n )))\n\n if (conLabel) {\n item.childItems.add(buildConnectorLabel(connector, item.w, item.h))\n }\n item\n}\n\nfunc buildConnectorLabel(c, connectorWidth, connectorHeight) {\n local valueText = formatValue(c.value)\n local valueTextSize = calculateTextSize(valueText, font, fontSize)\n local valueLabel = buildLabel('cl-' + c.id, valueText, font, fontSize, 'center', 'middle')\n valueLabel.w = valueTextSize.w + 4 + 10\n valueLabel.h = valueTextSize.h * 1.8 + 14\n valueLabel.x = connectorWidth/2 - valueLabel.w/2\n valueLabel.y = connectorHeight/2 - valueLabel.h/2\n valueLabel.name = 'connector-label-' + c.id\n valueLabel.shapeProps.set('fill', conLabelColor)\n valueLabel.shapeProps.set('strokeColor', conLabelStroke)\n valueLabel.shapeProps.set('strokeSize', conLabelStrokeSize)\n valueLabel.shapeProps.set('cornerRadius', 5)\n valueLabel\n}\n\nfunc buildLabel(id, text, font, fontSize, halign, valign) {\n local item = Item(id, text, 'none')\n item.args.set('templateForceText', true)\n item.textSlots.set('body', Map(\n 'text', text,\n 'font', font,\n 'color', labelColor,\n 'fontSize', fontSize,\n 'halign', halign,\n 'valign', valign,\n 'paddingLeft', 0,\n 'paddingRight', 0,\n 'paddingTop', 0,\n 'paddingBottom', 0,\n 'whiteSpace', 'nowrap'\n ))\n item\n}\n\n// \"1000000.00\", \"1000000,00\", \"1,000,000.00\", \"1.000.000,00\", \"1 000 000.00\", \"1 000 000,00\"\n\n/*\n\nen-US 100,000.2\nde-DE 100.000,2\nfi-FI 100 000,2\n*/\n\nlocal valueFormaters = Map(\n '1000000.00', (value) => {\n numberToLocaleString(value, 'en-US').replaceAll(',', '')\n },\n '1000000,00', (value) => {\n numberToLocaleString(value, 'de-DE').replaceAll('.', '')\n },\n '1,000,000.00', (value) => {\n numberToLocaleString(value, 'en-US')\n },\n '1.000.000,00', (value) => {\n numberToLocaleString(value, 'de-DE')\n },\n '1 000 000.00', (value) => {\n numberToLocaleString(value, 'fi-FI').replaceAll(',', '.')\n },\n '1 000 000,00', (value) => {\n numberToLocaleString(value, 'fi-FI')\n },\n)\n\nfunc formatValue(value) {\n local valueText = value\n if (valueFormaters.has(numberFormat)) {\n valueText = valueFormaters.get(numberFormat)(value)\n }\n valuePrefix + valueText + valueSuffix\n}\n\nfunc buildNodeLabels(nodes) {\n local labelItems = List()\n nodes.forEach(node => {\n local textSize = calculateTextSize(node.name, font, labelFontSize)\n local valueText = formatValue(node.value)\n local valueTextSize = calculateTextSize(valueText, font, valueFontSize)\n local totalHeight = (textSize.h + valueTextSize.h)*1.8 + 8\n local isLeft = node.dstNodes.size == 0\n local halign = 'left'\n if (!isLeft) {\n halign = 'right'\n }\n local item = buildLabel('ln-' + node.id, node.name, font, labelFontSize, halign, 'bottom')\n item.w = textSize.w + 4\n item.h = textSize.h * 1.8 + 4\n\n if (isLeft) {\n item.x = node.position - item.w - labelPadding\n } else {\n item.x = node.position + node.width + labelPadding\n }\n item.x += node.x * width\n item.y = node.offset + node.y * height + node.height / 2 - totalHeight / 2\n\n labelItems.add(item)\n\n local valueLabel = buildLabel('lv-' + node.id, valueText, font, valueFontSize, halign, 'top')\n valueLabel.w = valueTextSize.w + 4\n valueLabel.h = valueTextSize.h * 1.8 + 4\n if (isLeft) {\n valueLabel.x = node.position - valueLabel.w - labelPadding\n } else {\n valueLabel.x = node.position + node.width + labelPadding\n }\n valueLabel.x += node.x * width\n valueLabel.y = item.y + item.h\n\n labelItems.add(valueLabel)\n })\n labelItems\n}\n\n\n\n\nfunc onAreaUpdate(itemId, item, area) {\n local node = null\n if (itemId.startsWith('n-')) {\n node = nodesById.get(itemId.substring(2))\n }\n if (node) {\n node.x = (area.x - node.position) / max(1, width)\n node.y = (area.y - node.offset) / max(1, height)\n\n nodesData = encodeNodes(nodesById)\n }\n}\n\nlocal nodesDataById = decodeNodesData(nodesData)\nallConnections = parseConnections(diagramCode, nodesDataById)\nallNodes = extractNodesFromConnections(allConnections)\n\nlocal levels = buildLevels(allNodes, allConnections)\n\nnodeItems = buildNodeItems(levels)\nconnectorItems = buildConnectorItems(levels, allConnections, allNodes)\nnodeLabels = buildNodeLabels(allNodes)\n\n\n"} \ No newline at end of file +{"name": "Sankey diagram", "description": "This template converts your diagram code below into an interactive Sankey diagram.\nTo define a connection in your diagram between the two nodes \"A\" and \"B\" type it like this \"A [150] B\".\nEvery connection should be defined in a separate line.\n", "args": {"nodesData": {"type": "string", "value": "a1_1;x=0;y=0;|a1_2|a2", "name": "Nodes encoded", "hidden": true}, "diagramCode": {"type": "string", "value": "Wages [2000] Budget\nOther [120] Budget\nBudget [1000] Housing\nBudget [450] Taxes\n", "name": "Diagram", "textarea": true, "rows": 15}, "colorTheme": {"group": "Theme & Colors", "type": "choice", "value": "light", "options": ["default", "light", "dark"], "name": "Color theme"}, "conColorType": {"group": "Theme & Colors", "type": "choice", "value": "source", "options": ["source", "destination", "gradient", "custom"], "name": "Connection color type"}, "conColor": {"group": "Theme & Colors", "type": "advanced-color", "value": {"type": "solid", "color": "#aaaaaa"}, "name": "Connection color", "depends": {"conColorType": "custom"}}, "labelColor": {"group": "Theme & Colors", "type": "color", "value": "#222222", "name": "Label color"}, "nodeWidth": {"group": "Nodes", "type": "number", "value": 20, "name": "Node width", "min": 1}, "nodeSpacing": {"group": "Nodes", "type": "number", "value": 40, "name": "Nodes empty space (%)", "min": 0, "max": 90}, "nodeCornerRadius": {"group": "Nodes", "type": "number", "value": 5, "name": "Corner radius", "min": 0}, "nodeStrokeSize": {"group": "Nodes", "type": "number", "value": 1, "name": "Stroke size", "min": 0}, "nodeStrokeColor": {"group": "Nodes", "type": "color", "value": "rgba(255,255,255,1)", "name": "Stroke color"}, "curviness": {"group": "Connections", "type": "number", "value": 80, "name": "Curviness (%)", "min": 0, "max": 100}, "conOpacity": {"group": "Connections", "type": "number", "value": 60, "name": "Connector opacity", "min": 0, "max": 100}, "conLabel": {"group": "Connections", "type": "boolean", "value": true, "name": "Connection labels enabled", "description": "Displays the value of the connection"}, "conLabelColor": {"group": "Connections", "type": "advanced-color", "value": {"type": "solid", "color": "rgba(255, 255, 255, 0.3)"}, "name": "Connection label color"}, "conLabelStroke": {"group": "Connections", "type": "color", "value": "rgba(120,120,120,0.6)", "name": "Connection label stroke"}, "conLabelStrokeSize": {"group": "Connections", "type": "number", "value": 1, "name": "Connection label stroke size"}, "conHoverStroke": {"group": "Connections", "type": "color", "value": "rgba(30,30,30,1)", "name": "Connection hover stroke"}, "conHoverStrokeSize": {"group": "Connections", "type": "number", "value": 1, "name": "Connection hover stroke size"}, "font": {"group": "Labels & Text", "type": "font", "value": "Arial", "name": "Font"}, "fontSize": {"group": "Labels & Text", "type": "number", "value": 14, "name": "Font size", "min": 1}, "magnify": {"group": "Labels & Text", "type": "number", "value": 0, "name": "Magnify value", "min": -50, "max": 50}, "valuePrefix": {"group": "Number formatting", "type": "string", "value": "", "name": "Value prefix"}, "valueSuffix": {"group": "Number formatting", "type": "string", "value": "", "name": "Value suffix"}, "numberFormat": {"group": "Number formatting", "type": "choice", "value": "1000000.00", "options": ["1000000.00", "1000000,00", "1,000,000.00", "1.000.000,00", "1 000 000.00", "1 000 000,00"], "name": "Number format"}}, "preview": "/assets/templates/previews/mind-map.svg", "defaultArea": {"x": 0, "y": 0, "w": 200, "h": 60}, "import": ["./src/item.sch", "./src/control.sch", "./src/sankey.sch"], "handlers": {"area": "onAreaUpdate(itemId, item, area)"}, "item": {"id": "root", "name": "Sankey diagram", "shape": "rect", "shapeProps": {"fill": {"type": "none"}, "strokeColor": "rgba(200,200,200,1)"}, "locked": false, "area": {"x": 0, "y": 0, "w": {"$-expr": "width"}, "h": {"$-expr": "height"}}, "childItems": [{"$-foreach": {"source": "connectorItems", "it": "it"}, "id": {"$-expr": "it.id"}, "tags": ["sankey-connector"], "name": {"$-expr": "it.name"}, "shape": {"$-expr": "it.shape"}, "shapeProps": {"$-expr": "toJSON(it.shapeProps)"}, "args": {"$-expr": "it.getArgs()"}, "locked": {"$-expr": "it.locked"}, "textSlots": {"$-expr": "toJSON(it.textSlots)"}, "selfOpacity": {"$-expr": "conOpacity"}, "area": {"x": {"$-expr": "it.x"}, "y": {"$-expr": "it.y"}, "w": {"$-expr": "it.w"}, "h": {"$-expr": "it.h"}}, "childItems": [{"$-foreach": {"source": "it.childItems", "it": "label"}, "id": {"$-expr": "label.id"}, "name": {"$-expr": "label.name"}, "shape": "rect", "tags": ["connector-label"], "shapeProps": {"$-expr": "toJSON(label.shapeProps)"}, "args": {"$-expr": "label.getArgs()"}, "locked": {"$-expr": "label.locked"}, "textSlots": {"$-expr": "toJSON(label.textSlots)"}, "visible": true, "opacity": 100, "area": {"x": {"$-expr": "label.x"}, "y": {"$-expr": "label.y"}, "w": {"$-expr": "label.w"}, "h": {"$-expr": "label.h"}}, "behavior": {"events": [{"id": "init", "event": "init", "actions": [{"id": "a1", "element": "self", "method": "hide", "args": {"animated": false}}]}]}}], "behavior": {"events": [{"id": "mousein", "event": "mousein", "actions": [{"id": "a1", "element": "self", "method": "set", "args": {"field": "shapeProps.strokeSize", "value": {"$-expr": "conHoverStrokeSize"}, "animated": true, "animationDuration": 0.2, "transition": "ease-in-out", "inBackground": true}}, {"id": "a2", "element": {"$-str": "#cl-${it.id}"}, "method": "show", "args": {"animated": true, "animationDuration": 0.2}}]}, {"id": "mouseout", "event": "mouseout", "actions": [{"id": "a1", "element": "self", "method": "set", "args": {"field": "shapeProps.strokeSize", "value": 0, "animated": true, "animationDuration": 0.2, "transition": "ease-in-out", "inBackground": true}}, {"id": "a2", "element": {"$-str": "#cl-${it.id}"}, "method": "hide", "args": {"animated": true, "animationDuration": 0.2}}]}]}}, {"$-foreach": {"source": "nodeItems", "it": "it"}, "id": {"$-expr": "it.id"}, "tags": ["sankey-node"], "name": {"$-expr": "it.name"}, "shape": {"$-expr": "it.shape"}, "shapeProps": {"$-expr": "toJSON(it.shapeProps)"}, "args": {"$-expr": "it.getArgs()"}, "locked": {"$-expr": "it.locked"}, "textSlots": {"$-expr": "toJSON(it.textSlots)"}, "area": {"x": {"$-expr": "it.x"}, "y": {"$-expr": "it.y"}, "w": {"$-expr": "it.w"}, "h": {"$-expr": "it.h"}}}, {"$-foreach": {"source": "nodeLabels", "it": "it"}, "id": {"$-expr": "it.id"}, "name": {"$-expr": "it.name"}, "shape": {"$-expr": "it.shape"}, "shapeProps": {"$-expr": "toJSON(it.shapeProps)"}, "args": {"$-expr": "it.getArgs()"}, "locked": {"$-expr": "it.locked"}, "textSlots": {"$-expr": "toJSON(it.textSlots)"}, "area": {"x": {"$-expr": "it.x"}, "y": {"$-expr": "it.y"}, "w": {"$-expr": "it.w"}, "h": {"$-expr": "it.h"}}}]}, "init": "\nstruct Item {\n id: uid()\n name: ''\n shape: 'rect'\n x: 0\n y: 0\n w: 100\n h: 50\n shapeProps: Map()\n childItems: List()\n args: Map()\n locked: true\n textSlots: Map()\n description: \"\"\n\n\n traverse(callback) {\n this.childItems.forEach((childItem) => {\n childItem.traverse(callback)\n })\n callback(this)\n }\n\n getArgs() {\n toJSON(this.args)\n }\n\n setText(slotName, text) {\n if (!this.textSlots.has(slotName)) {\n this.textSlots.set(slotName, Map('text', text))\n } else {\n this.textSlots.get(slotName).set('text', text)\n }\n }\n\n toJSON() {\n childItems = this.childItems.map((childItem) => { childItem.toJSON() })\n result = toJSON(Map(\n 'id', this.id,\n 'childItems', childItems,\n 'name', this.name,\n 'description', this.description,\n 'shape', this.shape,\n 'area', Map('x', this.x, 'y', this.y, 'w', this.w, 'h', this.h, 'r', 0, 'sx', 1, 'sy', 1, 'px', 0.5, 'py', 0.5),\n 'shapeProps', this.shapeProps,\n 'args', this.args,\n 'locked', this.locked,\n 'textSlots', this.textSlots,\n ))\n\n result\n }\n}\n\n\n\nstruct Control {\n name: \"\"\n data: Map()\n click: \"log('control clicked')\"\n x: 0\n y: 0\n width: 20\n height: 20\n text: \"+\"\n placement: \"TL\"\n selectedItemId: \"\"\n type: 'button'\n}\n\ngapRatio = nodeSpacing / 100\nlabelPadding = 5\n\nlabelFontSize = max(1, round(fontSize * (100 - magnify) / 100))\nvalueFontSize = max(1, round(fontSize * (100 + magnify) / 100))\n\nlocal nodesById = Map()\n\ncolorThemes = Map(\n 'default', List('#F16161', '#F1A261', '#F1EB61', '#71EB57', '#57EBB1', '#57C2EB', '#576BEB', '#A557EB', '#EB57C8', '#EB578E'),\n 'light', List('#FD9999', '#FDCA99', '#F9FD99', '#C2FD99', '#99FDA6', '#99FDE2', '#99EAFD', '#99BEFD', '#AE99FD', '#FD99F6'),\n 'dark', List('#921515', '#924E15', '#899215', '#4E9215', '#15922B', '#15926B', '#157F92', '#153F92', '#491592', '#921575')\n)\n\nstruct Node {\n id: uid()\n name: 'Unnamed'\n value: 0\n inValue: 0\n outValue: 0\n color: '#FD9999'\n x: 0\n y: 0\n level: 0\n sortOrder: 0 // Position inside of its level\n srcNodes: List()\n dstNodes: List()\n width: 0\n height: 0\n position: 0\n offset: 0\n unitSize: 1\n reservedIn: 0\n reservedOut: 0\n}\n\nfunc encodeNodes(nodes) {\n local result = ''\n\n nodes.forEach(n => {\n if (result != '') {\n result += '|'\n }\n result += `${n.id};x=${n.x};y=${n.y}`\n })\n result\n}\n\nfunc decodeNodesData(text) {\n local nodesById = Map()\n splitString(text, '|').forEach(singleNodeText => {\n local node = Node()\n local parts = splitString(singleNodeText, ';')\n for (local i = 0; i < parts.size; i++) {\n if (i == 0) {\n node.id = parts.get(0)\n } else {\n local varValue = splitString(parts.get(i), '=')\n if (varValue.size == 2) {\n local name = varValue.get(0)\n local value = varValue.get(1)\n if (name == 'x') {\n node.x = value\n } else if (name == 'y') {\n node.y = value\n }\n }\n }\n }\n nodesById.set(node.id, node)\n })\n nodesById\n}\n\n\nstruct Connection {\n id: uid()\n srcId: ''\n dstId: ''\n value: 0\n srcNode: null\n dstNode: null\n}\n\n\nfunc parseConnection(line) {\n local s1 = line.indexOf('[')\n local s2 = line.indexOf(']')\n\n if (s1 > 0 && s2 > s1) {\n local nodeName1 = line.substring(0, s1).trim()\n local nodeName2 = line.substring(s2+1).trim()\n local valueText = line.substring(s1+1, s2)\n\n if (nodeName1 != '' && nodeName2 != '') {\n local value = parseFloat(valueText)\n local id = nodeName1 + '[]' + nodeName2\n Connection(id, nodeName1, nodeName2, value)\n } else {\n null\n }\n } else {\n null\n }\n}\n\nfunc parseConnections(text, nodesData) {\n getOrCreateNode = (id) => {\n local node = nodesById.get(id)\n if (!node) {\n node = Node(id, id)\n nodesById.set(id, node)\n }\n local nData = nodesData.get(id)\n if (nData) {\n node.x = nData.x\n node.y = nData.y\n }\n node\n }\n\n local connections = List()\n splitString(text, '\\n').forEach(line => {\n line = line.trim()\n if (line != '' && !line.startsWith('//')) {\n local c = parseConnection(line)\n if (c) {\n c.srcNode = getOrCreateNode(c.srcId)\n c.dstNode = getOrCreateNode(c.dstId)\n if (c) {\n connections.add(c)\n }\n }\n }\n })\n connections\n}\n\nfunc extractNodesFromConnections(connections) {\n local nodeIds = Set()\n local list = List()\n\n connections.forEach(c => {\n if (!nodeIds.has(c.srcNode.id)) {\n nodeIds.add(c.srcNode.id)\n list.add(c.srcNode)\n }\n if (!nodeIds.has(c.dstNode.id)) {\n nodeIds.add(c.dstNode.id)\n list.add(c.dstNode)\n }\n })\n\n list\n}\n\n\n\n// Performs a recursive tree iteration and updates the levels in nodes\n// maxVisitCount is used in order to prevent from infinite loop in case there is a cyclic dependency\nfunc updateLevels(node, maxVisitCount) {\n if (maxVisitCount >= 0) {\n node.dstNodes.forEach(dstNode => {\n local newLevel = node.level + 1\n if (dstNode.level < newLevel) {\n dstNode.level = newLevel\n updateLevels(dstNode, maxVisitCount - 1)\n }\n })\n }\n}\n\nstruct Level {\n idx: 0\n nodes: List()\n nodesMap: Map()\n totalValue: 0\n height: 0\n}\n\nfunc readjustStarterNodeLevels(nodesMap) {\n // readjusting node levels for starter nodes\n nodesMap.forEach(node => {\n if (node.srcNodes.size == 0 && node.dstNodes.size > 0) {\n local minDstLevel = node.dstNodes.get(0).level\n node.dstNodes.forEach(dstNode => {\n if (minDstLevel > dstNode.level) {\n minDstLevel = dstNode.level\n }\n })\n if (minDstLevel - node.level > 1) {\n node.level = minDstLevel - 1\n }\n }\n })\n}\n\nfunc buildLevels(allNodes, allConnections) {\n local nodesMap = Map()\n allNodes.forEach(node => {\n nodesMap.set(node.id, node)\n })\n\n allConnections.forEach(c => {\n if (c.srcId != c.dstId) {\n local srcNode = nodesMap.get(c.srcId)\n if (!srcNode) {\n srcNode = Node(c.srcId)\n nodesMap.set(c.srcId, srcNode)\n }\n local dstNode = nodesMap.get(c.dstId)\n if (!dstNode) {\n dstNode = Node(c.dstId)\n nodesMap.set(c.dstId, dstNode)\n }\n\n local value = abs(c.value)\n srcNode.outValue += value\n dstNode.inValue += value\n srcNode.dstNodes.add(dstNode)\n dstNode.srcNodes.add(srcNode)\n }\n })\n\n nodesMap.forEach(node => {\n if (node.srcNodes.size == 0) {\n node.level = 0\n updateLevels(node, nodesMap.size)\n }\n })\n\n readjustStarterNodeLevels(nodesMap)\n\n local levels = Map()\n local maxLevel = 0\n nodesMap.forEach(node => {\n node.value = max(node.inValue, node.outValue)\n local level = levels.get(node.level)\n if (level) {\n level.nodes.add(node)\n } else {\n levels.set(node.level, Level(node.level, List(node), nodesMap))\n }\n if (maxLevel < node.level) {\n maxLevel = node.level\n }\n })\n\n local allLevels = List()\n for (local i = 0; i <= maxLevel; i++) {\n local level = levels.get(i)\n if (level) {\n level.nodes.sort((a, b) => {\n b.value - a.value\n })\n level.nodes.forEach((n, idx) => {\n n.sortOrder = idx\n })\n allLevels.add(level)\n level.totalValue = 0\n level.nodes.forEach(node => {\n level.totalValue += node.value\n })\n }\n }\n\n allLevels\n}\n\n\nfunc buildNodeItems(levels) {\n local colorPalette = colorThemes.get(colorTheme)\n if (!colorPalette) {\n colorPalette = colorThemes.get('default')\n }\n\n local maxLevelValue = 0\n local maxNodesPerLevel = 0\n levels.forEach(level => {\n if (maxLevelValue < level.totalValue) {\n maxLevelValue = level.totalValue\n }\n if (maxNodesPerLevel < level.nodes.size) {\n maxNodesPerLevel = level.nodes.size\n }\n })\n\n local nodeItems = List()\n\n if (maxLevelValue > 0 && maxNodesPerLevel > 0) {\n local unitSize = height * (1 - gapRatio) / maxLevelValue\n local singleGap = height * gapRatio / maxNodesPerLevel\n\n levels.forEach(level => {\n local levelPosition = level.idx * max(1, width - nodeWidth) / (levels.size - 1)\n local levelSize = level.totalValue * unitSize + singleGap * (level.nodes.size - 1)\n local levelOffset = height / 2 - levelSize / 2\n\n local currentY = levelOffset\n level.nodes.forEach(node => {\n node.unitSize = unitSize\n node.height = unitSize * node.value\n node.width = nodeWidth\n node.position = levelPosition\n node.offset = currentY\n local hashCode = Strings.hashCode(node.name)\n node.color = colorPalette.get(abs(hashCode) % colorPalette.size)\n\n\n local nodeItem = Item('n-' + node.id, node.name, 'rect')\n nodeItem.w = node.width\n nodeItem.h = node.height\n nodeItem.x = node.position + node.x * width\n nodeItem.y = node.offset + node.y * height\n nodeItem.shapeProps.set('strokeSize', nodeStrokeSize)\n nodeItem.shapeProps.set('strokeColor', nodeStrokeColor)\n nodeItem.shapeProps.set('cornerRadius', nodeCornerRadius)\n nodeItem.shapeProps.set('fill', Fill.solid(node.color))\n nodeItem.args.set('tplArea', 'controlled')\n nodeItem.args.set('tplConnector', 'off')\n nodeItem.args.set('tplRotation', 'off')\n nodeItem.locked = false\n nodeItems.add(nodeItem)\n\n currentY += nodeItem.h + singleGap\n })\n })\n }\n nodeItems\n}\n\nfunc buildConnectorItems(levels, allConnections, allNodes) {\n local k2 = max(allConnections.size, allNodes.size)\n local k1 = k2 ^ 2\n local connectorItems = List()\n local connectionsBySource = Map()\n allConnections.forEach(c => {\n if (c.srcId != c.dstId) {\n local cs = connectionsBySource.get(c.srcId)\n if (cs) {\n cs.add(c)\n } else {\n connectionsBySource.set(c.srcId, List(c))\n }\n }\n })\n\n local cs = List()\n\n levels.forEach(level => {\n level.nodes.forEach(node => {\n local connections = connectionsBySource.get(node.id)\n if (connections) {\n connections.sort((a, b) => {\n a.dstNode.offset + a.dstNode.y * height - (b.dstNode.offset + b.dstNode.y * height)\n })\n connections.forEach(c => {\n local dstNode = level.nodesMap.get(c.dstId)\n if (dstNode) {\n cs.add(c)\n }\n })\n }\n })\n })\n\n cs.sort((a, b) => {\n a.srcNode.offset + a.srcNode.y * height - (b.srcNode.offset + b.srcNode.y * height)\n })\n\n cs.forEach(c => {\n connectorItems.add(buildSingleConnectorItem(c, c.srcNode, c.dstNode))\n })\n\n connectorItems\n}\n\n\nstruct PathPoint {\n t: 'B'\n x: 0\n y: 0\n x1: 0\n y1: 0\n x2: 0\n y2: 0\n}\n\nfunc buildSingleConnectorItem(connector, srcNode, dstNode) {\n local item = Item(connector.id, `${srcNode.id} -> ${dstNode.id}`, 'path')\n local connectorSize = srcNode.unitSize * connector.value\n\n local xs = srcNode.position + srcNode.x * width + srcNode.width\n local ys1 = srcNode.offset + srcNode.y * height + srcNode.reservedOut\n local ys2 = ys1 + connectorSize\n srcNode.reservedOut += connectorSize\n\n local xd = dstNode.position + dstNode.x * width\n local yd1 = dstNode.offset + dstNode.y * height + dstNode.reservedIn\n local yd2 = yd1 + connectorSize\n dstNode.reservedIn += connectorSize\n\n local minX = min(xs, xd)\n local maxX = max(xs, xd)\n local minY = min(ys1, ys2, yd1, yd2)\n local maxY = max(ys1, ys2, yd1, yd2)\n\n local dx = max(0.001, maxX - minX)\n local dy = max(0.001, maxY - minY)\n\n local t = curviness / 100\n\n local points = List(\n PathPoint('B', xs, ys1, 0, t * (ys2 - ys1) / 2, t * (xd - xs) / 2, 0),\n PathPoint('B', xd, yd1, t * (xs - xd) / 2, 0, 0, t * (yd2 - yd1) / 2),\n PathPoint('B', xd, yd2, 0, t * (yd1 - yd2) / 2, t * (xs - xd) / 2, 0),\n PathPoint('B', xs, ys2, t * (xd - xs) / 2, 0, 0, t * (ys1 - ys2) / 2),\n ).map(p => {\n PathPoint('B',\n 100 * (p.x - minX) / dx, 100 * (p.y - minY) / dy,\n 100 * p.x1 / dx, 100 * p.y1 / dy,\n 100 * p.x2 / dx, 100 * p.y2 / dy\n )\n })\n\n item.x = minX\n item.y = minY\n item.w = dx\n item.h = dy\n\n if (conColorType == 'gradient') {\n item.shapeProps.set('fill', Fill.linearGradient(90, 0, srcNode.color, 100, dstNode.color))\n } else if (conColorType == 'source') {\n item.shapeProps.set('fill', Fill.solid(srcNode.color))\n } else if (conColorType == 'destination') {\n item.shapeProps.set('fill', Fill.solid(dstNode.color))\n } else {\n item.shapeProps.set('fill', conColor)\n }\n item.shapeProps.set('strokeSize', 0)\n item.shapeProps.set('strokeColor', conHoverStroke)\n item.shapeProps.set('paths', List(Map(\n 'id', 'p-' + connector.id,\n 'closed', true,\n 'pos', 'relative',\n 'points', points\n )))\n\n if (conLabel) {\n item.childItems.add(buildConnectorLabel(connector, item.w, item.h))\n }\n item\n}\n\nfunc buildConnectorLabel(c, connectorWidth, connectorHeight) {\n local valueText = formatValue(c.value)\n local valueTextSize = calculateTextSize(valueText, font, fontSize)\n local valueLabel = buildLabel('cl-' + c.id, valueText, font, fontSize, 'center', 'middle')\n valueLabel.w = valueTextSize.w + 4 + 10\n valueLabel.h = valueTextSize.h * 1.8 + 14\n valueLabel.x = connectorWidth/2 - valueLabel.w/2\n valueLabel.y = connectorHeight/2 - valueLabel.h/2\n valueLabel.name = 'connector-label-' + c.id\n valueLabel.shapeProps.set('fill', conLabelColor)\n valueLabel.shapeProps.set('strokeColor', conLabelStroke)\n valueLabel.shapeProps.set('strokeSize', conLabelStrokeSize)\n valueLabel.shapeProps.set('cornerRadius', 5)\n valueLabel\n}\n\nfunc buildLabel(id, text, font, fontSize, halign, valign) {\n local item = Item(id, text, 'none')\n item.args.set('templateForceText', true)\n item.textSlots.set('body', Map(\n 'text', text,\n 'font', font,\n 'color', labelColor,\n 'fontSize', fontSize,\n 'halign', halign,\n 'valign', valign,\n 'paddingLeft', 0,\n 'paddingRight', 0,\n 'paddingTop', 0,\n 'paddingBottom', 0,\n 'whiteSpace', 'nowrap'\n ))\n item\n}\n\n// \"1000000.00\", \"1000000,00\", \"1,000,000.00\", \"1.000.000,00\", \"1 000 000.00\", \"1 000 000,00\"\n\n/*\n\nen-US 100,000.2\nde-DE 100.000,2\nfi-FI 100 000,2\n*/\n\nlocal valueFormaters = Map(\n '1000000.00', (value) => {\n numberToLocaleString(value, 'en-US').replaceAll(',', '')\n },\n '1000000,00', (value) => {\n numberToLocaleString(value, 'de-DE').replaceAll('.', '')\n },\n '1,000,000.00', (value) => {\n numberToLocaleString(value, 'en-US')\n },\n '1.000.000,00', (value) => {\n numberToLocaleString(value, 'de-DE')\n },\n '1 000 000.00', (value) => {\n numberToLocaleString(value, 'fi-FI').replaceAll(',', '.')\n },\n '1 000 000,00', (value) => {\n numberToLocaleString(value, 'fi-FI')\n },\n)\n\nfunc formatValue(value) {\n local valueText = value\n if (valueFormaters.has(numberFormat)) {\n valueText = valueFormaters.get(numberFormat)(value)\n }\n valuePrefix + valueText + valueSuffix\n}\n\nfunc buildNodeLabels(nodes) {\n local labelItems = List()\n nodes.forEach(node => {\n local textSize = calculateTextSize(node.name, font, labelFontSize)\n local valueText = formatValue(node.value)\n local valueTextSize = calculateTextSize(valueText, font, valueFontSize)\n local totalHeight = (textSize.h + valueTextSize.h)*1.8 + 8\n local isLeft = node.dstNodes.size == 0\n local halign = 'left'\n if (!isLeft) {\n halign = 'right'\n }\n local item = buildLabel('ln-' + node.id, node.name, font, labelFontSize, halign, 'bottom')\n item.w = textSize.w + 4\n item.h = textSize.h * 1.8 + 4\n\n if (isLeft) {\n item.x = node.position - item.w - labelPadding\n } else {\n item.x = node.position + node.width + labelPadding\n }\n item.x += node.x * width\n item.y = node.offset + node.y * height + node.height / 2 - totalHeight / 2\n\n labelItems.add(item)\n\n local valueLabel = buildLabel('lv-' + node.id, valueText, font, valueFontSize, halign, 'top')\n valueLabel.w = valueTextSize.w + 4\n valueLabel.h = valueTextSize.h * 1.8 + 4\n if (isLeft) {\n valueLabel.x = node.position - valueLabel.w - labelPadding\n } else {\n valueLabel.x = node.position + node.width + labelPadding\n }\n valueLabel.x += node.x * width\n valueLabel.y = item.y + item.h\n\n labelItems.add(valueLabel)\n })\n labelItems\n}\n\n\n\n\nfunc onAreaUpdate(itemId, item, area) {\n local node = null\n if (itemId.startsWith('n-')) {\n node = nodesById.get(itemId.substring(2))\n }\n if (node) {\n node.x = (area.x - node.position) / max(1, width)\n node.y = (area.y - node.offset) / max(1, height)\n\n nodesData = encodeNodes(nodesById)\n }\n}\n\nlocal nodesDataById = decodeNodesData(nodesData)\nallConnections = parseConnections(diagramCode, nodesDataById)\nallNodes = extractNodesFromConnections(allConnections)\n\nlocal levels = buildLevels(allNodes, allConnections)\n\nnodeItems = buildNodeItems(levels)\nconnectorItems = buildConnectorItems(levels, allConnections, allNodes)\nnodeLabels = buildNodeLabels(allNodes)\n\n\n"} \ No newline at end of file diff --git a/assets/templates/diagrams/sankey.yaml b/assets/templates/diagrams/sankey.yaml index 7f70e74d..e673e7aa 100644 --- a/assets/templates/diagrams/sankey.yaml +++ b/assets/templates/diagrams/sankey.yaml @@ -1,5 +1,9 @@ name: Sankey diagram -description: "" +description: | + This template converts your diagram code below into an interactive Sankey diagram. + To define a connection in your diagram between the two nodes "A" and "B" type it like this "A [150] B". + Every connection should be defined in a separate line. + args: nodesData: {type: "string", value: "a1_1;x=0;y=0;|a1_2|a2", name: "Nodes encoded", hidden: true} diagramCode: { @@ -20,6 +24,7 @@ args: nodeStrokeSize: {group: "Nodes", type: number, value: 1, name: "Stroke size", min: 0} nodeStrokeColor: {group: "Nodes", type: color, value: 'rgba(255,255,255,1)', name: "Stroke color"} + curviness: {group: "Connections", type: number, value: 80, name: "Curviness (%)", min: 0, max: 100} conOpacity: {group: "Connections", type: number, value: 60, name: "Connector opacity", min: 0, max: 100} conLabel: {group: "Connections", type: boolean, value: true, name: 'Connection labels enabled', description: 'Displays the value of the connection'} conLabelColor: {group: "Connections", type: advanced-color, value: {type: solid, color: 'rgba(255, 255, 255, 0.3)'}, name: 'Connection label color'} diff --git a/assets/templates/diagrams/src/sankey.sch b/assets/templates/diagrams/src/sankey.sch index c4cd58d2..b537c366 100644 --- a/assets/templates/diagrams/src/sankey.sch +++ b/assets/templates/diagrams/src/sankey.sch @@ -270,7 +270,6 @@ func buildLevels(allNodes, allConnections) { func buildNodeItems(levels) { local colorPalette = colorThemes.get(colorTheme) - log('Selected color palette', colorTheme, colorPalette) if (!colorPalette) { colorPalette = colorThemes.get('default') } @@ -409,11 +408,13 @@ func buildSingleConnectorItem(connector, srcNode, dstNode) { local dx = max(0.001, maxX - minX) local dy = max(0.001, maxY - minY) + local t = curviness / 100 + local points = List( - PathPoint('B', xs, ys1, 0, (ys2 - ys1) / 3, (xd - xs) / 3, 0), - PathPoint('B', xd, yd1, (xs - xd) / 3, 0, 0, (yd2 - yd1) / 3), - PathPoint('B', xd, yd2, 0, (yd1 - yd2) / 3, (xs - xd) / 3, 0), - PathPoint('B', xs, ys2, (xd - xs) / 3, 0, 0, (ys1 - ys2) / 3), + PathPoint('B', xs, ys1, 0, t * (ys2 - ys1) / 2, t * (xd - xs) / 2, 0), + PathPoint('B', xd, yd1, t * (xs - xd) / 2, 0, 0, t * (yd2 - yd1) / 2), + PathPoint('B', xd, yd2, 0, t * (yd1 - yd2) / 2, t * (xs - xd) / 2, 0), + PathPoint('B', xs, ys2, t * (xd - xs) / 2, 0, 0, t * (ys1 - ys2) / 2), ).map(p => { PathPoint('B', 100 * (p.x - minX) / dx, 100 * (p.y - minY) / dy, diff --git a/assets/templates/index.json b/assets/templates/index.json index 009e095c..a4afc45c 100644 --- a/assets/templates/index.json +++ b/assets/templates/index.json @@ -1 +1 @@ -[{"name": "Dropdown", "path": "/assets/templates/ui/dropdown.json", "preview": "data:image/svg+xml;base64,PHN2ZyByZWY9InN2Z0NvbnRhaW5lciIgY2xhc3M9ImV4cG9ydC1zdmctcHJldmlldyIKICAgICAgICB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIyMDBweCIKICAgICAgICB2aWV3Qm94PSItMTAgLTEwIDMyMCA0MjAiCiAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiCiAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICAgICAgIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgogICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiA+CiAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSByb3RhdGUoMCkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSJnc0RYYTlhMnEiIGRhdGEtaXRlbS1pZD0iZ3NEWGE5YTJxIiBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPjxnPjxkZWZzPjxmaWx0ZXIgaWQ9Iml0ZW0tZWZmZWN0LWRyb3Atc2hhZG93LWdzRFhhOWEycS0wIiB4PSItNTAwJSIgeT0iLTUwMCUiIHdpZHRoPSIyMDAwJSIgaGVpZ2h0PSIyMDAwJSI+PGZlR2F1c3NpYW5CbHVyIGluPSJTb3VyY2VHcmFwaGljIiBzdGREZXZpYXRpb249IjUiPjwvZmVHYXVzc2lhbkJsdXI+PC9maWx0ZXI+PC9kZWZzPjxwYXRoIGQ9Ik0gMjg4IDQwMCAgTCAxMiA0MDAgYSAxMiAxMiAwIDAgMSAtMTIgLTEyICBMIDAgMTIgIGEgMTIgMTIgMCAwIDEgMTIgLTEyICAgTCAyODggMCAgIGEgMTIgMTIgMCAwIDEgMTIgMTIgIEwgMzAwIDM4OCAgIGEgMTIgMTIgMCAwIDEgLTEyIDEyIFoiIHN0cm9rZT0ibm9uZSIgZmlsbD0icmdiYSgwLDAsMCwxLjApIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMCAxMCkiIHN0eWxlPSJvcGFjaXR5OiAwLjA1IiBmaWx0ZXI9InVybCgjaXRlbS1lZmZlY3QtZHJvcC1zaGFkb3ctZ3NEWGE5YTJxLTApIj48L3BhdGg+PC9nPiA8ZGVmcz48L2RlZnM+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz4gPC9nPiA8cGF0aCBkPSJNIDI4OCA0MDAgIEwgMTIgNDAwIGEgMTIgMTIgMCAwIDEgLTEyIC0xMiAgTCAwIDEyICBhIDEyIDEyIDAgMCAxIDEyIC0xMiAgIEwgMjg4IDAgICBhIDEyIDEyIDAgMCAxIDEyIDEyICBMIDMwMCAzODggICBhIDEyIDEyIDAgMCAxIC0xMiAxMiBaIiBzdHJva2Utd2lkdGg9IjFweCIgc3Ryb2tlPSJyZ2JhKDIwNiwgMjA2LCAyMDYsIDEpIiBzdHJva2UtZGFzaGFycmF5PSIiIGRhdGEtaXRlbS1pZD0iZ3NEWGE5YTJxIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJyZ2JhKDI1NSwyNTUsMjU1LDEpIj48L3BhdGg+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zm9yZWlnbk9iamVjdCBkYXRhLXRleHQtc2xvdC1uYW1lPSJib2R5IiBpZD0iaXRlbS10ZXh0LXNsb3QtZ3NEWGE5YTJxLWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSIzMDAiIGhlaWdodD0iNDAwIj48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBkYXRhLWl0ZW0taWQ9ImdzRFhhOWEycSIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDMwMHB4OyBoZWlnaHQ6IDQwMHB4OyI+PGRpdiBkYXRhLWl0ZW0tdGV4dC1lbGVtZW50LWl0ZW0taWQ9ImdzRFhhOWEycSIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+ICAgICAgIDxkZWZzPjxjbGlwUGF0aCBpZD0iaXRlbS1jbGlwLXBhdGgtZ3NEWGE5YTJxIj48cGF0aCBkPSJNIDI4OCA0MDAgIEwgMTIgNDAwIGEgMTIgMTIgMCAwIDEgLTEyIC0xMiAgTCAwIDEyICBhIDEyIDEyIDAgMCAxIDEyIC0xMiAgIEwgMjg4IDAgICBhIDEyIDEyIDAgMCAxIDEyIDEyICBMIDMwMCAzODggICBhIDEyIDEyIDAgMCAxIC0xMiAxMiBaIiBkYXRhLWl0ZW0taWQ9ImdzRFhhOWEycSIgc3Ryb2tlLXdpZHRoPSIwcHgiIHN0cm9rZT0icmdiYSgyNTUsIDI1NSwgMjU1LCAwKSIgZmlsbD0icmdiYSgyNTUsIDI1NSwgMjU1LCAwKSIgY2xhc3M9InN2Zy1ldmVudC1sYXllciI+PC9wYXRoPjwvY2xpcFBhdGg+PC9kZWZzPiAgPGcgc3R5bGU9ImNsaXAtcGF0aDogdXJsKCZxdW90OyNpdGVtLWNsaXAtcGF0aC1nc0RYYTlhMnEmcXVvdDspOyI+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSwwLDApIiBkYXRhLXN2Zy1pdGVtLWNvbnRhaW5lci1pZD0ieFE4ZmlwRXFsMyIgZGF0YS1pdGVtLWlkPSJ4UThmaXBFcWwzIiBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcz48L2RlZnM+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz4gPGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJmaWxsLXBhdHRlcm4teFE4ZmlwRXFsMyIgeDE9IjUwJSIgeTE9IjEwMCUiIHgyPSI1MCUiIHkyPSIwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3R5bGU9InN0b3AtY29sb3I6IHJnYigyMSwgOTYsIDE3MSk7Ij48L3N0b3A+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdHlsZT0ic3RvcC1jb2xvcjogcmdiKDUxLCAxNTUsIDI0OSk7Ij48L3N0b3A+PC9saW5lYXJHcmFkaWVudD4gPC9kZWZzPjwvZz4gPHBhdGggZD0iTSAyODggNDAgIEwgMTIgNDAgYSAxMiAxMiAwIDAgMSAtMTIgLTEyICBMIDAgMTIgIGEgMTIgMTIgMCAwIDEgMTIgLTEyICAgTCAyODggMCAgIGEgMTIgMTIgMCAwIDEgMTIgMTIgIEwgMzAwIDI4ICAgYSAxMiAxMiAwIDAgMSAtMTIgMTIgWiIgc3Ryb2tlLXdpZHRoPSIwcHgiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIGRhdGEtaXRlbS1pZD0ieFE4ZmlwRXFsMyIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0idXJsKCNmaWxsLXBhdHRlcm4teFE4ZmlwRXFsMykiPjwvcGF0aD48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxmb3JlaWduT2JqZWN0IGRhdGEtdGV4dC1zbG90LW5hbWU9ImJvZHkiIGlkPSJpdGVtLXRleHQtc2xvdC14UThmaXBFcWwzLWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSIzMDAiIGhlaWdodD0iNDAiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGRhdGEtaXRlbS1pZD0ieFE4ZmlwRXFsMyIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDMwMHB4OyBoZWlnaHQ6IDQwcHg7Ij48ZGl2IGRhdGEtaXRlbS10ZXh0LWVsZW1lbnQtaXRlbS1pZD0ieFE4ZmlwRXFsMyIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PHAgc3R5bGU9Im1hcmdpbi10b3A6IDBweDsgbWFyZ2luLWJvdHRvbTogMHB4OyBwYWRkaW5nOiAwcHg7IG1pbi1oZWlnaHQ6IDE4cHg7Ij48c3Ryb25nPkRyb3Bkb3duPC9zdHJvbmc+PC9wPjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPiAgICAgICAgIDxnPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsMTcsMTYuNSkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSJzNVpIVk5GYXQ5IiBkYXRhLWl0ZW0taWQ9InM1WkhWTkZhdDkiIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzPjwvZGVmcz4gPGcgZmlsdGVyPSIiPjxnIG1vZGU9ImVkaXQiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+IDwvZz4gPHBhdGggZD0iTSAwIDEuNiBMIDYuNSA2IEwgMTMgMS42IEwgMTEuNjEgMCBMIDYuNSAzLjYgTCAxLjM5IDAgTCAwIDEuNiAgWiAiIHN0cm9rZS13aWR0aD0iMnB4IiBzdHJva2U9InJnYmEoMjU1LCAyNTUsIDI1NSwgMSkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgZmlsbD0icmdiYSgyNTUsIDI1NSwgMjU1LCAxKSIgc3R5bGU9InN0cm9rZS1saW5lam9pbjogcm91bmQ7Ij48L3BhdGg+PC9nPiAgIDwvZz4gICAgICAgICAgPC9nPjwvZz4gPC9nPjwvZz4gPC9nPgogICAgPC9zdmc+", "description": "Dropdown UI element that expands once clicked"}, {"name": "Dynamic component", "path": "/assets/templates/diagrams/component.json", "preview": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmlld0JveD0iLTQgLTQgMjY4IDE2OCI+PGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIHJvdGF0ZSgwKSIgZGF0YS1zdmctaXRlbS1jb250YWluZXItaWQ9ImI1dGZVMkEwbCIgZGF0YS1pdGVtLWlkPSJiNXRmVTJBMGwiPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+PGc+PGc+IDwvZz4gPHBhdGggZD0iTSAyNjAgMTYwICBMIDAgMTYwIGEgMCAwIDAgMCAxIDAgMCAgTCAwIDAgIGEgMCAwIDAgMCAxIDAgMCAgIEwgMjYwIDAgICBhIDAgMCAwIDAgMSAwIDAgIEwgMjYwIDE2MCAgIGEgMCAwIDAgMCAxIDAgMCBaIiBzdHJva2Utd2lkdGg9IjJweCIgc3Ryb2tlPSJyZ2JhKDE5MywgMTk0LCAxOTUsIDEpIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoMjQwLDI0MCwyNDAsMS4wKSIvPjwvZz48L2c+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ii8+PC9nPiAgICAgICAgPGc+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw2MCw0MCkiPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+PGc+PGc+IDwvZz4gPHBhdGggZD0iTSAxMzAgODAgIEwgMTAgODAgYSAxMCAxMCAwIDAgMSAtMTAgLTEwICBMIDAgMTAgIGEgMTAgMTAgMCAwIDEgMTAgLTEwICAgTCAxMzAgMCAgIGEgMTAgMTAgMCAwIDEgMTAgMTAgIEwgMTQwIDcwICAgYSAxMCAxMCAwIDAgMSAtMTAgMTAgWiIgc3Ryb2tlLXdpZHRoPSIwcHgiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoODIsMTM5LDE2NSwxKSIvPjwvZz48L2c+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zm9yZWlnbk9iamVjdCBpZD0iaXRlbS10ZXh0LXNsb3QtbHNDdTA0QUJCRWVyLWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSIxNDAiIGhlaWdodD0iODAiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGNsYXNzPSJpdGVtLXRleHQtY29udGFpbmVyIiBzdHlsZT0iY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTsgZm9udC1zaXplOiAxNHB4OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgcGFkZGluZzogMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IGRpc3BsYXk6IHRhYmxlLWNlbGw7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtd2VpZ2h0OiBib2xkOyB3aWR0aDogMTQwcHg7IGhlaWdodDogODBweDsiPjxkaXYgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+TW9yZTwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPiAgICAgICAgPGcvPiA8L2c+PC9nPjwvZz4gPC9nPjwvZz48L3N2Zz4=", "description": "A button that triggers loading of external diagram on top of it"}, {"name": "Frame-by-frame diagram", "path": "/assets/templates/diagrams/framed-diagram.json", "preview": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmlld0JveD0iLTIgLTIgNjI0IDM0NCI+PGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIHJvdGF0ZSgwKSIgZGF0YS1zdmctaXRlbS1jb250YWluZXItaWQ9IkJxZFJCQ2JTVWdaIiBkYXRhLWl0ZW0taWQ9IkJxZFJCQ2JTVWdaIj4gPGc+IDwvZz4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij48Zz48ZGVmcz48ZmlsdGVyIGlkPSJpdGVtLWVmZmVjdC1kcm9wLXNoYWRvdy1CcWRSQkNiU1VnWi0wIiB4PSItNTAwJSIgeT0iLTUwMCUiIHdpZHRoPSIyMDAwJSIgaGVpZ2h0PSIyMDAwJSI+PGZlR2F1c3NpYW5CbHVyIGluPSJTb3VyY2VHcmFwaGljIiBzdGREZXZpYXRpb249IjIwIi8+PC9maWx0ZXI+PC9kZWZzPjxwYXRoIGQ9Ik0gNjEwIDM0MCAgTCAxMCAzNDAgYSAxMCAxMCAwIDAgMSAtMTAgLTEwICBMIDAgMTAgIGEgMTAgMTAgMCAwIDEgMTAgLTEwICAgTCA2MTAgMCAgIGEgMTAgMTAgMCAwIDEgMTAgMTAgIEwgNjIwIDMzMCAgIGEgMTAgMTAgMCAwIDEgLTEwIDEwIFoiIHN0cm9rZT0ibm9uZSIgZmlsbD0icmdiYSgwLDAsMCwxLjApIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzIDMpIiBzdHlsZT0ib3BhY2l0eTogMC4yIiBmaWx0ZXI9InVybCgjaXRlbS1lZmZlY3QtZHJvcC1zaGFkb3ctQnFkUkJDYlNVZ1otMCkiLz48L2c+IDxkZWZzLz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPjxnPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gNjEwIDM0MCAgTCAxMCAzNDAgYSAxMCAxMCAwIDAgMSAtMTAgLTEwICBMIDAgMTAgIGEgMTAgMTAgMCAwIDEgMTAgLTEwICAgTCA2MTAgMCAgIGEgMTAgMTAgMCAwIDEgMTAgMTAgIEwgNjIwIDMzMCAgIGEgMTAgMTAgMCAwIDEgLTEwIDEwIFoiIHN0cm9rZS13aWR0aD0iMXB4IiBzdHJva2U9InJnYmEoMTU4LCAxNTcsIDE1NywgMSkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0icmdiYSgyNDAsIDI0MCwgMjQwLCAxKSIvPjwvZz48L2c+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ii8+PC9nPiAgICAgICAgPGc+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSwxNTUsMCkiPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyIvPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zm9yZWlnbk9iamVjdCBpZD0iaXRlbS10ZXh0LXNsb3QtNHRjV2F4MTJHd0YtYm9keSIgeD0iMCIgeT0iMCIgd2lkdGg9IjMxMy42MDA4OTMwNjkwMjk5IiBoZWlnaHQ9IjQzLjYwMDg3MjMwMDAzMDY2Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBjbGFzcz0iaXRlbS10ZXh0LWNvbnRhaW5lciIgc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtc2l6ZTogMjBweDsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IHBhZGRpbmc6IDBweDsgdGV4dC1hbGlnbjogY2VudGVyOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyBkaXNwbGF5OiB0YWJsZS1jZWxsOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBmb250LXdlaWdodDogYm9sZDsgd2lkdGg6IDMxMy42MDFweDsgaGVpZ2h0OiA0My42MDA5cHg7Ij48ZGl2IGNsYXNzPSJpdGVtLXRleHQtZWxlbWVudCIgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsiPjxwIHN0eWxlPSJtYXJnaW4tdG9wOiAwcHg7IG1hcmdpbi1ib3R0b206IDBweDsgcGFkZGluZzogMHB4OyBtaW4taGVpZ2h0OiAxOHB4OyI+QW5pbWF0ZWQgRGlhZ3JhbTwvcD48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz4gICAgICAgICA8L2c+PC9nPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNzQsNjApIj4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzLz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPjxnPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gNDcyIDI2NiAgTCAwIDI2NiBhIDAgMCAwIDAgMSAwIDAgIEwgMCAwICBhIDAgMCAwIDAgMSAwIDAgICBMIDQ3MiAwICAgYSAwIDAgMCAwIDEgMCAwICBMIDQ3MiAyNjYgICBhIDAgMCAwIDAgMSAwIDAgWiIgc3Ryb2tlLXdpZHRoPSIxcHgiIHN0cm9rZT0icmdiYSgyMTIsMjEyLDIxMiwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoMjUwLCAyNTAsIDI1MCwgMSkiLz48L2c+PC9nPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyIvPjwvZz4gICAgICAgIDxnPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsMjYuOTAxOTk0NTYxMzk1NDQsMjQuNTA5OTcyODA2OTc2MDY2KSI+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcy8+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz48Zz48Zz4gPC9nPiA8cGF0aCBkPSJNIDYwIDQwICBMIDAgNDAgYSAwIDAgMCAwIDEgMCAwICBMIDAgMCAgYSAwIDAgMCAwIDEgMCAwICAgTCA2MCAwICAgYSAwIDAgMCAwIDEgMCAwICBMIDYwIDQwICAgYSAwIDAgMCAwIDEgMCAwIFoiIHN0cm9rZS13aWR0aD0iMnB4IiBzdHJva2U9InJnYmEoMzAsMzAsMzAsMS4wKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJyZ2JhKDI0MCwyNDAsMjQwLDEuMCkiLz48L2c+PC9nPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyIvPjwvZz4gICAgICAgICA8L2c+PC9nPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsODYsNDApIj4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzLz4gPGcgZmlsdGVyPSIiPjxnIG1vZGU9ImVkaXQiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+IDwvZz4gPHBhdGggZD0iTSAwLjkgNC41MSBDIDIwLjYgNC41MSA0MC4zICA1LjE2IDYwIDUuMTYgIiBzdHJva2Utd2lkdGg9IjJweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZS1saW5lam9pbjogcm91bmQ7Ii8+IDxnPjxwYXRoIGQ9Ik0gNjAuMDAwMDAwMjI1NjY4ODMgMTAuMTYyNzA0NDY3NzczNDM4IEwgODAuMDAwMDAwMjI1NjY4ODMgNS4xNjI3MDQ0Njc3NzM0Mzc1IEwgNjAuMDAwMDAwMjI1NjY4ODMgMC4xNjI3MDQ0Njc3NzM0Mzc1ICB6ICIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS13aWR0aD0iMiIgZmlsbD0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9nPjwvZz4gICA8L2c+ICAgICAgICAgPC9nPjwvZz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDExNiw3MCkiPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+PGcgbW9kZT0iZWRpdCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz4gPC9nPiA8cGF0aCBkPSJNIDEwMCAwIEMgMTAwIDM4Ljg3IDAgIDIxLjEzIDAgNjAgIiBzdHJva2Utd2lkdGg9IjJweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZS1saW5lam9pbjogcm91bmQ7Ii8+IDxnPjxwYXRoIGQ9Ik0gLTUgNjAgTCAwIDgwIEwgNSA2MCAgeiAiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9InJnYmEoMzAsMzAsMzAsMS4wKSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvZz48L2c+ICAgPC9nPiAgICAgICAgIDwvZz48L2c+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSwyMTYsNzApIj4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzLz4gPGcgZmlsdGVyPSIiPjxnIG1vZGU9ImVkaXQiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+IDwvZz4gPHBhdGggZD0iTSAwIDAgQyAwIDQwLjY5IDEwMCAgMjkuMzEgMTAwIDcwICIgc3Ryb2tlLXdpZHRoPSIycHgiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIGZpbGw9Im5vbmUiIHN0eWxlPSJzdHJva2UtbGluZWpvaW46IHJvdW5kOyIvPiA8Zz48cGF0aCBkPSJNIDk1IDcwIEwgMTAwIDkwIEwgMTA1IDcwICB6ICIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS13aWR0aD0iMiIgZmlsbD0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9nPjwvZz4gICA8L2c+ICAgICAgICAgPC9nPjwvZz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDI2NiwxNjApIj4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzLz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPjxnPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gMCAyNSBBIDUwIDI1IDAgMSAxIDEwMCAyNSAgQSA1MCAyNSAwIDEgMSAwIDI1IFoiIHN0cm9rZS13aWR0aD0iMnB4IiBzdHJva2U9InJnYmEoMzAsMzAsMzAsMS4wKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJyZ2JhKDI0MCwyNDAsMjQwLDEuMCkiLz48L2c+PC9nPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyIvPjwvZz4gICAgICAgICA8L2c+PC9nPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNjYsMTUwKSI+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcy8+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz48Zz48Zz4gPC9nPiA8cGF0aCBkPSJNIDAgMjUgQSA1MCAyNSAwIDEgMSAxMDAgMjUgIEEgNTAgMjUgMCAxIDEgMCAyNSBaIiBzdHJva2Utd2lkdGg9IjJweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0icmdiYSgyNDAsMjQwLDI0MCwxLjApIi8+PC9nPjwvZz48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiLz48L2c+ICAgICAgICAgPC9nPjwvZz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDE2NiwyMCkiPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+PGc+PGc+IDwvZz4gPHBhdGggZD0iTSA4MCA1MCAgTCAyMCA1MCBhIDIwIDIwIDAgMCAxIC0yMCAtMjAgIEwgMCAyMCAgYSAyMCAyMCAwIDAgMSAyMCAtMjAgICBMIDgwIDAgICBhIDIwIDIwIDAgMCAxIDIwIDIwICBMIDEwMCAzMCAgIGEgMjAgMjAgMCAwIDEgLTIwIDIwIFoiIHN0cm9rZS13aWR0aD0iMnB4IiBzdHJva2U9InJnYmEoMzAsMzAsMzAsMS4wKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJyZ2JhKDI0MCwyNDAsMjQwLDEuMCkiLz48L2c+PC9nPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyIvPjwvZz4gICAgICAgICA8L2c+PC9nPjwvZz4gPC9nPjwvZz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDcsMTQwKSI+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMC42OyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzLz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPjxnPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gMCAzMCBBIDMwIDMwIDAgMSAxIDYwIDMwICBBIDMwIDMwIDAgMSAxIDAgMzAgWiIgc3Ryb2tlLXdpZHRoPSIwcHgiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoNzgsIDEzMSwgMjQ1LCAxKSIvPjwvZz48L2c+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ii8+PC9nPiAgICAgICAgPGc+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSwxNSwxOCkiPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+PGcgbW9kZT0iZWRpdCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz4gPC9nPiA8cGF0aCBkPSJNIDIwIDAgTCAyMCAyNSBMIDAgMTIuNSBMIDIwIDAgIFogIiBzdHJva2Utd2lkdGg9IjRweCIgc3Ryb2tlPSJyZ2JhKDI1NSwgMjU1LCAyNTUsIDEpIiBzdHJva2UtZGFzaGFycmF5PSIiIGZpbGw9InJnYmEoMjU1LCAyNTUsIDI1NSwgMSkiIHN0eWxlPSJzdHJva2UtbGluZWpvaW46IHJvdW5kOyIvPjwvZz4gICA8L2c+ICAgICAgICAgPC9nPjwvZz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgtMSwxLjIyNDY0Njc5OTE0NzM1MzJlLTE2LC0xLjIyNDY0Njc5OTE0NzM1MzJlLTE2LC0xLDYwLDYwKSI+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcy8+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDA7Ij48Zz48Zz48Zz4gPC9nPiA8cGF0aCBkPSJNIDAgMzAgQSAzMCAzMCAwIDEgMSA2MCAzMCAgQSAzMCAzMCAwIDEgMSAwIDMwIFoiIHN0cm9rZS13aWR0aD0iMnB4IiBzdHJva2U9InJnYmEoMzAsMzAsMzAsMS4wKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJyZ2JhKDI0MCwyNDAsMjQwLDEuMCkiLz48L2c+PC9nPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAwOyIvPjwvZz4gICAgICAgICA8L2c+PC9nPjwvZz4gPC9nPjwvZz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDU1MywxNDApIj4gIDxnIHN0eWxlPSJvcGFjaXR5OiAwLjY7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+PGc+PGc+IDwvZz4gPHBhdGggZD0iTSAwIDMwIEEgMzAgMzAgMCAxIDEgNjAgMzAgIEEgMzAgMzAgMCAxIDEgMCAzMCBaIiBzdHJva2Utd2lkdGg9IjBweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0icmdiYSg3OCwgMTMxLCAyNDUsIDEpIi8+PC9nPjwvZz48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiLz48L2c+ICAgICAgICA8Zz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgtMSwxLjIyNDY0Njc5OTE0NzM1MzJlLTE2LC0xLjIyNDY0Njc5OTE0NzM1MzJlLTE2LC0xLDQ0LDQzKSI+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcy8+IDxnIGZpbHRlcj0iIj48ZyBtb2RlPSJlZGl0IiBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gMjAgMCBMIDIwIDI1IEwgMCAxMi41IEwgMjAgMCAgWiAiIHN0cm9rZS13aWR0aD0iNHB4IiBzdHJva2U9InJnYmEoMjU1LCAyNTUsIDI1NSwgMSkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgZmlsbD0icmdiYSgyNTUsIDI1NSwgMjU1LCAxKSIgc3R5bGU9InN0cm9rZS1saW5lam9pbjogcm91bmQ7Ii8+PC9nPiAgIDwvZz4gICAgICAgICA8L2c+PC9nPjxnIHRyYW5zZm9ybT0ibWF0cml4KC0xLDEuMjI0NjQ2Nzk5MTQ3MzUzMmUtMTYsLTEuMjI0NjQ2Nzk5MTQ3MzUzMmUtMTYsLTEsNjAsNjApIj4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzLz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMDsiPjxnPjxnPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gMCAzMCBBIDMwIDMwIDAgMSAxIDYwIDMwICBBIDMwIDMwIDAgMSAxIDAgMzAgWiIgc3Ryb2tlLXdpZHRoPSIycHgiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoMjQwLDI0MCwyNDAsMS4wKSIvPjwvZz48L2c+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDA7Ii8+PC9nPiAgICAgICAgIDwvZz48L2c+PC9nPiA8L2c+PC9nPjwvZz4gPC9nPjwvZz48L3N2Zz4=", "description": "Lets you design simple animated diagram that shows elements frame by frame.\nTo make it work you need to tag your items with \"frame-1\", \"frame-2\", \"frame-3\" and so on for every frame"}, {"name": "Hierarchy chart", "path": "/assets/templates/diagrams/hierarchy-chart.json", "preview": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmlld0JveD0iLTEwIC0xMCAzNDAgMjIwIj48ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEwMCwwKSByb3RhdGUoMCkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSJaZ2txU09HSVkiIGRhdGEtaXRlbS1pZD0iWmdrcVNPR0lZIj4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzLz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPjxnPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gMTAwIDYwICBMIDIwIDYwIGEgMjAgMjAgMCAwIDEgLTIwIC0yMCAgTCAwIDIwICBhIDIwIDIwIDAgMCAxIDIwIC0yMCAgIEwgMTAwIDAgICBhIDIwIDIwIDAgMCAxIDIwIDIwICBMIDEyMCA0MCAgIGEgMjAgMjAgMCAwIDEgLTIwIDIwIFoiIHN0cm9rZS13aWR0aD0iMnB4IiBzdHJva2U9InJnYmEoMzAsMzAsMzAsMS4wKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtZGFzaG9mZnNldD0iMCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0icmdiYSgyNDAsMjQwLDI0MCwxLjApIi8+PC9nPjwvZz48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiLz48L2c+ICA8ZyBpZD0iYW5pbWF0aW9uLWNvbnRhaW5lci1aZ2txU09HSVkiLz4gICAgICAgPC9nPjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDE0MCkgcm90YXRlKDApIiBkYXRhLXN2Zy1pdGVtLWNvbnRhaW5lci1pZD0iaDdSV0p0UTBLIiBkYXRhLWl0ZW0taWQ9Img3UldKdFEwSyI+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcy8+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz48Zz48Zz4gPC9nPiA8cGF0aCBkPSJNIDEwMCA2MCAgTCAyMCA2MCBhIDIwIDIwIDAgMCAxIC0yMCAtMjAgIEwgMCAyMCAgYSAyMCAyMCAwIDAgMSAyMCAtMjAgICBMIDEwMCAwICAgYSAyMCAyMCAwIDAgMSAyMCAyMCAgTCAxMjAgNDAgICBhIDIwIDIwIDAgMCAxIC0yMCAyMCBaIiBzdHJva2Utd2lkdGg9IjJweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLWRhc2hvZmZzZXQ9IjAiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoMjQwLDI0MCwyNDAsMS4wKSIvPjwvZz48L2c+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ii8+PC9nPiAgPGcgaWQ9ImFuaW1hdGlvbi1jb250YWluZXItaDdSV0p0UTBLIi8+ICAgICAgIDwvZz48L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjAsNjApIHJvdGF0ZSgwKSIgZGF0YS1zdmctaXRlbS1jb250YWluZXItaWQ9ImRwUXQ3Tlk4dyIgZGF0YS1pdGVtLWlkPSJkcFF0N05ZOHciPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+PGcgbW9kZT0iZWRpdCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz4gPC9nPiA8cGF0aCBkPSJNIDEwMCAwIEMgMTAwIDM4Ljg3IDAgIDIxLjEzIDAgNjAgIiBzdHJva2Utd2lkdGg9IjJweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLWRhc2hvZmZzZXQ9IjAiIGZpbGw9Im5vbmUiIHN0eWxlPSJzdHJva2UtbGluZWpvaW46IHJvdW5kOyIvPiA8Zz48cGF0aCBkPSJNIC01IDYwIEwgMCA4MCBMIDUgNjAgIHogIiBzdHJva2U9InJnYmEoMzAsMzAsMzAsMS4wKSIgc3Ryb2tlLXdpZHRoPSIyIiBmaWxsPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L2c+PC9nPiAgIDwvZz4gIDxnIGlkPSJhbmltYXRpb24tY29udGFpbmVyLWRwUXQ3Tlk4dyIvPiAgICAgICA8L2c+PC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIwMCwxNDApIHJvdGF0ZSgwKSIgZGF0YS1zdmctaXRlbS1jb250YWluZXItaWQ9Ik1Nanh4QXptVzQiIGRhdGEtaXRlbS1pZD0iTU1qeHhBem1XNCI+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcy8+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz48Zz48Zz4gPC9nPiA8cGF0aCBkPSJNIDEwMCA2MCAgTCAyMCA2MCBhIDIwIDIwIDAgMCAxIC0yMCAtMjAgIEwgMCAyMCAgYSAyMCAyMCAwIDAgMSAyMCAtMjAgICBMIDEwMCAwICAgYSAyMCAyMCAwIDAgMSAyMCAyMCAgTCAxMjAgNDAgICBhIDIwIDIwIDAgMCAxIC0yMCAyMCBaIiBzdHJva2Utd2lkdGg9IjJweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0icmdiYSgyNDAsMjQwLDI0MCwxLjApIi8+PC9nPjwvZz48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiLz48L2c+ICA8ZyBpZD0iYW5pbWF0aW9uLWNvbnRhaW5lci1NTWp4eEF6bVc0Ii8+ICAgICAgIDwvZz48L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTYwLDYwKSByb3RhdGUoMCkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSJSSkhNU2FYUTYiIGRhdGEtaXRlbS1pZD0iUkpITVNhWFE2Ij4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzLz4gPGcgZmlsdGVyPSIiPjxnIG1vZGU9ImVkaXQiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+IDwvZz4gPHBhdGggZD0iTSAwIDAgQyAwIDM4Ljg3IDEwMCAgMjEuMTMgMTAwIDYwICIgc3Ryb2tlLXdpZHRoPSIycHgiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1kYXNob2Zmc2V0PSIwIiBmaWxsPSJub25lIiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOiByb3VuZDsiLz4gPGc+PHBhdGggZD0iTSA5NSA2MCBMIDEwMCA4MCBMIDEwNSA2MCAgeiAiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9InJnYmEoMzAsMzAsMzAsMS4wKSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvZz48L2c+ICAgPC9nPiAgPGcgaWQ9ImFuaW1hdGlvbi1jb250YWluZXItUkpITVNhWFE2Ii8+ICAgICAgIDwvZz48L2c+PC9zdmc+", "description": ""}, {"name": "Layered diagram", "path": "/assets/templates/diagrams/layered-diagram.json", "preview": "data:image/svg+xml;base64,PHN2ZyByZWY9InN2Z0NvbnRhaW5lciIgY2xhc3M9ImV4cG9ydC1zdmctcHJldmlldyIKICAgICAgICB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIyMDBweCIKICAgICAgICB2aWV3Qm94PSItMTAgLTEwIDUyMCAzMjAiCiAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiCiAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICAgICAgIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgogICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiA+CiAgICAgICAgPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIHJvdGF0ZSgwKSIgZGF0YS1zdmctaXRlbS1jb250YWluZXItaWQ9Ii1JNURLQ0lVaiIgZGF0YS1pdGVtLWlkPSItSTVES0NJVWoiPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+PGc+PGc+IDwvZz4gPHBhdGggZD0iTSA0MDQgMCAgTCA0ODAgMCBhIDIwIDIwIDAgMCAxIDIwIDIwIEwgNTAwIDI4MCBhIDIwIDIwIDAgMCAxIC0yMCAyMEwgMjAgMzAwIGEgMjAgMjAgMCAwIDEgLTIwIC0yMCBMIDAgMjAgIGEgMjAgMjAgMCAwIDEgMjAgLTIwICBMIDk2IDAiIHN0cm9rZS13aWR0aD0iM3B4IiBzdHJva2U9InJnYmEoMTYwLDE2MCwxNjAsMS4wKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJub25lIi8+PC9nPjwvZz48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxmb3JlaWduT2JqZWN0IGlkPSJpdGVtLXRleHQtc2xvdC0tSTVES0NJVWotdGl0bGUiIHg9Ijk2IiB5PSItMjUiIHdpZHRoPSIzMDgiIGhlaWdodD0iNTAiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGNsYXNzPSJpdGVtLXRleHQtY29udGFpbmVyIiBzdHlsZT0iY29sb3I6IHJnYigxNTAsIDE1MCwgMTUwKTsgZm9udC1zaXplOiAxNnB4OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgcGFkZGluZzogMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IGRpc3BsYXk6IHRhYmxlLWNlbGw7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtd2VpZ2h0OiBib2xkOyB3aWR0aDogMzA4cHg7IGhlaWdodDogNTBweDsiPjxkaXYgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PHAgc3R5bGU9Im1hcmdpbi10b3A6IDBweDsgbWFyZ2luLWJvdHRvbTogMHB4OyBwYWRkaW5nOiAwcHg7IG1pbi1oZWlnaHQ6IDE4cHg7Ij5MYXllcmVkIERpYWdyYW08L3A+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+ICAgICAgICA8Zz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDIwLDI0MCkiPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+PGc+PGc+IDwvZz4gPHBhdGggZD0iTSAxMTAgNDAgIEwgMTAgNDAgYSAxMCAxMCAwIDAgMSAtMTAgLTEwICBMIDAgMTAgIGEgMTAgMTAgMCAwIDEgMTAgLTEwICAgTCAxMTAgMCAgIGEgMTAgMTAgMCAwIDEgMTAgMTAgIEwgMTIwIDMwICAgYSAxMCAxMCAwIDAgMSAtMTAgMTAgWiIgc3Ryb2tlLXdpZHRoPSIwcHgiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoODAsIDE4MiwgMjI4LCAxKSIvPjwvZz48L2c+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zm9yZWlnbk9iamVjdCBpZD0iaXRlbS10ZXh0LXNsb3QteFBNYU9wNHBILWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSIxMjAiIGhlaWdodD0iNDAiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGNsYXNzPSJpdGVtLXRleHQtY29udGFpbmVyIiBzdHlsZT0iY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTsgZm9udC1zaXplOiAxNHB4OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgcGFkZGluZzogMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IGRpc3BsYXk6IHRhYmxlLWNlbGw7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtd2VpZ2h0OiBib2xkOyB3aWR0aDogMTIwcHg7IGhlaWdodDogNDBweDsiPjxkaXYgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PHAgc3R5bGU9Im1hcmdpbi10b3A6IDBweDsgbWFyZ2luLWJvdHRvbTogMHB4OyBwYWRkaW5nOiAwcHg7IG1pbi1oZWlnaHQ6IDE4cHg7Ij5MYXllciAxPC9wPjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPiAgICAgICAgIDwvZz48L2c+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSwxNjAsMjQwKSI+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcy8+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz48Zz48Zz4gPC9nPiA8cGF0aCBkPSJNIDExMCA0MCAgTCAxMCA0MCBhIDEwIDEwIDAgMCAxIC0xMCAtMTAgIEwgMCAxMCAgYSAxMCAxMCAwIDAgMSAxMCAtMTAgICBMIDExMCAwICAgYSAxMCAxMCAwIDAgMSAxMCAxMCAgTCAxMjAgMzAgICBhIDEwIDEwIDAgMCAxIC0xMCAxMCBaIiBzdHJva2Utd2lkdGg9IjBweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0icmdiYSg4MCwgMTgyLCAyMjgsIDEpIi8+PC9nPjwvZz48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxmb3JlaWduT2JqZWN0IGlkPSJpdGVtLXRleHQtc2xvdC11Vlh0X0szSjliLWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSIxMjAiIGhlaWdodD0iNDAiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGNsYXNzPSJpdGVtLXRleHQtY29udGFpbmVyIiBzdHlsZT0iY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTsgZm9udC1zaXplOiAxNHB4OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgcGFkZGluZzogMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IGRpc3BsYXk6IHRhYmxlLWNlbGw7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtd2VpZ2h0OiBib2xkOyB3aWR0aDogMTIwcHg7IGhlaWdodDogNDBweDsiPjxkaXYgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PHAgc3R5bGU9Im1hcmdpbi10b3A6IDBweDsgbWFyZ2luLWJvdHRvbTogMHB4OyBwYWRkaW5nOiAwcHg7IG1pbi1oZWlnaHQ6IDE4cHg7Ij5MYXllciAyPC9wPjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPiAgICAgICAgIDwvZz48L2c+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSwzMDAsMjQwKSI+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcy8+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz48Zz48Zz4gPC9nPiA8cGF0aCBkPSJNIDExMCA0MCAgTCAxMCA0MCBhIDEwIDEwIDAgMCAxIC0xMCAtMTAgIEwgMCAxMCAgYSAxMCAxMCAwIDAgMSAxMCAtMTAgICBMIDExMCAwICAgYSAxMCAxMCAwIDAgMSAxMCAxMCAgTCAxMjAgMzAgICBhIDEwIDEwIDAgMCAxIC0xMCAxMCBaIiBzdHJva2Utd2lkdGg9IjBweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0icmdiYSg4MCwgMTgyLCAyMjgsIDEpIi8+PC9nPjwvZz48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxmb3JlaWduT2JqZWN0IGlkPSJpdGVtLXRleHQtc2xvdC1NazVyZmV6Zy0tYm9keSIgeD0iMCIgeT0iMCIgd2lkdGg9IjEyMCIgaGVpZ2h0PSI0MCI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdpZHRoOiAxMjBweDsgaGVpZ2h0OiA0MHB4OyI+PGRpdiBjbGFzcz0iaXRlbS10ZXh0LWVsZW1lbnQiIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ij48cCBzdHlsZT0ibWFyZ2luLXRvcDogMHB4OyBtYXJnaW4tYm90dG9tOiAwcHg7IHBhZGRpbmc6IDBweDsgbWluLWhlaWdodDogMThweDsiPkxheWVyIDM8L3A+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+ICAgICAgICAgPC9nPjwvZz48L2c+IDwvZz48L2c+CiAgICA8L3N2Zz4=", "description": ""}, {"name": "Mind map", "path": "/assets/templates/diagrams/mind-map.json", "preview": "/assets/templates/previews/mind-map.svg", "description": ""}, {"name": "Popup", "path": "/assets/templates/ui/popup.json", "preview": "data:image/svg+xml;base64,PHN2ZyByZWY9InN2Z0NvbnRhaW5lciIgY2xhc3M9ImV4cG9ydC1zdmctcHJldmlldyIKICAgICAgICB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIyMDBweCIKICAgICAgICB2aWV3Qm94PSItMTAgLTEwIDQwMCAyNDAiCiAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiCiAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICAgICAgIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgogICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiA+CiAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSByb3RhdGUoMCkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSI1Ri1VSF91Y3AiIGRhdGEtaXRlbS1pZD0iNUYtVUhfdWNwIiBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPjxnPjxkZWZzPjxmaWx0ZXIgaWQ9Iml0ZW0tZWZmZWN0LWRyb3Atc2hhZG93LTVGLVVIX3VjcC0wIiB4PSItNTAwJSIgeT0iLTUwMCUiIHdpZHRoPSIyMDAwJSIgaGVpZ2h0PSIyMDAwJSI+PGZlR2F1c3NpYW5CbHVyIGluPSJTb3VyY2VHcmFwaGljIiBzdGREZXZpYXRpb249IjUiPjwvZmVHYXVzc2lhbkJsdXI+PC9maWx0ZXI+PC9kZWZzPjxwYXRoIGQ9Ik0gMzYwIDIyMCAgTCAyMCAyMjAgYSAyMCAyMCAwIDAgMSAtMjAgLTIwICBMIDAgMjAgIGEgMjAgMjAgMCAwIDEgMjAgLTIwICAgTCAzNjAgMCAgIGEgMjAgMjAgMCAwIDEgMjAgMjAgIEwgMzgwIDIwMCAgIGEgMjAgMjAgMCAwIDEgLTIwIDIwIFoiIHN0cm9rZT0ibm9uZSIgZmlsbD0icmdiYSgwLDAsMCwxLjApIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDIpIiBzdHlsZT0ib3BhY2l0eTogMC4zIiBmaWx0ZXI9InVybCgjaXRlbS1lZmZlY3QtZHJvcC1zaGFkb3ctNUYtVUhfdWNwLTApIj48L3BhdGg+PC9nPiA8ZGVmcz48L2RlZnM+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz4gPC9nPiA8cGF0aCBkPSJNIDM2MCAyMjAgIEwgMjAgMjIwIGEgMjAgMjAgMCAwIDEgLTIwIC0yMCAgTCAwIDIwICBhIDIwIDIwIDAgMCAxIDIwIC0yMCAgIEwgMzYwIDAgICBhIDIwIDIwIDAgMCAxIDIwIDIwICBMIDM4MCAyMDAgICBhIDIwIDIwIDAgMCAxIC0yMCAyMCBaIiBzdHJva2Utd2lkdGg9IjFweCIgc3Ryb2tlPSJyZ2JhKDIwNiwgMjA2LCAyMDYsIDEpIiBzdHJva2UtZGFzaGFycmF5PSIiIGRhdGEtaXRlbS1pZD0iNUYtVUhfdWNwIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJyZ2JhKDI0MywyNDMsMjQzLDEpIj48L3BhdGg+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zm9yZWlnbk9iamVjdCBkYXRhLXRleHQtc2xvdC1uYW1lPSJib2R5IiBpZD0iaXRlbS10ZXh0LXNsb3QtNUYtVUhfdWNwLWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSIzODAiIGhlaWdodD0iMjIwIj48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBkYXRhLWl0ZW0taWQ9IjVGLVVIX3VjcCIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDMwLCAzMCwgMzApOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAyMHB4IDBweCAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDM4MHB4OyBoZWlnaHQ6IDIyMHB4OyI+PGRpdiBkYXRhLWl0ZW0tdGV4dC1lbGVtZW50LWl0ZW0taWQ9IjVGLVVIX3VjcCIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PHAgc3R5bGU9Im1hcmdpbi10b3A6IDBweDsgbWFyZ2luLWJvdHRvbTogMHB4OyBwYWRkaW5nOiAwcHg7IG1pbi1oZWlnaHQ6IDE4cHg7Ij5QbGFjZWhvbGRlcjwvcD48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz4gICAgICAgICA8Zz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDgwLDApIiBkYXRhLXN2Zy1pdGVtLWNvbnRhaW5lci1pZD0icm02QjU1NThhNyIgZGF0YS1pdGVtLWlkPSJybTZCNTU1OGE3IiBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcz48L2RlZnM+IDxnIGZpbHRlcj0iIj4gICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxmb3JlaWduT2JqZWN0IGRhdGEtdGV4dC1zbG90LW5hbWU9ImJvZHkiIGlkPSJpdGVtLXRleHQtc2xvdC1ybTZCNTU1OGE3LWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSIyMjAiIGhlaWdodD0iNDUiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGRhdGEtaXRlbS1pZD0icm02QjU1NThhNyIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDMwLCAzMCwgMzApOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDIyMHB4OyBoZWlnaHQ6IDQ1cHg7Ij48ZGl2IGRhdGEtaXRlbS10ZXh0LWVsZW1lbnQtaXRlbS1pZD0icm02QjU1NThhNyIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PHAgc3R5bGU9Im1hcmdpbi10b3A6IDBweDsgbWFyZ2luLWJvdHRvbTogMHB4OyBwYWRkaW5nOiAwcHg7IG1pbi1oZWlnaHQ6IDE4cHg7Ij48c3Ryb25nPlRpdGxlIHBsYWNlaG9sZGVyPC9zdHJvbmc+PC9wPjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPiAgICAgICAgICA8L2c+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSwzNDUsNSkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSJVQnE3ODRENDJHIiBkYXRhLWl0ZW0taWQ9IlVCcTc4NEQ0MkciIHN0eWxlPSJvcGFjaXR5OiAwLjY7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnM+PC9kZWZzPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+IDwvZz4gPHBhdGggZD0iTSAwIDE1IEEgMTUgMTUgMCAxIDEgMzAgMTUgIEEgMTUgMTUgMCAxIDEgMCAxNSBaIiBzdHJva2Utd2lkdGg9IjBweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgZGF0YS1pdGVtLWlkPSJVQnE3ODRENDJHIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSIjNDNBMkZCIj48L3BhdGg+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zm9yZWlnbk9iamVjdCBkYXRhLXRleHQtc2xvdC1uYW1lPSJib2R5IiBpZD0iaXRlbS10ZXh0LXNsb3QtVUJxNzg0RDQyRy1ib2R5IiB4PSIwIiB5PSIwIiB3aWR0aD0iMzAiIGhlaWdodD0iMzAiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGRhdGEtaXRlbS1pZD0iVUJxNzg0RDQyRyIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDMwcHg7IGhlaWdodDogMzBweDsiPjxkaXYgZGF0YS1pdGVtLXRleHQtZWxlbWVudC1pdGVtLWlkPSJVQnE3ODRENDJHIiBjbGFzcz0iaXRlbS10ZXh0LWVsZW1lbnQiIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ij48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz4gICAgICAgICA8Zz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDcuMzQzMTQ1NzUwNTA3NjE4LDcuMzQzMTQ1NzUwNTA3NjMyKSIgZGF0YS1zdmctaXRlbS1jb250YWluZXItaWQ9Imt6cmxTWXkwOGwiIGRhdGEtaXRlbS1pZD0ia3pybFNZeTA4bCIgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnM+PC9kZWZzPiA8ZyBmaWx0ZXI9IiI+PGcgbW9kZT0iZWRpdCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz4gPC9nPiA8cGF0aCBkPSJNIDMuODMgNy44MyBMIDAuODMgNC44MyBBIDIuODMgMi44MyAwIDAgMSA0LjgzIDAuODNMIDcuODMgMy44MyBMIDEwLjgzIDAuODMgQSAyLjgzIDIuODMgMCAwIDEgMTQuODMgNC44M0wgMTEuODMgNy44MyBMIDE0LjgzIDEwLjgzIEEgMi44MyAyLjgzIDAgMCAxIDEwLjgzIDE0LjgzTCA3LjgzIDExLjgzIEwgNC44MyAxNC44MyBBIDIuODMgMi44MyAwIDAgMSAwLjgzIDEwLjgzTCAzLjgzIDcuODMgIFogIiBzdHJva2Utd2lkdGg9IjBweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgZmlsbD0iI0ZGRkZGRiIgc3R5bGU9InN0cm9rZS1saW5lam9pbjogcm91bmQ7Ij48L3BhdGg+PC9nPiAgIDwvZz4gICAgICAgICA8Zz48L2c+IDwvZz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDAsMCkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSJydVo0a2hKXzRIIiBkYXRhLWl0ZW0taWQ9InJ1WjRraEpfNEgiIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzPjwvZGVmcz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gMCAxNSBBIDE1IDE1IDAgMSAxIDMwIDE1ICBBIDE1IDE1IDAgMSAxIDAgMTUgWiIgc3Ryb2tlLXdpZHRoPSIwcHgiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIGRhdGEtaXRlbS1pZD0icnVaNGtoSl80SCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0icmdiYSgyNTUsIDI1NSwgMjU1LCAwKSI+PC9wYXRoPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGZvcmVpZ25PYmplY3QgZGF0YS10ZXh0LXNsb3QtbmFtZT0iYm9keSIgaWQ9Iml0ZW0tdGV4dC1zbG90LXJ1WjRraEpfNEgtYm9keSIgeD0iMCIgeT0iMCIgd2lkdGg9IjMwIiBoZWlnaHQ9IjMwIj48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBkYXRhLWl0ZW0taWQ9InJ1WjRraEpfNEgiIGNsYXNzPSJpdGVtLXRleHQtY29udGFpbmVyIiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1zaXplOiAxNHB4OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgcGFkZGluZzogMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IGRpc3BsYXk6IHRhYmxlLWNlbGw7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdpZHRoOiAzMHB4OyBoZWlnaHQ6IDMwcHg7Ij48ZGl2IGRhdGEtaXRlbS10ZXh0LWVsZW1lbnQtaXRlbS1pZD0icnVaNGtoSl80SCIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PHAgc3R5bGU9Im1hcmdpbi10b3A6IDBweDsgbWFyZ2luLWJvdHRvbTogMHB4OyBwYWRkaW5nOiAwcHg7IG1pbi1oZWlnaHQ6IDE4cHg7Ij48L3A+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+ICAgICAgICAgIDwvZz48L2c+IDwvZz48L2c+IDwvZz4KICAgIDwvc3ZnPg==", "description": "A popup with open and closing animations"}, {"name": "Prototype", "path": "/assets/templates/prototypes/prototype.json", "preview": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmlld0JveD0iLTQgLTQgMjQ4IDM2OCI+PGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIHJvdGF0ZSgwKSIgZGF0YS1zdmctaXRlbS1jb250YWluZXItaWQ9ImE1VmxwYU04QiIgZGF0YS1pdGVtLWlkPSJhNVZscGFNOEIiPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+PGc+PGc+IDwvZz4gPHBhdGggZD0iTSAyMjAgMzYwICBMIDIwIDM2MCBhIDIwIDIwIDAgMCAxIC0yMCAtMjAgIEwgMCAyMCAgYSAyMCAyMCAwIDAgMSAyMCAtMjAgICBMIDIyMCAwICAgYSAyMCAyMCAwIDAgMSAyMCAyMCAgTCAyNDAgMzQwICAgYSAyMCAyMCAwIDAgMSAtMjAgMjAgWiIgc3Ryb2tlLXdpZHRoPSIycHgiIHN0cm9rZT0icmdiYSgxNjAsIDE2MCwgMTYwLCAxKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJyZ2JhKDIwOCwgMjA4LCAyMDgsIDEpIi8+PC9nPjwvZz48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiLz48L2c+ICAgICAgICA8Zz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDIwLDIwKSI+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcy8+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ii8+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxmb3JlaWduT2JqZWN0IGlkPSJpdGVtLXRleHQtc2xvdC16b1h4S1Zqb2YtYm9keSIgeD0iMCIgeT0iMCIgd2lkdGg9IjIwMCIgaGVpZ2h0PSI0MCI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDExMSwgMTExLCAxMTEpOyBmb250LXNpemU6IDI5cHg7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IHBhZGRpbmc6IDBweDsgdGV4dC1hbGlnbjogY2VudGVyOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyBkaXNwbGF5OiB0YWJsZS1jZWxsOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBmb250LXdlaWdodDogYm9sZDsgd2lkdGg6IDIwMHB4OyBoZWlnaHQ6IDQwcHg7Ij48ZGl2IGNsYXNzPSJpdGVtLXRleHQtZWxlbWVudCIgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsiPjxwIHN0eWxlPSJtYXJnaW4tdG9wOiAwcHg7IG1hcmdpbi1ib3R0b206IDBweDsgcGFkZGluZzogMHB4OyBtaW4taGVpZ2h0OiAxOHB4OyI+QXBwIFByb3RvdHlwZTwvcD48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz4gICAgICAgICA8L2c+PC9nPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNDAsMjQwKSI+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcy8+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz48Zz48Zz4gPC9nPiA8cGF0aCBkPSJNIDE0NSA0MCAgTCAxNSA0MCBhIDE1IDE1IDAgMCAxIC0xNSAtMTUgIEwgMCAxNSAgYSAxNSAxNSAwIDAgMSAxNSAtMTUgICBMIDE0NSAwICAgYSAxNSAxNSAwIDAgMSAxNSAxNSAgTCAxNjAgMjUgICBhIDE1IDE1IDAgMCAxIC0xNSAxNSBaIiBzdHJva2Utd2lkdGg9IjJweCIgc3Ryb2tlPSJyZ2JhKDE1NCwgMTU0LCAxNTQsIDEpIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoMTAzLCAxMDMsIDEwMywgMSkiLz48L2c+PC9nPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGZvcmVpZ25PYmplY3QgaWQ9Iml0ZW0tdGV4dC1zbG90LXhNdXdxWHkycy1ib2R5IiB4PSIwIiB5PSIwIiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjQwIj48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBjbGFzcz0iaXRlbS10ZXh0LWNvbnRhaW5lciIgc3R5bGU9ImNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7IGZvbnQtc2l6ZTogMjBweDsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IHBhZGRpbmc6IDBweDsgdGV4dC1hbGlnbjogY2VudGVyOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyBkaXNwbGF5OiB0YWJsZS1jZWxsOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3aWR0aDogMTYwcHg7IGhlaWdodDogNDBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij48ZGl2IGNsYXNzPSJpdGVtLXRleHQtZWxlbWVudCIgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsiPjxwIHN0eWxlPSJtYXJnaW4tdG9wOiAwcHg7IG1hcmdpbi1ib3R0b206IDBweDsgcGFkZGluZzogMHB4OyBtaW4taGVpZ2h0OiAxOHB4OyI+T3BlbjwvcD48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz4gICAgICAgICA8L2c+PC9nPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNDAuMDAwMDAwMDAwMDAwMTE0LDMwMCkiPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+PGc+PGc+IDwvZz4gPHBhdGggZD0iTSAxNDUgNDAgIEwgMTUgNDAgYSAxNSAxNSAwIDAgMSAtMTUgLTE1ICBMIDAgMTUgIGEgMTUgMTUgMCAwIDEgMTUgLTE1ICAgTCAxNDUgMCAgIGEgMTUgMTUgMCAwIDEgMTUgMTUgIEwgMTYwIDI1ICAgYSAxNSAxNSAwIDAgMSAtMTUgMTUgWiIgc3Ryb2tlLXdpZHRoPSIycHgiIHN0cm9rZT0icmdiYSgxNTQsIDE1NCwgMTU0LCAxKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJyZ2JhKDEwMywgMTAzLCAxMDMsIDEpIi8+PC9nPjwvZz48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxmb3JlaWduT2JqZWN0IGlkPSJpdGVtLXRleHQtc2xvdC1rUlI5UE83dGUtYm9keSIgeD0iMCIgeT0iMCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI0MCI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpOyBmb250LXNpemU6IDIwcHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDE2MHB4OyBoZWlnaHQ6IDQwcHg7IGZvbnQtd2VpZ2h0OiBib2xkOyI+PGRpdiBjbGFzcz0iaXRlbS10ZXh0LWVsZW1lbnQiIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ij48cCBzdHlsZT0ibWFyZ2luLXRvcDogMHB4OyBtYXJnaW4tYm90dG9tOiAwcHg7IHBhZGRpbmc6IDBweDsgbWluLWhlaWdodDogMThweDsiPkJhY2s8L3A+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+ICAgICAgICAgPC9nPjwvZz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQwLDgwKSI+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcy8+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz48Zz48Zz4gPC9nPiA8cGF0aCBkPSJNIDE0MCAxMjAgIEwgMjAgMTIwIGEgMjAgMjAgMCAwIDEgLTIwIC0yMCAgTCAwIDIwICBhIDIwIDIwIDAgMCAxIDIwIC0yMCAgIEwgMTQwIDAgICBhIDIwIDIwIDAgMCAxIDIwIDIwICBMIDE2MCAxMDAgICBhIDIwIDIwIDAgMCAxIC0yMCAyMCBaIiBzdHJva2Utd2lkdGg9IjJweCIgc3Ryb2tlPSJyZ2JhKDE2MCwgMTYwLCAxNjAsIDEpIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoMjI3LCAyMjQsIDIyNCwgMSkiLz48L2c+PC9nPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyIvPjwvZz4gICAgICAgICA8L2c+PC9nPjwvZz4gPC9nPjwvZz48L3N2Zz4=", "description": "Helps designing a basic app prototype with multiple app pages. Each page has an \"Open Page\" event that, once triggered, displays that page on top."}, {"name": "Sankey diagram", "path": "/assets/templates/diagrams/sankey.json", "preview": "/assets/templates/previews/mind-map.svg", "description": ""}, {"name": "Slider", "path": "/assets/templates/ui/slider.json", "preview": "data:image/svg+xml;base64,PHN2ZyByZWY9InN2Z0NvbnRhaW5lciIgY2xhc3M9ImV4cG9ydC1zdmctcHJldmlldyIKICAgICAgICB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIyMDBweCIKICAgICAgICB2aWV3Qm94PSItMTAgLTEwIDUwIDMyMCIKICAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCIKICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgICAgICAgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCiAgICAgICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiID4KICAgICAgICA8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUsMCkgcm90YXRlKDApIiBkYXRhLXN2Zy1pdGVtLWNvbnRhaW5lci1pZD0idm5UZ0JweWZhSSIgZGF0YS1pdGVtLWlkPSJ2blRnQnB5ZmFJIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+IDwvZz4gPHBhdGggZD0iTSAxMCAzMDAgIEwgMTAgMzAwIGEgMTAgMTAgMCAwIDEgLTEwIC0xMCAgTCAwIDEwICBhIDEwIDEwIDAgMCAxIDEwIC0xMCAgIEwgMTAgMCAgIGEgMTAgMTAgMCAwIDEgMTAgMTAgIEwgMjAgMjkwICAgYSAxMCAxMCAwIDAgMSAtMTAgMTAgWiIgc3Ryb2tlLXdpZHRoPSIxcHgiIHN0cm9rZT0icmdiYSgxODMsIDE5MywgMTk5LCAxKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBkYXRhLWl0ZW0taWQ9InZuVGdCcHlmYUkiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoMjE2LCAyMjIsIDIyNywgMSkiLz48L2c+ICAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zm9yZWlnbk9iamVjdCBkYXRhLXRleHQtc2xvdC1uYW1lPSJib2R5IiBpZD0iaXRlbS10ZXh0LXNsb3Qtdm5UZ0JweWZhSS1ib2R5IiB4PSIwIiB5PSIwIiB3aWR0aD0iMjAiIGhlaWdodD0iMzAwIj48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBkYXRhLWl0ZW0taWQ9InZuVGdCcHlmYUkiIGNsYXNzPSJpdGVtLXRleHQtY29udGFpbmVyIiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1zaXplOiAxNHB4OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgcGFkZGluZzogMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IGRpc3BsYXk6IHRhYmxlLWNlbGw7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdpZHRoOiAyMHB4OyBoZWlnaHQ6IDMwMHB4OyI+PGRpdiBkYXRhLWl0ZW0tdGV4dC1lbGVtZW50LWl0ZW0taWQ9InZuVGdCcHlmYUkiIGNsYXNzPSJpdGVtLXRleHQtZWxlbWVudCIgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsiPjxiciAvPjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPiAgICAgICAgPGc+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSwtNSwxMzApIiBkYXRhLXN2Zy1pdGVtLWNvbnRhaW5lci1pZD0iN2pDX2xhcVpXIiBkYXRhLWl0ZW0taWQ9IjdqQ19sYXFaVyI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzLz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPiA8ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImZpbGwtcGF0dGVybi03akNfbGFxWlciIHgxPSI1MCUiIHkxPSIxMDAlIiB4Mj0iNTAlIiB5Mj0iMCUiPjxzdG9wIG9mZnNldD0iMCUiIHN0eWxlPSJzdG9wLWNvbG9yOiByZ2IoOTMsIDE2OSwgMjQ3KTsiLz48c3RvcCBvZmZzZXQ9IjEwMCUiIHN0eWxlPSJzdG9wLWNvbG9yOiByZ2IoNTksIDEzNSwgMjEyKTsiLz48L2xpbmVhckdyYWRpZW50PiA8L2RlZnM+PC9nPiA8cGF0aCBkPSJNIDAgMTUgQSAxNSAxNSAwIDEgMSAzMCAxNSAgQSAxNSAxNSAwIDEgMSAwIDE1IFoiIHN0cm9rZS13aWR0aD0iM3B4IiBzdHJva2U9InJnYmEoODYsIDE0OSwgMjE4LCAxKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBkYXRhLWl0ZW0taWQ9IjdqQ19sYXFaVyIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0idXJsKCNmaWxsLXBhdHRlcm4tN2pDX2xhcVpXKSIvPjwvZz4gICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxmb3JlaWduT2JqZWN0IGRhdGEtdGV4dC1zbG90LW5hbWU9ImJvZHkiIGlkPSJpdGVtLXRleHQtc2xvdC03akNfbGFxWlctYm9keSIgeD0iMCIgeT0iMCIgd2lkdGg9IjMwIiBoZWlnaHQ9IjMwIj48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBkYXRhLWl0ZW0taWQ9IjdqQ19sYXFaVyIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDMwcHg7IGhlaWdodDogMzBweDsiPjxkaXYgZGF0YS1pdGVtLXRleHQtZWxlbWVudC1pdGVtLWlkPSI3akNfbGFxWlciIGNsYXNzPSJpdGVtLXRleHQtZWxlbWVudCIgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsiPjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPiAgICAgICAgPGcvPiA8L2c+PC9nPjwvZz4gPC9nPjwvZz4KICAgIDwvc3ZnPg==", "description": "Allows users to drag slider in view mode and change its value. This slider can be used as an input to some Script function"}, {"name": "Slides", "path": "/assets/templates/ui/slides.json", "preview": "data:image/svg+xml;base64,PHN2ZyByZWY9InN2Z0NvbnRhaW5lciIgY2xhc3M9ImV4cG9ydC1zdmctcHJldmlldyIKICAgICAgICB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIyMDBweCIKICAgICAgICB2aWV3Qm94PSItMTAgLTEwIDU5NSA0MjAiCiAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiCiAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICAgICAgIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgogICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiA+CiAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSByb3RhdGUoMCkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSJETGhlQ0k5Q2w4XyIgZGF0YS1pdGVtLWlkPSJETGhlQ0k5Q2w4XyIgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij48Zz48ZGVmcz48ZmlsdGVyIGlkPSJpdGVtLWVmZmVjdC1kcm9wLXNoYWRvdy1ETGhlQ0k5Q2w4Xy0wIiB4PSItNTAwJSIgeT0iLTUwMCUiIHdpZHRoPSIyMDAwJSIgaGVpZ2h0PSIyMDAwJSI+PGZlR2F1c3NpYW5CbHVyIGluPSJTb3VyY2VHcmFwaGljIiBzdGREZXZpYXRpb249IjIwIj48L2ZlR2F1c3NpYW5CbHVyPjwvZmlsdGVyPjwvZGVmcz48cGF0aCBkPSJNIDU2NS4wNTg3NTExMzc5OTk1IDQwMCAgTCAxMCA0MDAgYSAxMCAxMCAwIDAgMSAtMTAgLTEwICBMIDAgMTAgIGEgMTAgMTAgMCAwIDEgMTAgLTEwICAgTCA1NjUuMDU4NzUxMTM3OTk5NSAwICAgYSAxMCAxMCAwIDAgMSAxMCAxMCAgTCA1NzUuMDU4NzUxMTM3OTk5NSAzOTAgICBhIDEwIDEwIDAgMCAxIC0xMCAxMCBaIiBzdHJva2U9Im5vbmUiIGZpbGw9InJnYmEoMCwwLDAsMS4wKSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMyAzKSIgc3R5bGU9Im9wYWNpdHk6IDAuMiIgZmlsdGVyPSJ1cmwoI2l0ZW0tZWZmZWN0LWRyb3Atc2hhZG93LURMaGVDSTlDbDhfLTApIj48L3BhdGg+PC9nPiA8ZGVmcz48L2RlZnM+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz4gPC9nPiA8cGF0aCBkPSJNIDU2NS4wNTg3NTExMzc5OTk1IDQwMCAgTCAxMCA0MDAgYSAxMCAxMCAwIDAgMSAtMTAgLTEwICBMIDAgMTAgIGEgMTAgMTAgMCAwIDEgMTAgLTEwICAgTCA1NjUuMDU4NzUxMTM3OTk5NSAwICAgYSAxMCAxMCAwIDAgMSAxMCAxMCAgTCA1NzUuMDU4NzUxMTM3OTk5NSAzOTAgICBhIDEwIDEwIDAgMCAxIC0xMCAxMCBaIiBzdHJva2Utd2lkdGg9IjFweCIgc3Ryb2tlPSJyZ2JhKDIxMiwyMTIsMjEyLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgZGF0YS1pdGVtLWlkPSJETGhlQ0k5Q2w4XyIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0icmdiYSgyNDAsIDI0MCwgMjQwLCAxKSI+PC9wYXRoPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGZvcmVpZ25PYmplY3QgZGF0YS10ZXh0LXNsb3QtbmFtZT0iYm9keSIgaWQ9Iml0ZW0tdGV4dC1zbG90LURMaGVDSTlDbDhfLWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSI1NzUuMDU4NzUxMTM3OTk5NSIgaGVpZ2h0PSI0MDAiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGRhdGEtaXRlbS1pZD0iRExoZUNJOUNsOF8iIGNsYXNzPSJpdGVtLXRleHQtY29udGFpbmVyIiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1zaXplOiAxNHB4OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgcGFkZGluZzogMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IGRpc3BsYXk6IHRhYmxlLWNlbGw7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdpZHRoOiA1NzUuMDU5cHg7IGhlaWdodDogNDAwcHg7Ij48ZGl2IGRhdGEtaXRlbS10ZXh0LWVsZW1lbnQtaXRlbS1pZD0iRExoZUNJOUNsOF8iIGNsYXNzPSJpdGVtLXRleHQtZWxlbWVudCIgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsiPjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPiAgICAgICAgIDxnPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsMTQzLjc2NDY4Nzc4NDQ5OTg3LDApIiBkYXRhLXN2Zy1pdGVtLWNvbnRhaW5lci1pZD0iYkdGQVh2T1hmY0siIGRhdGEtaXRlbS1pZD0iYkdGQVh2T1hmY0siIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzPjwvZGVmcz4gPGcgZmlsdGVyPSIiPiAgIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGZvcmVpZ25PYmplY3QgZGF0YS10ZXh0LXNsb3QtbmFtZT0iYm9keSIgaWQ9Iml0ZW0tdGV4dC1zbG90LWJHRkFYdk9YZmNLLWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSIyODcuNTI5Mzc1NTY4OTk5NzQiIGhlaWdodD0iNDAiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGRhdGEtaXRlbS1pZD0iYkdGQVh2T1hmY0siIGNsYXNzPSJpdGVtLXRleHQtY29udGFpbmVyIiBzdHlsZT0iY29sb3I6IHJnYigzMCwgMzAsIDMwKTsgZm9udC1zaXplOiAyMHB4OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgcGFkZGluZzogMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IGRpc3BsYXk6IHRhYmxlLWNlbGw7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdpZHRoOiAyODcuNTI5cHg7IGhlaWdodDogNDBweDsiPjxkaXYgZGF0YS1pdGVtLXRleHQtZWxlbWVudC1pdGVtLWlkPSJiR0ZBWHZPWGZjSyIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PHAgc3R5bGU9Im1hcmdpbi10b3A6IDBweDsgbWFyZ2luLWJvdHRvbTogMHB4OyBwYWRkaW5nOiAwcHg7IG1pbi1oZWlnaHQ6IDE4cHg7Ij48c3Ryb25nPlNsaWRlczwvc3Ryb25nPjwvcD48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz4gICAgICAgICAgPC9nPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNTQsNjApIiBkYXRhLXN2Zy1pdGVtLWNvbnRhaW5lci1pZD0iZDdPOW0zaUV3YTIiIGRhdGEtaXRlbS1pZD0iZDdPOW0zaUV3YTIiIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzPjwvZGVmcz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gNDY3LjA1ODc1MTEzNzk5OTUgMzI2ICBMIDAgMzI2IGEgMCAwIDAgMCAxIDAgMCAgTCAwIDAgIGEgMCAwIDAgMCAxIDAgMCAgIEwgNDY3LjA1ODc1MTEzNzk5OTUgMCAgIGEgMCAwIDAgMCAxIDAgMCAgTCA0NjcuMDU4NzUxMTM3OTk5NSAzMjYgICBhIDAgMCAwIDAgMSAwIDAgWiIgc3Ryb2tlLXdpZHRoPSIxcHgiIHN0cm9rZT0icmdiYSgyMTIsMjEyLDIxMiwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIGRhdGEtaXRlbS1pZD0iZDdPOW0zaUV3YTIiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoMjUwLCAyNTAsIDI1MCwgMSkiPjwvcGF0aD48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxmb3JlaWduT2JqZWN0IGRhdGEtdGV4dC1zbG90LW5hbWU9ImJvZHkiIGlkPSJpdGVtLXRleHQtc2xvdC1kN085bTNpRXdhMi1ib2R5IiB4PSIwIiB5PSIwIiB3aWR0aD0iNDY3LjA1ODc1MTEzNzk5OTUiIGhlaWdodD0iMzI2Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBkYXRhLWl0ZW0taWQ9ImQ3TzltM2lFd2EyIiBjbGFzcz0iaXRlbS10ZXh0LWNvbnRhaW5lciIgc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtc2l6ZTogMTRweDsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IHBhZGRpbmc6IDBweDsgdGV4dC1hbGlnbjogY2VudGVyOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyBkaXNwbGF5OiB0YWJsZS1jZWxsOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3aWR0aDogNDY3LjA1OXB4OyBoZWlnaHQ6IDMyNnB4OyI+PGRpdiBkYXRhLWl0ZW0tdGV4dC1lbGVtZW50LWl0ZW0taWQ9ImQ3TzltM2lFd2EyIiBjbGFzcz0iaXRlbS10ZXh0LWVsZW1lbnQiIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ij48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz4gICAgICAgICA8Zz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDAsMCkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSJKN2RmeEtXZGkyeiIgZGF0YS1pdGVtLWlkPSJKN2RmeEtXZGkyeiIgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnM+PC9kZWZzPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAwOyI+PGc+IDwvZz4gPHBhdGggZD0iTSA0NzcuMDU4NzUxMTM3OTk5NSAzMjYgIEwgMCAzMjYgYSAwIDAgMCAwIDEgMCAwICBMIDAgMCAgYSAwIDAgMCAwIDEgMCAwICAgTCA0NzcuMDU4NzUxMTM3OTk5NSAwICAgYSAwIDAgMCAwIDEgMCAwICBMIDQ3Ny4wNTg3NTExMzc5OTk1IDMyNiAgIGEgMCAwIDAgMCAxIDAgMCBaIiBzdHJva2Utd2lkdGg9IjJweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgZGF0YS1pdGVtLWlkPSJKN2RmeEtXZGkyeiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0icmdiYSgyNDAsMjQwLDI0MCwxLjApIj48L3BhdGg+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDA7Ij48Zm9yZWlnbk9iamVjdCBkYXRhLXRleHQtc2xvdC1uYW1lPSJib2R5IiBpZD0iaXRlbS10ZXh0LXNsb3QtSjdkZnhLV2RpMnotYm9keSIgeD0iMCIgeT0iMCIgd2lkdGg9IjQ3Ny4wNTg3NTExMzc5OTk1IiBoZWlnaHQ9IjMyNiI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgZGF0YS1pdGVtLWlkPSJKN2RmeEtXZGkyeiIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDQ3Ny4wNTlweDsgaGVpZ2h0OiAzMjZweDsiPjxkaXYgZGF0YS1pdGVtLXRleHQtZWxlbWVudC1pdGVtLWlkPSJKN2RmeEtXZGkyeiIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+ICAgICAgICAgPGc+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSwwLDApIiBkYXRhLXN2Zy1pdGVtLWNvbnRhaW5lci1pZD0iVTk0Q1FIQWJfNTkiIGRhdGEtaXRlbS1pZD0iVTk0Q1FIQWJfNTkiIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzPjwvZGVmcz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gNDY3LjA1ODc1MTEzNzk5OTUgMzI2ICBMIDAgMzI2IGEgMCAwIDAgMCAxIDAgMCAgTCAwIDAgIGEgMCAwIDAgMCAxIDAgMCAgIEwgNDY3LjA1ODc1MTEzNzk5OTUgMCAgIGEgMCAwIDAgMCAxIDAgMCAgTCA0NjcuMDU4NzUxMTM3OTk5NSAzMjYgICBhIDAgMCAwIDAgMSAwIDAgWiIgc3Ryb2tlLXdpZHRoPSIycHgiIHN0cm9rZT0icmdiYSgyNTAsMjAwLDIwMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSI4IDgiIGRhdGEtaXRlbS1pZD0iVTk0Q1FIQWJfNTkiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoMjQwLCAyNDAsIDI0MCwgMSkiPjwvcGF0aD48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxmb3JlaWduT2JqZWN0IGRhdGEtdGV4dC1zbG90LW5hbWU9ImJvZHkiIGlkPSJpdGVtLXRleHQtc2xvdC1VOTRDUUhBYl81OS1ib2R5IiB4PSIwIiB5PSIwIiB3aWR0aD0iNDY3LjA1ODc1MTEzNzk5OTUiIGhlaWdodD0iMzI2Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBkYXRhLWl0ZW0taWQ9IlU5NENRSEFiXzU5IiBjbGFzcz0iaXRlbS10ZXh0LWNvbnRhaW5lciIgc3R5bGU9ImNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMyk7IGZvbnQtc2l6ZTogMTZweDsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IHBhZGRpbmc6IDBweDsgdGV4dC1hbGlnbjogY2VudGVyOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyBkaXNwbGF5OiB0YWJsZS1jZWxsOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3aWR0aDogNDY3LjA1OXB4OyBoZWlnaHQ6IDMyNnB4OyI+PGRpdiBkYXRhLWl0ZW0tdGV4dC1lbGVtZW50LWl0ZW0taWQ9IlU5NENRSEFiXzU5IiBjbGFzcz0iaXRlbS10ZXh0LWVsZW1lbnQiIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ij48aDE+U2xpZGUgIzE8L2gxPgo8cCBzdHlsZT0ibWFyZ2luLXRvcDogMHB4OyBtYXJnaW4tYm90dG9tOiAwcHg7IHBhZGRpbmc6IDBweDsgbWluLWhlaWdodDogMThweDsiPkRyb3AgeW91ciBpdGVtcyBoZXJlPC9wPgo8cCBzdHlsZT0ibWFyZ2luLXRvcDogMHB4OyBtYXJnaW4tYm90dG9tOiAwcHg7IHBhZGRpbmc6IDBweDsgbWluLWhlaWdodDogMThweDsiPjxpPih0aGlzIHRleHQgYXMgd2VsbCBhcyB0aGlzIHNsaWRlIGNvbnRhaW5lciB3aWxsIG5vdCBiZSB2aXNpYmxlIGluIHZpZXcgbW9kZSk8L2k+PC9wPjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPiAgICAgICAgIDxnPjwvZz4gPC9nPjwvZz4gPC9nPjwvZz4gPC9nPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNywxODApIiBkYXRhLXN2Zy1pdGVtLWNvbnRhaW5lci1pZD0ia3AwLWVnV0R0OVIiIGRhdGEtaXRlbS1pZD0ia3AwLWVnV0R0OVIiIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzPjwvZGVmcz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gMCAyMCBBIDIwIDIwIDAgMSAxIDQwIDIwICBBIDIwIDIwIDAgMSAxIDAgMjAgWiIgc3Ryb2tlLXdpZHRoPSIwcHgiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIGRhdGEtaXRlbS1pZD0ia3AwLWVnV0R0OVIiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoNzgsIDEzMSwgMjQ1LCAxKSI+PC9wYXRoPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGZvcmVpZ25PYmplY3QgZGF0YS10ZXh0LXNsb3QtbmFtZT0iYm9keSIgaWQ9Iml0ZW0tdGV4dC1zbG90LWtwMC1lZ1dEdDlSLWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgZGF0YS1pdGVtLWlkPSJrcDAtZWdXRHQ5UiIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDQwcHg7IGhlaWdodDogNDBweDsiPjxkaXYgZGF0YS1pdGVtLXRleHQtZWxlbWVudC1pdGVtLWlkPSJrcDAtZWdXRHQ5UiIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+ICAgICAgICAgPGc+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw5Ljk5OTk5OTk5OTk5OTk5OCwxMikiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSI0TkJNUGFUTE9oLSIgZGF0YS1pdGVtLWlkPSI0TkJNUGFUTE9oLSIgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnM+PC9kZWZzPiA8ZyBmaWx0ZXI9IiI+PGcgbW9kZT0iZWRpdCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz4gPC9nPiA8cGF0aCBkPSJNIDEzLjMzIDAgTCAxMy4zMyAxNi42NyBMIDAgOC4zMyBMIDEzLjMzIDAgIFogIiBzdHJva2Utd2lkdGg9IjRweCIgc3Ryb2tlPSJyZ2JhKDI1NSwgMjU1LCAyNTUsIDEpIiBzdHJva2UtZGFzaGFycmF5PSIiIGZpbGw9InJnYmEoMjU1LCAyNTUsIDI1NSwgMSkiIHN0eWxlPSJzdHJva2UtbGluZWpvaW46IHJvdW5kOyI+PC9wYXRoPjwvZz4gICA8L2c+ICAgICAgICAgIDwvZz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgtMSwxLjIyNDY0Njc5OTE0NzM1MzJlLTE2LC0xLjIyNDY0Njc5OTE0NzM1MzJlLTE2LC0xLDQwLDQwKSIgZGF0YS1zdmctaXRlbS1jb250YWluZXItaWQ9IjN6blBrTm5wbTNUIiBkYXRhLWl0ZW0taWQ9IjN6blBrTm5wbTNUIiBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcz48L2RlZnM+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDA7Ij48Zz4gPC9nPiA8cGF0aCBkPSJNIDAgMjAgQSAyMCAyMCAwIDEgMSA0MCAyMCAgQSAyMCAyMCAwIDEgMSAwIDIwIFoiIHN0cm9rZS13aWR0aD0iMnB4IiBzdHJva2U9InJnYmEoMzAsMzAsMzAsMS4wKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBkYXRhLWl0ZW0taWQ9IjN6blBrTm5wbTNUIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJyZ2JhKDI0MCwyNDAsMjQwLDEuMCkiPjwvcGF0aD48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMDsiPjxmb3JlaWduT2JqZWN0IGRhdGEtdGV4dC1zbG90LW5hbWU9ImJvZHkiIGlkPSJpdGVtLXRleHQtc2xvdC0zem5Qa05ucG0zVC1ib2R5IiB4PSIwIiB5PSIwIiB3aWR0aD0iNDAiIGhlaWdodD0iNDAiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGRhdGEtaXRlbS1pZD0iM3puUGtObnBtM1QiIGNsYXNzPSJpdGVtLXRleHQtY29udGFpbmVyIiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1zaXplOiAxNHB4OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgcGFkZGluZzogMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IGRpc3BsYXk6IHRhYmxlLWNlbGw7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdpZHRoOiA0MHB4OyBoZWlnaHQ6IDQwcHg7Ij48ZGl2IGRhdGEtaXRlbS10ZXh0LWVsZW1lbnQtaXRlbS1pZD0iM3puUGtObnBtM1QiIGNsYXNzPSJpdGVtLXRleHQtZWxlbWVudCIgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsiPjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPiAgICAgICAgICA8L2c+PC9nPiA8L2c+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw1MjguMDU4NzUxMTM3OTk5NSwxODApIiBkYXRhLXN2Zy1pdGVtLWNvbnRhaW5lci1pZD0iei02dkNrSVBia1kiIGRhdGEtaXRlbS1pZD0iei02dkNrSVBia1kiIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzPjwvZGVmcz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gMCAyMCBBIDIwIDIwIDAgMSAxIDQwIDIwICBBIDIwIDIwIDAgMSAxIDAgMjAgWiIgc3Ryb2tlLXdpZHRoPSIwcHgiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIGRhdGEtaXRlbS1pZD0iei02dkNrSVBia1kiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoNzgsIDEzMSwgMjQ1LCAxKSI+PC9wYXRoPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGZvcmVpZ25PYmplY3QgZGF0YS10ZXh0LXNsb3QtbmFtZT0iYm9keSIgaWQ9Iml0ZW0tdGV4dC1zbG90LXotNnZDa0lQYmtZLWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgZGF0YS1pdGVtLWlkPSJ6LTZ2Q2tJUGJrWSIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDQwcHg7IGhlaWdodDogNDBweDsiPjxkaXYgZGF0YS1pdGVtLXRleHQtZWxlbWVudC1pdGVtLWlkPSJ6LTZ2Q2tJUGJrWSIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+ICAgICAgICAgPGc+PGcgdHJhbnNmb3JtPSJtYXRyaXgoLTEsMS4yMjQ2NDY3OTkxNDczNTMyZS0xNiwtMS4yMjQ2NDY3OTkxNDczNTMyZS0xNiwtMSwyOS4zMzMzMzMzMzMzMzMzMzIsMjguNjY2NjY2NjY2NjY2NjY0KSIgZGF0YS1zdmctaXRlbS1jb250YWluZXItaWQ9IkVwOVFJaEpUMkRlIiBkYXRhLWl0ZW0taWQ9IkVwOVFJaEpUMkRlIiBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcz48L2RlZnM+IDxnIGZpbHRlcj0iIj48ZyBtb2RlPSJlZGl0IiBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gMTMuMzMgMCBMIDEzLjMzIDE2LjY3IEwgMCA4LjMzIEwgMTMuMzMgMCAgWiAiIHN0cm9rZS13aWR0aD0iNHB4IiBzdHJva2U9InJnYmEoMjU1LCAyNTUsIDI1NSwgMSkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgZmlsbD0icmdiYSgyNTUsIDI1NSwgMjU1LCAxKSIgc3R5bGU9InN0cm9rZS1saW5lam9pbjogcm91bmQ7Ij48L3BhdGg+PC9nPiAgIDwvZz4gICAgICAgICAgPC9nPjxnIHRyYW5zZm9ybT0ibWF0cml4KC0xLDEuMjI0NjQ2Nzk5MTQ3MzUzMmUtMTYsLTEuMjI0NjQ2Nzk5MTQ3MzUzMmUtMTYsLTEsNDAsNDApIiBkYXRhLXN2Zy1pdGVtLWNvbnRhaW5lci1pZD0iZlZ0YkpIYzFYbS0iIGRhdGEtaXRlbS1pZD0iZlZ0YkpIYzFYbS0iIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzPjwvZGVmcz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMDsiPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gMCAyMCBBIDIwIDIwIDAgMSAxIDQwIDIwICBBIDIwIDIwIDAgMSAxIDAgMjAgWiIgc3Ryb2tlLXdpZHRoPSIycHgiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIGRhdGEtaXRlbS1pZD0iZlZ0YkpIYzFYbS0iIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoMjQwLDI0MCwyNDAsMS4wKSI+PC9wYXRoPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAwOyI+PGZvcmVpZ25PYmplY3QgZGF0YS10ZXh0LXNsb3QtbmFtZT0iYm9keSIgaWQ9Iml0ZW0tdGV4dC1zbG90LWZWdGJKSGMxWG0tLWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgZGF0YS1pdGVtLWlkPSJmVnRiSkhjMVhtLSIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDQwcHg7IGhlaWdodDogNDBweDsiPjxkaXYgZGF0YS1pdGVtLXRleHQtZWxlbWVudC1pdGVtLWlkPSJmVnRiSkhjMVhtLSIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+ICAgICAgICAgIDwvZz48L2c+IDwvZz48L2c+IDwvZz4KICAgIDwvc3ZnPg==\n", "description": ""}, {"name": "Tabs panel", "path": "/assets/templates/ui/tabs-panel.json", "preview": "data:image/svg+xml;base64,PHN2ZyByZWY9InN2Z0NvbnRhaW5lciIgY2xhc3M9ImV4cG9ydC1zdmctcHJldmlldyIKICAgICAgICB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIyMDBweCIKICAgICAgICB2aWV3Qm94PSItMTAgLTEwIDU2MCAzODAiCiAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiCiAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICAgICAgIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgogICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiA+CiAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSByb3RhdGUoMCkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSJpUnVRLTdJR3giIGRhdGEtaXRlbS1pZD0iaVJ1US03SUd4IiBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPjxnPjxkZWZzPjxmaWx0ZXIgaWQ9Iml0ZW0tZWZmZWN0LWRyb3Atc2hhZG93LWlSdVEtN0lHeC0wIiB4PSItNTAwJSIgeT0iLTUwMCUiIHdpZHRoPSIyMDAwJSIgaGVpZ2h0PSIyMDAwJSI+PGZlR2F1c3NpYW5CbHVyIGluPSJTb3VyY2VHcmFwaGljIiBzdGREZXZpYXRpb249IjIwIj48L2ZlR2F1c3NpYW5CbHVyPjwvZmlsdGVyPjwvZGVmcz48cGF0aCBkPSJNIDUyMCAzNjAgIEwgMjAgMzYwIGEgMjAgMjAgMCAwIDEgLTIwIC0yMCAgTCAwIDIwICBhIDIwIDIwIDAgMCAxIDIwIC0yMCAgIEwgNTIwIDAgICBhIDIwIDIwIDAgMCAxIDIwIDIwICBMIDU0MCAzNDAgICBhIDIwIDIwIDAgMCAxIC0yMCAyMCBaIiBzdHJva2U9Im5vbmUiIGZpbGw9InJnYmEoMCwwLDAsMS4wKSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMyAzKSIgc3R5bGU9Im9wYWNpdHk6IDAuMiIgZmlsdGVyPSJ1cmwoI2l0ZW0tZWZmZWN0LWRyb3Atc2hhZG93LWlSdVEtN0lHeC0wKSI+PC9wYXRoPjwvZz4gPGRlZnM+PC9kZWZzPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+IDwvZz4gPHBhdGggZD0iTSA1MjAgMzYwICBMIDIwIDM2MCBhIDIwIDIwIDAgMCAxIC0yMCAtMjAgIEwgMCAyMCAgYSAyMCAyMCAwIDAgMSAyMCAtMjAgICBMIDUyMCAwICAgYSAyMCAyMCAwIDAgMSAyMCAyMCAgTCA1NDAgMzQwICAgYSAyMCAyMCAwIDAgMSAtMjAgMjAgWiIgc3Ryb2tlLXdpZHRoPSIxcHgiIHN0cm9rZT0icmdiYSgyMTIsIDIxMiwgMjEyLCAxKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBkYXRhLWl0ZW0taWQ9ImlSdVEtN0lHeCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0icmdiYSgyNDAsMjQwLDI0MCwxLjApIj48L3BhdGg+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zm9yZWlnbk9iamVjdCBkYXRhLXRleHQtc2xvdC1uYW1lPSJib2R5IiBpZD0iaXRlbS10ZXh0LXNsb3QtaVJ1US03SUd4LWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSI1NDAiIGhlaWdodD0iMzYwIj48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBkYXRhLWl0ZW0taWQ9ImlSdVEtN0lHeCIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDU0MHB4OyBoZWlnaHQ6IDM2MHB4OyI+PGRpdiBkYXRhLWl0ZW0tdGV4dC1lbGVtZW50LWl0ZW0taWQ9ImlSdVEtN0lHeCIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+ICAgICAgICAgPGc+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw0MCwyMCkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSJHb04yVzVVLUEiIGRhdGEtaXRlbS1pZD0iR29OMlc1VS1BIiBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcz48L2RlZnM+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz4gPC9nPiA8cGF0aCBkPSJNIDkxIDYwICBMIDkgNjAgYSA5IDkgMCAwIDEgLTkgLTkgIEwgMCA5ICBhIDkgOSAwIDAgMSA5IC05ICAgTCA5MSAwICAgYSA5IDkgMCAwIDEgOSA5ICBMIDEwMCA1MSAgIGEgOSA5IDAgMCAxIC05IDkgWiIgc3Ryb2tlLXdpZHRoPSIwcHgiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIGRhdGEtaXRlbS1pZD0iR29OMlc1VS1BIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJyZ2JhKDI1NSwgMjU1LCAyNTUsIDEpIj48L3BhdGg+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zm9yZWlnbk9iamVjdCBkYXRhLXRleHQtc2xvdC1uYW1lPSJib2R5IiBpZD0iaXRlbS10ZXh0LXNsb3QtR29OMlc1VS1BLWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAiIGhlaWdodD0iNjAiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGRhdGEtaXRlbS1pZD0iR29OMlc1VS1BIiBjbGFzcz0iaXRlbS10ZXh0LWNvbnRhaW5lciIgc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtc2l6ZTogMTRweDsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IHBhZGRpbmc6IDE1cHggMHB4IDBweDsgdGV4dC1hbGlnbjogY2VudGVyOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyBkaXNwbGF5OiB0YWJsZS1jZWxsOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3aWR0aDogMTAwcHg7IGhlaWdodDogNjBweDsiPjxkaXYgZGF0YS1pdGVtLXRleHQtZWxlbWVudC1pdGVtLWlkPSJHb04yVzVVLUEiIGNsYXNzPSJpdGVtLXRleHQtZWxlbWVudCIgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsiPjxwIHN0eWxlPSJtYXJnaW4tdG9wOiAwcHg7IG1hcmdpbi1ib3R0b206IDBweDsgcGFkZGluZzogMHB4OyBtaW4taGVpZ2h0OiAxOHB4OyI+VGFiIDE8L3A+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+ICAgICAgICAgIDwvZz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDE2MCwyMCkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSJWWDB2OTFQSGkiIGRhdGEtaXRlbS1pZD0iVlgwdjkxUEhpIiBzdHlsZT0ib3BhY2l0eTogMC41OyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzPjwvZGVmcz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gOTEgNjAgIEwgOSA2MCBhIDkgOSAwIDAgMSAtOSAtOSAgTCAwIDkgIGEgOSA5IDAgMCAxIDkgLTkgICBMIDkxIDAgICBhIDkgOSAwIDAgMSA5IDkgIEwgMTAwIDUxICAgYSA5IDkgMCAwIDEgLTkgOSBaIiBzdHJva2Utd2lkdGg9IjBweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgZGF0YS1pdGVtLWlkPSJWWDB2OTFQSGkiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoMjU1LCAyNTUsIDI1NSwgMSkiPjwvcGF0aD48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxmb3JlaWduT2JqZWN0IGRhdGEtdGV4dC1zbG90LW5hbWU9ImJvZHkiIGlkPSJpdGVtLXRleHQtc2xvdC1WWDB2OTFQSGktYm9keSIgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSI2MCI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgZGF0YS1pdGVtLWlkPSJWWDB2OTFQSGkiIGNsYXNzPSJpdGVtLXRleHQtY29udGFpbmVyIiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1zaXplOiAxNHB4OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgcGFkZGluZzogMTVweCAwcHggMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiB0b3A7IHdoaXRlLXNwYWNlOiBub3JtYWw7IGRpc3BsYXk6IHRhYmxlLWNlbGw7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdpZHRoOiAxMDBweDsgaGVpZ2h0OiA2MHB4OyI+PGRpdiBkYXRhLWl0ZW0tdGV4dC1lbGVtZW50LWl0ZW0taWQ9IlZYMHY5MVBIaSIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PHAgc3R5bGU9Im1hcmdpbi10b3A6IDBweDsgbWFyZ2luLWJvdHRvbTogMHB4OyBwYWRkaW5nOiAwcHg7IG1pbi1oZWlnaHQ6IDE4cHg7Ij5UYWIgMjwvcD48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz4gICAgICAgICAgPC9nPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsMjgwLDIwKSIgZGF0YS1zdmctaXRlbS1jb250YWluZXItaWQ9ImNIVXpZSVNwZiIgZGF0YS1pdGVtLWlkPSJjSFV6WUlTcGYiIHN0eWxlPSJvcGFjaXR5OiAwLjU7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnM+PC9kZWZzPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+IDwvZz4gPHBhdGggZD0iTSA5MSA2MCAgTCA5IDYwIGEgOSA5IDAgMCAxIC05IC05ICBMIDAgOSAgYSA5IDkgMCAwIDEgOSAtOSAgIEwgOTEgMCAgIGEgOSA5IDAgMCAxIDkgOSAgTCAxMDAgNTEgICBhIDkgOSAwIDAgMSAtOSA5IFoiIHN0cm9rZS13aWR0aD0iMHB4IiBzdHJva2U9InJnYmEoMzAsMzAsMzAsMS4wKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBkYXRhLWl0ZW0taWQ9ImNIVXpZSVNwZiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0icmdiYSgyNTUsIDI1NSwgMjU1LCAxKSI+PC9wYXRoPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGZvcmVpZ25PYmplY3QgZGF0YS10ZXh0LXNsb3QtbmFtZT0iYm9keSIgaWQ9Iml0ZW0tdGV4dC1zbG90LWNIVXpZSVNwZi1ib2R5IiB4PSIwIiB5PSIwIiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjYwIj48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBkYXRhLWl0ZW0taWQ9ImNIVXpZSVNwZiIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAxNXB4IDBweCAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IHRvcDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDEwMHB4OyBoZWlnaHQ6IDYwcHg7Ij48ZGl2IGRhdGEtaXRlbS10ZXh0LWVsZW1lbnQtaXRlbS1pZD0iY0hVellJU3BmIiBjbGFzcz0iaXRlbS10ZXh0LWVsZW1lbnQiIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ij48cCBzdHlsZT0ibWFyZ2luLXRvcDogMHB4OyBtYXJnaW4tYm90dG9tOiAwcHg7IHBhZGRpbmc6IDBweDsgbWluLWhlaWdodDogMThweDsiPlRhYiAzPC9wPjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPiAgICAgICAgICA8L2c+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSwyMCw2MCkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSItYUZNdVFITmwiIGRhdGEtaXRlbS1pZD0iLWFGTXVRSE5sIiBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcz48L2RlZnM+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz4gPC9nPiA8cGF0aCBkPSJNIDQ4MCAyODAgIEwgMjAgMjgwIGEgMjAgMjAgMCAwIDEgLTIwIC0yMCAgTCAwIDIwICBhIDIwIDIwIDAgMCAxIDIwIC0yMCAgIEwgNDgwIDAgICBhIDIwIDIwIDAgMCAxIDIwIDIwICBMIDUwMCAyNjAgICBhIDIwIDIwIDAgMCAxIC0yMCAyMCBaIiBzdHJva2Utd2lkdGg9IjBweCIgc3Ryb2tlPSJyZ2JhKDI1NSwgMjU1LCAyNTUsIDEpIiBzdHJva2UtZGFzaGFycmF5PSIiIGRhdGEtaXRlbS1pZD0iLWFGTXVRSE5sIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJyZ2JhKDI1NSwgMjU1LCAyNTUsIDEpIj48L3BhdGg+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zm9yZWlnbk9iamVjdCBkYXRhLXRleHQtc2xvdC1uYW1lPSJib2R5IiBpZD0iaXRlbS10ZXh0LXNsb3QtLWFGTXVRSE5sLWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSI1MDAiIGhlaWdodD0iMjgwIj48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBkYXRhLWl0ZW0taWQ9Ii1hRk11UUhObCIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDUwMHB4OyBoZWlnaHQ6IDI4MHB4OyI+PGRpdiBkYXRhLWl0ZW0tdGV4dC1lbGVtZW50LWl0ZW0taWQ9Ii1hRk11UUhObCIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PHAgc3R5bGU9Im1hcmdpbi10b3A6IDBweDsgbWFyZ2luLWJvdHRvbTogMHB4OyBwYWRkaW5nOiAwcHg7IG1pbi1oZWlnaHQ6IDE4cHg7Ij5UYWIgY29udGVudCAxPC9wPjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPiAgICAgICAgICA8L2c+PC9nPiA8L2c+CiAgICA8L3N2Zz4=", "description": "Panel with tabs"}, {"name": "Tooltip", "path": "/assets/templates/ui/tooltip.json", "preview": "/assets/images/templates/tooltip.svg", "description": ""}] \ No newline at end of file +[{"name": "Dropdown", "path": "/assets/templates/ui/dropdown.json", "preview": "data:image/svg+xml;base64,PHN2ZyByZWY9InN2Z0NvbnRhaW5lciIgY2xhc3M9ImV4cG9ydC1zdmctcHJldmlldyIKICAgICAgICB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIyMDBweCIKICAgICAgICB2aWV3Qm94PSItMTAgLTEwIDMyMCA0MjAiCiAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiCiAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICAgICAgIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgogICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiA+CiAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSByb3RhdGUoMCkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSJnc0RYYTlhMnEiIGRhdGEtaXRlbS1pZD0iZ3NEWGE5YTJxIiBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPjxnPjxkZWZzPjxmaWx0ZXIgaWQ9Iml0ZW0tZWZmZWN0LWRyb3Atc2hhZG93LWdzRFhhOWEycS0wIiB4PSItNTAwJSIgeT0iLTUwMCUiIHdpZHRoPSIyMDAwJSIgaGVpZ2h0PSIyMDAwJSI+PGZlR2F1c3NpYW5CbHVyIGluPSJTb3VyY2VHcmFwaGljIiBzdGREZXZpYXRpb249IjUiPjwvZmVHYXVzc2lhbkJsdXI+PC9maWx0ZXI+PC9kZWZzPjxwYXRoIGQ9Ik0gMjg4IDQwMCAgTCAxMiA0MDAgYSAxMiAxMiAwIDAgMSAtMTIgLTEyICBMIDAgMTIgIGEgMTIgMTIgMCAwIDEgMTIgLTEyICAgTCAyODggMCAgIGEgMTIgMTIgMCAwIDEgMTIgMTIgIEwgMzAwIDM4OCAgIGEgMTIgMTIgMCAwIDEgLTEyIDEyIFoiIHN0cm9rZT0ibm9uZSIgZmlsbD0icmdiYSgwLDAsMCwxLjApIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMCAxMCkiIHN0eWxlPSJvcGFjaXR5OiAwLjA1IiBmaWx0ZXI9InVybCgjaXRlbS1lZmZlY3QtZHJvcC1zaGFkb3ctZ3NEWGE5YTJxLTApIj48L3BhdGg+PC9nPiA8ZGVmcz48L2RlZnM+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz4gPC9nPiA8cGF0aCBkPSJNIDI4OCA0MDAgIEwgMTIgNDAwIGEgMTIgMTIgMCAwIDEgLTEyIC0xMiAgTCAwIDEyICBhIDEyIDEyIDAgMCAxIDEyIC0xMiAgIEwgMjg4IDAgICBhIDEyIDEyIDAgMCAxIDEyIDEyICBMIDMwMCAzODggICBhIDEyIDEyIDAgMCAxIC0xMiAxMiBaIiBzdHJva2Utd2lkdGg9IjFweCIgc3Ryb2tlPSJyZ2JhKDIwNiwgMjA2LCAyMDYsIDEpIiBzdHJva2UtZGFzaGFycmF5PSIiIGRhdGEtaXRlbS1pZD0iZ3NEWGE5YTJxIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJyZ2JhKDI1NSwyNTUsMjU1LDEpIj48L3BhdGg+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zm9yZWlnbk9iamVjdCBkYXRhLXRleHQtc2xvdC1uYW1lPSJib2R5IiBpZD0iaXRlbS10ZXh0LXNsb3QtZ3NEWGE5YTJxLWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSIzMDAiIGhlaWdodD0iNDAwIj48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBkYXRhLWl0ZW0taWQ9ImdzRFhhOWEycSIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDMwMHB4OyBoZWlnaHQ6IDQwMHB4OyI+PGRpdiBkYXRhLWl0ZW0tdGV4dC1lbGVtZW50LWl0ZW0taWQ9ImdzRFhhOWEycSIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+ICAgICAgIDxkZWZzPjxjbGlwUGF0aCBpZD0iaXRlbS1jbGlwLXBhdGgtZ3NEWGE5YTJxIj48cGF0aCBkPSJNIDI4OCA0MDAgIEwgMTIgNDAwIGEgMTIgMTIgMCAwIDEgLTEyIC0xMiAgTCAwIDEyICBhIDEyIDEyIDAgMCAxIDEyIC0xMiAgIEwgMjg4IDAgICBhIDEyIDEyIDAgMCAxIDEyIDEyICBMIDMwMCAzODggICBhIDEyIDEyIDAgMCAxIC0xMiAxMiBaIiBkYXRhLWl0ZW0taWQ9ImdzRFhhOWEycSIgc3Ryb2tlLXdpZHRoPSIwcHgiIHN0cm9rZT0icmdiYSgyNTUsIDI1NSwgMjU1LCAwKSIgZmlsbD0icmdiYSgyNTUsIDI1NSwgMjU1LCAwKSIgY2xhc3M9InN2Zy1ldmVudC1sYXllciI+PC9wYXRoPjwvY2xpcFBhdGg+PC9kZWZzPiAgPGcgc3R5bGU9ImNsaXAtcGF0aDogdXJsKCZxdW90OyNpdGVtLWNsaXAtcGF0aC1nc0RYYTlhMnEmcXVvdDspOyI+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSwwLDApIiBkYXRhLXN2Zy1pdGVtLWNvbnRhaW5lci1pZD0ieFE4ZmlwRXFsMyIgZGF0YS1pdGVtLWlkPSJ4UThmaXBFcWwzIiBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcz48L2RlZnM+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz4gPGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJmaWxsLXBhdHRlcm4teFE4ZmlwRXFsMyIgeDE9IjUwJSIgeTE9IjEwMCUiIHgyPSI1MCUiIHkyPSIwJSI+PHN0b3Agb2Zmc2V0PSIwJSIgc3R5bGU9InN0b3AtY29sb3I6IHJnYigyMSwgOTYsIDE3MSk7Ij48L3N0b3A+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdHlsZT0ic3RvcC1jb2xvcjogcmdiKDUxLCAxNTUsIDI0OSk7Ij48L3N0b3A+PC9saW5lYXJHcmFkaWVudD4gPC9kZWZzPjwvZz4gPHBhdGggZD0iTSAyODggNDAgIEwgMTIgNDAgYSAxMiAxMiAwIDAgMSAtMTIgLTEyICBMIDAgMTIgIGEgMTIgMTIgMCAwIDEgMTIgLTEyICAgTCAyODggMCAgIGEgMTIgMTIgMCAwIDEgMTIgMTIgIEwgMzAwIDI4ICAgYSAxMiAxMiAwIDAgMSAtMTIgMTIgWiIgc3Ryb2tlLXdpZHRoPSIwcHgiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIGRhdGEtaXRlbS1pZD0ieFE4ZmlwRXFsMyIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0idXJsKCNmaWxsLXBhdHRlcm4teFE4ZmlwRXFsMykiPjwvcGF0aD48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxmb3JlaWduT2JqZWN0IGRhdGEtdGV4dC1zbG90LW5hbWU9ImJvZHkiIGlkPSJpdGVtLXRleHQtc2xvdC14UThmaXBFcWwzLWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSIzMDAiIGhlaWdodD0iNDAiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGRhdGEtaXRlbS1pZD0ieFE4ZmlwRXFsMyIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDMwMHB4OyBoZWlnaHQ6IDQwcHg7Ij48ZGl2IGRhdGEtaXRlbS10ZXh0LWVsZW1lbnQtaXRlbS1pZD0ieFE4ZmlwRXFsMyIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PHAgc3R5bGU9Im1hcmdpbi10b3A6IDBweDsgbWFyZ2luLWJvdHRvbTogMHB4OyBwYWRkaW5nOiAwcHg7IG1pbi1oZWlnaHQ6IDE4cHg7Ij48c3Ryb25nPkRyb3Bkb3duPC9zdHJvbmc+PC9wPjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPiAgICAgICAgIDxnPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsMTcsMTYuNSkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSJzNVpIVk5GYXQ5IiBkYXRhLWl0ZW0taWQ9InM1WkhWTkZhdDkiIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzPjwvZGVmcz4gPGcgZmlsdGVyPSIiPjxnIG1vZGU9ImVkaXQiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+IDwvZz4gPHBhdGggZD0iTSAwIDEuNiBMIDYuNSA2IEwgMTMgMS42IEwgMTEuNjEgMCBMIDYuNSAzLjYgTCAxLjM5IDAgTCAwIDEuNiAgWiAiIHN0cm9rZS13aWR0aD0iMnB4IiBzdHJva2U9InJnYmEoMjU1LCAyNTUsIDI1NSwgMSkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgZmlsbD0icmdiYSgyNTUsIDI1NSwgMjU1LCAxKSIgc3R5bGU9InN0cm9rZS1saW5lam9pbjogcm91bmQ7Ij48L3BhdGg+PC9nPiAgIDwvZz4gICAgICAgICAgPC9nPjwvZz4gPC9nPjwvZz4gPC9nPgogICAgPC9zdmc+", "description": "Dropdown UI element that expands once clicked"}, {"name": "Dynamic component", "path": "/assets/templates/diagrams/component.json", "preview": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmlld0JveD0iLTQgLTQgMjY4IDE2OCI+PGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIHJvdGF0ZSgwKSIgZGF0YS1zdmctaXRlbS1jb250YWluZXItaWQ9ImI1dGZVMkEwbCIgZGF0YS1pdGVtLWlkPSJiNXRmVTJBMGwiPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+PGc+PGc+IDwvZz4gPHBhdGggZD0iTSAyNjAgMTYwICBMIDAgMTYwIGEgMCAwIDAgMCAxIDAgMCAgTCAwIDAgIGEgMCAwIDAgMCAxIDAgMCAgIEwgMjYwIDAgICBhIDAgMCAwIDAgMSAwIDAgIEwgMjYwIDE2MCAgIGEgMCAwIDAgMCAxIDAgMCBaIiBzdHJva2Utd2lkdGg9IjJweCIgc3Ryb2tlPSJyZ2JhKDE5MywgMTk0LCAxOTUsIDEpIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoMjQwLDI0MCwyNDAsMS4wKSIvPjwvZz48L2c+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ii8+PC9nPiAgICAgICAgPGc+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw2MCw0MCkiPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+PGc+PGc+IDwvZz4gPHBhdGggZD0iTSAxMzAgODAgIEwgMTAgODAgYSAxMCAxMCAwIDAgMSAtMTAgLTEwICBMIDAgMTAgIGEgMTAgMTAgMCAwIDEgMTAgLTEwICAgTCAxMzAgMCAgIGEgMTAgMTAgMCAwIDEgMTAgMTAgIEwgMTQwIDcwICAgYSAxMCAxMCAwIDAgMSAtMTAgMTAgWiIgc3Ryb2tlLXdpZHRoPSIwcHgiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoODIsMTM5LDE2NSwxKSIvPjwvZz48L2c+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zm9yZWlnbk9iamVjdCBpZD0iaXRlbS10ZXh0LXNsb3QtbHNDdTA0QUJCRWVyLWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSIxNDAiIGhlaWdodD0iODAiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGNsYXNzPSJpdGVtLXRleHQtY29udGFpbmVyIiBzdHlsZT0iY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTsgZm9udC1zaXplOiAxNHB4OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgcGFkZGluZzogMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IGRpc3BsYXk6IHRhYmxlLWNlbGw7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtd2VpZ2h0OiBib2xkOyB3aWR0aDogMTQwcHg7IGhlaWdodDogODBweDsiPjxkaXYgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+TW9yZTwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPiAgICAgICAgPGcvPiA8L2c+PC9nPjwvZz4gPC9nPjwvZz48L3N2Zz4=", "description": "A button that triggers loading of external diagram on top of it"}, {"name": "Frame-by-frame diagram", "path": "/assets/templates/diagrams/framed-diagram.json", "preview": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmlld0JveD0iLTIgLTIgNjI0IDM0NCI+PGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIHJvdGF0ZSgwKSIgZGF0YS1zdmctaXRlbS1jb250YWluZXItaWQ9IkJxZFJCQ2JTVWdaIiBkYXRhLWl0ZW0taWQ9IkJxZFJCQ2JTVWdaIj4gPGc+IDwvZz4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij48Zz48ZGVmcz48ZmlsdGVyIGlkPSJpdGVtLWVmZmVjdC1kcm9wLXNoYWRvdy1CcWRSQkNiU1VnWi0wIiB4PSItNTAwJSIgeT0iLTUwMCUiIHdpZHRoPSIyMDAwJSIgaGVpZ2h0PSIyMDAwJSI+PGZlR2F1c3NpYW5CbHVyIGluPSJTb3VyY2VHcmFwaGljIiBzdGREZXZpYXRpb249IjIwIi8+PC9maWx0ZXI+PC9kZWZzPjxwYXRoIGQ9Ik0gNjEwIDM0MCAgTCAxMCAzNDAgYSAxMCAxMCAwIDAgMSAtMTAgLTEwICBMIDAgMTAgIGEgMTAgMTAgMCAwIDEgMTAgLTEwICAgTCA2MTAgMCAgIGEgMTAgMTAgMCAwIDEgMTAgMTAgIEwgNjIwIDMzMCAgIGEgMTAgMTAgMCAwIDEgLTEwIDEwIFoiIHN0cm9rZT0ibm9uZSIgZmlsbD0icmdiYSgwLDAsMCwxLjApIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgzIDMpIiBzdHlsZT0ib3BhY2l0eTogMC4yIiBmaWx0ZXI9InVybCgjaXRlbS1lZmZlY3QtZHJvcC1zaGFkb3ctQnFkUkJDYlNVZ1otMCkiLz48L2c+IDxkZWZzLz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPjxnPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gNjEwIDM0MCAgTCAxMCAzNDAgYSAxMCAxMCAwIDAgMSAtMTAgLTEwICBMIDAgMTAgIGEgMTAgMTAgMCAwIDEgMTAgLTEwICAgTCA2MTAgMCAgIGEgMTAgMTAgMCAwIDEgMTAgMTAgIEwgNjIwIDMzMCAgIGEgMTAgMTAgMCAwIDEgLTEwIDEwIFoiIHN0cm9rZS13aWR0aD0iMXB4IiBzdHJva2U9InJnYmEoMTU4LCAxNTcsIDE1NywgMSkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0icmdiYSgyNDAsIDI0MCwgMjQwLCAxKSIvPjwvZz48L2c+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ii8+PC9nPiAgICAgICAgPGc+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSwxNTUsMCkiPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyIvPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zm9yZWlnbk9iamVjdCBpZD0iaXRlbS10ZXh0LXNsb3QtNHRjV2F4MTJHd0YtYm9keSIgeD0iMCIgeT0iMCIgd2lkdGg9IjMxMy42MDA4OTMwNjkwMjk5IiBoZWlnaHQ9IjQzLjYwMDg3MjMwMDAzMDY2Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBjbGFzcz0iaXRlbS10ZXh0LWNvbnRhaW5lciIgc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtc2l6ZTogMjBweDsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IHBhZGRpbmc6IDBweDsgdGV4dC1hbGlnbjogY2VudGVyOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyBkaXNwbGF5OiB0YWJsZS1jZWxsOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBmb250LXdlaWdodDogYm9sZDsgd2lkdGg6IDMxMy42MDFweDsgaGVpZ2h0OiA0My42MDA5cHg7Ij48ZGl2IGNsYXNzPSJpdGVtLXRleHQtZWxlbWVudCIgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsiPjxwIHN0eWxlPSJtYXJnaW4tdG9wOiAwcHg7IG1hcmdpbi1ib3R0b206IDBweDsgcGFkZGluZzogMHB4OyBtaW4taGVpZ2h0OiAxOHB4OyI+QW5pbWF0ZWQgRGlhZ3JhbTwvcD48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz4gICAgICAgICA8L2c+PC9nPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNzQsNjApIj4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzLz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPjxnPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gNDcyIDI2NiAgTCAwIDI2NiBhIDAgMCAwIDAgMSAwIDAgIEwgMCAwICBhIDAgMCAwIDAgMSAwIDAgICBMIDQ3MiAwICAgYSAwIDAgMCAwIDEgMCAwICBMIDQ3MiAyNjYgICBhIDAgMCAwIDAgMSAwIDAgWiIgc3Ryb2tlLXdpZHRoPSIxcHgiIHN0cm9rZT0icmdiYSgyMTIsMjEyLDIxMiwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoMjUwLCAyNTAsIDI1MCwgMSkiLz48L2c+PC9nPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyIvPjwvZz4gICAgICAgIDxnPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsMjYuOTAxOTk0NTYxMzk1NDQsMjQuNTA5OTcyODA2OTc2MDY2KSI+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcy8+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz48Zz48Zz4gPC9nPiA8cGF0aCBkPSJNIDYwIDQwICBMIDAgNDAgYSAwIDAgMCAwIDEgMCAwICBMIDAgMCAgYSAwIDAgMCAwIDEgMCAwICAgTCA2MCAwICAgYSAwIDAgMCAwIDEgMCAwICBMIDYwIDQwICAgYSAwIDAgMCAwIDEgMCAwIFoiIHN0cm9rZS13aWR0aD0iMnB4IiBzdHJva2U9InJnYmEoMzAsMzAsMzAsMS4wKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJyZ2JhKDI0MCwyNDAsMjQwLDEuMCkiLz48L2c+PC9nPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyIvPjwvZz4gICAgICAgICA8L2c+PC9nPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsODYsNDApIj4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzLz4gPGcgZmlsdGVyPSIiPjxnIG1vZGU9ImVkaXQiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+IDwvZz4gPHBhdGggZD0iTSAwLjkgNC41MSBDIDIwLjYgNC41MSA0MC4zICA1LjE2IDYwIDUuMTYgIiBzdHJva2Utd2lkdGg9IjJweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZS1saW5lam9pbjogcm91bmQ7Ii8+IDxnPjxwYXRoIGQ9Ik0gNjAuMDAwMDAwMjI1NjY4ODMgMTAuMTYyNzA0NDY3NzczNDM4IEwgODAuMDAwMDAwMjI1NjY4ODMgNS4xNjI3MDQ0Njc3NzM0Mzc1IEwgNjAuMDAwMDAwMjI1NjY4ODMgMC4xNjI3MDQ0Njc3NzM0Mzc1ICB6ICIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS13aWR0aD0iMiIgZmlsbD0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9nPjwvZz4gICA8L2c+ICAgICAgICAgPC9nPjwvZz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDExNiw3MCkiPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+PGcgbW9kZT0iZWRpdCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz4gPC9nPiA8cGF0aCBkPSJNIDEwMCAwIEMgMTAwIDM4Ljg3IDAgIDIxLjEzIDAgNjAgIiBzdHJva2Utd2lkdGg9IjJweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgZmlsbD0ibm9uZSIgc3R5bGU9InN0cm9rZS1saW5lam9pbjogcm91bmQ7Ii8+IDxnPjxwYXRoIGQ9Ik0gLTUgNjAgTCAwIDgwIEwgNSA2MCAgeiAiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9InJnYmEoMzAsMzAsMzAsMS4wKSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvZz48L2c+ICAgPC9nPiAgICAgICAgIDwvZz48L2c+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSwyMTYsNzApIj4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzLz4gPGcgZmlsdGVyPSIiPjxnIG1vZGU9ImVkaXQiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+IDwvZz4gPHBhdGggZD0iTSAwIDAgQyAwIDQwLjY5IDEwMCAgMjkuMzEgMTAwIDcwICIgc3Ryb2tlLXdpZHRoPSIycHgiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIGZpbGw9Im5vbmUiIHN0eWxlPSJzdHJva2UtbGluZWpvaW46IHJvdW5kOyIvPiA8Zz48cGF0aCBkPSJNIDk1IDcwIEwgMTAwIDkwIEwgMTA1IDcwICB6ICIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS13aWR0aD0iMiIgZmlsbD0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PC9nPjwvZz4gICA8L2c+ICAgICAgICAgPC9nPjwvZz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDI2NiwxNjApIj4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzLz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPjxnPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gMCAyNSBBIDUwIDI1IDAgMSAxIDEwMCAyNSAgQSA1MCAyNSAwIDEgMSAwIDI1IFoiIHN0cm9rZS13aWR0aD0iMnB4IiBzdHJva2U9InJnYmEoMzAsMzAsMzAsMS4wKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJyZ2JhKDI0MCwyNDAsMjQwLDEuMCkiLz48L2c+PC9nPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyIvPjwvZz4gICAgICAgICA8L2c+PC9nPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNjYsMTUwKSI+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcy8+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz48Zz48Zz4gPC9nPiA8cGF0aCBkPSJNIDAgMjUgQSA1MCAyNSAwIDEgMSAxMDAgMjUgIEEgNTAgMjUgMCAxIDEgMCAyNSBaIiBzdHJva2Utd2lkdGg9IjJweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0icmdiYSgyNDAsMjQwLDI0MCwxLjApIi8+PC9nPjwvZz48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiLz48L2c+ICAgICAgICAgPC9nPjwvZz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDE2NiwyMCkiPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+PGc+PGc+IDwvZz4gPHBhdGggZD0iTSA4MCA1MCAgTCAyMCA1MCBhIDIwIDIwIDAgMCAxIC0yMCAtMjAgIEwgMCAyMCAgYSAyMCAyMCAwIDAgMSAyMCAtMjAgICBMIDgwIDAgICBhIDIwIDIwIDAgMCAxIDIwIDIwICBMIDEwMCAzMCAgIGEgMjAgMjAgMCAwIDEgLTIwIDIwIFoiIHN0cm9rZS13aWR0aD0iMnB4IiBzdHJva2U9InJnYmEoMzAsMzAsMzAsMS4wKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJyZ2JhKDI0MCwyNDAsMjQwLDEuMCkiLz48L2c+PC9nPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyIvPjwvZz4gICAgICAgICA8L2c+PC9nPjwvZz4gPC9nPjwvZz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDcsMTQwKSI+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMC42OyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzLz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPjxnPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gMCAzMCBBIDMwIDMwIDAgMSAxIDYwIDMwICBBIDMwIDMwIDAgMSAxIDAgMzAgWiIgc3Ryb2tlLXdpZHRoPSIwcHgiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoNzgsIDEzMSwgMjQ1LCAxKSIvPjwvZz48L2c+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ii8+PC9nPiAgICAgICAgPGc+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSwxNSwxOCkiPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+PGcgbW9kZT0iZWRpdCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz4gPC9nPiA8cGF0aCBkPSJNIDIwIDAgTCAyMCAyNSBMIDAgMTIuNSBMIDIwIDAgIFogIiBzdHJva2Utd2lkdGg9IjRweCIgc3Ryb2tlPSJyZ2JhKDI1NSwgMjU1LCAyNTUsIDEpIiBzdHJva2UtZGFzaGFycmF5PSIiIGZpbGw9InJnYmEoMjU1LCAyNTUsIDI1NSwgMSkiIHN0eWxlPSJzdHJva2UtbGluZWpvaW46IHJvdW5kOyIvPjwvZz4gICA8L2c+ICAgICAgICAgPC9nPjwvZz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgtMSwxLjIyNDY0Njc5OTE0NzM1MzJlLTE2LC0xLjIyNDY0Njc5OTE0NzM1MzJlLTE2LC0xLDYwLDYwKSI+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcy8+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDA7Ij48Zz48Zz48Zz4gPC9nPiA8cGF0aCBkPSJNIDAgMzAgQSAzMCAzMCAwIDEgMSA2MCAzMCAgQSAzMCAzMCAwIDEgMSAwIDMwIFoiIHN0cm9rZS13aWR0aD0iMnB4IiBzdHJva2U9InJnYmEoMzAsMzAsMzAsMS4wKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJyZ2JhKDI0MCwyNDAsMjQwLDEuMCkiLz48L2c+PC9nPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAwOyIvPjwvZz4gICAgICAgICA8L2c+PC9nPjwvZz4gPC9nPjwvZz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDU1MywxNDApIj4gIDxnIHN0eWxlPSJvcGFjaXR5OiAwLjY7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+PGc+PGc+IDwvZz4gPHBhdGggZD0iTSAwIDMwIEEgMzAgMzAgMCAxIDEgNjAgMzAgIEEgMzAgMzAgMCAxIDEgMCAzMCBaIiBzdHJva2Utd2lkdGg9IjBweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0icmdiYSg3OCwgMTMxLCAyNDUsIDEpIi8+PC9nPjwvZz48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiLz48L2c+ICAgICAgICA8Zz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgtMSwxLjIyNDY0Njc5OTE0NzM1MzJlLTE2LC0xLjIyNDY0Njc5OTE0NzM1MzJlLTE2LC0xLDQ0LDQzKSI+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcy8+IDxnIGZpbHRlcj0iIj48ZyBtb2RlPSJlZGl0IiBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gMjAgMCBMIDIwIDI1IEwgMCAxMi41IEwgMjAgMCAgWiAiIHN0cm9rZS13aWR0aD0iNHB4IiBzdHJva2U9InJnYmEoMjU1LCAyNTUsIDI1NSwgMSkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgZmlsbD0icmdiYSgyNTUsIDI1NSwgMjU1LCAxKSIgc3R5bGU9InN0cm9rZS1saW5lam9pbjogcm91bmQ7Ii8+PC9nPiAgIDwvZz4gICAgICAgICA8L2c+PC9nPjxnIHRyYW5zZm9ybT0ibWF0cml4KC0xLDEuMjI0NjQ2Nzk5MTQ3MzUzMmUtMTYsLTEuMjI0NjQ2Nzk5MTQ3MzUzMmUtMTYsLTEsNjAsNjApIj4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzLz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMDsiPjxnPjxnPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gMCAzMCBBIDMwIDMwIDAgMSAxIDYwIDMwICBBIDMwIDMwIDAgMSAxIDAgMzAgWiIgc3Ryb2tlLXdpZHRoPSIycHgiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoMjQwLDI0MCwyNDAsMS4wKSIvPjwvZz48L2c+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDA7Ii8+PC9nPiAgICAgICAgIDwvZz48L2c+PC9nPiA8L2c+PC9nPjwvZz4gPC9nPjwvZz48L3N2Zz4=", "description": "Lets you design simple animated diagram that shows elements frame by frame.\nTo make it work you need to tag your items with \"frame-1\", \"frame-2\", \"frame-3\" and so on for every frame"}, {"name": "Hierarchy chart", "path": "/assets/templates/diagrams/hierarchy-chart.json", "preview": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmlld0JveD0iLTEwIC0xMCAzNDAgMjIwIj48ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDEwMCwwKSByb3RhdGUoMCkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSJaZ2txU09HSVkiIGRhdGEtaXRlbS1pZD0iWmdrcVNPR0lZIj4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzLz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPjxnPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gMTAwIDYwICBMIDIwIDYwIGEgMjAgMjAgMCAwIDEgLTIwIC0yMCAgTCAwIDIwICBhIDIwIDIwIDAgMCAxIDIwIC0yMCAgIEwgMTAwIDAgICBhIDIwIDIwIDAgMCAxIDIwIDIwICBMIDEyMCA0MCAgIGEgMjAgMjAgMCAwIDEgLTIwIDIwIFoiIHN0cm9rZS13aWR0aD0iMnB4IiBzdHJva2U9InJnYmEoMzAsMzAsMzAsMS4wKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtZGFzaG9mZnNldD0iMCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0icmdiYSgyNDAsMjQwLDI0MCwxLjApIi8+PC9nPjwvZz48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiLz48L2c+ICA8ZyBpZD0iYW5pbWF0aW9uLWNvbnRhaW5lci1aZ2txU09HSVkiLz4gICAgICAgPC9nPjwvZz4KPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDE0MCkgcm90YXRlKDApIiBkYXRhLXN2Zy1pdGVtLWNvbnRhaW5lci1pZD0iaDdSV0p0UTBLIiBkYXRhLWl0ZW0taWQ9Img3UldKdFEwSyI+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcy8+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz48Zz48Zz4gPC9nPiA8cGF0aCBkPSJNIDEwMCA2MCAgTCAyMCA2MCBhIDIwIDIwIDAgMCAxIC0yMCAtMjAgIEwgMCAyMCAgYSAyMCAyMCAwIDAgMSAyMCAtMjAgICBMIDEwMCAwICAgYSAyMCAyMCAwIDAgMSAyMCAyMCAgTCAxMjAgNDAgICBhIDIwIDIwIDAgMCAxIC0yMCAyMCBaIiBzdHJva2Utd2lkdGg9IjJweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLWRhc2hvZmZzZXQ9IjAiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoMjQwLDI0MCwyNDAsMS4wKSIvPjwvZz48L2c+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ii8+PC9nPiAgPGcgaWQ9ImFuaW1hdGlvbi1jb250YWluZXItaDdSV0p0UTBLIi8+ICAgICAgIDwvZz48L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNjAsNjApIHJvdGF0ZSgwKSIgZGF0YS1zdmctaXRlbS1jb250YWluZXItaWQ9ImRwUXQ3Tlk4dyIgZGF0YS1pdGVtLWlkPSJkcFF0N05ZOHciPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+PGcgbW9kZT0iZWRpdCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz4gPC9nPiA8cGF0aCBkPSJNIDEwMCAwIEMgMTAwIDM4Ljg3IDAgIDIxLjEzIDAgNjAgIiBzdHJva2Utd2lkdGg9IjJweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLWRhc2hvZmZzZXQ9IjAiIGZpbGw9Im5vbmUiIHN0eWxlPSJzdHJva2UtbGluZWpvaW46IHJvdW5kOyIvPiA8Zz48cGF0aCBkPSJNIC01IDYwIEwgMCA4MCBMIDUgNjAgIHogIiBzdHJva2U9InJnYmEoMzAsMzAsMzAsMS4wKSIgc3Ryb2tlLXdpZHRoPSIyIiBmaWxsPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48L2c+PC9nPiAgIDwvZz4gIDxnIGlkPSJhbmltYXRpb24tY29udGFpbmVyLWRwUXQ3Tlk4dyIvPiAgICAgICA8L2c+PC9nPgo8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDIwMCwxNDApIHJvdGF0ZSgwKSIgZGF0YS1zdmctaXRlbS1jb250YWluZXItaWQ9Ik1Nanh4QXptVzQiIGRhdGEtaXRlbS1pZD0iTU1qeHhBem1XNCI+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcy8+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz48Zz48Zz4gPC9nPiA8cGF0aCBkPSJNIDEwMCA2MCAgTCAyMCA2MCBhIDIwIDIwIDAgMCAxIC0yMCAtMjAgIEwgMCAyMCAgYSAyMCAyMCAwIDAgMSAyMCAtMjAgICBMIDEwMCAwICAgYSAyMCAyMCAwIDAgMSAyMCAyMCAgTCAxMjAgNDAgICBhIDIwIDIwIDAgMCAxIC0yMCAyMCBaIiBzdHJva2Utd2lkdGg9IjJweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0icmdiYSgyNDAsMjQwLDI0MCwxLjApIi8+PC9nPjwvZz48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiLz48L2c+ICA8ZyBpZD0iYW5pbWF0aW9uLWNvbnRhaW5lci1NTWp4eEF6bVc0Ii8+ICAgICAgIDwvZz48L2c+CjxnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTYwLDYwKSByb3RhdGUoMCkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSJSSkhNU2FYUTYiIGRhdGEtaXRlbS1pZD0iUkpITVNhWFE2Ij4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzLz4gPGcgZmlsdGVyPSIiPjxnIG1vZGU9ImVkaXQiIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+IDwvZz4gPHBhdGggZD0iTSAwIDAgQyAwIDM4Ljg3IDEwMCAgMjEuMTMgMTAwIDYwICIgc3Ryb2tlLXdpZHRoPSIycHgiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1kYXNob2Zmc2V0PSIwIiBmaWxsPSJub25lIiBzdHlsZT0ic3Ryb2tlLWxpbmVqb2luOiByb3VuZDsiLz4gPGc+PHBhdGggZD0iTSA5NSA2MCBMIDEwMCA4MCBMIDEwNSA2MCAgeiAiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9InJnYmEoMzAsMzAsMzAsMS4wKSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjwvZz48L2c+ICAgPC9nPiAgPGcgaWQ9ImFuaW1hdGlvbi1jb250YWluZXItUkpITVNhWFE2Ii8+ICAgICAgIDwvZz48L2c+PC9zdmc+", "description": ""}, {"name": "Layered diagram", "path": "/assets/templates/diagrams/layered-diagram.json", "preview": "data:image/svg+xml;base64,PHN2ZyByZWY9InN2Z0NvbnRhaW5lciIgY2xhc3M9ImV4cG9ydC1zdmctcHJldmlldyIKICAgICAgICB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIyMDBweCIKICAgICAgICB2aWV3Qm94PSItMTAgLTEwIDUyMCAzMjAiCiAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiCiAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICAgICAgIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgogICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiA+CiAgICAgICAgPGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIHJvdGF0ZSgwKSIgZGF0YS1zdmctaXRlbS1jb250YWluZXItaWQ9Ii1JNURLQ0lVaiIgZGF0YS1pdGVtLWlkPSItSTVES0NJVWoiPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+PGc+PGc+IDwvZz4gPHBhdGggZD0iTSA0MDQgMCAgTCA0ODAgMCBhIDIwIDIwIDAgMCAxIDIwIDIwIEwgNTAwIDI4MCBhIDIwIDIwIDAgMCAxIC0yMCAyMEwgMjAgMzAwIGEgMjAgMjAgMCAwIDEgLTIwIC0yMCBMIDAgMjAgIGEgMjAgMjAgMCAwIDEgMjAgLTIwICBMIDk2IDAiIHN0cm9rZS13aWR0aD0iM3B4IiBzdHJva2U9InJnYmEoMTYwLDE2MCwxNjAsMS4wKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJub25lIi8+PC9nPjwvZz48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxmb3JlaWduT2JqZWN0IGlkPSJpdGVtLXRleHQtc2xvdC0tSTVES0NJVWotdGl0bGUiIHg9Ijk2IiB5PSItMjUiIHdpZHRoPSIzMDgiIGhlaWdodD0iNTAiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGNsYXNzPSJpdGVtLXRleHQtY29udGFpbmVyIiBzdHlsZT0iY29sb3I6IHJnYigxNTAsIDE1MCwgMTUwKTsgZm9udC1zaXplOiAxNnB4OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgcGFkZGluZzogMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IGRpc3BsYXk6IHRhYmxlLWNlbGw7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtd2VpZ2h0OiBib2xkOyB3aWR0aDogMzA4cHg7IGhlaWdodDogNTBweDsiPjxkaXYgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PHAgc3R5bGU9Im1hcmdpbi10b3A6IDBweDsgbWFyZ2luLWJvdHRvbTogMHB4OyBwYWRkaW5nOiAwcHg7IG1pbi1oZWlnaHQ6IDE4cHg7Ij5MYXllcmVkIERpYWdyYW08L3A+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+ICAgICAgICA8Zz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDIwLDI0MCkiPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+PGc+PGc+IDwvZz4gPHBhdGggZD0iTSAxMTAgNDAgIEwgMTAgNDAgYSAxMCAxMCAwIDAgMSAtMTAgLTEwICBMIDAgMTAgIGEgMTAgMTAgMCAwIDEgMTAgLTEwICAgTCAxMTAgMCAgIGEgMTAgMTAgMCAwIDEgMTAgMTAgIEwgMTIwIDMwICAgYSAxMCAxMCAwIDAgMSAtMTAgMTAgWiIgc3Ryb2tlLXdpZHRoPSIwcHgiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoODAsIDE4MiwgMjI4LCAxKSIvPjwvZz48L2c+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zm9yZWlnbk9iamVjdCBpZD0iaXRlbS10ZXh0LXNsb3QteFBNYU9wNHBILWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSIxMjAiIGhlaWdodD0iNDAiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGNsYXNzPSJpdGVtLXRleHQtY29udGFpbmVyIiBzdHlsZT0iY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTsgZm9udC1zaXplOiAxNHB4OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgcGFkZGluZzogMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IGRpc3BsYXk6IHRhYmxlLWNlbGw7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtd2VpZ2h0OiBib2xkOyB3aWR0aDogMTIwcHg7IGhlaWdodDogNDBweDsiPjxkaXYgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PHAgc3R5bGU9Im1hcmdpbi10b3A6IDBweDsgbWFyZ2luLWJvdHRvbTogMHB4OyBwYWRkaW5nOiAwcHg7IG1pbi1oZWlnaHQ6IDE4cHg7Ij5MYXllciAxPC9wPjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPiAgICAgICAgIDwvZz48L2c+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSwxNjAsMjQwKSI+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcy8+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz48Zz48Zz4gPC9nPiA8cGF0aCBkPSJNIDExMCA0MCAgTCAxMCA0MCBhIDEwIDEwIDAgMCAxIC0xMCAtMTAgIEwgMCAxMCAgYSAxMCAxMCAwIDAgMSAxMCAtMTAgICBMIDExMCAwICAgYSAxMCAxMCAwIDAgMSAxMCAxMCAgTCAxMjAgMzAgICBhIDEwIDEwIDAgMCAxIC0xMCAxMCBaIiBzdHJva2Utd2lkdGg9IjBweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0icmdiYSg4MCwgMTgyLCAyMjgsIDEpIi8+PC9nPjwvZz48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxmb3JlaWduT2JqZWN0IGlkPSJpdGVtLXRleHQtc2xvdC11Vlh0X0szSjliLWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSIxMjAiIGhlaWdodD0iNDAiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGNsYXNzPSJpdGVtLXRleHQtY29udGFpbmVyIiBzdHlsZT0iY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTsgZm9udC1zaXplOiAxNHB4OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgcGFkZGluZzogMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IGRpc3BsYXk6IHRhYmxlLWNlbGw7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IGZvbnQtd2VpZ2h0OiBib2xkOyB3aWR0aDogMTIwcHg7IGhlaWdodDogNDBweDsiPjxkaXYgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PHAgc3R5bGU9Im1hcmdpbi10b3A6IDBweDsgbWFyZ2luLWJvdHRvbTogMHB4OyBwYWRkaW5nOiAwcHg7IG1pbi1oZWlnaHQ6IDE4cHg7Ij5MYXllciAyPC9wPjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPiAgICAgICAgIDwvZz48L2c+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSwzMDAsMjQwKSI+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcy8+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz48Zz48Zz4gPC9nPiA8cGF0aCBkPSJNIDExMCA0MCAgTCAxMCA0MCBhIDEwIDEwIDAgMCAxIC0xMCAtMTAgIEwgMCAxMCAgYSAxMCAxMCAwIDAgMSAxMCAtMTAgICBMIDExMCAwICAgYSAxMCAxMCAwIDAgMSAxMCAxMCAgTCAxMjAgMzAgICBhIDEwIDEwIDAgMCAxIC0xMCAxMCBaIiBzdHJva2Utd2lkdGg9IjBweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0icmdiYSg4MCwgMTgyLCAyMjgsIDEpIi8+PC9nPjwvZz48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxmb3JlaWduT2JqZWN0IGlkPSJpdGVtLXRleHQtc2xvdC1NazVyZmV6Zy0tYm9keSIgeD0iMCIgeT0iMCIgd2lkdGg9IjEyMCIgaGVpZ2h0PSI0MCI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdpZHRoOiAxMjBweDsgaGVpZ2h0OiA0MHB4OyI+PGRpdiBjbGFzcz0iaXRlbS10ZXh0LWVsZW1lbnQiIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ij48cCBzdHlsZT0ibWFyZ2luLXRvcDogMHB4OyBtYXJnaW4tYm90dG9tOiAwcHg7IHBhZGRpbmc6IDBweDsgbWluLWhlaWdodDogMThweDsiPkxheWVyIDM8L3A+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+ICAgICAgICAgPC9nPjwvZz48L2c+IDwvZz48L2c+CiAgICA8L3N2Zz4=", "description": ""}, {"name": "Mind map", "path": "/assets/templates/diagrams/mind-map.json", "preview": "/assets/templates/previews/mind-map.svg", "description": ""}, {"name": "Popup", "path": "/assets/templates/ui/popup.json", "preview": "data:image/svg+xml;base64,PHN2ZyByZWY9InN2Z0NvbnRhaW5lciIgY2xhc3M9ImV4cG9ydC1zdmctcHJldmlldyIKICAgICAgICB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIyMDBweCIKICAgICAgICB2aWV3Qm94PSItMTAgLTEwIDQwMCAyNDAiCiAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiCiAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICAgICAgIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgogICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiA+CiAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSByb3RhdGUoMCkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSI1Ri1VSF91Y3AiIGRhdGEtaXRlbS1pZD0iNUYtVUhfdWNwIiBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPjxnPjxkZWZzPjxmaWx0ZXIgaWQ9Iml0ZW0tZWZmZWN0LWRyb3Atc2hhZG93LTVGLVVIX3VjcC0wIiB4PSItNTAwJSIgeT0iLTUwMCUiIHdpZHRoPSIyMDAwJSIgaGVpZ2h0PSIyMDAwJSI+PGZlR2F1c3NpYW5CbHVyIGluPSJTb3VyY2VHcmFwaGljIiBzdGREZXZpYXRpb249IjUiPjwvZmVHYXVzc2lhbkJsdXI+PC9maWx0ZXI+PC9kZWZzPjxwYXRoIGQ9Ik0gMzYwIDIyMCAgTCAyMCAyMjAgYSAyMCAyMCAwIDAgMSAtMjAgLTIwICBMIDAgMjAgIGEgMjAgMjAgMCAwIDEgMjAgLTIwICAgTCAzNjAgMCAgIGEgMjAgMjAgMCAwIDEgMjAgMjAgIEwgMzgwIDIwMCAgIGEgMjAgMjAgMCAwIDEgLTIwIDIwIFoiIHN0cm9rZT0ibm9uZSIgZmlsbD0icmdiYSgwLDAsMCwxLjApIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyIDIpIiBzdHlsZT0ib3BhY2l0eTogMC4zIiBmaWx0ZXI9InVybCgjaXRlbS1lZmZlY3QtZHJvcC1zaGFkb3ctNUYtVUhfdWNwLTApIj48L3BhdGg+PC9nPiA8ZGVmcz48L2RlZnM+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz4gPC9nPiA8cGF0aCBkPSJNIDM2MCAyMjAgIEwgMjAgMjIwIGEgMjAgMjAgMCAwIDEgLTIwIC0yMCAgTCAwIDIwICBhIDIwIDIwIDAgMCAxIDIwIC0yMCAgIEwgMzYwIDAgICBhIDIwIDIwIDAgMCAxIDIwIDIwICBMIDM4MCAyMDAgICBhIDIwIDIwIDAgMCAxIC0yMCAyMCBaIiBzdHJva2Utd2lkdGg9IjFweCIgc3Ryb2tlPSJyZ2JhKDIwNiwgMjA2LCAyMDYsIDEpIiBzdHJva2UtZGFzaGFycmF5PSIiIGRhdGEtaXRlbS1pZD0iNUYtVUhfdWNwIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJyZ2JhKDI0MywyNDMsMjQzLDEpIj48L3BhdGg+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zm9yZWlnbk9iamVjdCBkYXRhLXRleHQtc2xvdC1uYW1lPSJib2R5IiBpZD0iaXRlbS10ZXh0LXNsb3QtNUYtVUhfdWNwLWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSIzODAiIGhlaWdodD0iMjIwIj48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBkYXRhLWl0ZW0taWQ9IjVGLVVIX3VjcCIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDMwLCAzMCwgMzApOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAyMHB4IDBweCAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDM4MHB4OyBoZWlnaHQ6IDIyMHB4OyI+PGRpdiBkYXRhLWl0ZW0tdGV4dC1lbGVtZW50LWl0ZW0taWQ9IjVGLVVIX3VjcCIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PHAgc3R5bGU9Im1hcmdpbi10b3A6IDBweDsgbWFyZ2luLWJvdHRvbTogMHB4OyBwYWRkaW5nOiAwcHg7IG1pbi1oZWlnaHQ6IDE4cHg7Ij5QbGFjZWhvbGRlcjwvcD48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz4gICAgICAgICA8Zz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDgwLDApIiBkYXRhLXN2Zy1pdGVtLWNvbnRhaW5lci1pZD0icm02QjU1NThhNyIgZGF0YS1pdGVtLWlkPSJybTZCNTU1OGE3IiBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcz48L2RlZnM+IDxnIGZpbHRlcj0iIj4gICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxmb3JlaWduT2JqZWN0IGRhdGEtdGV4dC1zbG90LW5hbWU9ImJvZHkiIGlkPSJpdGVtLXRleHQtc2xvdC1ybTZCNTU1OGE3LWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSIyMjAiIGhlaWdodD0iNDUiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGRhdGEtaXRlbS1pZD0icm02QjU1NThhNyIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDMwLCAzMCwgMzApOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDIyMHB4OyBoZWlnaHQ6IDQ1cHg7Ij48ZGl2IGRhdGEtaXRlbS10ZXh0LWVsZW1lbnQtaXRlbS1pZD0icm02QjU1NThhNyIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PHAgc3R5bGU9Im1hcmdpbi10b3A6IDBweDsgbWFyZ2luLWJvdHRvbTogMHB4OyBwYWRkaW5nOiAwcHg7IG1pbi1oZWlnaHQ6IDE4cHg7Ij48c3Ryb25nPlRpdGxlIHBsYWNlaG9sZGVyPC9zdHJvbmc+PC9wPjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPiAgICAgICAgICA8L2c+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSwzNDUsNSkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSJVQnE3ODRENDJHIiBkYXRhLWl0ZW0taWQ9IlVCcTc4NEQ0MkciIHN0eWxlPSJvcGFjaXR5OiAwLjY7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnM+PC9kZWZzPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+IDwvZz4gPHBhdGggZD0iTSAwIDE1IEEgMTUgMTUgMCAxIDEgMzAgMTUgIEEgMTUgMTUgMCAxIDEgMCAxNSBaIiBzdHJva2Utd2lkdGg9IjBweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgZGF0YS1pdGVtLWlkPSJVQnE3ODRENDJHIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSIjNDNBMkZCIj48L3BhdGg+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zm9yZWlnbk9iamVjdCBkYXRhLXRleHQtc2xvdC1uYW1lPSJib2R5IiBpZD0iaXRlbS10ZXh0LXNsb3QtVUJxNzg0RDQyRy1ib2R5IiB4PSIwIiB5PSIwIiB3aWR0aD0iMzAiIGhlaWdodD0iMzAiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGRhdGEtaXRlbS1pZD0iVUJxNzg0RDQyRyIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDMwcHg7IGhlaWdodDogMzBweDsiPjxkaXYgZGF0YS1pdGVtLXRleHQtZWxlbWVudC1pdGVtLWlkPSJVQnE3ODRENDJHIiBjbGFzcz0iaXRlbS10ZXh0LWVsZW1lbnQiIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ij48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz4gICAgICAgICA8Zz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDcuMzQzMTQ1NzUwNTA3NjE4LDcuMzQzMTQ1NzUwNTA3NjMyKSIgZGF0YS1zdmctaXRlbS1jb250YWluZXItaWQ9Imt6cmxTWXkwOGwiIGRhdGEtaXRlbS1pZD0ia3pybFNZeTA4bCIgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnM+PC9kZWZzPiA8ZyBmaWx0ZXI9IiI+PGcgbW9kZT0iZWRpdCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz4gPC9nPiA8cGF0aCBkPSJNIDMuODMgNy44MyBMIDAuODMgNC44MyBBIDIuODMgMi44MyAwIDAgMSA0LjgzIDAuODNMIDcuODMgMy44MyBMIDEwLjgzIDAuODMgQSAyLjgzIDIuODMgMCAwIDEgMTQuODMgNC44M0wgMTEuODMgNy44MyBMIDE0LjgzIDEwLjgzIEEgMi44MyAyLjgzIDAgMCAxIDEwLjgzIDE0LjgzTCA3LjgzIDExLjgzIEwgNC44MyAxNC44MyBBIDIuODMgMi44MyAwIDAgMSAwLjgzIDEwLjgzTCAzLjgzIDcuODMgIFogIiBzdHJva2Utd2lkdGg9IjBweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgZmlsbD0iI0ZGRkZGRiIgc3R5bGU9InN0cm9rZS1saW5lam9pbjogcm91bmQ7Ij48L3BhdGg+PC9nPiAgIDwvZz4gICAgICAgICA8Zz48L2c+IDwvZz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDAsMCkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSJydVo0a2hKXzRIIiBkYXRhLWl0ZW0taWQ9InJ1WjRraEpfNEgiIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzPjwvZGVmcz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gMCAxNSBBIDE1IDE1IDAgMSAxIDMwIDE1ICBBIDE1IDE1IDAgMSAxIDAgMTUgWiIgc3Ryb2tlLXdpZHRoPSIwcHgiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIGRhdGEtaXRlbS1pZD0icnVaNGtoSl80SCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0icmdiYSgyNTUsIDI1NSwgMjU1LCAwKSI+PC9wYXRoPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGZvcmVpZ25PYmplY3QgZGF0YS10ZXh0LXNsb3QtbmFtZT0iYm9keSIgaWQ9Iml0ZW0tdGV4dC1zbG90LXJ1WjRraEpfNEgtYm9keSIgeD0iMCIgeT0iMCIgd2lkdGg9IjMwIiBoZWlnaHQ9IjMwIj48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBkYXRhLWl0ZW0taWQ9InJ1WjRraEpfNEgiIGNsYXNzPSJpdGVtLXRleHQtY29udGFpbmVyIiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1zaXplOiAxNHB4OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgcGFkZGluZzogMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IGRpc3BsYXk6IHRhYmxlLWNlbGw7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdpZHRoOiAzMHB4OyBoZWlnaHQ6IDMwcHg7Ij48ZGl2IGRhdGEtaXRlbS10ZXh0LWVsZW1lbnQtaXRlbS1pZD0icnVaNGtoSl80SCIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PHAgc3R5bGU9Im1hcmdpbi10b3A6IDBweDsgbWFyZ2luLWJvdHRvbTogMHB4OyBwYWRkaW5nOiAwcHg7IG1pbi1oZWlnaHQ6IDE4cHg7Ij48L3A+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+ICAgICAgICAgIDwvZz48L2c+IDwvZz48L2c+IDwvZz4KICAgIDwvc3ZnPg==", "description": "A popup with open and closing animations"}, {"name": "Prototype", "path": "/assets/templates/prototypes/prototype.json", "preview": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmlld0JveD0iLTQgLTQgMjQ4IDM2OCI+PGcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLDApIHJvdGF0ZSgwKSIgZGF0YS1zdmctaXRlbS1jb250YWluZXItaWQ9ImE1VmxwYU04QiIgZGF0YS1pdGVtLWlkPSJhNVZscGFNOEIiPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+PGc+PGc+IDwvZz4gPHBhdGggZD0iTSAyMjAgMzYwICBMIDIwIDM2MCBhIDIwIDIwIDAgMCAxIC0yMCAtMjAgIEwgMCAyMCAgYSAyMCAyMCAwIDAgMSAyMCAtMjAgICBMIDIyMCAwICAgYSAyMCAyMCAwIDAgMSAyMCAyMCAgTCAyNDAgMzQwICAgYSAyMCAyMCAwIDAgMSAtMjAgMjAgWiIgc3Ryb2tlLXdpZHRoPSIycHgiIHN0cm9rZT0icmdiYSgxNjAsIDE2MCwgMTYwLCAxKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJyZ2JhKDIwOCwgMjA4LCAyMDgsIDEpIi8+PC9nPjwvZz48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiLz48L2c+ICAgICAgICA8Zz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDIwLDIwKSI+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcy8+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ii8+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxmb3JlaWduT2JqZWN0IGlkPSJpdGVtLXRleHQtc2xvdC16b1h4S1Zqb2YtYm9keSIgeD0iMCIgeT0iMCIgd2lkdGg9IjIwMCIgaGVpZ2h0PSI0MCI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDExMSwgMTExLCAxMTEpOyBmb250LXNpemU6IDI5cHg7IGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IHBhZGRpbmc6IDBweDsgdGV4dC1hbGlnbjogY2VudGVyOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyBkaXNwbGF5OiB0YWJsZS1jZWxsOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBmb250LXdlaWdodDogYm9sZDsgd2lkdGg6IDIwMHB4OyBoZWlnaHQ6IDQwcHg7Ij48ZGl2IGNsYXNzPSJpdGVtLXRleHQtZWxlbWVudCIgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsiPjxwIHN0eWxlPSJtYXJnaW4tdG9wOiAwcHg7IG1hcmdpbi1ib3R0b206IDBweDsgcGFkZGluZzogMHB4OyBtaW4taGVpZ2h0OiAxOHB4OyI+QXBwIFByb3RvdHlwZTwvcD48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz4gICAgICAgICA8L2c+PC9nPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNDAsMjQwKSI+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcy8+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz48Zz48Zz4gPC9nPiA8cGF0aCBkPSJNIDE0NSA0MCAgTCAxNSA0MCBhIDE1IDE1IDAgMCAxIC0xNSAtMTUgIEwgMCAxNSAgYSAxNSAxNSAwIDAgMSAxNSAtMTUgICBMIDE0NSAwICAgYSAxNSAxNSAwIDAgMSAxNSAxNSAgTCAxNjAgMjUgICBhIDE1IDE1IDAgMCAxIC0xNSAxNSBaIiBzdHJva2Utd2lkdGg9IjJweCIgc3Ryb2tlPSJyZ2JhKDE1NCwgMTU0LCAxNTQsIDEpIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoMTAzLCAxMDMsIDEwMywgMSkiLz48L2c+PC9nPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGZvcmVpZ25PYmplY3QgaWQ9Iml0ZW0tdGV4dC1zbG90LXhNdXdxWHkycy1ib2R5IiB4PSIwIiB5PSIwIiB3aWR0aD0iMTYwIiBoZWlnaHQ9IjQwIj48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBjbGFzcz0iaXRlbS10ZXh0LWNvbnRhaW5lciIgc3R5bGU9ImNvbG9yOiByZ2IoMjU1LCAyNTUsIDI1NSk7IGZvbnQtc2l6ZTogMjBweDsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IHBhZGRpbmc6IDBweDsgdGV4dC1hbGlnbjogY2VudGVyOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyBkaXNwbGF5OiB0YWJsZS1jZWxsOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3aWR0aDogMTYwcHg7IGhlaWdodDogNDBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij48ZGl2IGNsYXNzPSJpdGVtLXRleHQtZWxlbWVudCIgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsiPjxwIHN0eWxlPSJtYXJnaW4tdG9wOiAwcHg7IG1hcmdpbi1ib3R0b206IDBweDsgcGFkZGluZzogMHB4OyBtaW4taGVpZ2h0OiAxOHB4OyI+T3BlbjwvcD48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz4gICAgICAgICA8L2c+PC9nPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNDAuMDAwMDAwMDAwMDAwMTE0LDMwMCkiPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+PGc+PGc+IDwvZz4gPHBhdGggZD0iTSAxNDUgNDAgIEwgMTUgNDAgYSAxNSAxNSAwIDAgMSAtMTUgLTE1ICBMIDAgMTUgIGEgMTUgMTUgMCAwIDEgMTUgLTE1ICAgTCAxNDUgMCAgIGEgMTUgMTUgMCAwIDEgMTUgMTUgIEwgMTYwIDI1ICAgYSAxNSAxNSAwIDAgMSAtMTUgMTUgWiIgc3Ryb2tlLXdpZHRoPSIycHgiIHN0cm9rZT0icmdiYSgxNTQsIDE1NCwgMTU0LCAxKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJyZ2JhKDEwMywgMTAzLCAxMDMsIDEpIi8+PC9nPjwvZz48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxmb3JlaWduT2JqZWN0IGlkPSJpdGVtLXRleHQtc2xvdC1rUlI5UE83dGUtYm9keSIgeD0iMCIgeT0iMCIgd2lkdGg9IjE2MCIgaGVpZ2h0PSI0MCI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpOyBmb250LXNpemU6IDIwcHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDE2MHB4OyBoZWlnaHQ6IDQwcHg7IGZvbnQtd2VpZ2h0OiBib2xkOyI+PGRpdiBjbGFzcz0iaXRlbS10ZXh0LWVsZW1lbnQiIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ij48cCBzdHlsZT0ibWFyZ2luLXRvcDogMHB4OyBtYXJnaW4tYm90dG9tOiAwcHg7IHBhZGRpbmc6IDBweDsgbWluLWhlaWdodDogMThweDsiPkJhY2s8L3A+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+ICAgICAgICAgPC9nPjwvZz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDQwLDgwKSI+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcy8+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz48Zz48Zz4gPC9nPiA8cGF0aCBkPSJNIDE0MCAxMjAgIEwgMjAgMTIwIGEgMjAgMjAgMCAwIDEgLTIwIC0yMCAgTCAwIDIwICBhIDIwIDIwIDAgMCAxIDIwIC0yMCAgIEwgMTQwIDAgICBhIDIwIDIwIDAgMCAxIDIwIDIwICBMIDE2MCAxMDAgICBhIDIwIDIwIDAgMCAxIC0yMCAyMCBaIiBzdHJva2Utd2lkdGg9IjJweCIgc3Ryb2tlPSJyZ2JhKDE2MCwgMTYwLCAxNjAsIDEpIiBzdHJva2UtZGFzaGFycmF5PSIiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoMjI3LCAyMjQsIDIyNCwgMSkiLz48L2c+PC9nPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyIvPjwvZz4gICAgICAgICA8L2c+PC9nPjwvZz4gPC9nPjwvZz48L3N2Zz4=", "description": "Helps designing a basic app prototype with multiple app pages. Each page has an \"Open Page\" event that, once triggered, displays that page on top."}, {"name": "Sankey diagram", "path": "/assets/templates/diagrams/sankey.json", "preview": "/assets/templates/previews/mind-map.svg", "description": "This template converts your diagram code below into an interactive Sankey diagram.\nTo define a connection in your diagram between the two nodes \"A\" and \"B\" type it like this \"A [150] B\".\nEvery connection should be defined in a separate line.\n"}, {"name": "Slider", "path": "/assets/templates/ui/slider.json", "preview": "data:image/svg+xml;base64,PHN2ZyByZWY9InN2Z0NvbnRhaW5lciIgY2xhc3M9ImV4cG9ydC1zdmctcHJldmlldyIKICAgICAgICB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIyMDBweCIKICAgICAgICB2aWV3Qm94PSItMTAgLTEwIDUwIDMyMCIKICAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCIKICAgICAgICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgICAgICAgeG1sbnM6eGh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCiAgICAgICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiID4KICAgICAgICA8ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUsMCkgcm90YXRlKDApIiBkYXRhLXN2Zy1pdGVtLWNvbnRhaW5lci1pZD0idm5UZ0JweWZhSSIgZGF0YS1pdGVtLWlkPSJ2blRnQnB5ZmFJIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnMvPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+IDwvZz4gPHBhdGggZD0iTSAxMCAzMDAgIEwgMTAgMzAwIGEgMTAgMTAgMCAwIDEgLTEwIC0xMCAgTCAwIDEwICBhIDEwIDEwIDAgMCAxIDEwIC0xMCAgIEwgMTAgMCAgIGEgMTAgMTAgMCAwIDEgMTAgMTAgIEwgMjAgMjkwICAgYSAxMCAxMCAwIDAgMSAtMTAgMTAgWiIgc3Ryb2tlLXdpZHRoPSIxcHgiIHN0cm9rZT0icmdiYSgxODMsIDE5MywgMTk5LCAxKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBkYXRhLWl0ZW0taWQ9InZuVGdCcHlmYUkiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoMjE2LCAyMjIsIDIyNywgMSkiLz48L2c+ICAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zm9yZWlnbk9iamVjdCBkYXRhLXRleHQtc2xvdC1uYW1lPSJib2R5IiBpZD0iaXRlbS10ZXh0LXNsb3Qtdm5UZ0JweWZhSS1ib2R5IiB4PSIwIiB5PSIwIiB3aWR0aD0iMjAiIGhlaWdodD0iMzAwIj48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBkYXRhLWl0ZW0taWQ9InZuVGdCcHlmYUkiIGNsYXNzPSJpdGVtLXRleHQtY29udGFpbmVyIiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1zaXplOiAxNHB4OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgcGFkZGluZzogMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IGRpc3BsYXk6IHRhYmxlLWNlbGw7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdpZHRoOiAyMHB4OyBoZWlnaHQ6IDMwMHB4OyI+PGRpdiBkYXRhLWl0ZW0tdGV4dC1lbGVtZW50LWl0ZW0taWQ9InZuVGdCcHlmYUkiIGNsYXNzPSJpdGVtLXRleHQtZWxlbWVudCIgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsiPjxiciAvPjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPiAgICAgICAgPGc+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSwtNSwxMzApIiBkYXRhLXN2Zy1pdGVtLWNvbnRhaW5lci1pZD0iN2pDX2xhcVpXIiBkYXRhLWl0ZW0taWQ9IjdqQ19sYXFaVyI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzLz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPiA8ZGVmcz48bGluZWFyR3JhZGllbnQgaWQ9ImZpbGwtcGF0dGVybi03akNfbGFxWlciIHgxPSI1MCUiIHkxPSIxMDAlIiB4Mj0iNTAlIiB5Mj0iMCUiPjxzdG9wIG9mZnNldD0iMCUiIHN0eWxlPSJzdG9wLWNvbG9yOiByZ2IoOTMsIDE2OSwgMjQ3KTsiLz48c3RvcCBvZmZzZXQ9IjEwMCUiIHN0eWxlPSJzdG9wLWNvbG9yOiByZ2IoNTksIDEzNSwgMjEyKTsiLz48L2xpbmVhckdyYWRpZW50PiA8L2RlZnM+PC9nPiA8cGF0aCBkPSJNIDAgMTUgQSAxNSAxNSAwIDEgMSAzMCAxNSAgQSAxNSAxNSAwIDEgMSAwIDE1IFoiIHN0cm9rZS13aWR0aD0iM3B4IiBzdHJva2U9InJnYmEoODYsIDE0OSwgMjE4LCAxKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBkYXRhLWl0ZW0taWQ9IjdqQ19sYXFaVyIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0idXJsKCNmaWxsLXBhdHRlcm4tN2pDX2xhcVpXKSIvPjwvZz4gICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxmb3JlaWduT2JqZWN0IGRhdGEtdGV4dC1zbG90LW5hbWU9ImJvZHkiIGlkPSJpdGVtLXRleHQtc2xvdC03akNfbGFxWlctYm9keSIgeD0iMCIgeT0iMCIgd2lkdGg9IjMwIiBoZWlnaHQ9IjMwIj48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBkYXRhLWl0ZW0taWQ9IjdqQ19sYXFaVyIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDMwcHg7IGhlaWdodDogMzBweDsiPjxkaXYgZGF0YS1pdGVtLXRleHQtZWxlbWVudC1pdGVtLWlkPSI3akNfbGFxWlciIGNsYXNzPSJpdGVtLXRleHQtZWxlbWVudCIgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsiPjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPiAgICAgICAgPGcvPiA8L2c+PC9nPjwvZz4gPC9nPjwvZz4KICAgIDwvc3ZnPg==", "description": "Allows users to drag slider in view mode and change its value. This slider can be used as an input to some Script function"}, {"name": "Slides", "path": "/assets/templates/ui/slides.json", "preview": "data:image/svg+xml;base64,PHN2ZyByZWY9InN2Z0NvbnRhaW5lciIgY2xhc3M9ImV4cG9ydC1zdmctcHJldmlldyIKICAgICAgICB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIyMDBweCIKICAgICAgICB2aWV3Qm94PSItMTAgLTEwIDU5NSA0MjAiCiAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiCiAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICAgICAgIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgogICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiA+CiAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSByb3RhdGUoMCkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSJETGhlQ0k5Q2w4XyIgZGF0YS1pdGVtLWlkPSJETGhlQ0k5Q2w4XyIgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij48Zz48ZGVmcz48ZmlsdGVyIGlkPSJpdGVtLWVmZmVjdC1kcm9wLXNoYWRvdy1ETGhlQ0k5Q2w4Xy0wIiB4PSItNTAwJSIgeT0iLTUwMCUiIHdpZHRoPSIyMDAwJSIgaGVpZ2h0PSIyMDAwJSI+PGZlR2F1c3NpYW5CbHVyIGluPSJTb3VyY2VHcmFwaGljIiBzdGREZXZpYXRpb249IjIwIj48L2ZlR2F1c3NpYW5CbHVyPjwvZmlsdGVyPjwvZGVmcz48cGF0aCBkPSJNIDU2NS4wNTg3NTExMzc5OTk1IDQwMCAgTCAxMCA0MDAgYSAxMCAxMCAwIDAgMSAtMTAgLTEwICBMIDAgMTAgIGEgMTAgMTAgMCAwIDEgMTAgLTEwICAgTCA1NjUuMDU4NzUxMTM3OTk5NSAwICAgYSAxMCAxMCAwIDAgMSAxMCAxMCAgTCA1NzUuMDU4NzUxMTM3OTk5NSAzOTAgICBhIDEwIDEwIDAgMCAxIC0xMCAxMCBaIiBzdHJva2U9Im5vbmUiIGZpbGw9InJnYmEoMCwwLDAsMS4wKSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMyAzKSIgc3R5bGU9Im9wYWNpdHk6IDAuMiIgZmlsdGVyPSJ1cmwoI2l0ZW0tZWZmZWN0LWRyb3Atc2hhZG93LURMaGVDSTlDbDhfLTApIj48L3BhdGg+PC9nPiA8ZGVmcz48L2RlZnM+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz4gPC9nPiA8cGF0aCBkPSJNIDU2NS4wNTg3NTExMzc5OTk1IDQwMCAgTCAxMCA0MDAgYSAxMCAxMCAwIDAgMSAtMTAgLTEwICBMIDAgMTAgIGEgMTAgMTAgMCAwIDEgMTAgLTEwICAgTCA1NjUuMDU4NzUxMTM3OTk5NSAwICAgYSAxMCAxMCAwIDAgMSAxMCAxMCAgTCA1NzUuMDU4NzUxMTM3OTk5NSAzOTAgICBhIDEwIDEwIDAgMCAxIC0xMCAxMCBaIiBzdHJva2Utd2lkdGg9IjFweCIgc3Ryb2tlPSJyZ2JhKDIxMiwyMTIsMjEyLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgZGF0YS1pdGVtLWlkPSJETGhlQ0k5Q2w4XyIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0icmdiYSgyNDAsIDI0MCwgMjQwLCAxKSI+PC9wYXRoPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGZvcmVpZ25PYmplY3QgZGF0YS10ZXh0LXNsb3QtbmFtZT0iYm9keSIgaWQ9Iml0ZW0tdGV4dC1zbG90LURMaGVDSTlDbDhfLWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSI1NzUuMDU4NzUxMTM3OTk5NSIgaGVpZ2h0PSI0MDAiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGRhdGEtaXRlbS1pZD0iRExoZUNJOUNsOF8iIGNsYXNzPSJpdGVtLXRleHQtY29udGFpbmVyIiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1zaXplOiAxNHB4OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgcGFkZGluZzogMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IGRpc3BsYXk6IHRhYmxlLWNlbGw7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdpZHRoOiA1NzUuMDU5cHg7IGhlaWdodDogNDAwcHg7Ij48ZGl2IGRhdGEtaXRlbS10ZXh0LWVsZW1lbnQtaXRlbS1pZD0iRExoZUNJOUNsOF8iIGNsYXNzPSJpdGVtLXRleHQtZWxlbWVudCIgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsiPjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPiAgICAgICAgIDxnPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsMTQzLjc2NDY4Nzc4NDQ5OTg3LDApIiBkYXRhLXN2Zy1pdGVtLWNvbnRhaW5lci1pZD0iYkdGQVh2T1hmY0siIGRhdGEtaXRlbS1pZD0iYkdGQVh2T1hmY0siIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzPjwvZGVmcz4gPGcgZmlsdGVyPSIiPiAgIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGZvcmVpZ25PYmplY3QgZGF0YS10ZXh0LXNsb3QtbmFtZT0iYm9keSIgaWQ9Iml0ZW0tdGV4dC1zbG90LWJHRkFYdk9YZmNLLWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSIyODcuNTI5Mzc1NTY4OTk5NzQiIGhlaWdodD0iNDAiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGRhdGEtaXRlbS1pZD0iYkdGQVh2T1hmY0siIGNsYXNzPSJpdGVtLXRleHQtY29udGFpbmVyIiBzdHlsZT0iY29sb3I6IHJnYigzMCwgMzAsIDMwKTsgZm9udC1zaXplOiAyMHB4OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgcGFkZGluZzogMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IGRpc3BsYXk6IHRhYmxlLWNlbGw7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdpZHRoOiAyODcuNTI5cHg7IGhlaWdodDogNDBweDsiPjxkaXYgZGF0YS1pdGVtLXRleHQtZWxlbWVudC1pdGVtLWlkPSJiR0ZBWHZPWGZjSyIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PHAgc3R5bGU9Im1hcmdpbi10b3A6IDBweDsgbWFyZ2luLWJvdHRvbTogMHB4OyBwYWRkaW5nOiAwcHg7IG1pbi1oZWlnaHQ6IDE4cHg7Ij48c3Ryb25nPlNsaWRlczwvc3Ryb25nPjwvcD48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz4gICAgICAgICAgPC9nPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNTQsNjApIiBkYXRhLXN2Zy1pdGVtLWNvbnRhaW5lci1pZD0iZDdPOW0zaUV3YTIiIGRhdGEtaXRlbS1pZD0iZDdPOW0zaUV3YTIiIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzPjwvZGVmcz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gNDY3LjA1ODc1MTEzNzk5OTUgMzI2ICBMIDAgMzI2IGEgMCAwIDAgMCAxIDAgMCAgTCAwIDAgIGEgMCAwIDAgMCAxIDAgMCAgIEwgNDY3LjA1ODc1MTEzNzk5OTUgMCAgIGEgMCAwIDAgMCAxIDAgMCAgTCA0NjcuMDU4NzUxMTM3OTk5NSAzMjYgICBhIDAgMCAwIDAgMSAwIDAgWiIgc3Ryb2tlLXdpZHRoPSIxcHgiIHN0cm9rZT0icmdiYSgyMTIsMjEyLDIxMiwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIGRhdGEtaXRlbS1pZD0iZDdPOW0zaUV3YTIiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoMjUwLCAyNTAsIDI1MCwgMSkiPjwvcGF0aD48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxmb3JlaWduT2JqZWN0IGRhdGEtdGV4dC1zbG90LW5hbWU9ImJvZHkiIGlkPSJpdGVtLXRleHQtc2xvdC1kN085bTNpRXdhMi1ib2R5IiB4PSIwIiB5PSIwIiB3aWR0aD0iNDY3LjA1ODc1MTEzNzk5OTUiIGhlaWdodD0iMzI2Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBkYXRhLWl0ZW0taWQ9ImQ3TzltM2lFd2EyIiBjbGFzcz0iaXRlbS10ZXh0LWNvbnRhaW5lciIgc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtc2l6ZTogMTRweDsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IHBhZGRpbmc6IDBweDsgdGV4dC1hbGlnbjogY2VudGVyOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyBkaXNwbGF5OiB0YWJsZS1jZWxsOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3aWR0aDogNDY3LjA1OXB4OyBoZWlnaHQ6IDMyNnB4OyI+PGRpdiBkYXRhLWl0ZW0tdGV4dC1lbGVtZW50LWl0ZW0taWQ9ImQ3TzltM2lFd2EyIiBjbGFzcz0iaXRlbS10ZXh0LWVsZW1lbnQiIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ij48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz4gICAgICAgICA8Zz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDAsMCkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSJKN2RmeEtXZGkyeiIgZGF0YS1pdGVtLWlkPSJKN2RmeEtXZGkyeiIgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnM+PC9kZWZzPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAwOyI+PGc+IDwvZz4gPHBhdGggZD0iTSA0NzcuMDU4NzUxMTM3OTk5NSAzMjYgIEwgMCAzMjYgYSAwIDAgMCAwIDEgMCAwICBMIDAgMCAgYSAwIDAgMCAwIDEgMCAwICAgTCA0NzcuMDU4NzUxMTM3OTk5NSAwICAgYSAwIDAgMCAwIDEgMCAwICBMIDQ3Ny4wNTg3NTExMzc5OTk1IDMyNiAgIGEgMCAwIDAgMCAxIDAgMCBaIiBzdHJva2Utd2lkdGg9IjJweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgZGF0YS1pdGVtLWlkPSJKN2RmeEtXZGkyeiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0icmdiYSgyNDAsMjQwLDI0MCwxLjApIj48L3BhdGg+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDA7Ij48Zm9yZWlnbk9iamVjdCBkYXRhLXRleHQtc2xvdC1uYW1lPSJib2R5IiBpZD0iaXRlbS10ZXh0LXNsb3QtSjdkZnhLV2RpMnotYm9keSIgeD0iMCIgeT0iMCIgd2lkdGg9IjQ3Ny4wNTg3NTExMzc5OTk1IiBoZWlnaHQ9IjMyNiI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgZGF0YS1pdGVtLWlkPSJKN2RmeEtXZGkyeiIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDQ3Ny4wNTlweDsgaGVpZ2h0OiAzMjZweDsiPjxkaXYgZGF0YS1pdGVtLXRleHQtZWxlbWVudC1pdGVtLWlkPSJKN2RmeEtXZGkyeiIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+ICAgICAgICAgPGc+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSwwLDApIiBkYXRhLXN2Zy1pdGVtLWNvbnRhaW5lci1pZD0iVTk0Q1FIQWJfNTkiIGRhdGEtaXRlbS1pZD0iVTk0Q1FIQWJfNTkiIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzPjwvZGVmcz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gNDY3LjA1ODc1MTEzNzk5OTUgMzI2ICBMIDAgMzI2IGEgMCAwIDAgMCAxIDAgMCAgTCAwIDAgIGEgMCAwIDAgMCAxIDAgMCAgIEwgNDY3LjA1ODc1MTEzNzk5OTUgMCAgIGEgMCAwIDAgMCAxIDAgMCAgTCA0NjcuMDU4NzUxMTM3OTk5NSAzMjYgICBhIDAgMCAwIDAgMSAwIDAgWiIgc3Ryb2tlLXdpZHRoPSIycHgiIHN0cm9rZT0icmdiYSgyNTAsMjAwLDIwMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSI4IDgiIGRhdGEtaXRlbS1pZD0iVTk0Q1FIQWJfNTkiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoMjQwLCAyNDAsIDI0MCwgMSkiPjwvcGF0aD48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxmb3JlaWduT2JqZWN0IGRhdGEtdGV4dC1zbG90LW5hbWU9ImJvZHkiIGlkPSJpdGVtLXRleHQtc2xvdC1VOTRDUUhBYl81OS1ib2R5IiB4PSIwIiB5PSIwIiB3aWR0aD0iNDY3LjA1ODc1MTEzNzk5OTUiIGhlaWdodD0iMzI2Ij48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBkYXRhLWl0ZW0taWQ9IlU5NENRSEFiXzU5IiBjbGFzcz0iaXRlbS10ZXh0LWNvbnRhaW5lciIgc3R5bGU9ImNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMyk7IGZvbnQtc2l6ZTogMTZweDsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IHBhZGRpbmc6IDBweDsgdGV4dC1hbGlnbjogY2VudGVyOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyBkaXNwbGF5OiB0YWJsZS1jZWxsOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3aWR0aDogNDY3LjA1OXB4OyBoZWlnaHQ6IDMyNnB4OyI+PGRpdiBkYXRhLWl0ZW0tdGV4dC1lbGVtZW50LWl0ZW0taWQ9IlU5NENRSEFiXzU5IiBjbGFzcz0iaXRlbS10ZXh0LWVsZW1lbnQiIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ij48aDE+U2xpZGUgIzE8L2gxPgo8cCBzdHlsZT0ibWFyZ2luLXRvcDogMHB4OyBtYXJnaW4tYm90dG9tOiAwcHg7IHBhZGRpbmc6IDBweDsgbWluLWhlaWdodDogMThweDsiPkRyb3AgeW91ciBpdGVtcyBoZXJlPC9wPgo8cCBzdHlsZT0ibWFyZ2luLXRvcDogMHB4OyBtYXJnaW4tYm90dG9tOiAwcHg7IHBhZGRpbmc6IDBweDsgbWluLWhlaWdodDogMThweDsiPjxpPih0aGlzIHRleHQgYXMgd2VsbCBhcyB0aGlzIHNsaWRlIGNvbnRhaW5lciB3aWxsIG5vdCBiZSB2aXNpYmxlIGluIHZpZXcgbW9kZSk8L2k+PC9wPjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPiAgICAgICAgIDxnPjwvZz4gPC9nPjwvZz4gPC9nPjwvZz4gPC9nPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsNywxODApIiBkYXRhLXN2Zy1pdGVtLWNvbnRhaW5lci1pZD0ia3AwLWVnV0R0OVIiIGRhdGEtaXRlbS1pZD0ia3AwLWVnV0R0OVIiIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzPjwvZGVmcz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gMCAyMCBBIDIwIDIwIDAgMSAxIDQwIDIwICBBIDIwIDIwIDAgMSAxIDAgMjAgWiIgc3Ryb2tlLXdpZHRoPSIwcHgiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIGRhdGEtaXRlbS1pZD0ia3AwLWVnV0R0OVIiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoNzgsIDEzMSwgMjQ1LCAxKSI+PC9wYXRoPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGZvcmVpZ25PYmplY3QgZGF0YS10ZXh0LXNsb3QtbmFtZT0iYm9keSIgaWQ9Iml0ZW0tdGV4dC1zbG90LWtwMC1lZ1dEdDlSLWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgZGF0YS1pdGVtLWlkPSJrcDAtZWdXRHQ5UiIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDQwcHg7IGhlaWdodDogNDBweDsiPjxkaXYgZGF0YS1pdGVtLXRleHQtZWxlbWVudC1pdGVtLWlkPSJrcDAtZWdXRHQ5UiIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+ICAgICAgICAgPGc+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw5Ljk5OTk5OTk5OTk5OTk5OCwxMikiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSI0TkJNUGFUTE9oLSIgZGF0YS1pdGVtLWlkPSI0TkJNUGFUTE9oLSIgc3R5bGU9Im9wYWNpdHk6IDE7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnM+PC9kZWZzPiA8ZyBmaWx0ZXI9IiI+PGcgbW9kZT0iZWRpdCIgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz4gPC9nPiA8cGF0aCBkPSJNIDEzLjMzIDAgTCAxMy4zMyAxNi42NyBMIDAgOC4zMyBMIDEzLjMzIDAgIFogIiBzdHJva2Utd2lkdGg9IjRweCIgc3Ryb2tlPSJyZ2JhKDI1NSwgMjU1LCAyNTUsIDEpIiBzdHJva2UtZGFzaGFycmF5PSIiIGZpbGw9InJnYmEoMjU1LCAyNTUsIDI1NSwgMSkiIHN0eWxlPSJzdHJva2UtbGluZWpvaW46IHJvdW5kOyI+PC9wYXRoPjwvZz4gICA8L2c+ICAgICAgICAgIDwvZz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgtMSwxLjIyNDY0Njc5OTE0NzM1MzJlLTE2LC0xLjIyNDY0Njc5OTE0NzM1MzJlLTE2LC0xLDQwLDQwKSIgZGF0YS1zdmctaXRlbS1jb250YWluZXItaWQ9IjN6blBrTm5wbTNUIiBkYXRhLWl0ZW0taWQ9IjN6blBrTm5wbTNUIiBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcz48L2RlZnM+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDA7Ij48Zz4gPC9nPiA8cGF0aCBkPSJNIDAgMjAgQSAyMCAyMCAwIDEgMSA0MCAyMCAgQSAyMCAyMCAwIDEgMSAwIDIwIFoiIHN0cm9rZS13aWR0aD0iMnB4IiBzdHJva2U9InJnYmEoMzAsMzAsMzAsMS4wKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBkYXRhLWl0ZW0taWQ9IjN6blBrTm5wbTNUIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJyZ2JhKDI0MCwyNDAsMjQwLDEuMCkiPjwvcGF0aD48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMDsiPjxmb3JlaWduT2JqZWN0IGRhdGEtdGV4dC1zbG90LW5hbWU9ImJvZHkiIGlkPSJpdGVtLXRleHQtc2xvdC0zem5Qa05ucG0zVC1ib2R5IiB4PSIwIiB5PSIwIiB3aWR0aD0iNDAiIGhlaWdodD0iNDAiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGRhdGEtaXRlbS1pZD0iM3puUGtObnBtM1QiIGNsYXNzPSJpdGVtLXRleHQtY29udGFpbmVyIiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1zaXplOiAxNHB4OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgcGFkZGluZzogMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IHdoaXRlLXNwYWNlOiBub3JtYWw7IGRpc3BsYXk6IHRhYmxlLWNlbGw7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdpZHRoOiA0MHB4OyBoZWlnaHQ6IDQwcHg7Ij48ZGl2IGRhdGEtaXRlbS10ZXh0LWVsZW1lbnQtaXRlbS1pZD0iM3puUGtObnBtM1QiIGNsYXNzPSJpdGVtLXRleHQtZWxlbWVudCIgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsiPjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPiAgICAgICAgICA8L2c+PC9nPiA8L2c+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw1MjguMDU4NzUxMTM3OTk5NSwxODApIiBkYXRhLXN2Zy1pdGVtLWNvbnRhaW5lci1pZD0iei02dkNrSVBia1kiIGRhdGEtaXRlbS1pZD0iei02dkNrSVBia1kiIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzPjwvZGVmcz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gMCAyMCBBIDIwIDIwIDAgMSAxIDQwIDIwICBBIDIwIDIwIDAgMSAxIDAgMjAgWiIgc3Ryb2tlLXdpZHRoPSIwcHgiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIGRhdGEtaXRlbS1pZD0iei02dkNrSVBia1kiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoNzgsIDEzMSwgMjQ1LCAxKSI+PC9wYXRoPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGZvcmVpZ25PYmplY3QgZGF0YS10ZXh0LXNsb3QtbmFtZT0iYm9keSIgaWQ9Iml0ZW0tdGV4dC1zbG90LXotNnZDa0lQYmtZLWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgZGF0YS1pdGVtLWlkPSJ6LTZ2Q2tJUGJrWSIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDQwcHg7IGhlaWdodDogNDBweDsiPjxkaXYgZGF0YS1pdGVtLXRleHQtZWxlbWVudC1pdGVtLWlkPSJ6LTZ2Q2tJUGJrWSIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+ICAgICAgICAgPGc+PGcgdHJhbnNmb3JtPSJtYXRyaXgoLTEsMS4yMjQ2NDY3OTkxNDczNTMyZS0xNiwtMS4yMjQ2NDY3OTkxNDczNTMyZS0xNiwtMSwyOS4zMzMzMzMzMzMzMzMzMzIsMjguNjY2NjY2NjY2NjY2NjY0KSIgZGF0YS1zdmctaXRlbS1jb250YWluZXItaWQ9IkVwOVFJaEpUMkRlIiBkYXRhLWl0ZW0taWQ9IkVwOVFJaEpUMkRlIiBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcz48L2RlZnM+IDxnIGZpbHRlcj0iIj48ZyBtb2RlPSJlZGl0IiBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gMTMuMzMgMCBMIDEzLjMzIDE2LjY3IEwgMCA4LjMzIEwgMTMuMzMgMCAgWiAiIHN0cm9rZS13aWR0aD0iNHB4IiBzdHJva2U9InJnYmEoMjU1LCAyNTUsIDI1NSwgMSkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgZmlsbD0icmdiYSgyNTUsIDI1NSwgMjU1LCAxKSIgc3R5bGU9InN0cm9rZS1saW5lam9pbjogcm91bmQ7Ij48L3BhdGg+PC9nPiAgIDwvZz4gICAgICAgICAgPC9nPjxnIHRyYW5zZm9ybT0ibWF0cml4KC0xLDEuMjI0NjQ2Nzk5MTQ3MzUzMmUtMTYsLTEuMjI0NjQ2Nzk5MTQ3MzUzMmUtMTYsLTEsNDAsNDApIiBkYXRhLXN2Zy1pdGVtLWNvbnRhaW5lci1pZD0iZlZ0YkpIYzFYbS0iIGRhdGEtaXRlbS1pZD0iZlZ0YkpIYzFYbS0iIHN0eWxlPSJvcGFjaXR5OiAxOyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzPjwvZGVmcz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMDsiPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gMCAyMCBBIDIwIDIwIDAgMSAxIDQwIDIwICBBIDIwIDIwIDAgMSAxIDAgMjAgWiIgc3Ryb2tlLXdpZHRoPSIycHgiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIGRhdGEtaXRlbS1pZD0iZlZ0YkpIYzFYbS0iIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoMjQwLDI0MCwyNDAsMS4wKSI+PC9wYXRoPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAwOyI+PGZvcmVpZ25PYmplY3QgZGF0YS10ZXh0LXNsb3QtbmFtZT0iYm9keSIgaWQ9Iml0ZW0tdGV4dC1zbG90LWZWdGJKSGMxWG0tLWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgZGF0YS1pdGVtLWlkPSJmVnRiSkhjMVhtLSIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDQwcHg7IGhlaWdodDogNDBweDsiPjxkaXYgZGF0YS1pdGVtLXRleHQtZWxlbWVudC1pdGVtLWlkPSJmVnRiSkhjMVhtLSIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+ICAgICAgICAgIDwvZz48L2c+IDwvZz48L2c+IDwvZz4KICAgIDwvc3ZnPg==\n", "description": ""}, {"name": "Tabs panel", "path": "/assets/templates/ui/tabs-panel.json", "preview": "data:image/svg+xml;base64,PHN2ZyByZWY9InN2Z0NvbnRhaW5lciIgY2xhc3M9ImV4cG9ydC1zdmctcHJldmlldyIKICAgICAgICB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIyMDBweCIKICAgICAgICB2aWV3Qm94PSItMTAgLTEwIDU2MCAzODAiCiAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiCiAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICAgICAgIHhtbG5zOnhodG1sPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgogICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiA+CiAgICAgICAgPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwwKSByb3RhdGUoMCkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSJpUnVRLTdJR3giIGRhdGEtaXRlbS1pZD0iaVJ1US03SUd4IiBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPjxnPjxkZWZzPjxmaWx0ZXIgaWQ9Iml0ZW0tZWZmZWN0LWRyb3Atc2hhZG93LWlSdVEtN0lHeC0wIiB4PSItNTAwJSIgeT0iLTUwMCUiIHdpZHRoPSIyMDAwJSIgaGVpZ2h0PSIyMDAwJSI+PGZlR2F1c3NpYW5CbHVyIGluPSJTb3VyY2VHcmFwaGljIiBzdGREZXZpYXRpb249IjIwIj48L2ZlR2F1c3NpYW5CbHVyPjwvZmlsdGVyPjwvZGVmcz48cGF0aCBkPSJNIDUyMCAzNjAgIEwgMjAgMzYwIGEgMjAgMjAgMCAwIDEgLTIwIC0yMCAgTCAwIDIwICBhIDIwIDIwIDAgMCAxIDIwIC0yMCAgIEwgNTIwIDAgICBhIDIwIDIwIDAgMCAxIDIwIDIwICBMIDU0MCAzNDAgICBhIDIwIDIwIDAgMCAxIC0yMCAyMCBaIiBzdHJva2U9Im5vbmUiIGZpbGw9InJnYmEoMCwwLDAsMS4wKSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMyAzKSIgc3R5bGU9Im9wYWNpdHk6IDAuMiIgZmlsdGVyPSJ1cmwoI2l0ZW0tZWZmZWN0LWRyb3Atc2hhZG93LWlSdVEtN0lHeC0wKSI+PC9wYXRoPjwvZz4gPGRlZnM+PC9kZWZzPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+IDwvZz4gPHBhdGggZD0iTSA1MjAgMzYwICBMIDIwIDM2MCBhIDIwIDIwIDAgMCAxIC0yMCAtMjAgIEwgMCAyMCAgYSAyMCAyMCAwIDAgMSAyMCAtMjAgICBMIDUyMCAwICAgYSAyMCAyMCAwIDAgMSAyMCAyMCAgTCA1NDAgMzQwICAgYSAyMCAyMCAwIDAgMSAtMjAgMjAgWiIgc3Ryb2tlLXdpZHRoPSIxcHgiIHN0cm9rZT0icmdiYSgyMTIsIDIxMiwgMjEyLCAxKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBkYXRhLWl0ZW0taWQ9ImlSdVEtN0lHeCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0icmdiYSgyNDAsMjQwLDI0MCwxLjApIj48L3BhdGg+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zm9yZWlnbk9iamVjdCBkYXRhLXRleHQtc2xvdC1uYW1lPSJib2R5IiBpZD0iaXRlbS10ZXh0LXNsb3QtaVJ1US03SUd4LWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSI1NDAiIGhlaWdodD0iMzYwIj48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBkYXRhLWl0ZW0taWQ9ImlSdVEtN0lHeCIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDU0MHB4OyBoZWlnaHQ6IDM2MHB4OyI+PGRpdiBkYXRhLWl0ZW0tdGV4dC1lbGVtZW50LWl0ZW0taWQ9ImlSdVEtN0lHeCIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+ICAgICAgICAgPGc+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSw0MCwyMCkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSJHb04yVzVVLUEiIGRhdGEtaXRlbS1pZD0iR29OMlc1VS1BIiBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcz48L2RlZnM+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz4gPC9nPiA8cGF0aCBkPSJNIDkxIDYwICBMIDkgNjAgYSA5IDkgMCAwIDEgLTkgLTkgIEwgMCA5ICBhIDkgOSAwIDAgMSA5IC05ICAgTCA5MSAwICAgYSA5IDkgMCAwIDEgOSA5ICBMIDEwMCA1MSAgIGEgOSA5IDAgMCAxIC05IDkgWiIgc3Ryb2tlLXdpZHRoPSIwcHgiIHN0cm9rZT0icmdiYSgzMCwzMCwzMCwxLjApIiBzdHJva2UtZGFzaGFycmF5PSIiIGRhdGEtaXRlbS1pZD0iR29OMlc1VS1BIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJyZ2JhKDI1NSwgMjU1LCAyNTUsIDEpIj48L3BhdGg+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zm9yZWlnbk9iamVjdCBkYXRhLXRleHQtc2xvdC1uYW1lPSJib2R5IiBpZD0iaXRlbS10ZXh0LXNsb3QtR29OMlc1VS1BLWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAiIGhlaWdodD0iNjAiPjxkaXYgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIGRhdGEtaXRlbS1pZD0iR29OMlc1VS1BIiBjbGFzcz0iaXRlbS10ZXh0LWNvbnRhaW5lciIgc3R5bGU9ImNvbG9yOiByZ2IoMCwgMCwgMCk7IGZvbnQtc2l6ZTogMTRweDsgZm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IHBhZGRpbmc6IDE1cHggMHB4IDBweDsgdGV4dC1hbGlnbjogY2VudGVyOyB2ZXJ0aWNhbC1hbGlnbjogdG9wOyB3aGl0ZS1zcGFjZTogbm9ybWFsOyBkaXNwbGF5OiB0YWJsZS1jZWxsOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB3aWR0aDogMTAwcHg7IGhlaWdodDogNjBweDsiPjxkaXYgZGF0YS1pdGVtLXRleHQtZWxlbWVudC1pdGVtLWlkPSJHb04yVzVVLUEiIGNsYXNzPSJpdGVtLXRleHQtZWxlbWVudCIgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsiPjxwIHN0eWxlPSJtYXJnaW4tdG9wOiAwcHg7IG1hcmdpbi1ib3R0b206IDBweDsgcGFkZGluZzogMHB4OyBtaW4taGVpZ2h0OiAxOHB4OyI+VGFiIDE8L3A+PC9kaXY+PC9kaXY+PC9mb3JlaWduT2JqZWN0PjwvZz48L2c+ICAgICAgICAgIDwvZz48ZyB0cmFuc2Zvcm09Im1hdHJpeCgxLDAsMCwxLDE2MCwyMCkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSJWWDB2OTFQSGkiIGRhdGEtaXRlbS1pZD0iVlgwdjkxUEhpIiBzdHlsZT0ib3BhY2l0eTogMC41OyBtaXgtYmxlbmQtbW9kZTogbm9ybWFsOyI+IDxkZWZzPjwvZGVmcz4gPGcgZmlsdGVyPSIiPiA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxnPiA8L2c+IDxwYXRoIGQ9Ik0gOTEgNjAgIEwgOSA2MCBhIDkgOSAwIDAgMSAtOSAtOSAgTCAwIDkgIGEgOSA5IDAgMCAxIDkgLTkgICBMIDkxIDAgICBhIDkgOSAwIDAgMSA5IDkgIEwgMTAwIDUxICAgYSA5IDkgMCAwIDEgLTkgOSBaIiBzdHJva2Utd2lkdGg9IjBweCIgc3Ryb2tlPSJyZ2JhKDMwLDMwLDMwLDEuMCkiIHN0cm9rZS1kYXNoYXJyYXk9IiIgZGF0YS1pdGVtLWlkPSJWWDB2OTFQSGkiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9InJnYmEoMjU1LCAyNTUsIDI1NSwgMSkiPjwvcGF0aD48L2c+ICA8ZyBzdHlsZT0ib3BhY2l0eTogMTsiPjxmb3JlaWduT2JqZWN0IGRhdGEtdGV4dC1zbG90LW5hbWU9ImJvZHkiIGlkPSJpdGVtLXRleHQtc2xvdC1WWDB2OTFQSGktYm9keSIgeD0iMCIgeT0iMCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSI2MCI+PGRpdiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgZGF0YS1pdGVtLWlkPSJWWDB2OTFQSGkiIGNsYXNzPSJpdGVtLXRleHQtY29udGFpbmVyIiBzdHlsZT0iY29sb3I6IHJnYigwLCAwLCAwKTsgZm9udC1zaXplOiAxNHB4OyBmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgcGFkZGluZzogMTVweCAwcHggMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IHZlcnRpY2FsLWFsaWduOiB0b3A7IHdoaXRlLXNwYWNlOiBub3JtYWw7IGRpc3BsYXk6IHRhYmxlLWNlbGw7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IHdpZHRoOiAxMDBweDsgaGVpZ2h0OiA2MHB4OyI+PGRpdiBkYXRhLWl0ZW0tdGV4dC1lbGVtZW50LWl0ZW0taWQ9IlZYMHY5MVBIaSIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PHAgc3R5bGU9Im1hcmdpbi10b3A6IDBweDsgbWFyZ2luLWJvdHRvbTogMHB4OyBwYWRkaW5nOiAwcHg7IG1pbi1oZWlnaHQ6IDE4cHg7Ij5UYWIgMjwvcD48L2Rpdj48L2Rpdj48L2ZvcmVpZ25PYmplY3Q+PC9nPjwvZz4gICAgICAgICAgPC9nPjxnIHRyYW5zZm9ybT0ibWF0cml4KDEsMCwwLDEsMjgwLDIwKSIgZGF0YS1zdmctaXRlbS1jb250YWluZXItaWQ9ImNIVXpZSVNwZiIgZGF0YS1pdGVtLWlkPSJjSFV6WUlTcGYiIHN0eWxlPSJvcGFjaXR5OiAwLjU7IG1peC1ibGVuZC1tb2RlOiBub3JtYWw7Ij4gPGRlZnM+PC9kZWZzPiA8ZyBmaWx0ZXI9IiI+IDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGc+IDwvZz4gPHBhdGggZD0iTSA5MSA2MCAgTCA5IDYwIGEgOSA5IDAgMCAxIC05IC05ICBMIDAgOSAgYSA5IDkgMCAwIDEgOSAtOSAgIEwgOTEgMCAgIGEgOSA5IDAgMCAxIDkgOSAgTCAxMDAgNTEgICBhIDkgOSAwIDAgMSAtOSA5IFoiIHN0cm9rZS13aWR0aD0iMHB4IiBzdHJva2U9InJnYmEoMzAsMzAsMzAsMS4wKSIgc3Ryb2tlLWRhc2hhcnJheT0iIiBkYXRhLWl0ZW0taWQ9ImNIVXpZSVNwZiIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgZmlsbD0icmdiYSgyNTUsIDI1NSwgMjU1LCAxKSI+PC9wYXRoPjwvZz4gIDxnIHN0eWxlPSJvcGFjaXR5OiAxOyI+PGZvcmVpZ25PYmplY3QgZGF0YS10ZXh0LXNsb3QtbmFtZT0iYm9keSIgaWQ9Iml0ZW0tdGV4dC1zbG90LWNIVXpZSVNwZi1ib2R5IiB4PSIwIiB5PSIwIiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjYwIj48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBkYXRhLWl0ZW0taWQ9ImNIVXpZSVNwZiIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAxNXB4IDBweCAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IHRvcDsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDEwMHB4OyBoZWlnaHQ6IDYwcHg7Ij48ZGl2IGRhdGEtaXRlbS10ZXh0LWVsZW1lbnQtaXRlbS1pZD0iY0hVellJU3BmIiBjbGFzcz0iaXRlbS10ZXh0LWVsZW1lbnQiIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ij48cCBzdHlsZT0ibWFyZ2luLXRvcDogMHB4OyBtYXJnaW4tYm90dG9tOiAwcHg7IHBhZGRpbmc6IDBweDsgbWluLWhlaWdodDogMThweDsiPlRhYiAzPC9wPjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPiAgICAgICAgICA8L2c+PGcgdHJhbnNmb3JtPSJtYXRyaXgoMSwwLDAsMSwyMCw2MCkiIGRhdGEtc3ZnLWl0ZW0tY29udGFpbmVyLWlkPSItYUZNdVFITmwiIGRhdGEtaXRlbS1pZD0iLWFGTXVRSE5sIiBzdHlsZT0ib3BhY2l0eTogMTsgbWl4LWJsZW5kLW1vZGU6IG5vcm1hbDsiPiA8ZGVmcz48L2RlZnM+IDxnIGZpbHRlcj0iIj4gPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zz4gPC9nPiA8cGF0aCBkPSJNIDQ4MCAyODAgIEwgMjAgMjgwIGEgMjAgMjAgMCAwIDEgLTIwIC0yMCAgTCAwIDIwICBhIDIwIDIwIDAgMCAxIDIwIC0yMCAgIEwgNDgwIDAgICBhIDIwIDIwIDAgMCAxIDIwIDIwICBMIDUwMCAyNjAgICBhIDIwIDIwIDAgMCAxIC0yMCAyMCBaIiBzdHJva2Utd2lkdGg9IjBweCIgc3Ryb2tlPSJyZ2JhKDI1NSwgMjU1LCAyNTUsIDEpIiBzdHJva2UtZGFzaGFycmF5PSIiIGRhdGEtaXRlbS1pZD0iLWFGTXVRSE5sIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBmaWxsPSJyZ2JhKDI1NSwgMjU1LCAyNTUsIDEpIj48L3BhdGg+PC9nPiAgPGcgc3R5bGU9Im9wYWNpdHk6IDE7Ij48Zm9yZWlnbk9iamVjdCBkYXRhLXRleHQtc2xvdC1uYW1lPSJib2R5IiBpZD0iaXRlbS10ZXh0LXNsb3QtLWFGTXVRSE5sLWJvZHkiIHg9IjAiIHk9IjAiIHdpZHRoPSI1MDAiIGhlaWdodD0iMjgwIj48ZGl2IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBkYXRhLWl0ZW0taWQ9Ii1hRk11UUhObCIgY2xhc3M9Iml0ZW0tdGV4dC1jb250YWluZXIiIHN0eWxlPSJjb2xvcjogcmdiKDAsIDAsIDApOyBmb250LXNpemU6IDE0cHg7IGZvbnQtZmFtaWx5OiBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyBwYWRkaW5nOiAwcHg7IHRleHQtYWxpZ246IGNlbnRlcjsgdmVydGljYWwtYWxpZ246IG1pZGRsZTsgd2hpdGUtc3BhY2U6IG5vcm1hbDsgZGlzcGxheTogdGFibGUtY2VsbDsgYm94LXNpemluZzogYm9yZGVyLWJveDsgd2lkdGg6IDUwMHB4OyBoZWlnaHQ6IDI4MHB4OyI+PGRpdiBkYXRhLWl0ZW0tdGV4dC1lbGVtZW50LWl0ZW0taWQ9Ii1hRk11UUhObCIgY2xhc3M9Iml0ZW0tdGV4dC1lbGVtZW50IiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyI+PHAgc3R5bGU9Im1hcmdpbi10b3A6IDBweDsgbWFyZ2luLWJvdHRvbTogMHB4OyBwYWRkaW5nOiAwcHg7IG1pbi1oZWlnaHQ6IDE4cHg7Ij5UYWIgY29udGVudCAxPC9wPjwvZGl2PjwvZGl2PjwvZm9yZWlnbk9iamVjdD48L2c+PC9nPiAgICAgICAgICA8L2c+PC9nPiA8L2c+CiAgICA8L3N2Zz4=", "description": "Panel with tabs"}, {"name": "Tooltip", "path": "/assets/templates/ui/tooltip.json", "preview": "/assets/images/templates/tooltip.svg", "description": ""}] \ No newline at end of file