From f48dddab97c268a9131faa5118d035c9352927ab Mon Sep 17 00:00:00 2001 From: Nicolas Date: Tue, 10 Mar 2026 13:40:39 +0100 Subject: [PATCH 1/3] Add victron main icon. --- index.js | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++-- index.min.js | 2 +- 2 files changed, 66 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index 6461b7c..4a6f97f 100644 --- a/index.js +++ b/index.js @@ -206,7 +206,68 @@ const FlowRenderer = function () { 'advanced-ai': 'advanced-ai-node.svg', 'image-classification': 'classification-node.svg', 'image-depth': 'depth-estimation-node.svg', - 'object-detection': 'object-detection-node.svg' + 'object-detection': 'object-detection-node.svg', + + // Victronenergy specific + 'victron-virtual-switch': 'victronenergy.svg', + 'victron-virtual': 'victronenergy.svg', + 'victron-inject': 'victronenergy.svg', + 'vrm-api': 'victronenergy.svg', + + 'victron-input-accharger': 'victronenergy.svg', + 'victron-input-acload': 'victronenergy.svg', + 'victron-input-acsystem': 'victronenergy.svg', + 'victron-input-alternator': 'victronenergy.svg', + 'victron-input-battery': 'victronenergy.svg', + 'victron-input-dcdc': 'victronenergy.svg', + 'victron-input-dcload': 'victronenergy.svg', + 'victron-input-dcsource': 'victronenergy.svg', + 'victron-input-dcsystem': 'victronenergy.svg', + 'victron-input-dess': 'victronenergy.svg', + 'victron-input-digitalinput': 'victronenergy.svg', + 'victron-input-ess': 'victronenergy.svg', + 'victron-input-evcharger': 'victronenergy.svg', + 'victron-input-fuelcell': 'victronenergy.svg', + 'victron-input-generator': 'victronenergy.svg', + 'victron-input-gps': 'victronenergy.svg', + 'victron-input-gridmeter': 'victronenergy.svg', + 'victron-input-inverter': 'victronenergy.svg', + 'victron-input-meteo': 'victronenergy.svg', + 'victron-input-motordrive': 'victronenergy.svg', + 'victron-input-multi': 'victronenergy.svg', + 'victron-input-pulsemeter': 'victronenergy.svg', + 'victron-input-pump': 'victronenergy.svg', + 'victron-input-pvinverter': 'victronenergy.svg', + 'victron-input-relay': 'victronenergy.svg', + 'victron-input-settings': 'victronenergy.svg', + 'victron-input-solarcharger': 'victronenergy.svg', + 'victron-input-switch': 'victronenergy.svg', + 'victron-input-system': 'victronenergy.svg', + 'victron-input-tank': 'victronenergy.svg', + 'victron-input-temperature': 'victronenergy.svg', + 'victron-input-vebus': 'victronenergy.svg', + + 'victron-output-accharger': 'victronenergy.svg', + 'victron-output-acsystem': 'victronenergy.svg', + 'victron-output-battery': 'victronenergy.svg', + 'victron-output-charger': 'victronenergy.svg', + 'victron-output-dcdc': 'victronenergy.svg', + 'victron-output-dess': 'victronenergy.svg', + 'victron-output-ess': 'victronenergy.svg', + 'victron-output-evcharger': 'victronenergy.svg', + 'victron-output-generator': 'victronenergy.svg', + 'victron-output-inverter': 'victronenergy.svg', + 'victron-output-multi': 'victronenergy.svg', + 'victron-output-pump': 'victronenergy.svg', + 'victron-output-pvinverter': 'victronenergy.svg', + 'victron-output-relay': 'victronenergy.svg', + 'victron-output-settings': 'victronenergy.svg', + 'victron-output-solarcharger': 'victronenergy.svg', + 'victron-output-switch': 'victronenergy.svg', + 'victron-output-vebus': 'victronenergy.svg', + + 'victron-input-custom': 'victronenergy.svg', + 'victron-output-custom': 'victronenergy.svg' } const imageNameToContent = { @@ -283,7 +344,9 @@ const FlowRenderer = function () { 'advanced-ai-node.svg': 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIiB3aWR0aD0iMjAiPgogICAgPHBhdGggZmlsbD0id2hpdGUiIGQ9Im0xNzYtMTIwLTU2LTU2IDMwMS0zMDItMTgxLTQ1IDE5OC0xMjMtMTctMjM0IDE3OSAxNTEgMjE2LTg4LTg3IDIxNyAxNTEgMTc4LTIzNC0xNi0xMjQgMTk4LTQ1LTE4MS0zMDEgMzAxWm0yNC01MjAtODAtODAgODAtODAgODAgODAtODAgODBabTM1NSAxOTcgNDgtNzkgOTMgNy02MC03MSAzNS04Ni04NiAzNS03MS01OSA3IDkyLTc5IDQ5IDkwIDIyIDIzIDkwWm0xNjUgMzIzLTgwLTgwIDgwLTgwIDgwIDgwLTgwIDgwWk01NjktNTcwWiIvPgo8c2NyaXB0IHhtbG5zPSIiLz48L3N2Zz4=', 'classification-node.svg': 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIiB3aWR0aD0iMjAiPgogICAgPHBhdGggZmlsbD0id2hpdGUiIGQ9Ik0yMTYtNzkydjYyNC02MjQgMTY4LTE2OFptMCA2OTZxLTI5LjcgMC01MC44NS0yMS4xNVExNDQtMTM4LjMgMTQ0LTE2OHYtNjI0cTAtMjkuNyAyMS4xNS01MC44NVExODYuMy04NjQgMjE2LTg2NGgzMTJsMTkyIDE5MnYxNDlxLTE4LTQtMzYtNXQtMzYgMXYtOTdINDgwdi0xNjhIMjE2djYyNGgyNDhxMTIgMjEgMjggMzkuNVQ1MjgtOTZIMjE2Wm00NTUuNzctOTZRNzEyLTE5MiA3NDAtMjE5Ljc3cTI4LTI3Ljc4IDI4LTY4UTc2OC0zMjggNzQwLjE2LTM1NnEtMjcuODQtMjgtNjguMTYtMjgtMzIgMC02NCAyNHQtMzIgNzJxMCA0MC4zMiAyNy43NyA2OC4xNiAyNy43OCAyNy44NCA2OCAyNy44NFpNODYxLTQ4bC05OC05OXEtMjAgMTMtNDMuMDMgMjB0LTQ3LjQ3IDdRNjAyLTEyMCA1NTMtMTY5dC00OS0xMTlxMC03MCA0OS0xMTl0MTE5LTQ5cTcwIDAgMTE5IDQ5dDQ5IDExOXEwIDI0LjYxLTcgNDcuODFRODI2LTIxNyA4MTMtMTk3bDk5IDk4LTUxIDUxWiIvPgo8c2NyaXB0IHhtbG5zPSIiLz48L3N2Zz4=', 'depth-estimation-node.svg': 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgLTk2MCA5NjAgOTYwIiB3aWR0aD0iMjAiPgogICAgPHBhdGggZmlsbD0id2hpdGUiIGQ9Ik00ODAtMTE4IDEyMC0zOThsNjYtNTAgMjk0IDIyOCAyOTQtMjI4IDY2IDUwLTM2MCAyODBabTAtMjAyTDEyMC02MDBsMzYwLTI4MCAzNjAgMjgwLTM2MCAyODBabTAtMjgwWm0wIDE3OCAyMzAtMTc4LTIzMC0xNzgtMjMwIDE3OCAyMzAgMTc4WiIvPgo8c2NyaXB0IHhtbG5zPSIiLz48L3N2Zz4=', - 'object-detection-node.svg': 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAtOTYwIDk2MCA5NjAiIHdpZHRoPSIyNHB4Ij4KICAgIDxwYXRoIGZpbGw9IndoaXRlIiBkPSJtMjYwLTUyMCAyMjAtMzYwIDIyMCAzNjBIMjYwWk03MDAtODBxLTc1IDAtMTI3LjUtNTIuNVQ1MjAtMjYwcTAtNzUgNTIuNS0xMjcuNVQ3MDAtNDQwcTc1IDAgMTI3LjUgNTIuNVQ4ODAtMjYwcTAgNzUtNTIuNSAxMjcuNVQ3MDAtODBabS01ODAtMjB2LTMyMGgzMjB2MzIwSDEyMFptNTgwLTYwcTQyIDAgNzEtMjl0MjktNzFxMC00Mi0yOS03MXQtNzEtMjlxLTQyIDAtNzEgMjl0LTI5IDcxcTAgNDIgMjkgNzF0NzEgMjlabS01MDAtMjBoMTYwdi0xNjBIMjAwdjE2MFptMjAyLTQyMGgxNTZsLTc4LTEyNi03OCAxMjZabTc4IDBaTTM2MC0zNDBabTM0MCA4MFoiLz4KPHNjcmlwdCB4bWxucz0iIi8+PC9zdmc+' + 'object-detection-node.svg': 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjRweCIgdmlld0JveD0iMCAtOTYwIDk2MCA5NjAiIHdpZHRoPSIyNHB4Ij4KICAgIDxwYXRoIGZpbGw9IndoaXRlIiBkPSJtMjYwLTUyMCAyMjAtMzYwIDIyMCAzNjBIMjYwWk03MDAtODBxLTc1IDAtMTI3LjUtNTIuNVQ1MjAtMjYwcTAtNzUgNTIuNS0xMjcuNVQ3MDAtNDQwcTc1IDAgMTI3LjUgNTIuNVQ4ODAtMjYwcTAgNzUtNTIuNSAxMjcuNVQ3MDAtODBabS01ODAtMjB2LTMyMGgzMjB2MzIwSDEyMFptNTgwLTYwcTQyIDAgNzEtMjl0MjktNzFxMC00Mi0yOS03MXQtNzEtMjlxLTQyIDAtNzEgMjl0LTI5IDcxcTAgNDIgMjkgNzF0NzEgMjlabS01MDAtMjBoMTYwdi0xNjBIMjAwdjE2MFptMjAyLTQyMGgxNTZsLTc4LTEyNi03OCAxMjZabTc4IDBaTTM2MC0zNDBabTM0MCA4MFoiLz4KPHNjcmlwdCB4bWxucz0iIi8+PC9zdmc+', + + 'victronenergy.svg': 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDIzLjAuMSwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IgoJIHZpZXdCb3g9IjAgMCA5Mi43IDYyLjIiIHN0eWxlPSJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDkyLjcgNjIuMjsiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoJLnN0MHtmaWxsOiNGRkZGRkY7fQo8L3N0eWxlPgo8dGl0bGU+di1zeW1ib2w8L3RpdGxlPgo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMjMuOSw3LjdjLTMuNC0xLjEtNy4xLTAuMy05LjgsMi4xYzAsMC01LjksNC03LDIwLjZjMCwwLTAuMywyLjgsMi4xLDMuMmMwLDAsMi41LDAuNSwyLjgtMS42czAuMy0xMi42LDQuOS0xOAoJYzAuNC0wLjUsMS0xLDEuNy0xLjJjMS0wLjcsMS44LTEuNywyLjUtMi43QzIxLjgsOSwyMi44LDguMiwyMy45LDcuNyIvPgo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNMzIuNyw3LjNjMCwwLTQuNC0xLjQtOSwyLjJjMCwwLTUuNSwzLjQtNi45LDE2LjljLTAuMiwxLjctMC4zLDMuMy0wLjIsNWMwLjEsMS4yLDEuMSwyLDIuMiwyLjEKCWMwLDAsMi41LDAuMiwyLjYtMi4xbDAuMi0zLjJjMCwwLDAuNC05LDQtMTMuNWwwLjksMC43QzI3LjcsMTIsMjkuOSw5LjIsMzIuNyw3LjNMMzIuNyw3LjN6Ii8+CjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik00MS42LDcuM2MtMy43LTAuNy03LjQsMC41LTEwLDMuMmMwLDAtNC4yLDMuNy01LjQsMTNjMCwwLTAuNSw1LTAuNiw3LjRjMCwxLjMsMC45LDIuNCwyLjIsMi42CgljMS4zLDAuMSwyLjQtMC45LDIuNS0yLjJjMC0wLjEsMC0wLjEsMC0wLjJjMCwwLDAuMi0xMS4zLDQuNC0xNi41bDEsMC42QzM1LjYsMTUuMywzNy40LDEwLjEsNDEuNiw3LjNMNDEuNiw3LjN6Ii8+CjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik00OC4yLDcuMWMtMy45LDAuMS03LjQsMi4zLTkuMyw1LjdjMCwwLTQsNS44LTQsMTcuNmMwLDAtMC4yLDIuOCwyLDMuMWMxLjQsMC4xLDIuNi0xLDIuNi0yLjQKCWMwLTAuMSwwLTAuMywwLTAuNGMwLDAsMC4xLTExLjcsNC42LTE2LjRjMCwwLDQsNC43LDQuMywxNS45YzAsMCwwLjEsNy43LDEuNiwxMS45YzAuOS0zLjcsMS40LTcuNSwxLjUtMTEuM2MwLTAuOCwwLjMtMS41LDAuOS0yCgljMCwwLDAuNy0wLjMsMC41LTEuNWMwLDAtMS05LjctNC4yLTE1LjNjMCwwLDYuOS0wLjUsOC4yLDEzLjNjMCwxLjIsMC40LDIuMywxLjEsMy4zYzAuNiwwLjUsMC45LDEuMiwwLjksMmMwLjEsMi44LDAsNS41LTAuNCw4LjIKCWMtMC4xLDEuMSwwLjEsMi4zLDAuNSwzLjNjMS0zLDEuNC02LjIsMS4zLTkuM2MwLDAtMC4yLTMuNywxLjYtNWMwLDAtMC4xLTEwLjUtNC4zLTE2LjJDNTUuNCw4LjcsNTEuOSw3LjEsNDguMiw3LjFMNDguMiw3LjF6Ii8+CjxwYXRoIGNsYXNzPSJzdDAiIGQ9Ik02OC44LDU0LjRjMy40LDEuMSw3LjEsMC4zLDkuOC0yLjFjMCwwLDUuOS00LDctMjAuNmMwLDAsMC4zLTIuOC0yLjEtMy4yYzAsMC0yLjUtMC41LTIuOCwxLjYKCXMtMC4zLDEyLjYtNC45LDE4Yy0wLjQsMC41LTEsMS0xLjcsMS4yYy0xLDAuNy0xLjgsMS43LTIuNSwyLjdDNzAuOCw1My4xLDY5LjksNTMuOCw2OC44LDU0LjQiLz4KPHBhdGggY2xhc3M9InN0MCIgZD0iTTU5LjksNTQuOGMwLDAsNC40LDEuNCw5LTIuMmMwLDAsNS41LTMuNCw2LjktMTYuOWMwLjItMS43LDAuMy0zLjMsMC4yLTVjLTAuMS0xLjItMS4xLTIuMS0yLjItMi4xCgljMCwwLTIuNS0wLjItMi42LDIuMWwtMC4yLDMuMmMwLDAtMC40LDktNCwxMy41TDY2LDQ2LjhDNjQuOSw1MCw2Mi44LDUyLjksNTkuOSw1NC44TDU5LjksNTQuOHoiLz4KPHBhdGggY2xhc3M9InN0MCIgZD0iTTUxLjEsNTQuOGMzLjcsMC43LDcuNC0wLjUsMTAtMy4yYzAsMCw0LjItMy43LDUuNC0xM2MwLDAsMC41LTUsMC42LTcuNGMwLTEuMy0wLjktMi40LTIuMi0yLjYKCWMtMS4zLTAuMS0yLjQsMC45LTIuNSwyLjJjMCwwLjEsMCwwLjEsMCwwLjJjMCwwLTAuMSwxMS4zLTQuNCwxNi41bC0xLTAuNkM1Ny4xLDQ2LjcsNTUuMyw1Miw1MS4xLDU0LjhMNTEuMSw1NC44eiIvPgo8cGF0aCBjbGFzcz0ic3QwIiBkPSJNNDQuNCw1NWMzLjktMC4xLDcuNC0yLjMsOS4zLTUuN2MwLDAsNC01LjgsNC0xNy42YzAsMCwwLjItMi44LTItMy4xYy0xLjQtMC4xLTIuNiwxLTIuNiwyLjQKCWMwLDAuMSwwLDAuMywwLDAuNGMwLDAtMC4xLDExLjctNC42LDE2LjRjMCwwLTQtNC43LTQuMy0xNS45YzAsMC0wLjEtNy43LTEuNi0xMS45Yy0wLjksMy43LTEuNCw3LjUtMS41LDExLjNjMCwwLjgtMC4zLDEuNS0wLjksMgoJYzAsMC0wLjcsMC4zLTAuNSwxLjVjMCwwLDEsOS43LDQuMiwxNS4zYzAsMC02LjksMC41LTguMi0xMy4zYzAtMS4yLTAuNC0yLjMtMS4xLTMuM2MtMC42LTAuNS0wLjktMS4yLTAuOS0yCgljLTAuMS0yLjgsMC01LjUsMC40LTguMmMwLTEuMS0wLjEtMi4zLTAuNS0zLjNjLTEsMy0xLjQsNi4yLTEuMiw5LjNjMCwwLDAuMiwzLjctMS42LDVjMCwwLDAuMiwxMC41LDQuMywxNi4yCglDMzcuMiw1My40LDQwLjcsNTUsNDQuNCw1NUw0NC40LDU1eiIvPgo8L3N2Zz4K' } const toolbarImages = { zoomReset: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBMaWNlbnNlOiBQRC4gTWFkZSBieSBtb25vLWNvbXBhbnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9tb25vLWNvbXBhbnkvbW9uby1pY29ucyAtLT4KPHN2ZyB3aWR0aD0iODAwcHgiIGhlaWdodD0iODAwcHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMTAgNGE2IDYgMCAxIDAgMCAxMiA2IDYgMCAwIDAgMC0xMnptLTggNmE4IDggMCAxIDEgMTQuMzIgNC45MDZsNS4zODcgNS4zODdhMSAxIDAgMCAxLTEuNDE0IDEuNDE0bC01LjM4Ny01LjM4N0E4IDggMCAwIDEgMiAxMHoiIGZpbGw9IiMwRDBEMEQiLz48L3N2Zz4=', diff --git a/index.min.js b/index.min.js index 00175d0..f1e340b 100644 --- a/index.min.js +++ b/index.min.js @@ -1 +1 @@ -const FlowRenderer=function(){const t=this||{},e=100,i=8e3,n=8e3,M=13.5,o={view:{}};o.view.tools={},o.utils={},o.view.gridSize=function(){return 20},o.view.tools.calculateGridSnapOffsets=function(t,e){0;e=e||{align:"nearest"};const i={x:0,y:0},n=o.view.gridSize(),M=t.x-(n*Math.round((t.x-t.w/2)/n)+t.w/2),A=t.x-(n*Math.round((t.x+t.w/2)/n)-t.w/2);i.x=A,"right"===e.align||("left"===e.align||Math.abs(M)t.clientWidth,hasVerticalScrollbar:t.scrollHeight>t.clientHeight}}function m(t,e){let i=1;const n=t.getAttribute("transform");if(n){const t=n.match(/scale\(([^,]+)\)/);t&&(i=w(parseFloat(t[1]||1),.25,3,1))}const M=t.querySelector("g.outerContainer");x(M,i,!0),e.onwheel=function(t){if(t.ctrlKey||t.metaKey){t.preventDefault();let e=C(M);e-=.075*Math.sign(t.deltaY),e=w(e,.2,3,1),x(M,e)}};const o=function(t){const e=b(t,this);if(!e)return null;let i=t.querySelector(".toolbar");i||(i=v(t));let n=i.querySelector(".zoom-controls");if(n)return{zoomIn:i.querySelector(".zoom-in"),zoomOut:i.querySelector(".zoom-out"),zoomReset:i.querySelector(".zoom-reset")};n=e.createElement("div"),n.classList.add("zoom-controls"),n.classList.add("button-group");const M=e.createElement("button");M.classList.add("red-ui-footer-button","icon-button-bg","zoom-in"),M.innerHTML="+",M.title="Zoom In (Ctrl + Mouse Wheel Up)";const o=e.createElement("button");o.classList.add("red-ui-footer-button","icon-button-bg","zoom-reset"),o.title="Zoom & Scroll Reset";const A=e.createElement("button");A.classList.add("red-ui-footer-button","icon-button-bg","zoom-out"),A.innerHTML="-",A.title="Zoom Out (Ctrl + Mouse Wheel Down)",n.appendChild(A),n.appendChild(o),n.appendChild(M),i&&i.appendChild(n);return{zoomIn:M,zoomOut:A,zoomReset:o}}(e);o.zoomIn.onclick=function(){const t=w(C(M)+.1,.2,3,1);x(M,t)},o.zoomOut.onclick=function(){const t=w(C(M)-.1,.2,3,1);x(M,t)},o.zoomReset.onclick=function(){!function(t){const e=t.getAttribute("_scale_original")||1;x(t,e)}(M),function(t){t.scrollLeft=t.getAttribute("_scroll_x")||0,t.scrollTop=t.getAttribute("_scroll_y")||0}(e.querySelector(".red-ui-workspace-chart"))}}function C(t){return parseFloat(t.getAttribute("_scale_current")||1)}function x(t,e,M=!1){t.setAttribute("transform",`scale(${e})`);const o=t.ownerSVGElement||t;o.style.width=i*e+"px",o.style.height=n*e+"px",t.setAttribute("_scale_current",e),M&&t.setAttribute("_scale_original",e)}function T(t,e,i,n=!1){t.scrollLeft=e,t.scrollTop=i,n&&(t.setAttribute("_scroll_x",e),t.setAttribute("_scroll_y",i))}function S(t,e,M){const o=M.autoZoom||M.autoScroll?function(t,e){const M=.2,o=1,A=e.container.querySelector(".red-ui-workspace-chart"),a=A.getBoundingClientRect(),g=a.width-25,s=a.height-25;let r=i,d=n,u=0,l=0;const c=e.flowId,I=t.filter(t=>"tab"!==t.type&&"subflow"!==t.type&&t.z===c);if(0===I.length)return{scale:1,scrollX:0,scrollY:0};for(const t of I){if("tab"===t.type||"subflow"===t.type||"junction"===t.type)continue;const e=t.x||0,i=t.y||0,n=D(t),M=(n.width||100)/2,o=(n.height||30)/2,A=e-M,a=i-o,g=e+M,s=i+o;r=Math.min(r,A),d=Math.min(d,a),u=Math.max(u,g),l=Math.max(l,s)}let N=1;const j=u-r,L=l-d,y=g/j,b=s/L;(j>g||L>s)&&(N=Math.min(y,b),N*=.95);N=w(N,M,o,1);let p=r,m=d;p<50&&(p=0);m<40&&(m=0);p>0&&(p-=50);m>0&&(m-=40);return p=w(p*N,0,A.scrollWidth),m=w(m*N,0,A.scrollHeight),{scale:N,scrollX:p,scrollY:m,minX:r,minY:d,maxX:u,maxY:l}}(e,M):null;if(t=t.ownerSVGElement||t,M.zoom&&o&&M.autoZoom){x(t.querySelector("g.outerContainer"),o.scale,!0)}return o&&M.autoScroll&&T(t.parentElement,o.scrollX,o.scrollY,!0),o}function z(t,e,i){const n=t.parentElement,M=t.querySelector("g.outerContainer"),o=n.scrollLeft,A=n.scrollTop,a=C(M),g=i||e.flowId||"global";n.setAttribute(`data-tab-${g}-x`,o),n.setAttribute(`data-tab-${g}-y`,A),n.setAttribute(`data-tab-${g}-scale`,a)}function h(t,e,i){const n=t.parentElement,M=t.querySelector("g.outerContainer"),o=i||e.flowId||"global",A=n.getAttribute(`data-tab-${o}-x`),a=n.getAttribute(`data-tab-${o}-y`),g=n.getAttribute(`data-tab-${o}-scale`);"string"==typeof A&&"string"==typeof a&&T(n,A,a),"string"==typeof g&&x(M,g)}function f(t){const e=t.parentElement,i=t.querySelector("g.outerContainer");for(const t in i.dataset)/^tab-\w+-.*/.test(t)&&e.removeAttribute(t)}function E(t){const e=b(t,this).createElement("div");return e.classList.add("red-ui-workspace-chart"),t?(t.appendChild(e),e):e}function v(t){const e=b(t,this);if(!e)return null;let i=t.querySelector(".toolbar");return i||(i=e.createElement("div"),i.classList.add("toolbar"),t&&t.appendChild(i),i)}function O(t,{addDefaultLayer:e=!0,layer:M=0}={}){const o=b(t,this),A=o.createElementNS("http://www.w3.org/2000/svg","svg");A.setAttribute("style",`width:${i}px; height:${n}px;`),t.appendChild(A);const a=o.createElementNS("http://www.w3.org/2000/svg","defs");A.appendChild(a);a.innerHTML='\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ';const g=k("g",{class:"outerContainer"});return A.appendChild(g),e&&Z(A,{layer:M}),A}function k(t,e,i){const n=b(i,this).createElementNS("http://www.w3.org/2000/svg",t);if("object"==typeof e)for(const t in e)n.setAttribute(t,e[t]);return i&&i.appendChild(n),n}function Z(t,{layer:e=0,opacity:i=1}={}){let n=t.querySelector("g.outerContainer");n||(n=k("g",{class:"outerContainer"},t)),n.querySelector("g.flow_grid")||k("g",{class:"flow_grid"},n);let M=n.querySelector(`g.flow-layer-${e}`);for(M||(M=k("g",{class:`flow-layer-${e||0}`},n));M.firstChild;)M.removeChild(M.firstChild);return M.setAttribute("opacity",i),k("g","flow_group_elements",M),k("g","flow_group_select",M),k("g","flow_wires",M),k("g","flow_nodes",M),M}function B(t){if(t.childNodes.length>0)return;k("rect",{width:`${i}px`,height:`${n}px`,fill:"url(#grid)"},t).style.transform="translate(-1px, -1px)"}function Y(t,e,i,n,M){const o=b(M,this).createElement(t);if("object"==typeof e)for(const t in e)o.setAttribute(t,e[t]);return i&&"string"==typeof i?o.classList.add(...i.split(" ")):Array.isArray(i)&&o.classList.add(...i),"string"==typeof n&&(o.textContent=n),M&&M.appendChild(o),o}function U(t){const e=[],i={},n=new Set([...Object.keys(t.changed),...Object.keys(t.added),...Object.keys(t.deleted),...Object.keys(t.moved),...Object.keys(t.positionChanged)]),M=t.currentConfig,o=t.newConfig;function A(e,i,n,M,o,A){const a={tab:e,item:i,diffType:n,prop:M,value1:o,value2:A,toString:()=>""},g=t=>t?`'${t}'`:"''",s=t=>t?g(function(t,e,i){const n=$[t.type]||$._default,M=e&&e[t.type]||{};return n(t,M,i)}(t)):"'n/a'",r=t.currentConfig.all[e]||t.newConfig.all[e],d=s(r),u=t.currentConfig.all[i]||t.newConfig.all[i],l="tab"===i?r:t.currentConfig.all[i],c="tab"===i?r:t.newConfig.all[i],I="tab"===i?"tab":"node",N=/wires\[\d+\]/.test(M);let j="";N&&(a.value1&&!a.value2?j=`had wire removed from ${s(l)}`:!a.value1&&a.value2&&(j=`was wired up to ${s(c)}`));const L=o&&("z"===M||/wires\[\d+\]/.test(M))?t.currentConfig.all[o]:null,D=A&&("z"===M||/wires\[\d+\]/.test(M))?t.newConfig.all[A]:null;return a.toString=function(){const t=[];switch(n){case"deleted":t.push("deleted",I,s(u));break;case"added":t.push("added",I,s(u));break;case"moved":t.push(s(u),"moved from ",s(L),"to",s(D));break;case"changed":"g"===M?o&&!A?t.push(d,s(u),"was removed from group",g(s(o))):!o&&A?t.push(d,s(u),"was added to group",g(s(A))):t.push(d,s(u),"moved group from",g(o),"to",g(A)):N?t.push(d,s(u),j):"tab"===i?t.push("tab",d,"property",g(a.prop),"was",g(a.value1||"")+", now",g(a.value2||"")):t.push(s(u),"property",g(a.prop),"was",g(a.value1||""),"now",g(a.value2||""));break;case"positionChanged":t.push(s(u),"moved from",a.value1,"to",a.value2);break;default:t.push(d,s(u),g(a.prop),"was",g(a.value1||""),"now",g(a.value2||""))}return t.join(" ")},a}function a(t,e){const i=t.currentConfig.all,M=t.newConfig.all,o=[];if(!e.v1||!e.v2)return e.v1&&o.push(A(e.id,e.id,"tab","deleted",e.v1,null)),e.v2&&o.push(A(e.id,e.id,"tab","added",null,e.v2)),o;const a=e.v1?.tab?{...e.v1.tab.n}:{};a.order=e.v1?.order;const s=e.v2?.tab?{...e.v2.tab.n}:{};s.order=e.v2?.order;const r=e.v1?.tab?.nodes||[],d=e.v2?.tab?.nodes||[];o.push(...g(e.id,"tab","","changed",a,s));const u=r.map(t=>t.id),l=d.map(t=>t.id),c=new Set([...u,...l].filter(t=>n.has(t))),I=t=>"number"!=typeof t?null:t,N=(t,e)=>{const i={...e};for(const e of t)delete i[e];return i};for(const n of c){const A=i[n],a=M[n],s=!(!A||!a);if(t.deleted[n])o.push(...g(e.id,n,"","deleted",A,a));else if(t.added[n])o.push(...g(e.id,n,"","added",A,a));else if(s){let i=!0;if(t.moved[n]&&o.push(...g(e.id,n,"","moved",{z:A.z},{z:a.z})),t.positionChanged[n]){i=!1;const t={x:I(A.x),y:I(A.y)},M={x:I(a.x),y:I(a.y)},s=JSON.stringify(t),r=JSON.stringify(M);o.push(...g(e.id,n,"position","positionChanged",s,r))}if(i){const t=N(["x","y","z","w","h"],A),i=N(["x","y","z","w","h"],a);o.push(...g(e.id,n,"","changed",t,i))}}}return o}function g(t,e,i,n,M,o){const a=[];if("deleted"===n)a.push(A(t,e,n,i,M?"":"deleted",o?"":"deleted"));else if("added"===n)a.push(A(t,e,n,i,M?"added":"",o?"added":""));else if(typeof M!=typeof o)a.push(A(t,e,"changed",i,M||"",o||""));else if(Array.isArray(M))for(let A=0;A{const e=`${"z"===t.prop&&"moved"===t.diffType?"*":t.tab}-${t.item}-${t.diffType}-${t.prop}-${t.value1}-${t.value2}`;return!s.has(e)&&(s.add(e),!0)})}()),{get changes(){return e},get diff(){return t},get tabs(){return i},getNodeInfo:t=>({propertiesChanged:e.filter(e=>e.itemId===t&&e.tab!==t),v1:M.all[t],v2:o.all[t]}),getTabInfo:t=>({propertiesChanged:e.filter(e=>e.tab===t&&"tab"===e.itemId),nodesChanged:e.filter(e=>e.tab===t&&"tab"!==e.itemId),v1:i[t],v2:i[t]})}}function Q(t){t&&t.length&&"string"!=typeof t&&"string"==typeof t[0]&&(t=[...t].join(" "));return`\n :root {\n --red-ui-view-grid-color: #eee;\n --red-ui-view-border: 1px solid #bbbbbb;\n --red-ui-node-border: #999;\n --red-ui-node-port-background: #d9d9d9;\n --red-ui-workspace-button-color: #333;\n --red-ui-workspace-button-background: #f3f3f3;\n\n --red-ui-primary-font: Helvetica Neue, Arial, Helvetica, sans-serif;\n --red-ui-primary-font-size: 14px;\n --red-ui-monospace-font: Menlo, Consolas, DejaVu Sans Mono, Courier, monospace;\n --red-ui-primary-background: #f3f3f3;\n\n --red-ui-form-background: #fff;\n --red-ui-form-placeholder-color: #aaa;\n --red-ui-form-text-color: #555;\n --red-ui-form-text-color-disabled: #bbb;\n --red-ui-form-input-focus-color: rgba(85, 150, 230, 0.8);\n --red-ui-form-input-border-color: #ccc;\n --red-ui-form-input-border-selected-color: #aaa;\n --red-ui-form-input-border-error-color: rgb(214, 97, 95);\n --red-ui-form-input-background: #fff;\n --red-ui-form-input-background-disabled: #f9f9f9;\n --red-ui-form-button-background: #efefef;\n\n --red-ui-diff-state-color: #555;\n --red-ui-diff-state-prefix-color: #888;\n --red-ui-diff-state-added: #009900;\n --red-ui-diff-state-deleted: #f80000;\n --red-ui-diff-state-changed: #f89406;\n --red-ui-diff-state-moved: #3f81b3;\n }\n ${t=(t=t||".flow-renderer").split(" ").map(t=>`.${t}`).join(" ").trim()} .diff-table {\n width: 100%;\n font-size: var(--red-ui-primary-font-size);\n font-family: var(--red-ui-primary-font);\n }\n ${t} .diff-table thead tr {\n font-weight: bold;\n padding: 2px 4px;\n /* bottom border only */\n border-bottom: 3px solid #ddd;\n }\n ${t} .diff-table td {\n padding: 2px 4px;\n border-bottom: 1px solid #ddd;\n }\n ${t} .diff-table .diff-info {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n ${t} .diff-value button {\n height: 20px;\n width: 20px;\n padding: 1px;\n }\n ${t} .diff-value span {\n margin-left: 4px;\n margin-top: 2px;\n }\n ${t} .diff-type {\n height: 14px;\n width: 14px;\n margin: 2px;\n }\n ${t} .diff-type-text {\n flex-grow: 1;\n }\n ${t} .diff-type-moved {\n background-color: var(--red-ui-diff-state-moved);\n }\n ${t} .diff-type-added {\n background-color: var(--red-ui-diff-state-added);\n }\n ${t} .diff-type-deleted {\n background-color: var(--red-ui-diff-state-deleted);\n }\n ${t} .diff-type-changed {\n background-color: var(--red-ui-diff-state-changed);\n }\n ${t} .diff-type-positionChanged {\n background-color: var(--red-ui-diff-state-changed);\n }\n\n .red-ui-editor {\n font-size: var(--red-ui-primary-font-size);\n font-family: var(--red-ui-primary-font);\n padding: 0;\n margin: 0;\n background: var(--red-ui-primary-background);\n color: var(--red-ui-primary-text-color);\n line-height: 20px\n }\n ${t} {\n position: relative;\n }\n /* Source view */\n ${t} pre.red-ui-workspace-source {\n height: 100%;\n overflow: auto;\n width: 100%;\n font-family: var(--red-ui-monospace-font);\n background-color: #f7f7f7;\n }\n /* Chart view */\n ${t} .red-ui-workspace-chart {\n box-sizing: border-box;\n border: var(--red-ui-view-border);\n overflow: scroll;\n height: 100%;\n width: 100%;\n }\n ${t} div.red-ui-footer {\n height: 20px\n }\n ${t}.has-tabs div.red-ui-workspace-chart {\n height: calc(100% - 34px);\n }\n ${t} svg {\n position: relative;\n width: 100%;\n height: 100%;\n min-height: 250px;\n margin: auto;\n display: block;\n border-radius: 2px;\n }\n ${t} svg {\n cursor: default;\n }\n ${t} svg .group-text-label {\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 14px;\n }\n ${t} svg .node-text-label {\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 14px;\n dominant-baseline: middle;\n }\n ${t} svg .subflow-node-text-label {\n color: rgb(85, 85, 85);\n dominant-baseline: middle;\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 10px;\n line-height: 20px;\n pointer-events: none;\n text-anchor: middle;\n user-select: none\n }\n ${t} svg .subflow-node-text-label-number {\n color: rgb(85, 85, 85);\n dominant-baseline: middle;\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 16px;\n line-height: 20px;\n pointer-events: none;\n text-anchor: middle;\n user-select: none\n }\n\n ${t} svg .node {\n fill-opacity: 1;\n stroke-width: 1px;\n }\n ${t} svg .link {\n stroke: #999;\n stroke-width: 3;\n fill: none;\n }\n ${t} svg .link-highlight, .node-highlight {\n stroke: rgb(255, 127, 14);\n }\n ${t} svg .node-highlight {\n stroke-width: 3px;\n }\n ${t} .tab-glow {\n border-radius: 2px;\n animation: tab-glow-animation 1s infinite;\n }\n @keyframes tab-glow-animation {\n 0% {\n box-shadow: 0 0 0px 0px #7d26cddd;\n }\n 50% {\n box-shadow: 0 0 10px 5px #7d26cddd;\n }\n 100% {\n box-shadow: 0 0 0px 0px #7d26cddd;\n }\n }\n\n ${t} svg .node-disabled {\n stroke-dasharray: 8,3;\n fill-opacity: 0.5;\n }\n ${t} svg .group-highlight {\n stroke: rgb(255, 127, 14);\n stroke-width: 4px;\n fill: rgb(255, 127, 14);\n fill-opacity: 0.2;\n }\n ${t} svg .link-disabled {\n stroke-dasharray: 10,8 !important;\n stroke-width: 2 !important;\n stroke: rgb(204, 204, 204);\n }\n ${t} svg .grid-line {\n shape-rendering: geometricprecision;\n stroke: rgb(238, 238, 238);\n stroke-width: 1px;\n fill: none;\n }\n ${t} svg .red-ui-flow-port {\n stroke-width: 1px;\n stroke-miterlimit: 4;\n fill: var(--red-ui-node-port-background);\n }\n ${t} svg .red-ui-flow-port-input {\n stroke-width: 1px;\n stroke-miterlimit: 4;\n fill: var(--red-ui-node-port-background);\n }\n ${t} svg .flow-render-error {\n background-color: rgb(54, 52, 52); \n color: rgb(196, 59, 59); \n width: 100%;\n }\n ${t} svg text {\n user-select: none;\n }\n ${t} .red-ui-tabs {\n display: flex;\n }\n ${t} .red-ui-tab {\n padding: 6px 12px;\n box-sizing: border-box;\n display: block;\n border: 1px solid #bbbbbb;\n border-right: none;\n background-color: #f0f0f0;\n max-width: 200px;\n max-height: 34px; /* for calculating svg height */\n height: 34px; /* for calculating svg height */\n width: 14%;\n overflow: hidden;\n white-space: nowrap;\n position: relative;\n margin-top: -1px;\n transition: 0.2s background-color;\n user-select: none;\n position: relative;\n z-index: 1;\n top: 1px;\n }\n ${t} .red-ui-tab div.red-ui-tab-label {\n position: absolute;\n top: 7px;\n left: 10px;\n }\n ${t} .red-ui-tab-subflow-icon {\n mask-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMjUgMjUuOTRoN2MuNTggMCAxLS40MiAxLTF2LTJjMC0uNTgtLjQyLTEtMS0xaC03Yy0uNTggMC0xIC40Mi0xIDF2MmMwIC41OC40MiAxIDEgMXptLTE3IDEyaDdjLjU4IDAgMS0uNDIgMS0xdi0yYzAtLjU4LS40Mi0xLTEtMUg4Yy0uNTggMC0xIC40Mi0xIDF2MmMwIC41OC40MiAxIDEgMXptLS40MTYgMTFDNS42MjQgNDguOTQgNCA0Ny4zMTUgNCA0NS4zNTZWMTQuNTIyYzAtMS45NiAxLjYyNS0zLjU4MiAzLjU4NC0zLjU4MmgyNC44MzJjMS45NiAwIDMuNTg0IDEuNjIzIDMuNTg0IDMuNTgydjMwLjgzNGMwIDEuOTYtMS42MjUgMy41ODQtMy41ODQgMy41ODR6TTMyIDM2Ljk0SDE5YzAgMi4xOS0xLjgxIDQtNCA0SDd2NC40MTZjMCAuMzUuMjM1LjU4NC41ODQuNTg0aDI0LjgzMmMuMzUgMCAuNTg0LS4yMzUuNTg0LS41ODR2LTguNDE3em0xLTJ2LTZoLThjLTIuMTkgMC00LTEuODEtNC00aC0xYy00LjMzMy0uMDAyLTguNjY3LjAwNC0xMyAwdjZoOGMyLjE5IDAgNCAxLjgxIDQgNGgxM3ptMC0xNnYtNC40MThjMC0uMzUtLjIzNS0uNTgyLS41ODQtLjU4Mkg3LjU4NGMtLjM1IDAtLjU4NC4yMzMtLjU4NC41ODJ2OC40MTdjNC4zMzMuMDAyIDguNjY3LjAwMSAxMyAuMDAxaDFjMC0yLjE5IDEuODEtNCA0LTRoOHoiIGNvbG9yPSIjMDAwIiBmaWxsPSIjZmZmIi8+PC9zdmc+Cg==);\n display: inline-block;\n background-color: grey;\n margin-left: -8px;\n margin-right: 3px;\n margin-top: -1px;\n margin-bottom: 1px;\n opacity: 1;\n width: 16px;\n height: 18px;\n vertical-align: middle;\n mask-size: contain;\n mask-position: center;\n mask-repeat: no-repeat;\n }\n ${t} .red-ui-tab-disabled-icon {\n mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25' viewBox='0 0 1536 1792' style='&%2310;'%3E%3Cscript xmlns=''/%3E%3Cpath d='M1312 893q0-161-87-295l-754 753q137 89 297 89 111 0 211.5-43.5t173.5-116.5 116-174.5 43-212.5zM313 1192l755-754q-135-91-300-91-148 0-273 73t-198 199-73 274q0 162 89 299zM1536 893q0 157-61 300t-163.5 246-245 164-298.5 61-298.5-61-245-164-163.5-246-61-300 61-299.5 163.5-245.5 245-164 298.5-61 298.5 61 245 164 163.5 245.5 61 299.5z' fill='currentColor'/%3E%3Cscript xmlns=''/%3E%3C/svg%3E");\n display: inline-block;\n background-color: grey;\n margin-left: -8px;\n margin-right: 3px;\n margin-top: 0px;\n margin-bottom: 0px;\n opacity: 1;\n width: 16px;\n height: 16px;\n vertical-align: middle;\n mask-size: contain;\n mask-position: center;\n mask-repeat: no-repeat;\n transform: translateY(-2px);\n }\n ${t} .red-ui-tab span {\n font-size: 0.875rem;\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n }\n ${t} .red-ui-tab.active {\n background-color: white;\n border-bottom-color: white;\n font-weight: bold;\n }\n ${t} .red-ui-tab.disabled {\n border-top-style: dashed;\n border-left-style: dashed;\n font-style: italic;\n }\n ${t} .red-ui-tab:last-child {\n border-right: 1px solid #bbbbbb;\n }\n ${t} .red-ui-tab:last-child.disabled {\n border-right-style: dashed;\n }\n ${t} .red-ui-tab:hover {\n cursor: pointer;\n background-color: white;\n }\n /* positioning of toolbar */\n ${t} .toolbar {\n display: flex;\n flex-direction: row;\n position: absolute;\n bottom: 5px;\n right: 5px;\n opacity: 0.6;\n }\n ${t} .toolbar:hover {\n opacity: 1;\n }\n ${t}.has-scrollbars .toolbar {\n bottom: 24px;\n right: 24px;\n }\n\n ${t} .hidden {\n display: none !important;\n }\n ${t} .toolbar .button-group.hidden {\n display: none !important;\n }\n ${t} .toolbar .icon-button-bg.view-source {\n background-image: url("${I}");\n }\n ${t} .toolbar .icon-button-bg.download-flow {\n background-image: url("${c}");\n }\n ${t} .toolbar .icon-button-bg.copy-flow {\n background-image: url("${l}");\n }\n ${t} .toolbar .icon-button-bg.zoom-reset {\n background-image: url("${u}");\n }\n ${t} .toolbar .icon-button-bg {\n background-repeat: no-repeat;\n background-position: center;\n background-size: 16px 16px; /* Size of the background SVG */\n background-color: transparent;\n padding: 4px;\n cursor: pointer;\n width: 24px;\n height: 24px;\n font-size: 0; /* Hide any default button text if present */\n line-height: 0; /* Hide any default button text if present */\n }\n\n ${t} .toolbar .icon-button-bg:hover {\n background-color: #f0f0f0;\n }\n\n /* styles for button groups and buttons */\n ${t} .button-group {\n display: flex;\n flex-direction: row;\n }\n ${t} .button-group button {\n user-select: none;\n box-sizing: border-box;\n display: inline-block;\n text-align: center;\n cursor: pointer;\n line-height: 22px;\n height: 24px;\n color: var(--red-ui-workspace-button-color) !important;\n background: var(--red-ui-workspace-button-background);\n text-decoration: none;\n border: 1px solid var(--red-ui-form-input-border-color);\n margin: 0px;\n padding: 0px;\n }\n ${t} .button-group button:not(:first-child) {\n border-top-left-radius: 0px;\n border-bottom-left-radius: 0px;\n border-left: none;\n }\n\n /* zoom controls */\n ${t} .zoom-controls.button-group button {\n font-size: 22px;\n width: 24px;\n }\n\n /* copy controls */\n ${t} .copy-controls.button-group {\n margin-right: 8px;\n }\n ${t} .copy-controls.button-group button {\n padding: 0px 4px;\n }\n\n /* source controls */\n ${t} .source-controls.button-group {\n margin-right: 8px;\n }\n ${t} .source-controls.button-group button {\n padding: 0px 4px;\n }\n\n /* compare controls */\n ${t} .compare-controls.button-group {\n margin-right: 24px;\n }\n ${t} .compare-controls input[type='range'].flow-compare-slider {\n width: 100%;\n -webkit-appearance: none;\n }\n ${t} input[type='range'].flow-compare-slider::-webkit-slider-runnable-track {\n height: 16px;\n background: var(--red-ui-workspace-button-background);\n border-radius: 16px;\n }\n /* Track: Mozilla Firefox */\n ${t} input[type='range'].flow-compare-slider::-moz-range-track {\n height: 16px;\n background: var(--red-ui-workspace-button-background);\n border-radius: 16px;\n }\n `}function G(t,e){const i="flow-renderer-css"+(e?"--"+e.toString():"").replace(/[^a-z0-9]/gi,"-").toLowerCase();let n=t.getElementById(i);n||(n=t.createElement("style"),n.id=i,n.innerHTML=Q(e),t.head.appendChild(n))}function H(t,e){if(t){const i=t.querySelector(`.flow-layer-${e||0}`);["flow_group_elements","flow_group_select","flow_wires","flow_nodes"].forEach(t=>{const e=i.querySelector(`.${t}`)||k("g",{class:t},i);for(;e.firstChild;)e.removeChild(e.firstChild)})}}function W(t){const e=[],i={},n={},M=[],o={};return t.forEach(function(t){o[t.id]=t,"tab"===t.type?(e.push(t.id),i[t.id]={n:t,nodes:[]}):"subflow"===t.type&&(n[t.id]={n:t,nodes:[]})}),t.forEach(function(t){"tab"!==t.type&&"subflow"!==t.type&&(i[t.z]?i[t.z].nodes.push(t):n[t.z]?n[t.z].nodes.push(t):M.push(t))}),{all:o,tabOrder:e,tabs:i,subflows:n,globals:M}}function P(t,i,n,M,o,A=!1){const a=M-i,g=n-t,s=Math.sqrt(a*a+g*g);let r=.75;if(g*o>0?s0){const A=[[t+o*(e*r),i+0],[n-o*r*e,M-0]];return`M ${t} ${i} C ${A[0][0]} ${A[0][1]} ${A[1][0]} ${A[1][1]} ${n} ${M}`}{let s,d,u,l,c;const I=Math.floor(n-g/2),N=Math.floor(M-a/2);if(Math.abs(a)<10){l=Math.max(i,M)+(A?35:25);const e=l-i;return c=[[t+15*o,i],[t+25*o,i+5],[t+25*o,i+e/2],[t+25*o,i+e-5],[t+15*o,i+e],[t,i+e],[n-15*o,i+e],[n-25*o,i+e-5],[n-25*o,M+(l-M)/2],[n-25*o,M+5],[n-15*o,M],[n,M]],"M "+t+" "+i+" C "+c[0][0]+" "+c[0][1]+" "+c[1][0]+" "+c[1][1]+" "+c[2][0]+" "+c[2][1]+" C "+c[3][0]+" "+c[3][1]+" "+c[4][0]+" "+c[4][1]+" "+c[5][0]+" "+c[5][1]+" h "+g+" C "+c[6][0]+" "+c[6][1]+" "+c[7][0]+" "+c[7][1]+" "+c[8][0]+" "+c[8][1]+" C "+c[9][0]+" "+c[9][1]+" "+c[10][0]+" "+c[10][1]+" "+c[11][0]+" "+c[11][1]+" "}{const A=15,g=(M+N)/2;s=t+o*e*r,d=a>0?Math.min(g-a/2,i+A):Math.max(g-a/2,i-A),u=n-o*e*r,l=a>0?Math.max(g,M-A):Math.min(g,M+A);const j=(t+s)/2,L=a>0?1:-1;return c=[[j,i],[s,a>0?Math.max(i,d-A):Math.min(i,d+A)],[j,a>0?Math.min(N,d+A):Math.max(N,d-A)],[u,a>0?Math.max(N,l-A):Math.min(N,l+A)],[(n+u)/2,M]],c[2][1]===d+L*A&&(Math.abs(a)<10*A&&(c[1][1]=d-L*A/2,c[3][1]=l-L*A/2),c[2][0]=s),"M "+t+" "+i+" C "+c[0][0]+" "+c[0][1]+" "+c[1][0]+" "+c[1][1]+" "+s+" "+d+" S "+c[2][0]+" "+c[2][1]+" "+I+" "+N+" S "+c[3][0]+" "+c[3][1]+" "+u+" "+l+" S "+c[4][0]+" "+c[4][1]+" "+n+" "+M}}}function R(t,e){const i=function(t){let e=[];const i=t.split(/\\n /);if(i.length>1){let t=0;for(t=0;t{switch(t){case"str":return"string";case"num":return"number";case"bool":return"boolean";case"json":return"json";case"date":return"timestamp";case"bin":return"binary";case"env":return"environment";case"flow":return"flow";case"global":return"global";default:return t}},q=["inject","change","switch","function","template","delay","trigger","link in","link out","link call","watch","complete","catch","status","comment","debug","subflow","range","filter","rbe","mqtt in","mqtt out","http in","http response","http request","websocket in","websocket out","tcp in","tcp out","udp in","udp out","tcp request","split","join","sort","batch","csv","json","xml","yaml","html","file in","file","exec"],K=(t,e,i)=>{const n=t.name||e.name;if(n)return n;const M=t.label||t.info||t.text||"";let o="",A="",a="",g="";switch(t.type){case"file":a="write file";case"file in":return a=a||"read file",A=t.filename,"str"!==t.filenameType&&"env"!==t.filenameType&&(A=""),"env"===t.filenameType&&(A="env."+A),"write file"===a&&"delete"===t.overwriteFile?t.name||"delete "+A:t.name||A||a;case"html":o=t.tag;break;case"tcp in":case"tcp out":case"tcp request":a="tcp:";case"udp in":case"udp out":return a=a||"udp:",A=t.host||t.addr||t.server||"",a+(A?A+":":"")+(t.port||"");case"debug":return!0!==t.console&&"true"!==t.console||(g="\t⇲"),"jsonata"===t.targetType?(t.name||"JSONata")+g:!0===t.complete||"true"===t.complete?(t.name||"msg")+g:(t.name||"msg."+(t.complete&&"false"!==t.complete?this.complete:"payload"))+g}return t.type&&t.type.startsWith("ui-")?o=t.type.replace(/^ui-/,""):t.type&&t.type.startsWith("ui_")&&(o=t.type.replace(/^ui_/,"")),o&&o.length<=32?o:M||(t.topic&&t.topic.length<=32&&q.includes(t.type)?t.topic:t.type)},_=(t,e,i)=>(t.name||t.label||t.info||t.text||"").replace(/(.{40,60})([ \n\t])/g,"$1\\n$2")+(t.sumPass?" ⭄":"")+(t.sumPassPrio&&0!=parseInt(t.sumPassPrio)?" ("+t.sumPassPrio+")":""),$={base64:void 0,batch:void 0,catch:(t,e,i)=>{let n="";return t.uncaught&&(n=": uncaught"),t.scope&&(n=": "+t.scope.length),t.scope||t.uncaught||(n=": all"),t.name||t.type+n},change:t=>{function e(t,e){return t+"."+o.utils.parseContextKey(e).key}return t.name?t.name:(t._=t._||function(t,e){let i=t;switch(t){case"change.label.set":i="set {{property}}";break;case"change.label.change":i="change {{property}}";break;case"change.label.move":i="move {{property}}";break;case"change.label.delete":i="delete {{property}}";break;case"change.label.changeCount":i="change {{count}} properties"}for(const n in e)t=i.replace(new RegExp("\\{\\{"+n+"\\}\\}","g"),e[n]);return t},t.rules?1===t.rules.length?"set"===t.rules[0].t?t._("change.label.set",{property:e(t.rules[0].pt||"msg",t.rules[0].p)}):"change"===t.rules[0].t?t._("change.label.change",{property:e(t.rules[0].pt||"msg",t.rules[0].p)}):"move"===t.rules[0].t?t._("change.label.move",{property:e(t.rules[0].pt||"msg",t.rules[0].p)}):t._("change.label.delete",{property:e(t.rules[0].pt||"msg",t.rules[0].p)}):t._("change.label.changeCount",{count:t.rules.length}):"replace"===t.action?t._("change.label.set",{property:"msg."+t.property}):"change"===t.action?t._("change.label.change",{property:"msg."+t.property}):"move"===t.action?t._("change.label.move",{property:"msg."+t.property}):t._("change.label.delete",{property:"msg."+t.property}))},comment:void 0,csv:void 0,debug:void 0,exec:void 0,file:void 0,"file in":void 0,function:void 0,html:void 0,"http response":(t,e,i)=>t.name||"http"+(t.statusCode?" ("+t.statusCode+")":""),"http in":(t,e,i)=>t.name||"["+t.method+"] "+t.url,"http request":void 0,inject:t=>{let e="";if(t.once&&(e=" ¹"),(t.repeat&&0!=t.repeat||t.crontab)&&(e="\t↻"),t.name)return t.name+e;let i="",n="str",M="";const A=t.props;if(A)for(let e=0;e0&&i.length<24?i+e:"inject"+e;if("date"===n||"bin"===n||"env"===n)return""!==M&&M.length<=16?M+":"+X(n)+e:X(n)+e;if("flow"===n||"global"===n){return n+"."+o.utils.parseContextKey(i).key+e}return"inject"+e},join:void 0,json:void 0,junction:void 0,"link in":void 0,"link out":void 0,"link call":(t,e,i)=>{if(!t.links||0===t.links.length)return t.name||t.type;let n;return i.forEach(function(M){n||M.id===t.links[0]&&(n=($[M.type]||K)(M,e,i))}),t.name||n||t.type},markdown:void 0,postgresql:void 0,range:void 0,sort:void 0,split:void 0,switch:void 0,yaml:void 0,xml:void 0,BlogPages:void 0,BlogDetails:void 0,BlogPageInfo:(t,e,i)=>{if(t.name)return t.name;let n;return i.forEach(function(e){n||"link in"===e.type&&e.name.startsWith("[blog] ")&&(e.wires[0]||[]).indexOf(t.id)>-1&&(n=e.name.substring(7))}),n||t.type},PubMedium:void 0,Topic:_,Observation:_,Question:_,Thought:_,Idea:_,Analogy:_,Aphorism:_,Poesie:_,Humour:_,Treasure:_,Consequence:_,Advantage:_,Disadvantage:_,Text:_,"Blog-Post":_,Comment:_,Codebase:_,Sketch:_,Inspiration:_,Quote:_,Definition:_,Book:_,Author:_,"nnb-input-node":void 0,"nnb-layer-node":(t,e,i)=>t.name||t.actfunct+": "+t.bias+", "+t.threshold,"nnb-output-node":void 0,"nnb-backprop":void 0,"nnb-trainer":void 0,Seeker:void 0,Sink:void 0,Screenshot:void 0,Orphans:void 0,IsMobile:void 0,Navigator:void 0,DrawSVG:void 0,GetFlows:void 0,_default:K};function tt(t){const e={};let i=1e4,n=0;for(const M of t)"subflow"===M.type?e[M.id]={id:M.id,label:M.name,type:"subflow",disabled:M.disabled,order:i++}:"tab"!==M.type&&M.z&&(e[M.z]||(e[M.z]={id:M.z,label:"Flow "+(n+1),type:"tab",disabled:!1,order:n++}));const M=t.filter(t=>"tab"===t.type);let o=0;for(const t of M)e[t.id]&&(e[t.id].label=t.label||e[t.id].label,e[t.id].disabled=!!t.disabled,e[t.id].order=o++);const A=Object.keys(e).map(t=>e[t]);return A.sort((t,e)=>t.order-e.order),A}function et(t){Array.isArray(t)||(t=[]);const e=[...t];for(let t=0;t0?i.add(...n):e?.classList?.length&&i.add(...e.classList),0===i.size&&i.add("flow-renderer"),[...i]}(t)),t.container){const i={};["scope","gridLines","arrows","zoom","images","linkLines","labels","autoZoom","autoScroll","flowId"].forEach(function(e){if("string"==typeof t.container.dataset[e]){const n=t.container.dataset[e]||"true";i[e.replace(/-/g,"")]="true"===n}}),e.push(i)}e.push(t)}return Object.assign({},...e)}function nt(e,i){e=et(e);const n=b((i=it(i)).document,t.document,i.container,this),M=i.container;for(;M.firstChild;)M.removeChild(M.firstChild);const o=n.createElement("div");o.classList.add("red-ui-tabs"),M.appendChild(o);const A=E(M);!function(t,e,i=!0){const n=b(t,this),M=n.createElement("pre");M.classList.add("red-ui-workspace-source"),i&&M.classList.add("hidden"),M.setAttribute("data-code-wrap","json");const o=n.createElement("code");o.classList.add("lang-json","hljs","language-json"),o.textContent="object"==typeof e?JSON.stringify(e,null,2):"string"==typeof e?e:"// No content available",M.appendChild(o),t&&t.appendChild(M)}(M,e);const a=function(t){const e=b(t,this);if(!e)return null;let i=t.querySelector(".toolbar");i||(i=v(t));let n=i.querySelector(".source-controls");if(n)return{viewSource:i.querySelector(".view-source")};n=e.createElement("div"),n.classList.add("source-controls"),n.classList.add("button-group");const M=e.createElement("button");return M.classList.add("red-ui-footer-button","icon-button-bg","view-source"),M.title="Toggle Flows / Source",n.appendChild(M),i.appendChild(n),{viewSource:M}}(M);a.viewSource.onclick=function(t){!function(t){t.preventDefault(),t.stopPropagation();const e=t.target.parentElement.parentElement.parentElement.querySelector(".red-ui-workspace-chart");if(!e)return void console.warn("No container found for source view toggle");const i=e.parentElement,n=i.querySelector(".red-ui-tabs"),M=i.querySelector(".red-ui-workspace-source"),o=i.querySelector(".zoom-controls");M&&M.classList.contains("hidden")?(M.classList.remove("hidden"),e.classList.add("hidden"),n.classList.add("hidden"),o?.classList.add("hidden")):(M.classList.add("hidden"),e.classList.remove("hidden"),n.classList.remove("hidden"),o?.classList.remove("hidden"))}(t)};const g=function(t){const e=b(t,this);if(!e)return null;let i=t.querySelector(".toolbar");i||(i=v(t));let n=i.querySelector(".copy-controls");if(n)return{copy:i.querySelector(".copy-flow"),download:i.querySelector(".download-flow")};n=e.createElement("div"),n.classList.add("copy-controls"),n.classList.add("button-group");const M=e.createElement("button");M.classList.add("red-ui-footer-button","icon-button-bg","copy-flow"),M.title="Copy Flow to Clipboard";const o=e.createElement("button");return o.classList.add("red-ui-footer-button","icon-button-bg","download-flow"),o.title="Download Flows",n.appendChild(M),n.appendChild(o),i&&i.appendChild(n),{copy:M,download:o}}(M);g.copy.onclick=function(t){!function(t,e,i){i=i||function(){};let n=e||[];"object"==typeof n?n=JSON.stringify(n,null,0):"string"!=typeof n&&(n=n.toString());const M=b(t&&t.target&&t.target.ownerDocument,this);if("undefined"!=typeof navigator&&navigator.clipboard)return void navigator.clipboard.writeText(n).then(function(){i(null,!0)}).catch(function(t){i(t,!1)});const o=M.createElement("textarea");o.value=n,o.style.position="fixed",o.style.top="0",o.style.left="0";try{M.body.appendChild(o),o.focus(),o.select();const t=M.execCommand("copy");i(null,t),console.info("failed to copy",t)}catch(t){console.error("failed to copy",t)}finally{M.body.removeChild(o)}}(t,e)},g.download.onclick=function(t){!function(t,e,i,n,M){M=M||function(){};let o=e||[];"object"==typeof o?o=JSON.stringify(o,null,2):"string"!=typeof o&&(o=o.toString());const A=b(t&&t.target&&t.target.ownerDocument,this),a=new Blob([o],{type:i}),g=URL.createObjectURL(a),s=A.createElement("a");s.style.display="none",s.href=g,s.download=n,s.style.position="fixed",s.style.top="0",s.style.left="0";try{A.body.appendChild(s),s.focus(),s.click(t),URL.revokeObjectURL(g),M(null,!0)}catch(t){M(t,!1),console.error("failed to download",t)}finally{A.body.removeChild(s)}}(t,e,"application/json","flows.json")};const s=O(A);H(s),f(s),M.classList.add(i.scope);const r=function(t){o.querySelectorAll(".red-ui-tab").forEach(t=>t.classList.remove("active"));return o.querySelector(`[data-flow-id="${t}"]`).classList.add("active"),i.flowId=t,Mt(e,i)};G(n,i.scope);const d=M.querySelectorAll(".red-ui-tab");d&&d.forEach(t=>t.remove());const u=tt(e);if(u.forEach((e,n)=>{!function(e,i,n,M,o){const A=`red-ui-tab-${n}`,a=M.container,g=M.svg||a.querySelector("svg"),s=b(M.document,t.document,a,this),r=i.label;let d=a.querySelector(`.${A}`);if(d||(d=s.createElement("div"),e.appendChild(d),d.classList.add("red-ui-tab"),d.classList.add("red-ui-tab-"+i.type),d.setAttribute("data-flow-id",i.id)),i.disabled){d.classList.add("disabled");const t=s.createElement("i");t.classList.add("red-ui-tab-disabled-icon"),d.appendChild(t)}else if("subflow"===i.type){const t=s.createElement("i");t.classList.add("red-ui-tab-subflow-icon"),d.appendChild(t)}d.title=r;const u=s.createElement("span");u.textContent=r,d.appendChild(u),d.onclick=function(t){z(g,M,M.flowId),o(i.id),h(g,M,i.id)}}(o,e,n,i,r)}),u.length?M.classList.add("has-tabs"):M.classList.remove("has-tabs"),!i.flowId){const t=u.find(t=>"tab"===t.type),e=u.find(t=>"subflow"===t.type);i.flowId=t?t.id:e?e.id:null}let l=null;return l=u.length?r(i.flowId):Mt(e,i),z(s,i,i.flowId),l=l||{},l.tabs=u,l.flowId=i.flowId,l.css=l.css||Q(i.scope),l}function Mt(t,i){t=et(t);const n=(i=it(i)).container,A={},s={},u={},l={},c={},I=(i=i||{}).flowId,N=L("junction");let j=!1;const y=tt(t).find(t=>t.id===I);y&&"tab"===y.type&&(j=y.disabled);let b=n&&n.querySelector("svg");b=b||O(n),H(b,i.layer);const w=(i.svgLayer||b).querySelector(".flow_grid");i.gridLines&&w&&B(w),t.forEach(function(t){if("subflow"===t.type){s["subflow:"+t.id]=t;for(let e=0;e0&&t.wires.forEach(function(t){t.forEach(function(t){c[t]=!0})})});const C=(i.svgLayer||b).querySelector(".flow_nodes");t.forEach(function(n){if(n.z===I||n.id===I){const I=D(n),y=function(t){let e=!0;return"link out"!==t.type&&"link in"!==t.type||(e=!1),"junction"===t.type||"tab"===t.type||"subflow"===t.type||(!1===t.l?e=!1:!0===t.l&&(e=!0)),e}(n),b=!i.labels,w=L(n.type);switch(n.type){case"tab":case"ui_spacer":case"ui-spacer":break;case"group":u[n.id]=n;break;case"subflow":l[n.id]={...n};for(let t=0;t1?18:16)+")"});let t=0;l.lines.forEach(function(e){const i=k("text",{y:t,class:"node-text-label"});i.textContent=e,L.appendChild(i),t+=20})}const D=k("g",{"data-node-id":n.id,class:"node"});C.appendChild(D),y&&L&&D.appendChild(L);const p=y?L?.getBBox():{width:0,height:0},m=p.width,x=p.height+13.5,T=y?I.width>m?I.width:m:I.width,S=y?I.height>x?I.height:x:I.height,z={x:n.x,y:n.y,w:T,h:S,outputs:(n.wires||[]).length},h=!!c[n.id];try{y?(z.w=Math.max(e,20*Math.ceil((l.width+48+(h?7:0))/20)),z.h=Math.max(6+24*l.lines.length,15*(z.outputs||0),30)):(z.w=30,z.h=Math.max(30,15*(z.outputs||0)))}catch(t){}if(z.outputs>2&&y&&L&&z.h>x){const t=(z.h-x)/2;L.setAttributeNS(null,"transform","translate(38,"+((l.lines.length>1?16:14)+t)+")")}b&&L&&(L.style.display="none"),D.prepend(k("rect",{...w,rx:5,ry:5,fill:u.color||w.fill,width:z.w,height:z.h,class:"node node-"+n.id})),D.appendChild(k("path",{d:"M5 0 h25 v"+z.h+" h-25 a 5 5 0 0 1 -5 -5 v-"+(z.h-10)+" a 5 5 0 0 1 5 -5",fill:"rgb(0,0,0)","fill-opacity":.05,stroke:"none"})),y&&D.appendChild(k("path",{d:"M 29.5 0.5 l 0 "+(z.h-1),fill:"none",stroke:"rgb(0,0,0)","stroke-opacity":.1,"stroke-width":"1px"}));const f=o.view.tools.calculateGridSnapOffsets(z),E=n.x-z.w/2-f.x,v=n.y-z.h/2-f.y;if(D.setAttribute("transform",`translate(${E}, ${v})`),n.bbox=D.getBBox(),n.bbox.x=E,n.bbox.y=v,i.images){const t={x:0,y:Math.max(z.h/2-15,0),width:30,height:30},e=function(t){let e=r[t];return e||(t.startsWith("subflow:")?e=r.subflow:t.startsWith("ui-")?e=r["ui-template"]:t.startsWith("ui_")&&(e=r.ui_template)),e&&d[e]||""}(n.type);if(e)D.appendChild(k("image",{href:e,...t}));else if(n.type.startsWith("subflow:")){const e=u.icon&&d[u.icon]||d["subflow.svg"];D.appendChild(k("image",{href:e,...t}))}}(u.in&&u.in.length>0||c[n.id])&&(i.arrows?D.appendChild(k("path",{...N,transform:"translate(-3,"+(n.bbox.height/2-5)+")",d:i.arrows?"M 0,10 9,5 0,0 Z":"M -1,9.5 8,9.5 8,0.5 -1,0.5 Z",class:"red-ui-flow-port-input input-arrows","stroke-linecap":"round","stroke-linejoin":"round"})):D.appendChild(k("rect",{...N,transform:"translate(-5,"+(n.bbox.height/2-5)+")",...a,...g,class:"red-ui-flow-port-input"})));const O={...N,...a,...g,class:"red-ui-flow-port"};if(n.wires&&Array.isArray(n.wires)){const t=1===n.wires.length?n.bbox.height/2-5:n.wires.length%2==0?3.5:4.5;for(let e=0;e0;){h-=1;for(const t in u){if(T.indexOf(t)>-1)continue;const e=u[t];let i=0,n=0,M=!1;if(e.nodes.forEach(function(t){const o=(A[t]||{}).bbox;o?(i=Math.max(i,o.x-e.x+o.width),n=Math.max(n,o.y-e.y+o.height)):M=!0}),M)continue;const o=k("g",{"data-node-id":t});o.setAttribute("transform",`translate(${e.x}, ${e.y})`),o.appendChild(k("rect",{rx:5,ry:5,width:e.w,height:e.h,fill:"none","fill-opacity":0,"stroke-width":2,stroke:"grey",class:"group-"+e.id,...e.style})),x.prepend(o);const a=A[t];a.bbox=o.getBBox(),a.bbox.x=e.x,a.bbox.y=e.y;const g=k("g",{});if(o.appendChild(g),e.style.label&&e.name){const t=e.style["label-position"]||"nw",i=R(e.name,"group-text-label");let n=0,M=0,o="start";if(M="n"===t[0]?15:a.bbox.height-5-16*(i.lines.length-1),"w"===t[1]?(n=5,o="start"):"e"===t[1]?(n=a.bbox.width-5,o="end"):(n=a.bbox.width/2,o="middle"),g.setAttribute("transform",`translate(${n}, ${M})`),g.setAttribute("text-anchor",o),i){let t=0;i.lines.forEach(function(i){const n=k("text",{class:"group-text-label",x:0,y:t,fill:e.style.color||"grey"});n.textContent=i,g.appendChild(n),t+=16})}}T.push(t)}}const f=(i.svgLayer||b).querySelector(".flow_wires"),E=[],v=Object.keys(l);for(let t=0;t2&&e.splice(2);const n=new Map,M=U(function(t,e){const i=W(t),n=W(e),M={},o={},A={},a={},g={};return Object.keys(i.all).forEach(function(t){if(!j(n.all,t))return void(o[t]=!0);const e=JSON.stringify(i.all[t]),M=JSON.stringify(n.all[t]);if(e!==M)if(A[t]=!0,i.all[t].z!==n.all[t].z)g[t]=!0;else if(i.all[t].x!==n.all[t].x||i.all[t].y!==n.all[t].y||i.all[t].w!==n.all[t].w||i.all[t].h!==n.all[t].h){const i=JSON.parse(e),n=JSON.parse(M);delete i.x,delete i.y,delete i.w,delete i.h,delete n.x,delete n.y,delete n.w,delete n.h,JSON.stringify(i)===JSON.stringify(n)&&(a[t]=!0)}}),Object.keys(n.all).forEach(function(t){j(i.all,t)||(M[t]=!0)}),{currentConfig:i,newConfig:n,added:M,deleted:o,changed:A,positionChanged:a,moved:g}}(e[0],e[1]));M.changes.forEach(t=>{t.highlight=e=>function(t=-1,e){clearTimeout(N),clearTimeout(L);s.querySelectorAll(".red-ui-tab").forEach(t=>t.classList.remove("tab-glow"));d.querySelectorAll("g[data-node-id]").forEach(t=>{t.style.filter=""});const i=s.querySelector(".red-ui-tab.active").getAttribute("data-flow-id");let n=e.tab;"moved"===e.diffType&&(-1===t?t=e.v1:0===t?n=e.value1:1===t&&(n=e.value2));"added"===e.diffType&&-1===t?t=1:("deleted"===e.diffType&&-1===t||-1===t)&&(t=0);const M=s.querySelector(`.red-ui-tab[data-flow-id="${n}"]`);("tab"===e.item&&"changed"===e.diffType||n!==i)&&M&&(M.click(),M.classList.add("tab-glow"),L=setTimeout(()=>{M.classList.remove("tab-glow")},1e4));if(parseInt(l.value)<10||parseInt(l.value)>90){const e=0===t?10:90;!async function(){let t=parseInt(l.value);const i=e>t?1:-1;for(;t!==e;){t+=i,l.value=t;const e=new Event("input",{bubbles:!0});l.dispatchEvent(e),await new Promise(t=>setTimeout(t,10))}}()}const o=[e.item,e.tab][0],A=d.querySelector(`g.flow-layer-0 g[data-node-id="${o}"]`),a=d.querySelector(`g.flow-layer-1 g[data-node-id="${o}"]`);if(!A&&!a)return;(A||a).scrollIntoView({behavior:"smooth",block:"center",inline:"center"}),A&&(A.style.filter="url(#node-glow)");a&&(a.style.filter="url(#node-glow)");N=setTimeout(()=>{try{A&&(A.style.filter=""),a&&(a.style.filter="")}catch(t){}},1e4)}(e,t)}),M.tabMap=n;const o=b((i=it(i)).document,t.document,i.container,this),A=i.container;G(o,i.scope);const a=i.zoom,g=i.gridLines;for(i.zoom=!1,i.gridLines=!1;A.firstChild;)A.removeChild(A.firstChild);const s=Y("div",null,"red-ui-tabs",null,A),r=E(A),d=O(r,{addDefaultLayer:!1}),u=[...d.childNodes].find(t=>"g"===t.tagName&&t.classList.contains("outerContainer")),l=function(t){if(!b(t,this))return null;let e=t.querySelector(".toolbar");e||(e=v(t));let i=e.querySelector(".compare-controls");if(i)return e.querySelector(".flow-compare-slider");i=Y("div",null,"button-group compare-controls",null,e);const n=Y("input",null,"flow-compare-slider",null,i);return n.type="range",n.min="0",n.max="100",n}(A);l.type="range",l.min=0,l.max=100,l.value=0,l.step=5,l.style.width="100%",l.classList.add("flow-compare-slider");const c=A,I=r;f(d);for(let t=0;t{const M=n[0],o=n[1],r={...i,flowId:M,container:null,layers:o};!function(e,i,n){const M=b(i.document,t.document,A,this),o=i.layers;for(const t of Object.values(o)){const A=t.tab,a=A.label,g=`red-ui-tab-${t.index}`,s=`red-ui-tab-${A.id}`;let r=e.querySelector(`.${s}`);r||(r=M.createElement("div"),e.appendChild(r),r.classList.add("red-ui-tab"),r.classList.add(g),r.classList.add(s),r.classList.add("red-ui-tab-"+o.type),r.setAttribute("data-flow-id",A.id));let u=r.querySelector(`.red-ui-tab-label-${t.index}`);if(u||(u=M.createElement("div"),u.classList.add(`red-ui-tab-label-${t.index}`)),u.classList.add("red-ui-tab-label"),u.setAttribute("data-layer",t.index),u.style.opacity=0,r.appendChild(u),A.disabled){u.classList.add("disabled");const t=M.createElement("i");t.classList.add("red-ui-tab-disabled-icon"),u.appendChild(t)}else if("subflow"===A.type){const t=M.createElement("i");t.classList.add("red-ui-tab-subflow-icon"),u.appendChild(t)}u.title=a;const l=M.createElement("span");l.textContent=a,u.appendChild(l),r.onclick=function(t){z(d,i,i.flowId),n(i),h(d,i,A.id)}}}(s,r,function(t){s.querySelectorAll(".red-ui-tab").forEach(t=>t.classList.remove("active"));s.querySelector(`[data-flow-id="${t.flowId}"]`).classList.add("active");const n=Object.values(t.layers),M={0:!0,1:!0};n.forEach(t=>{t.svgLayer.setAttribute("opacity",0);const i=t.renderOptions;Mt(e[i.index]||[],i),M[i.index]=!1});const o=M[0]||M[1],r={...i,flowId:t.flowId,container:o?.container||o?.flowRenderer||A};if(M[0]&&(r.layer=0,r.svgLayer=d.querySelector("g.flow-layer-0"),Mt(e[0]||[],r)),M[1]&&(r.layer=1,r.svgLayer=d.querySelector("g.flow-layer-1"),Mt(e[1]||[],r)),a&&m(d,A),g){let t=[...u.childNodes].find(t=>"g"===t.tagName&&t.classList.contains("flow_grid"));t||(t=k("g",{class:"flow_grid"}),u.insertBefore(t,d.firstChild)),t&&B(t)}D()})}),l.addEventListener("input",function(t){D()});let N=null,L=null;function D(){const t=parseInt(l.value),i=[1-t/100,t/100];i.forEach((t,e)=>{t=t>.05?w(t+.15,0,1):t;const i=function(t,e){return t.querySelector(`g.flow-layer-${e||0}`)}(d,e);i?.setAttribute("opacity",t)});s.querySelectorAll(".red-ui-tab-label").forEach((t,n)=>{let M=parseInt(t.getAttribute("data-layer"));(isNaN(M)||M<0||M>=e.length)&&(M=0),t.style.opacity=i[M]||0})}const y=s.querySelector(".red-ui-tab");y&&y.click(),n.size>0?A.classList.add("has-tabs"):A.classList.remove("has-tabs");const C=p(d.parentElement);return C.hasHorizontalScrollbar||C.hasVerticalScrollbar?A.classList.add("has-scrollbars"):A.classList.remove("has-scrollbars"),M},renderFlows:nt,renderFlow:Mt,normaliseOptions:it,getStyles:Q}};"object"==typeof module&&module.exports?module.exports=FlowRenderer:"object"==typeof window?window.FlowRenderer=FlowRenderer:global.FlowRenderer=FlowRenderer;export default FlowRenderer; \ No newline at end of file +const FlowRenderer=function(){const t=this||{},e=100,i=8e3,n=8e3,M=13.5,o={view:{}};o.view.tools={},o.utils={},o.view.gridSize=function(){return 20},o.view.tools.calculateGridSnapOffsets=function(t,e){0;e=e||{align:"nearest"};const i={x:0,y:0},n=o.view.gridSize(),M=t.x-(n*Math.round((t.x-t.w/2)/n)+t.w/2),A=t.x-(n*Math.round((t.x+t.w/2)/n)-t.w/2);i.x=A,"right"===e.align||("left"===e.align||Math.abs(M)t.clientWidth,hasVerticalScrollbar:t.scrollHeight>t.clientHeight}}function p(t,e){let i=1;const n=t.getAttribute("transform");if(n){const t=n.match(/scale\(([^,]+)\)/);t&&(i=b(parseFloat(t[1]||1),.25,3,1))}const M=t.querySelector("g.outerContainer");T(M,i,!0),e.onwheel=function(t){if(t.ctrlKey||t.metaKey){t.preventDefault();let e=x(M);e-=.075*Math.sign(t.deltaY),e=b(e,.2,3,1),T(M,e)}};const o=function(t){const e=w(t,this);if(!e)return null;let i=t.querySelector(".toolbar");i||(i=v(t));let n=i.querySelector(".zoom-controls");if(n)return{zoomIn:i.querySelector(".zoom-in"),zoomOut:i.querySelector(".zoom-out"),zoomReset:i.querySelector(".zoom-reset")};n=e.createElement("div"),n.classList.add("zoom-controls"),n.classList.add("button-group");const M=e.createElement("button");M.classList.add("red-ui-footer-button","icon-button-bg","zoom-in"),M.innerHTML="+",M.title="Zoom In (Ctrl + Mouse Wheel Up)";const o=e.createElement("button");o.classList.add("red-ui-footer-button","icon-button-bg","zoom-reset"),o.title="Zoom & Scroll Reset";const A=e.createElement("button");A.classList.add("red-ui-footer-button","icon-button-bg","zoom-out"),A.innerHTML="-",A.title="Zoom Out (Ctrl + Mouse Wheel Down)",n.appendChild(A),n.appendChild(o),n.appendChild(M),i&&i.appendChild(n);return{zoomIn:M,zoomOut:A,zoomReset:o}}(e);o.zoomIn.onclick=function(){const t=b(x(M)+.1,.2,3,1);T(M,t)},o.zoomOut.onclick=function(){const t=b(x(M)-.1,.2,3,1);T(M,t)},o.zoomReset.onclick=function(){!function(t){const e=t.getAttribute("_scale_original")||1;T(t,e)}(M),function(t){t.scrollLeft=t.getAttribute("_scroll_x")||0,t.scrollTop=t.getAttribute("_scroll_y")||0}(e.querySelector(".red-ui-workspace-chart"))}}function x(t){return parseFloat(t.getAttribute("_scale_current")||1)}function T(t,e,M=!1){t.setAttribute("transform",`scale(${e})`);const o=t.ownerSVGElement||t;o.style.width=i*e+"px",o.style.height=n*e+"px",t.setAttribute("_scale_current",e),M&&t.setAttribute("_scale_original",e)}function m(t,e,i,n=!1){t.scrollLeft=e,t.scrollTop=i,n&&(t.setAttribute("_scroll_x",e),t.setAttribute("_scroll_y",i))}function S(t,e,M){const o=M.autoZoom||M.autoScroll?function(t,e){const M=.2,o=1,A=e.container.querySelector(".red-ui-workspace-chart"),a=A.getBoundingClientRect(),g=a.width-25,r=a.height-25;let u=i,s=n,d=0,c=0;const l=e.flowId,I=t.filter(t=>"tab"!==t.type&&"subflow"!==t.type&&t.z===l);if(0===I.length)return{scale:1,scrollX:0,scrollY:0};for(const t of I){if("tab"===t.type||"subflow"===t.type||"junction"===t.type)continue;const e=t.x||0,i=t.y||0,n=D(t),M=(n.width||100)/2,o=(n.height||30)/2,A=e-M,a=i-o,g=e+M,r=i+o;u=Math.min(u,A),s=Math.min(s,a),d=Math.max(d,g),c=Math.max(c,r)}let L=1;const N=d-u,j=c-s,y=g/N,w=r/j;(N>g||j>r)&&(L=Math.min(y,w),L*=.95);L=b(L,M,o,1);let C=u,p=s;C<50&&(C=0);p<40&&(p=0);C>0&&(C-=50);p>0&&(p-=40);return C=b(C*L,0,A.scrollWidth),p=b(p*L,0,A.scrollHeight),{scale:L,scrollX:C,scrollY:p,minX:u,minY:s,maxX:d,maxY:c}}(e,M):null;if(t=t.ownerSVGElement||t,M.zoom&&o&&M.autoZoom){T(t.querySelector("g.outerContainer"),o.scale,!0)}return o&&M.autoScroll&&m(t.parentElement,o.scrollX,o.scrollY,!0),o}function z(t,e,i){const n=t.parentElement,M=t.querySelector("g.outerContainer"),o=n.scrollLeft,A=n.scrollTop,a=x(M),g=i||e.flowId||"global";n.setAttribute(`data-tab-${g}-x`,o),n.setAttribute(`data-tab-${g}-y`,A),n.setAttribute(`data-tab-${g}-scale`,a)}function h(t,e,i){const n=t.parentElement,M=t.querySelector("g.outerContainer"),o=i||e.flowId||"global",A=n.getAttribute(`data-tab-${o}-x`),a=n.getAttribute(`data-tab-${o}-y`),g=n.getAttribute(`data-tab-${o}-scale`);"string"==typeof A&&"string"==typeof a&&m(n,A,a),"string"==typeof g&&T(M,g)}function f(t){const e=t.parentElement,i=t.querySelector("g.outerContainer");for(const t in i.dataset)/^tab-\w+-.*/.test(t)&&e.removeAttribute(t)}function E(t){const e=w(t,this).createElement("div");return e.classList.add("red-ui-workspace-chart"),t?(t.appendChild(e),e):e}function v(t){const e=w(t,this);if(!e)return null;let i=t.querySelector(".toolbar");return i||(i=e.createElement("div"),i.classList.add("toolbar"),t&&t.appendChild(i),i)}function O(t,{addDefaultLayer:e=!0,layer:M=0}={}){const o=w(t,this),A=o.createElementNS("http://www.w3.org/2000/svg","svg");A.setAttribute("style",`width:${i}px; height:${n}px;`),t.appendChild(A);const a=o.createElementNS("http://www.w3.org/2000/svg","defs");A.appendChild(a);a.innerHTML='\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ';const g=k("g",{class:"outerContainer"});return A.appendChild(g),e&&Z(A,{layer:M}),A}function k(t,e,i){const n=w(i,this).createElementNS("http://www.w3.org/2000/svg",t);if("object"==typeof e)for(const t in e)n.setAttribute(t,e[t]);return i&&i.appendChild(n),n}function Z(t,{layer:e=0,opacity:i=1}={}){let n=t.querySelector("g.outerContainer");n||(n=k("g",{class:"outerContainer"},t)),n.querySelector("g.flow_grid")||k("g",{class:"flow_grid"},n);let M=n.querySelector(`g.flow-layer-${e}`);for(M||(M=k("g",{class:`flow-layer-${e||0}`},n));M.firstChild;)M.removeChild(M.firstChild);return M.setAttribute("opacity",i),k("g","flow_group_elements",M),k("g","flow_group_select",M),k("g","flow_wires",M),k("g","flow_nodes",M),M}function B(t){if(t.childNodes.length>0)return;k("rect",{width:`${i}px`,height:`${n}px`,fill:"url(#grid)"},t).style.transform="translate(-1px, -1px)"}function Y(t,e,i,n,M){const o=w(M,this).createElement(t);if("object"==typeof e)for(const t in e)o.setAttribute(t,e[t]);return i&&"string"==typeof i?o.classList.add(...i.split(" ")):Array.isArray(i)&&o.classList.add(...i),"string"==typeof n&&(o.textContent=n),M&&M.appendChild(o),o}function Q(t){const e=[],i={},n=new Set([...Object.keys(t.changed),...Object.keys(t.added),...Object.keys(t.deleted),...Object.keys(t.moved),...Object.keys(t.positionChanged)]),M=t.currentConfig,o=t.newConfig;function A(e,i,n,M,o,A){const a={tab:e,item:i,diffType:n,prop:M,value1:o,value2:A,toString:()=>""},g=t=>t?`'${t}'`:"''",r=t=>t?g(function(t,e,i){const n=$[t.type]||$._default,M=e&&e[t.type]||{};return n(t,M,i)}(t)):"'n/a'",u=t.currentConfig.all[e]||t.newConfig.all[e],s=r(u),d=t.currentConfig.all[i]||t.newConfig.all[i],c="tab"===i?u:t.currentConfig.all[i],l="tab"===i?u:t.newConfig.all[i],I="tab"===i?"tab":"node",L=/wires\[\d+\]/.test(M);let N="";L&&(a.value1&&!a.value2?N=`had wire removed from ${r(c)}`:!a.value1&&a.value2&&(N=`was wired up to ${r(l)}`));const j=o&&("z"===M||/wires\[\d+\]/.test(M))?t.currentConfig.all[o]:null,D=A&&("z"===M||/wires\[\d+\]/.test(M))?t.newConfig.all[A]:null;return a.toString=function(){const t=[];switch(n){case"deleted":t.push("deleted",I,r(d));break;case"added":t.push("added",I,r(d));break;case"moved":t.push(r(d),"moved from ",r(j),"to",r(D));break;case"changed":"g"===M?o&&!A?t.push(s,r(d),"was removed from group",g(r(o))):!o&&A?t.push(s,r(d),"was added to group",g(r(A))):t.push(s,r(d),"moved group from",g(o),"to",g(A)):L?t.push(s,r(d),N):"tab"===i?t.push("tab",s,"property",g(a.prop),"was",g(a.value1||"")+", now",g(a.value2||"")):t.push(r(d),"property",g(a.prop),"was",g(a.value1||""),"now",g(a.value2||""));break;case"positionChanged":t.push(r(d),"moved from",a.value1,"to",a.value2);break;default:t.push(s,r(d),g(a.prop),"was",g(a.value1||""),"now",g(a.value2||""))}return t.join(" ")},a}function a(t,e){const i=t.currentConfig.all,M=t.newConfig.all,o=[];if(!e.v1||!e.v2)return e.v1&&o.push(A(e.id,e.id,"tab","deleted",e.v1,null)),e.v2&&o.push(A(e.id,e.id,"tab","added",null,e.v2)),o;const a=e.v1?.tab?{...e.v1.tab.n}:{};a.order=e.v1?.order;const r=e.v2?.tab?{...e.v2.tab.n}:{};r.order=e.v2?.order;const u=e.v1?.tab?.nodes||[],s=e.v2?.tab?.nodes||[];o.push(...g(e.id,"tab","","changed",a,r));const d=u.map(t=>t.id),c=s.map(t=>t.id),l=new Set([...d,...c].filter(t=>n.has(t))),I=t=>"number"!=typeof t?null:t,L=(t,e)=>{const i={...e};for(const e of t)delete i[e];return i};for(const n of l){const A=i[n],a=M[n],r=!(!A||!a);if(t.deleted[n])o.push(...g(e.id,n,"","deleted",A,a));else if(t.added[n])o.push(...g(e.id,n,"","added",A,a));else if(r){let i=!0;if(t.moved[n]&&o.push(...g(e.id,n,"","moved",{z:A.z},{z:a.z})),t.positionChanged[n]){i=!1;const t={x:I(A.x),y:I(A.y)},M={x:I(a.x),y:I(a.y)},r=JSON.stringify(t),u=JSON.stringify(M);o.push(...g(e.id,n,"position","positionChanged",r,u))}if(i){const t=L(["x","y","z","w","h"],A),i=L(["x","y","z","w","h"],a);o.push(...g(e.id,n,"","changed",t,i))}}}return o}function g(t,e,i,n,M,o){const a=[];if("deleted"===n)a.push(A(t,e,n,i,M?"":"deleted",o?"":"deleted"));else if("added"===n)a.push(A(t,e,n,i,M?"added":"",o?"added":""));else if(typeof M!=typeof o)a.push(A(t,e,"changed",i,M||"",o||""));else if(Array.isArray(M))for(let A=0;A{const e=`${"z"===t.prop&&"moved"===t.diffType?"*":t.tab}-${t.item}-${t.diffType}-${t.prop}-${t.value1}-${t.value2}`;return!r.has(e)&&(r.add(e),!0)})}()),{get changes(){return e},get diff(){return t},get tabs(){return i},getNodeInfo:t=>({propertiesChanged:e.filter(e=>e.itemId===t&&e.tab!==t),v1:M.all[t],v2:o.all[t]}),getTabInfo:t=>({propertiesChanged:e.filter(e=>e.tab===t&&"tab"===e.itemId),nodesChanged:e.filter(e=>e.tab===t&&"tab"!==e.itemId),v1:i[t],v2:i[t]})}}function U(t){t&&t.length&&"string"!=typeof t&&"string"==typeof t[0]&&(t=[...t].join(" "));return`\n :root {\n --red-ui-view-grid-color: #eee;\n --red-ui-view-border: 1px solid #bbbbbb;\n --red-ui-node-border: #999;\n --red-ui-node-port-background: #d9d9d9;\n --red-ui-workspace-button-color: #333;\n --red-ui-workspace-button-background: #f3f3f3;\n\n --red-ui-primary-font: Helvetica Neue, Arial, Helvetica, sans-serif;\n --red-ui-primary-font-size: 14px;\n --red-ui-monospace-font: Menlo, Consolas, DejaVu Sans Mono, Courier, monospace;\n --red-ui-primary-background: #f3f3f3;\n\n --red-ui-form-background: #fff;\n --red-ui-form-placeholder-color: #aaa;\n --red-ui-form-text-color: #555;\n --red-ui-form-text-color-disabled: #bbb;\n --red-ui-form-input-focus-color: rgba(85, 150, 230, 0.8);\n --red-ui-form-input-border-color: #ccc;\n --red-ui-form-input-border-selected-color: #aaa;\n --red-ui-form-input-border-error-color: rgb(214, 97, 95);\n --red-ui-form-input-background: #fff;\n --red-ui-form-input-background-disabled: #f9f9f9;\n --red-ui-form-button-background: #efefef;\n\n --red-ui-diff-state-color: #555;\n --red-ui-diff-state-prefix-color: #888;\n --red-ui-diff-state-added: #009900;\n --red-ui-diff-state-deleted: #f80000;\n --red-ui-diff-state-changed: #f89406;\n --red-ui-diff-state-moved: #3f81b3;\n }\n ${t=(t=t||".flow-renderer").split(" ").map(t=>`.${t}`).join(" ").trim()} .diff-table {\n width: 100%;\n font-size: var(--red-ui-primary-font-size);\n font-family: var(--red-ui-primary-font);\n }\n ${t} .diff-table thead tr {\n font-weight: bold;\n padding: 2px 4px;\n /* bottom border only */\n border-bottom: 3px solid #ddd;\n }\n ${t} .diff-table td {\n padding: 2px 4px;\n border-bottom: 1px solid #ddd;\n }\n ${t} .diff-table .diff-info {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n ${t} .diff-value button {\n height: 20px;\n width: 20px;\n padding: 1px;\n }\n ${t} .diff-value span {\n margin-left: 4px;\n margin-top: 2px;\n }\n ${t} .diff-type {\n height: 14px;\n width: 14px;\n margin: 2px;\n }\n ${t} .diff-type-text {\n flex-grow: 1;\n }\n ${t} .diff-type-moved {\n background-color: var(--red-ui-diff-state-moved);\n }\n ${t} .diff-type-added {\n background-color: var(--red-ui-diff-state-added);\n }\n ${t} .diff-type-deleted {\n background-color: var(--red-ui-diff-state-deleted);\n }\n ${t} .diff-type-changed {\n background-color: var(--red-ui-diff-state-changed);\n }\n ${t} .diff-type-positionChanged {\n background-color: var(--red-ui-diff-state-changed);\n }\n\n .red-ui-editor {\n font-size: var(--red-ui-primary-font-size);\n font-family: var(--red-ui-primary-font);\n padding: 0;\n margin: 0;\n background: var(--red-ui-primary-background);\n color: var(--red-ui-primary-text-color);\n line-height: 20px\n }\n ${t} {\n position: relative;\n }\n /* Source view */\n ${t} pre.red-ui-workspace-source {\n height: 100%;\n overflow: auto;\n width: 100%;\n font-family: var(--red-ui-monospace-font);\n background-color: #f7f7f7;\n }\n /* Chart view */\n ${t} .red-ui-workspace-chart {\n box-sizing: border-box;\n border: var(--red-ui-view-border);\n border-radius: 0 4px 4px 4px;\n overflow: scroll;\n height: 100%;\n width: 100%;\n }\n ${t} div.red-ui-footer {\n height: 20px\n }\n ${t}.has-tabs div.red-ui-workspace-chart {\n height: calc(100% - 34px);\n }\n ${t} svg {\n position: relative;\n width: 100%;\n height: 100%;\n min-height: 250px;\n margin: auto;\n display: block;\n border-radius: 2px;\n }\n ${t} svg {\n cursor: default;\n }\n ${t} svg .group-text-label {\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 14px;\n }\n ${t} svg .node-text-label {\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 14px;\n dominant-baseline: middle;\n }\n ${t} svg .subflow-node-text-label {\n color: rgb(85, 85, 85);\n dominant-baseline: middle;\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 10px;\n line-height: 20px;\n pointer-events: none;\n text-anchor: middle;\n user-select: none\n }\n ${t} svg .subflow-node-text-label-number {\n color: rgb(85, 85, 85);\n dominant-baseline: middle;\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 16px;\n line-height: 20px;\n pointer-events: none;\n text-anchor: middle;\n user-select: none\n }\n\n ${t} svg .node {\n fill-opacity: 1;\n stroke-width: 1px;\n }\n ${t} svg .link {\n stroke: #999;\n stroke-width: 3;\n fill: none;\n }\n ${t} svg .link-highlight, .node-highlight {\n stroke: rgb(255, 127, 14);\n }\n ${t} svg .node-highlight {\n stroke-width: 3px;\n }\n ${t} .tab-glow {\n border-radius: 2px;\n animation: tab-glow-animation 1s infinite;\n }\n @keyframes tab-glow-animation {\n 0% {\n box-shadow: 0 0 0px 0px #7d26cddd;\n }\n 50% {\n box-shadow: 0 0 10px 5px #7d26cddd;\n }\n 100% {\n box-shadow: 0 0 0px 0px #7d26cddd;\n }\n }\n\n ${t} svg .node-disabled {\n stroke-dasharray: 8,3;\n fill-opacity: 0.5;\n }\n ${t} svg .group-highlight {\n stroke: rgb(255, 127, 14);\n stroke-width: 4px;\n fill: rgb(255, 127, 14);\n fill-opacity: 0.2;\n }\n ${t} svg .link-disabled {\n stroke-dasharray: 10,8 !important;\n stroke-width: 2 !important;\n stroke: rgb(204, 204, 204);\n }\n ${t} svg .grid-line {\n shape-rendering: geometricprecision;\n stroke: rgb(238, 238, 238);\n stroke-width: 1px;\n fill: none;\n }\n ${t} svg .red-ui-flow-port {\n stroke-width: 1px;\n stroke-miterlimit: 4;\n fill: var(--red-ui-node-port-background);\n }\n ${t} svg .red-ui-flow-port-input {\n stroke-width: 1px;\n stroke-miterlimit: 4;\n fill: var(--red-ui-node-port-background);\n }\n ${t} svg .flow-render-error {\n background-color: rgb(54, 52, 52); \n color: rgb(196, 59, 59); \n width: 100%;\n }\n ${t} svg text {\n user-select: none;\n }\n ${t} .red-ui-tabs {\n display: flex;\n }\n ${t} .red-ui-tab {\n padding: 6px 12px;\n box-sizing: border-box;\n display: block;\n border: 1px solid #bbbbbb;\n border-right: none;\n background-color: #f0f0f0;\n max-width: 200px;\n max-height: 34px; /* for calculating svg height */\n height: 34px; /* for calculating svg height */\n width: 14%;\n overflow: hidden;\n white-space: nowrap;\n position: relative;\n margin-top: -1px;\n transition: 0.2s background-color;\n user-select: none;\n position: relative;\n z-index: 1;\n top: 1px;\n }\n ${t} .red-ui-tab div.red-ui-tab-label {\n position: absolute;\n top: 7px;\n left: 10px;\n }\n ${t} .red-ui-tab-subflow-icon {\n mask-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMjUgMjUuOTRoN2MuNTggMCAxLS40MiAxLTF2LTJjMC0uNTgtLjQyLTEtMS0xaC03Yy0uNTggMC0xIC40Mi0xIDF2MmMwIC41OC40MiAxIDEgMXptLTE3IDEyaDdjLjU4IDAgMS0uNDIgMS0xdi0yYzAtLjU4LS40Mi0xLTEtMUg4Yy0uNTggMC0xIC40Mi0xIDF2MmMwIC41OC40MiAxIDEgMXptLS40MTYgMTFDNS42MjQgNDguOTQgNCA0Ny4zMTUgNCA0NS4zNTZWMTQuNTIyYzAtMS45NiAxLjYyNS0zLjU4MiAzLjU4NC0zLjU4MmgyNC44MzJjMS45NiAwIDMuNTg0IDEuNjIzIDMuNTg0IDMuNTgydjMwLjgzNGMwIDEuOTYtMS42MjUgMy41ODQtMy41ODQgMy41ODR6TTMyIDM2Ljk0SDE5YzAgMi4xOS0xLjgxIDQtNCA0SDd2NC40MTZjMCAuMzUuMjM1LjU4NC41ODQuNTg0aDI0LjgzMmMuMzUgMCAuNTg0LS4yMzUuNTg0LS41ODR2LTguNDE3em0xLTJ2LTZoLThjLTIuMTkgMC00LTEuODEtNC00aC0xYy00LjMzMy0uMDAyLTguNjY3LjAwNC0xMyAwdjZoOGMyLjE5IDAgNCAxLjgxIDQgNGgxM3ptMC0xNnYtNC40MThjMC0uMzUtLjIzNS0uNTgyLS41ODQtLjU4Mkg3LjU4NGMtLjM1IDAtLjU4NC4yMzMtLjU4NC41ODJ2OC40MTdjNC4zMzMuMDAyIDguNjY3LjAwMSAxMyAuMDAxaDFjMC0yLjE5IDEuODEtNCA0LTRoOHoiIGNvbG9yPSIjMDAwIiBmaWxsPSIjZmZmIi8+PC9zdmc+Cg==);\n display: inline-block;\n background-color: grey;\n margin-left: -8px;\n margin-right: 3px;\n margin-top: -1px;\n margin-bottom: 1px;\n opacity: 1;\n width: 16px;\n height: 18px;\n vertical-align: middle;\n mask-size: contain;\n mask-position: center;\n mask-repeat: no-repeat;\n }\n ${t} .red-ui-tab-disabled-icon {\n mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25' viewBox='0 0 1536 1792' style='&%2310;'%3E%3Cscript xmlns=''/%3E%3Cpath d='M1312 893q0-161-87-295l-754 753q137 89 297 89 111 0 211.5-43.5t173.5-116.5 116-174.5 43-212.5zM313 1192l755-754q-135-91-300-91-148 0-273 73t-198 199-73 274q0 162 89 299zM1536 893q0 157-61 300t-163.5 246-245 164-298.5 61-298.5-61-245-164-163.5-246-61-300 61-299.5 163.5-245.5 245-164 298.5-61 298.5 61 245 164 163.5 245.5 61 299.5z' fill='currentColor'/%3E%3Cscript xmlns=''/%3E%3C/svg%3E");\n display: inline-block;\n background-color: grey;\n margin-left: -8px;\n margin-right: 3px;\n margin-top: 0px;\n margin-bottom: 0px;\n opacity: 1;\n width: 16px;\n height: 16px;\n vertical-align: middle;\n mask-size: contain;\n mask-position: center;\n mask-repeat: no-repeat;\n transform: translateY(-2px);\n }\n ${t} .red-ui-tab span {\n font-size: 0.875rem;\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n }\n ${t} .red-ui-tab.active {\n background-color: white;\n border-bottom-color: white;\n font-weight: bold;\n }\n ${t} .red-ui-tab.disabled {\n border-top-style: dashed;\n border-left-style: dashed;\n font-style: italic;\n }\n ${t} .red-ui-tab:first-child {\n border-radius: 4px 0 0 0;\n }\n ${t} .red-ui-tab:last-child {\n border-right: 1px solid #bbbbbb;\n border-radius: 0 4px 0 0;\n }\n ${t} .red-ui-tab:first-child:last-child {\n border-radius: 4px 4px 0 0;\n }\n ${t} .red-ui-tab:last-child.disabled {\n border-right-style: dashed;\n }\n ${t} .red-ui-tab:hover {\n cursor: pointer;\n background-color: white;\n }\n /* positioning of toolbar */\n ${t} .toolbar {\n display: flex;\n flex-direction: row;\n position: absolute;\n bottom: 5px;\n right: 5px;\n opacity: 0.6;\n }\n ${t} .toolbar:hover {\n opacity: 1;\n }\n ${t}.has-scrollbars .toolbar {\n bottom: 24px;\n right: 24px;\n }\n\n ${t} .hidden {\n display: none !important;\n }\n ${t} .toolbar .button-group.hidden {\n display: none !important;\n }\n ${t} .toolbar .icon-button-bg.view-source {\n background-image: url("${I}");\n }\n ${t} .toolbar .icon-button-bg.download-flow {\n background-image: url("${l}");\n }\n ${t} .toolbar .icon-button-bg.copy-flow {\n background-image: url("${c}");\n }\n ${t} .toolbar .icon-button-bg.zoom-reset {\n background-image: url("${d}");\n }\n ${t} .toolbar .icon-button-bg {\n background-repeat: no-repeat;\n background-position: center;\n background-size: 16px 16px; /* Size of the background SVG */\n background-color: transparent;\n padding: 4px;\n cursor: pointer;\n width: 24px;\n height: 24px;\n font-size: 0; /* Hide any default button text if present */\n line-height: 0; /* Hide any default button text if present */\n }\n\n ${t} .toolbar .icon-button-bg:hover {\n background-color: #f0f0f0;\n }\n\n /* styles for button groups and buttons */\n ${t} .button-group {\n display: flex;\n flex-direction: row;\n }\n ${t} .button-group button {\n user-select: none;\n box-sizing: border-box;\n display: inline-block;\n text-align: center;\n cursor: pointer;\n line-height: 22px;\n height: 24px;\n color: var(--red-ui-workspace-button-color) !important;\n background: var(--red-ui-workspace-button-background);\n text-decoration: none;\n border: 1px solid var(--red-ui-form-input-border-color);\n margin: 0px;\n padding: 0px;\n }\n ${t} .button-group button:not(:first-child) {\n border-top-left-radius: 0px;\n border-bottom-left-radius: 0px;\n border-left: none;\n }\n\n /* zoom controls */\n ${t} .zoom-controls.button-group button {\n font-size: 22px;\n width: 24px;\n }\n\n /* copy controls */\n ${t} .copy-controls.button-group {\n margin-right: 8px;\n }\n ${t} .copy-controls.button-group button {\n padding: 0px 4px;\n }\n\n /* source controls */\n ${t} .source-controls.button-group {\n margin-right: 8px;\n }\n ${t} .source-controls.button-group button {\n padding: 0px 4px;\n }\n\n /* compare controls */\n ${t} .compare-controls.button-group {\n margin-right: 24px;\n }\n ${t} .compare-controls input[type='range'].flow-compare-slider {\n width: 100%;\n -webkit-appearance: none;\n }\n ${t} input[type='range'].flow-compare-slider::-webkit-slider-runnable-track {\n height: 16px;\n background: var(--red-ui-workspace-button-background);\n border-radius: 16px;\n }\n /* Track: Mozilla Firefox */\n ${t} input[type='range'].flow-compare-slider::-moz-range-track {\n height: 16px;\n background: var(--red-ui-workspace-button-background);\n border-radius: 16px;\n }\n `}function G(t,e){const i="flow-renderer-css"+(e?"--"+e.toString():"").replace(/[^a-z0-9]/gi,"-").toLowerCase();let n=t.getElementById(i);n||(n=t.createElement("style"),n.id=i,n.innerHTML=U(e),t.head.appendChild(n))}function H(t,e){if(t){const i=t.querySelector(`.flow-layer-${e||0}`);["flow_group_elements","flow_group_select","flow_wires","flow_nodes"].forEach(t=>{const e=i.querySelector(`.${t}`)||k("g",{class:t},i);for(;e.firstChild;)e.removeChild(e.firstChild)})}}function W(t){const e=[],i={},n={},M=[],o={};return t.forEach(function(t){o[t.id]=t,"tab"===t.type?(e.push(t.id),i[t.id]={n:t,nodes:[]}):"subflow"===t.type&&(n[t.id]={n:t,nodes:[]})}),t.forEach(function(t){"tab"!==t.type&&"subflow"!==t.type&&(i[t.z]?i[t.z].nodes.push(t):n[t.z]?n[t.z].nodes.push(t):M.push(t))}),{all:o,tabOrder:e,tabs:i,subflows:n,globals:M}}function P(t,i,n,M,o,A=!1){const a=M-i,g=n-t,r=Math.sqrt(a*a+g*g);let u=.75;if(g*o>0?r0){const A=[[t+o*(e*u),i+0],[n-o*u*e,M-0]];return`M ${t} ${i} C ${A[0][0]} ${A[0][1]} ${A[1][0]} ${A[1][1]} ${n} ${M}`}{let r,s,d,c,l;const I=Math.floor(n-g/2),L=Math.floor(M-a/2);if(Math.abs(a)<10){c=Math.max(i,M)+(A?35:25);const e=c-i;return l=[[t+15*o,i],[t+25*o,i+5],[t+25*o,i+e/2],[t+25*o,i+e-5],[t+15*o,i+e],[t,i+e],[n-15*o,i+e],[n-25*o,i+e-5],[n-25*o,M+(c-M)/2],[n-25*o,M+5],[n-15*o,M],[n,M]],"M "+t+" "+i+" C "+l[0][0]+" "+l[0][1]+" "+l[1][0]+" "+l[1][1]+" "+l[2][0]+" "+l[2][1]+" C "+l[3][0]+" "+l[3][1]+" "+l[4][0]+" "+l[4][1]+" "+l[5][0]+" "+l[5][1]+" h "+g+" C "+l[6][0]+" "+l[6][1]+" "+l[7][0]+" "+l[7][1]+" "+l[8][0]+" "+l[8][1]+" C "+l[9][0]+" "+l[9][1]+" "+l[10][0]+" "+l[10][1]+" "+l[11][0]+" "+l[11][1]+" "}{const A=15,g=(M+L)/2;r=t+o*e*u,s=a>0?Math.min(g-a/2,i+A):Math.max(g-a/2,i-A),d=n-o*e*u,c=a>0?Math.max(g,M-A):Math.min(g,M+A);const N=(t+r)/2,j=a>0?1:-1;return l=[[N,i],[r,a>0?Math.max(i,s-A):Math.min(i,s+A)],[N,a>0?Math.min(L,s+A):Math.max(L,s-A)],[d,a>0?Math.max(L,c-A):Math.min(L,c+A)],[(n+d)/2,M]],l[2][1]===s+j*A&&(Math.abs(a)<10*A&&(l[1][1]=s-j*A/2,l[3][1]=c-j*A/2),l[2][0]=r),"M "+t+" "+i+" C "+l[0][0]+" "+l[0][1]+" "+l[1][0]+" "+l[1][1]+" "+r+" "+s+" S "+l[2][0]+" "+l[2][1]+" "+I+" "+L+" S "+l[3][0]+" "+l[3][1]+" "+d+" "+c+" S "+l[4][0]+" "+l[4][1]+" "+n+" "+M}}}function J(t,e){const i=function(t){let e=[];const i=t.split(/\\n /);if(i.length>1){let t=0;for(t=0;t{switch(t){case"str":return"string";case"num":return"number";case"bool":return"boolean";case"json":return"json";case"date":return"timestamp";case"bin":return"binary";case"env":return"environment";case"flow":return"flow";case"global":return"global";default:return t}},q=["inject","change","switch","function","template","delay","trigger","link in","link out","link call","watch","complete","catch","status","comment","debug","subflow","range","filter","rbe","mqtt in","mqtt out","http in","http response","http request","websocket in","websocket out","tcp in","tcp out","udp in","udp out","tcp request","split","join","sort","batch","csv","json","xml","yaml","html","file in","file","exec"],K=(t,e,i)=>{const n=t.name||e.name;if(n)return n;const M=t.label||t.info||t.text||"";let o="",A="",a="",g="";switch(t.type){case"file":a="write file";case"file in":return a=a||"read file",A=t.filename,"str"!==t.filenameType&&"env"!==t.filenameType&&(A=""),"env"===t.filenameType&&(A="env."+A),"write file"===a&&"delete"===t.overwriteFile?t.name||"delete "+A:t.name||A||a;case"html":o=t.tag;break;case"tcp in":case"tcp out":case"tcp request":a="tcp:";case"udp in":case"udp out":return a=a||"udp:",A=t.host||t.addr||t.server||"",a+(A?A+":":"")+(t.port||"");case"debug":return!0!==t.console&&"true"!==t.console||(g="\t⇲"),"jsonata"===t.targetType?(t.name||"JSONata")+g:!0===t.complete||"true"===t.complete?(t.name||"msg")+g:(t.name||"msg."+(t.complete&&"false"!==t.complete?this.complete:"payload"))+g}return t.type&&t.type.startsWith("ui-")?o=t.type.replace(/^ui-/,""):t.type&&t.type.startsWith("ui_")&&(o=t.type.replace(/^ui_/,"")),o&&o.length<=32?o:M||(t.topic&&t.topic.length<=32&&q.includes(t.type)?t.topic:t.type)},_=(t,e,i)=>(t.name||t.label||t.info||t.text||"").replace(/(.{40,60})([ \n\t])/g,"$1\\n$2")+(t.sumPass?" ⭄":"")+(t.sumPassPrio&&0!=parseInt(t.sumPassPrio)?" ("+t.sumPassPrio+")":""),$={base64:void 0,batch:void 0,catch:(t,e,i)=>{let n="";return t.uncaught&&(n=": uncaught"),t.scope&&(n=": "+t.scope.length),t.scope||t.uncaught||(n=": all"),t.name||t.type+n},change:t=>{function e(t,e){return t+"."+o.utils.parseContextKey(e).key}return t.name?t.name:(t._=t._||function(t,e){let i=t;switch(t){case"change.label.set":i="set {{property}}";break;case"change.label.change":i="change {{property}}";break;case"change.label.move":i="move {{property}}";break;case"change.label.delete":i="delete {{property}}";break;case"change.label.changeCount":i="change {{count}} properties"}for(const n in e)t=i.replace(new RegExp("\\{\\{"+n+"\\}\\}","g"),e[n]);return t},t.rules?1===t.rules.length?"set"===t.rules[0].t?t._("change.label.set",{property:e(t.rules[0].pt||"msg",t.rules[0].p)}):"change"===t.rules[0].t?t._("change.label.change",{property:e(t.rules[0].pt||"msg",t.rules[0].p)}):"move"===t.rules[0].t?t._("change.label.move",{property:e(t.rules[0].pt||"msg",t.rules[0].p)}):t._("change.label.delete",{property:e(t.rules[0].pt||"msg",t.rules[0].p)}):t._("change.label.changeCount",{count:t.rules.length}):"replace"===t.action?t._("change.label.set",{property:"msg."+t.property}):"change"===t.action?t._("change.label.change",{property:"msg."+t.property}):"move"===t.action?t._("change.label.move",{property:"msg."+t.property}):t._("change.label.delete",{property:"msg."+t.property}))},comment:void 0,csv:void 0,debug:void 0,exec:void 0,file:void 0,"file in":void 0,function:void 0,html:void 0,"http response":(t,e,i)=>t.name||"http"+(t.statusCode?" ("+t.statusCode+")":""),"http in":(t,e,i)=>t.name||"["+t.method+"] "+t.url,"http request":void 0,inject:t=>{let e="";if(t.once&&(e=" ¹"),(t.repeat&&0!=t.repeat||t.crontab)&&(e="\t↻"),t.name)return t.name+e;let i="",n="str",M="";const A=t.props;if(A)for(let e=0;e0&&i.length<24?i+e:"inject"+e;if("date"===n||"bin"===n||"env"===n)return""!==M&&M.length<=16?M+":"+X(n)+e:X(n)+e;if("flow"===n||"global"===n){return n+"."+o.utils.parseContextKey(i).key+e}return"inject"+e},join:void 0,json:void 0,junction:void 0,"link in":void 0,"link out":void 0,"link call":(t,e,i)=>{if(!t.links||0===t.links.length)return t.name||t.type;let n;return i.forEach(function(M){n||M.id===t.links[0]&&(n=($[M.type]||K)(M,e,i))}),t.name||n||t.type},markdown:void 0,postgresql:void 0,range:void 0,sort:void 0,split:void 0,switch:void 0,yaml:void 0,xml:void 0,BlogPages:void 0,BlogDetails:void 0,BlogPageInfo:(t,e,i)=>{if(t.name)return t.name;let n;return i.forEach(function(e){n||"link in"===e.type&&e.name.startsWith("[blog] ")&&(e.wires[0]||[]).indexOf(t.id)>-1&&(n=e.name.substring(7))}),n||t.type},PubMedium:void 0,Topic:_,Observation:_,Question:_,Thought:_,Idea:_,Analogy:_,Aphorism:_,Poesie:_,Humour:_,Treasure:_,Consequence:_,Advantage:_,Disadvantage:_,Text:_,"Blog-Post":_,Comment:_,Codebase:_,Sketch:_,Inspiration:_,Quote:_,Definition:_,Book:_,Author:_,"nnb-input-node":void 0,"nnb-layer-node":(t,e,i)=>t.name||t.actfunct+": "+t.bias+", "+t.threshold,"nnb-output-node":void 0,"nnb-backprop":void 0,"nnb-trainer":void 0,Seeker:void 0,Sink:void 0,Screenshot:void 0,Orphans:void 0,IsMobile:void 0,Navigator:void 0,DrawSVG:void 0,GetFlows:void 0,_default:K};function tt(t){const e={};let i=1e4,n=0;for(const M of t)"subflow"===M.type?e[M.id]={id:M.id,label:M.name,type:"subflow",disabled:M.disabled,order:i++}:"tab"!==M.type&&M.z&&(e[M.z]||(e[M.z]={id:M.z,label:"Flow "+(n+1),type:"tab",disabled:!1,order:n++}));const M=t.filter(t=>"tab"===t.type);let o=0;for(const t of M)e[t.id]&&(e[t.id].label=t.label||e[t.id].label,e[t.id].disabled=!!t.disabled,e[t.id].order=o++);const A=Object.keys(e).map(t=>e[t]);return A.sort((t,e)=>t.order-e.order),A}function et(t){Array.isArray(t)||(t=[]);const e=[...t];for(let t=0;t0?i.add(...n):e?.classList?.length&&i.add(...e.classList),0===i.size&&i.add("flow-renderer"),[...i]}(t)),t.container){const i={};["scope","gridLines","arrows","zoom","images","linkLines","labels","autoZoom","autoScroll","flowId"].forEach(function(e){if("string"==typeof t.container.dataset[e]){const n=t.container.dataset[e]||"true";i[e.replace(/-/g,"")]="true"===n}}),e.push(i)}e.push(t)}return Object.assign({},...e)}function nt(e,i){e=et(e);const n=w((i=it(i)).document,t.document,i.container,this),M=i.container;for(;M.firstChild;)M.removeChild(M.firstChild);const o=n.createElement("div");o.classList.add("red-ui-tabs"),M.appendChild(o);const A=E(M);!function(t,e,i=!0){const n=w(t,this),M=n.createElement("pre");M.classList.add("red-ui-workspace-source"),i&&M.classList.add("hidden"),M.setAttribute("data-code-wrap","json");const o=n.createElement("code");o.classList.add("lang-json","hljs","language-json"),o.textContent="object"==typeof e?JSON.stringify(e,null,2):"string"==typeof e?e:"// No content available",M.appendChild(o),t&&t.appendChild(M)}(M,e);const a=function(t){const e=w(t,this);if(!e)return null;let i=t.querySelector(".toolbar");i||(i=v(t));let n=i.querySelector(".source-controls");if(n)return{viewSource:i.querySelector(".view-source")};n=e.createElement("div"),n.classList.add("source-controls"),n.classList.add("button-group");const M=e.createElement("button");return M.classList.add("red-ui-footer-button","icon-button-bg","view-source"),M.title="Toggle Flows / Source",n.appendChild(M),i.appendChild(n),{viewSource:M}}(M);a.viewSource.onclick=function(t){!function(t){t.preventDefault(),t.stopPropagation();const e=t.target.parentElement.parentElement.parentElement.querySelector(".red-ui-workspace-chart");if(!e)return void console.warn("No container found for source view toggle");const i=e.parentElement,n=i.querySelector(".red-ui-tabs"),M=i.querySelector(".red-ui-workspace-source"),o=i.querySelector(".zoom-controls");M&&M.classList.contains("hidden")?(M.classList.remove("hidden"),e.classList.add("hidden"),n.classList.add("hidden"),o?.classList.add("hidden")):(M.classList.add("hidden"),e.classList.remove("hidden"),n.classList.remove("hidden"),o?.classList.remove("hidden"))}(t)};const g=function(t){const e=w(t,this);if(!e)return null;let i=t.querySelector(".toolbar");i||(i=v(t));let n=i.querySelector(".copy-controls");if(n)return{copy:i.querySelector(".copy-flow"),download:i.querySelector(".download-flow")};n=e.createElement("div"),n.classList.add("copy-controls"),n.classList.add("button-group");const M=e.createElement("button");M.classList.add("red-ui-footer-button","icon-button-bg","copy-flow"),M.title="Copy Flow to Clipboard";const o=e.createElement("button");return o.classList.add("red-ui-footer-button","icon-button-bg","download-flow"),o.title="Download Flows",n.appendChild(M),n.appendChild(o),i&&i.appendChild(n),{copy:M,download:o}}(M);g.copy.onclick=function(t){!function(t,e,i){i=i||function(){};let n=e||[];"object"==typeof n?n=JSON.stringify(n,null,0):"string"!=typeof n&&(n=n.toString());const M=w(t&&t.target&&t.target.ownerDocument,this);if("undefined"!=typeof navigator&&navigator.clipboard)return void navigator.clipboard.writeText(n).then(function(){i(null,!0)}).catch(function(t){i(t,!1)});const o=M.createElement("textarea");o.value=n,o.style.position="fixed",o.style.top="0",o.style.left="0";try{M.body.appendChild(o),o.focus(),o.select();const t=M.execCommand("copy");i(null,t),console.info("failed to copy",t)}catch(t){console.error("failed to copy",t)}finally{M.body.removeChild(o)}}(t,e)},g.download.onclick=function(t){!function(t,e,i,n,M){M=M||function(){};let o=e||[];"object"==typeof o?o=JSON.stringify(o,null,2):"string"!=typeof o&&(o=o.toString());const A=w(t&&t.target&&t.target.ownerDocument,this),a=new Blob([o],{type:i}),g=URL.createObjectURL(a),r=A.createElement("a");r.style.display="none",r.href=g,r.download=n,r.style.position="fixed",r.style.top="0",r.style.left="0";try{A.body.appendChild(r),r.focus(),r.click(t),URL.revokeObjectURL(g),M(null,!0)}catch(t){M(t,!1),console.error("failed to download",t)}finally{A.body.removeChild(r)}}(t,e,"application/json","flows.json")};const r=O(A);H(r),f(r),M.classList.add(i.scope);const u=function(t){o.querySelectorAll(".red-ui-tab").forEach(t=>t.classList.remove("active"));return o.querySelector(`[data-flow-id="${t}"]`).classList.add("active"),i.flowId=t,Mt(e,i)};G(n,i.scope);const s=M.querySelectorAll(".red-ui-tab");s&&s.forEach(t=>t.remove());const d=tt(e);if(d.forEach((e,n)=>{!function(e,i,n,M,o){const A=`red-ui-tab-${n}`,a=M.container,g=M.svg||a.querySelector("svg"),r=w(M.document,t.document,a,this),u=i.label;let s=a.querySelector(`.${A}`);if(s||(s=r.createElement("div"),e.appendChild(s),s.classList.add("red-ui-tab"),s.classList.add("red-ui-tab-"+i.type),s.setAttribute("data-flow-id",i.id)),i.disabled){s.classList.add("disabled");const t=r.createElement("i");t.classList.add("red-ui-tab-disabled-icon"),s.appendChild(t)}else if("subflow"===i.type){const t=r.createElement("i");t.classList.add("red-ui-tab-subflow-icon"),s.appendChild(t)}s.title=u;const d=r.createElement("span");d.textContent=u,s.appendChild(d),s.onclick=function(t){z(g,M,M.flowId),o(i.id),h(g,M,i.id)}}(o,e,n,i,u)}),d.length?M.classList.add("has-tabs"):M.classList.remove("has-tabs"),!i.flowId){const t=d.find(t=>"tab"===t.type),e=d.find(t=>"subflow"===t.type);i.flowId=t?t.id:e?e.id:null}let c=null;return c=d.length?u(i.flowId):Mt(e,i),z(r,i,i.flowId),c=c||{},c.tabs=d,c.flowId=i.flowId,c.css=c.css||U(i.scope),c}function Mt(t,i){t=et(t);const n=(i=it(i)).container,A={},r={},d={},c={},l={},I=(i=i||{}).flowId,L=j("junction");let N=!1;const y=tt(t).find(t=>t.id===I);y&&"tab"===y.type&&(N=y.disabled);let w=n&&n.querySelector("svg");w=w||O(n),H(w,i.layer);const b=(i.svgLayer||w).querySelector(".flow_grid");i.gridLines&&b&&B(b),t.forEach(function(t){if("subflow"===t.type){r["subflow:"+t.id]=t;for(let e=0;e0&&t.wires.forEach(function(t){t.forEach(function(t){l[t]=!0})})});const x=(i.svgLayer||w).querySelector(".flow_nodes");t.forEach(function(n){if(n.z===I||n.id===I){const I=D(n),y=function(t){let e=!0;return"link out"!==t.type&&"link in"!==t.type||(e=!1),"junction"===t.type||"tab"===t.type||"subflow"===t.type||(!1===t.l?e=!1:!0===t.l&&(e=!0)),e}(n),w=!i.labels,b=j(n.type);switch(n.type){case"tab":case"ui_spacer":case"ui-spacer":break;case"group":d[n.id]=n;break;case"subflow":c[n.id]={...n};for(let t=0;t1?18:16)+")"});let t=0;c.lines.forEach(function(e){const i=k("text",{y:t,class:"node-text-label"});i.textContent=e,j.appendChild(i),t+=20})}const D=k("g",{"data-node-id":n.id,class:"node"});x.appendChild(D),y&&j&&D.appendChild(j);const C=y?j?.getBBox():{width:0,height:0},p=C.width,T=C.height+13.5,m=y?I.width>p?I.width:p:I.width,S=y?I.height>T?I.height:T:I.height,z={x:n.x,y:n.y,w:m,h:S,outputs:(n.wires||[]).length},h=!!l[n.id];try{y?(z.w=Math.max(e,20*Math.ceil((c.width+48+(h?7:0))/20)),z.h=Math.max(6+24*c.lines.length,15*(z.outputs||0),30)):(z.w=30,z.h=Math.max(30,15*(z.outputs||0)))}catch(t){}if(z.outputs>2&&y&&j&&z.h>T){const t=(z.h-T)/2;j.setAttributeNS(null,"transform","translate(38,"+((c.lines.length>1?16:14)+t)+")")}w&&j&&(j.style.display="none"),D.prepend(k("rect",{...b,rx:5,ry:5,fill:d.color||b.fill,width:z.w,height:z.h,class:"node node-"+n.id})),D.appendChild(k("path",{d:"M5 0 h25 v"+z.h+" h-25 a 5 5 0 0 1 -5 -5 v-"+(z.h-10)+" a 5 5 0 0 1 5 -5",fill:"rgb(0,0,0)","fill-opacity":.05,stroke:"none"})),y&&D.appendChild(k("path",{d:"M 29.5 0.5 l 0 "+(z.h-1),fill:"none",stroke:"rgb(0,0,0)","stroke-opacity":.1,"stroke-width":"1px"}));const f=o.view.tools.calculateGridSnapOffsets(z),E=n.x-z.w/2-f.x,v=n.y-z.h/2-f.y;if(D.setAttribute("transform",`translate(${E}, ${v})`),n.bbox=D.getBBox(),n.bbox.x=E,n.bbox.y=v,i.images){const t={x:0,y:Math.max(z.h/2-15,0),width:30,height:30},e=function(t){let e=u[t];return e||(t.startsWith("subflow:")?e=u.subflow:t.startsWith("ui-")?e=u["ui-template"]:t.startsWith("ui_")&&(e=u.ui_template)),e&&s[e]||""}(n.type);if(e)D.appendChild(k("image",{href:e,...t}));else if(n.type.startsWith("subflow:")){const e=d.icon&&s[d.icon]||s["subflow.svg"];D.appendChild(k("image",{href:e,...t}))}}(d.in&&d.in.length>0||l[n.id])&&(i.arrows?D.appendChild(k("path",{...L,transform:"translate(-3,"+(n.bbox.height/2-5)+")",d:i.arrows?"M 0,10 9,5 0,0 Z":"M -1,9.5 8,9.5 8,0.5 -1,0.5 Z",class:"red-ui-flow-port-input input-arrows","stroke-linecap":"round","stroke-linejoin":"round"})):D.appendChild(k("rect",{...L,transform:"translate(-5,"+(n.bbox.height/2-5)+")",...a,...g,class:"red-ui-flow-port-input"})));const O={...L,...a,...g,class:"red-ui-flow-port"};if(n.wires&&Array.isArray(n.wires)){const t=1===n.wires.length?n.bbox.height/2-5:n.wires.length%2==0?3.5:4.5;for(let e=0;e0;){h-=1;for(const t in d){if(m.indexOf(t)>-1)continue;const e=d[t];let i=0,n=0,M=!1;if(e.nodes.forEach(function(t){const o=(A[t]||{}).bbox;o?(i=Math.max(i,o.x-e.x+o.width),n=Math.max(n,o.y-e.y+o.height)):M=!0}),M)continue;const o=k("g",{"data-node-id":t});o.setAttribute("transform",`translate(${e.x}, ${e.y})`),o.appendChild(k("rect",{rx:5,ry:5,width:e.w,height:e.h,fill:"none","fill-opacity":0,"stroke-width":2,stroke:"grey",class:"group-"+e.id,...e.style})),T.prepend(o);const a=A[t];a.bbox=o.getBBox(),a.bbox.x=e.x,a.bbox.y=e.y;const g=k("g",{});if(o.appendChild(g),e.style.label&&e.name){const t=e.style["label-position"]||"nw",i=J(e.name,"group-text-label");let n=0,M=0,o="start";if(M="n"===t[0]?15:a.bbox.height-5-16*(i.lines.length-1),"w"===t[1]?(n=5,o="start"):"e"===t[1]?(n=a.bbox.width-5,o="end"):(n=a.bbox.width/2,o="middle"),g.setAttribute("transform",`translate(${n}, ${M})`),g.setAttribute("text-anchor",o),i){let t=0;i.lines.forEach(function(i){const n=k("text",{class:"group-text-label",x:0,y:t,fill:e.style.color||"grey"});n.textContent=i,g.appendChild(n),t+=16})}}m.push(t)}}const f=(i.svgLayer||w).querySelector(".flow_wires"),E=[],v=Object.keys(c);for(let t=0;t2&&e.splice(2);const n=new Map,M=Q(function(t,e){const i=W(t),n=W(e),M={},o={},A={},a={},g={};return Object.keys(i.all).forEach(function(t){if(!N(n.all,t))return void(o[t]=!0);const e=JSON.stringify(i.all[t]),M=JSON.stringify(n.all[t]);if(e!==M)if(A[t]=!0,i.all[t].z!==n.all[t].z)g[t]=!0;else if(i.all[t].x!==n.all[t].x||i.all[t].y!==n.all[t].y||i.all[t].w!==n.all[t].w||i.all[t].h!==n.all[t].h){const i=JSON.parse(e),n=JSON.parse(M);delete i.x,delete i.y,delete i.w,delete i.h,delete n.x,delete n.y,delete n.w,delete n.h,JSON.stringify(i)===JSON.stringify(n)&&(a[t]=!0)}}),Object.keys(n.all).forEach(function(t){N(i.all,t)||(M[t]=!0)}),{currentConfig:i,newConfig:n,added:M,deleted:o,changed:A,positionChanged:a,moved:g}}(e[0],e[1]));M.changes.forEach(t=>{t.highlight=e=>function(t=-1,e){clearTimeout(L),clearTimeout(j);r.querySelectorAll(".red-ui-tab").forEach(t=>t.classList.remove("tab-glow"));s.querySelectorAll("g[data-node-id]").forEach(t=>{t.style.filter=""});const i=r.querySelector(".red-ui-tab.active").getAttribute("data-flow-id");let n=e.tab;"moved"===e.diffType&&(-1===t?t=e.v1:0===t?n=e.value1:1===t&&(n=e.value2));"added"===e.diffType&&-1===t?t=1:("deleted"===e.diffType&&-1===t||-1===t)&&(t=0);const M=r.querySelector(`.red-ui-tab[data-flow-id="${n}"]`);("tab"===e.item&&"changed"===e.diffType||n!==i)&&M&&(M.click(),M.classList.add("tab-glow"),j=setTimeout(()=>{M.classList.remove("tab-glow")},1e4));if(parseInt(c.value)<10||parseInt(c.value)>90){const e=0===t?10:90;!async function(){let t=parseInt(c.value);const i=e>t?1:-1;for(;t!==e;){t+=i,c.value=t;const e=new Event("input",{bubbles:!0});c.dispatchEvent(e),await new Promise(t=>setTimeout(t,10))}}()}const o=[e.item,e.tab][0],A=s.querySelector(`g.flow-layer-0 g[data-node-id="${o}"]`),a=s.querySelector(`g.flow-layer-1 g[data-node-id="${o}"]`);if(!A&&!a)return;(A||a).scrollIntoView({behavior:"smooth",block:"center",inline:"center"}),A&&(A.style.filter="url(#node-glow)");a&&(a.style.filter="url(#node-glow)");L=setTimeout(()=>{try{A&&(A.style.filter=""),a&&(a.style.filter="")}catch(t){}},1e4)}(e,t)}),M.tabMap=n;const o=w((i=it(i)).document,t.document,i.container,this),A=i.container;G(o,i.scope);const a=i.zoom,g=i.gridLines;for(i.zoom=!1,i.gridLines=!1;A.firstChild;)A.removeChild(A.firstChild);const r=Y("div",null,"red-ui-tabs",null,A),u=E(A),s=O(u,{addDefaultLayer:!1}),d=[...s.childNodes].find(t=>"g"===t.tagName&&t.classList.contains("outerContainer")),c=function(t){if(!w(t,this))return null;let e=t.querySelector(".toolbar");e||(e=v(t));let i=e.querySelector(".compare-controls");if(i)return e.querySelector(".flow-compare-slider");i=Y("div",null,"button-group compare-controls",null,e);const n=Y("input",null,"flow-compare-slider",null,i);return n.type="range",n.min="0",n.max="100",n}(A);c.type="range",c.min=0,c.max=100,c.value=0,c.step=5,c.style.width="100%",c.classList.add("flow-compare-slider");const l=A,I=u;f(s);for(let t=0;t{const M=n[0],o=n[1],u={...i,flowId:M,container:null,layers:o};!function(e,i,n){const M=w(i.document,t.document,A,this),o=i.layers;for(const t of Object.values(o)){const A=t.tab,a=A.label,g=`red-ui-tab-${t.index}`,r=`red-ui-tab-${A.id}`;let u=e.querySelector(`.${r}`);u||(u=M.createElement("div"),e.appendChild(u),u.classList.add("red-ui-tab"),u.classList.add(g),u.classList.add(r),u.classList.add("red-ui-tab-"+o.type),u.setAttribute("data-flow-id",A.id));let d=u.querySelector(`.red-ui-tab-label-${t.index}`);if(d||(d=M.createElement("div"),d.classList.add(`red-ui-tab-label-${t.index}`)),d.classList.add("red-ui-tab-label"),d.setAttribute("data-layer",t.index),d.style.opacity=0,u.appendChild(d),A.disabled){d.classList.add("disabled");const t=M.createElement("i");t.classList.add("red-ui-tab-disabled-icon"),d.appendChild(t)}else if("subflow"===A.type){const t=M.createElement("i");t.classList.add("red-ui-tab-subflow-icon"),d.appendChild(t)}d.title=a;const c=M.createElement("span");c.textContent=a,d.appendChild(c),u.onclick=function(t){z(s,i,i.flowId),n(i),h(s,i,A.id)}}}(r,u,function(t){r.querySelectorAll(".red-ui-tab").forEach(t=>t.classList.remove("active"));r.querySelector(`[data-flow-id="${t.flowId}"]`).classList.add("active");const n=Object.values(t.layers),M={0:!0,1:!0};n.forEach(t=>{t.svgLayer.setAttribute("opacity",0);const i=t.renderOptions;Mt(e[i.index]||[],i),M[i.index]=!1});const o=M[0]||M[1],u={...i,flowId:t.flowId,container:o?.container||o?.flowRenderer||A};if(M[0]&&(u.layer=0,u.svgLayer=s.querySelector("g.flow-layer-0"),Mt(e[0]||[],u)),M[1]&&(u.layer=1,u.svgLayer=s.querySelector("g.flow-layer-1"),Mt(e[1]||[],u)),a&&p(s,A),g){let t=[...d.childNodes].find(t=>"g"===t.tagName&&t.classList.contains("flow_grid"));t||(t=k("g",{class:"flow_grid"}),d.insertBefore(t,s.firstChild)),t&&B(t)}D()})}),c.addEventListener("input",function(t){D()});let L=null,j=null;function D(){const t=parseInt(c.value),i=[1-t/100,t/100];i.forEach((t,e)=>{t=t>.05?b(t+.15,0,1):t;const i=function(t,e){return t.querySelector(`g.flow-layer-${e||0}`)}(s,e);i?.setAttribute("opacity",t)});r.querySelectorAll(".red-ui-tab-label").forEach((t,n)=>{let M=parseInt(t.getAttribute("data-layer"));(isNaN(M)||M<0||M>=e.length)&&(M=0),t.style.opacity=i[M]||0})}const y=r.querySelector(".red-ui-tab");y&&y.click(),n.size>0?A.classList.add("has-tabs"):A.classList.remove("has-tabs");const x=C(s.parentElement);return x.hasHorizontalScrollbar||x.hasVerticalScrollbar?A.classList.add("has-scrollbars"):A.classList.remove("has-scrollbars"),M},renderFlows:nt,renderFlow:Mt,normaliseOptions:it,getStyles:U}};"object"==typeof module&&module.exports?module.exports=FlowRenderer:"object"==typeof window?window.FlowRenderer=FlowRenderer:global.FlowRenderer=FlowRenderer;export default FlowRenderer; \ No newline at end of file From b32f18d396f767180d88163cb0c00b458b844056 Mon Sep 17 00:00:00 2001 From: Nicolas Date: Tue, 10 Mar 2026 23:49:45 +0100 Subject: [PATCH 2/3] Add victron colors. --- index.js | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++ index.min.js | 2 +- 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index 4a6f97f..5f36fb0 100644 --- a/index.js +++ b/index.js @@ -567,6 +567,67 @@ const FlowRenderer = function () { 'image-depth': _hshClr('#f69e00'), 'object-detection': _hshClr('#f69e00'), + // victron nodes + 'victron-virtual-switch': _hshClr('#f7ab3e'), + 'victron-virtual': _hshClr('#f7ab3e'), + 'victron-inject': _hshClr('#f7ab3e'), + 'vrm-api': _hshClr('#f7ab3e'), + + 'victron-input-accharger': _hshClr('#4790d0'), + 'victron-input-acload': _hshClr('#4790d0'), + 'victron-input-acsystem': _hshClr('#4790d0'), + 'victron-input-alternator': _hshClr('#4790d0'), + 'victron-input-battery': _hshClr('#4790d0'), + 'victron-input-dcdc': _hshClr('#4790d0'), + 'victron-input-dcload': _hshClr('#4790d0'), + 'victron-input-dcsource': _hshClr('#4790d0'), + 'victron-input-dcsystem': _hshClr('#4790d0'), + 'victron-input-dess': _hshClr('#4790d0'), + 'victron-input-digitalinput': _hshClr('#4790d0'), + 'victron-input-ess': _hshClr('#4790d0'), + 'victron-input-evcharger': _hshClr('#4790d0'), + 'victron-input-fuelcell': _hshClr('#4790d0'), + 'victron-input-generator': _hshClr('#4790d0'), + 'victron-input-gps': _hshClr('#4790d0'), + 'victron-input-gridmeter': _hshClr('#4790d0'), + 'victron-input-inverter': _hshClr('#4790d0'), + 'victron-input-meteo': _hshClr('#4790d0'), + 'victron-input-motordrive': _hshClr('#4790d0'), + 'victron-input-multi': _hshClr('#4790d0'), + 'victron-input-pulsemeter': _hshClr('#4790d0'), + 'victron-input-pump': _hshClr('#4790d0'), + 'victron-input-pvinverter': _hshClr('#4790d0'), + 'victron-input-relay': _hshClr('#4790d0'), + 'victron-input-settings': _hshClr('#4790d0'), + 'victron-input-solarcharger': _hshClr('#4790d0'), + 'victron-input-switch': _hshClr('#4790d0'), + 'victron-input-system': _hshClr('#4790d0'), + 'victron-input-tank': _hshClr('#4790d0'), + 'victron-input-temperature': _hshClr('#4790d0'), + 'victron-input-vebus': _hshClr('#4790d0'), + + 'victron-output-accharger': _hshClr('#4790d0'), + 'victron-output-acsystem': _hshClr('#4790d0'), + 'victron-output-battery': _hshClr('#4790d0'), + 'victron-output-charger': _hshClr('#4790d0'), + 'victron-output-dcdc': _hshClr('#4790d0'), + 'victron-output-dess': _hshClr('#4790d0'), + 'victron-output-ess': _hshClr('#4790d0'), + 'victron-output-evcharger': _hshClr('#4790d0'), + 'victron-output-generator': _hshClr('#4790d0'), + 'victron-output-inverter': _hshClr('#4790d0'), + 'victron-output-multi': _hshClr('#4790d0'), + 'victron-output-pump': _hshClr('#4790d0'), + 'victron-output-pvinverter': _hshClr('#4790d0'), + 'victron-output-relay': _hshClr('#4790d0'), + 'victron-output-settings': _hshClr('#4790d0'), + 'victron-output-solarcharger': _hshClr('#4790d0'), + 'victron-output-switch': _hshClr('#4790d0'), + 'victron-output-vebus': _hshClr('#4790d0'), + + 'victron-input-custom': _hshClr('#f7ab3e'), + 'victron-output-custom': _hshClr('#f7ab3e'), + _default: _hshClr() } diff --git a/index.min.js b/index.min.js index f1e340b..e692afd 100644 --- a/index.min.js +++ b/index.min.js @@ -1 +1 @@ -const FlowRenderer=function(){const t=this||{},e=100,i=8e3,n=8e3,M=13.5,o={view:{}};o.view.tools={},o.utils={},o.view.gridSize=function(){return 20},o.view.tools.calculateGridSnapOffsets=function(t,e){0;e=e||{align:"nearest"};const i={x:0,y:0},n=o.view.gridSize(),M=t.x-(n*Math.round((t.x-t.w/2)/n)+t.w/2),A=t.x-(n*Math.round((t.x+t.w/2)/n)-t.w/2);i.x=A,"right"===e.align||("left"===e.align||Math.abs(M)t.clientWidth,hasVerticalScrollbar:t.scrollHeight>t.clientHeight}}function p(t,e){let i=1;const n=t.getAttribute("transform");if(n){const t=n.match(/scale\(([^,]+)\)/);t&&(i=b(parseFloat(t[1]||1),.25,3,1))}const M=t.querySelector("g.outerContainer");T(M,i,!0),e.onwheel=function(t){if(t.ctrlKey||t.metaKey){t.preventDefault();let e=x(M);e-=.075*Math.sign(t.deltaY),e=b(e,.2,3,1),T(M,e)}};const o=function(t){const e=w(t,this);if(!e)return null;let i=t.querySelector(".toolbar");i||(i=v(t));let n=i.querySelector(".zoom-controls");if(n)return{zoomIn:i.querySelector(".zoom-in"),zoomOut:i.querySelector(".zoom-out"),zoomReset:i.querySelector(".zoom-reset")};n=e.createElement("div"),n.classList.add("zoom-controls"),n.classList.add("button-group");const M=e.createElement("button");M.classList.add("red-ui-footer-button","icon-button-bg","zoom-in"),M.innerHTML="+",M.title="Zoom In (Ctrl + Mouse Wheel Up)";const o=e.createElement("button");o.classList.add("red-ui-footer-button","icon-button-bg","zoom-reset"),o.title="Zoom & Scroll Reset";const A=e.createElement("button");A.classList.add("red-ui-footer-button","icon-button-bg","zoom-out"),A.innerHTML="-",A.title="Zoom Out (Ctrl + Mouse Wheel Down)",n.appendChild(A),n.appendChild(o),n.appendChild(M),i&&i.appendChild(n);return{zoomIn:M,zoomOut:A,zoomReset:o}}(e);o.zoomIn.onclick=function(){const t=b(x(M)+.1,.2,3,1);T(M,t)},o.zoomOut.onclick=function(){const t=b(x(M)-.1,.2,3,1);T(M,t)},o.zoomReset.onclick=function(){!function(t){const e=t.getAttribute("_scale_original")||1;T(t,e)}(M),function(t){t.scrollLeft=t.getAttribute("_scroll_x")||0,t.scrollTop=t.getAttribute("_scroll_y")||0}(e.querySelector(".red-ui-workspace-chart"))}}function x(t){return parseFloat(t.getAttribute("_scale_current")||1)}function T(t,e,M=!1){t.setAttribute("transform",`scale(${e})`);const o=t.ownerSVGElement||t;o.style.width=i*e+"px",o.style.height=n*e+"px",t.setAttribute("_scale_current",e),M&&t.setAttribute("_scale_original",e)}function m(t,e,i,n=!1){t.scrollLeft=e,t.scrollTop=i,n&&(t.setAttribute("_scroll_x",e),t.setAttribute("_scroll_y",i))}function S(t,e,M){const o=M.autoZoom||M.autoScroll?function(t,e){const M=.2,o=1,A=e.container.querySelector(".red-ui-workspace-chart"),a=A.getBoundingClientRect(),g=a.width-25,r=a.height-25;let u=i,s=n,d=0,c=0;const l=e.flowId,I=t.filter(t=>"tab"!==t.type&&"subflow"!==t.type&&t.z===l);if(0===I.length)return{scale:1,scrollX:0,scrollY:0};for(const t of I){if("tab"===t.type||"subflow"===t.type||"junction"===t.type)continue;const e=t.x||0,i=t.y||0,n=D(t),M=(n.width||100)/2,o=(n.height||30)/2,A=e-M,a=i-o,g=e+M,r=i+o;u=Math.min(u,A),s=Math.min(s,a),d=Math.max(d,g),c=Math.max(c,r)}let L=1;const N=d-u,j=c-s,y=g/N,w=r/j;(N>g||j>r)&&(L=Math.min(y,w),L*=.95);L=b(L,M,o,1);let C=u,p=s;C<50&&(C=0);p<40&&(p=0);C>0&&(C-=50);p>0&&(p-=40);return C=b(C*L,0,A.scrollWidth),p=b(p*L,0,A.scrollHeight),{scale:L,scrollX:C,scrollY:p,minX:u,minY:s,maxX:d,maxY:c}}(e,M):null;if(t=t.ownerSVGElement||t,M.zoom&&o&&M.autoZoom){T(t.querySelector("g.outerContainer"),o.scale,!0)}return o&&M.autoScroll&&m(t.parentElement,o.scrollX,o.scrollY,!0),o}function z(t,e,i){const n=t.parentElement,M=t.querySelector("g.outerContainer"),o=n.scrollLeft,A=n.scrollTop,a=x(M),g=i||e.flowId||"global";n.setAttribute(`data-tab-${g}-x`,o),n.setAttribute(`data-tab-${g}-y`,A),n.setAttribute(`data-tab-${g}-scale`,a)}function h(t,e,i){const n=t.parentElement,M=t.querySelector("g.outerContainer"),o=i||e.flowId||"global",A=n.getAttribute(`data-tab-${o}-x`),a=n.getAttribute(`data-tab-${o}-y`),g=n.getAttribute(`data-tab-${o}-scale`);"string"==typeof A&&"string"==typeof a&&m(n,A,a),"string"==typeof g&&T(M,g)}function f(t){const e=t.parentElement,i=t.querySelector("g.outerContainer");for(const t in i.dataset)/^tab-\w+-.*/.test(t)&&e.removeAttribute(t)}function E(t){const e=w(t,this).createElement("div");return e.classList.add("red-ui-workspace-chart"),t?(t.appendChild(e),e):e}function v(t){const e=w(t,this);if(!e)return null;let i=t.querySelector(".toolbar");return i||(i=e.createElement("div"),i.classList.add("toolbar"),t&&t.appendChild(i),i)}function O(t,{addDefaultLayer:e=!0,layer:M=0}={}){const o=w(t,this),A=o.createElementNS("http://www.w3.org/2000/svg","svg");A.setAttribute("style",`width:${i}px; height:${n}px;`),t.appendChild(A);const a=o.createElementNS("http://www.w3.org/2000/svg","defs");A.appendChild(a);a.innerHTML='\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ';const g=k("g",{class:"outerContainer"});return A.appendChild(g),e&&Z(A,{layer:M}),A}function k(t,e,i){const n=w(i,this).createElementNS("http://www.w3.org/2000/svg",t);if("object"==typeof e)for(const t in e)n.setAttribute(t,e[t]);return i&&i.appendChild(n),n}function Z(t,{layer:e=0,opacity:i=1}={}){let n=t.querySelector("g.outerContainer");n||(n=k("g",{class:"outerContainer"},t)),n.querySelector("g.flow_grid")||k("g",{class:"flow_grid"},n);let M=n.querySelector(`g.flow-layer-${e}`);for(M||(M=k("g",{class:`flow-layer-${e||0}`},n));M.firstChild;)M.removeChild(M.firstChild);return M.setAttribute("opacity",i),k("g","flow_group_elements",M),k("g","flow_group_select",M),k("g","flow_wires",M),k("g","flow_nodes",M),M}function B(t){if(t.childNodes.length>0)return;k("rect",{width:`${i}px`,height:`${n}px`,fill:"url(#grid)"},t).style.transform="translate(-1px, -1px)"}function Y(t,e,i,n,M){const o=w(M,this).createElement(t);if("object"==typeof e)for(const t in e)o.setAttribute(t,e[t]);return i&&"string"==typeof i?o.classList.add(...i.split(" ")):Array.isArray(i)&&o.classList.add(...i),"string"==typeof n&&(o.textContent=n),M&&M.appendChild(o),o}function Q(t){const e=[],i={},n=new Set([...Object.keys(t.changed),...Object.keys(t.added),...Object.keys(t.deleted),...Object.keys(t.moved),...Object.keys(t.positionChanged)]),M=t.currentConfig,o=t.newConfig;function A(e,i,n,M,o,A){const a={tab:e,item:i,diffType:n,prop:M,value1:o,value2:A,toString:()=>""},g=t=>t?`'${t}'`:"''",r=t=>t?g(function(t,e,i){const n=$[t.type]||$._default,M=e&&e[t.type]||{};return n(t,M,i)}(t)):"'n/a'",u=t.currentConfig.all[e]||t.newConfig.all[e],s=r(u),d=t.currentConfig.all[i]||t.newConfig.all[i],c="tab"===i?u:t.currentConfig.all[i],l="tab"===i?u:t.newConfig.all[i],I="tab"===i?"tab":"node",L=/wires\[\d+\]/.test(M);let N="";L&&(a.value1&&!a.value2?N=`had wire removed from ${r(c)}`:!a.value1&&a.value2&&(N=`was wired up to ${r(l)}`));const j=o&&("z"===M||/wires\[\d+\]/.test(M))?t.currentConfig.all[o]:null,D=A&&("z"===M||/wires\[\d+\]/.test(M))?t.newConfig.all[A]:null;return a.toString=function(){const t=[];switch(n){case"deleted":t.push("deleted",I,r(d));break;case"added":t.push("added",I,r(d));break;case"moved":t.push(r(d),"moved from ",r(j),"to",r(D));break;case"changed":"g"===M?o&&!A?t.push(s,r(d),"was removed from group",g(r(o))):!o&&A?t.push(s,r(d),"was added to group",g(r(A))):t.push(s,r(d),"moved group from",g(o),"to",g(A)):L?t.push(s,r(d),N):"tab"===i?t.push("tab",s,"property",g(a.prop),"was",g(a.value1||"")+", now",g(a.value2||"")):t.push(r(d),"property",g(a.prop),"was",g(a.value1||""),"now",g(a.value2||""));break;case"positionChanged":t.push(r(d),"moved from",a.value1,"to",a.value2);break;default:t.push(s,r(d),g(a.prop),"was",g(a.value1||""),"now",g(a.value2||""))}return t.join(" ")},a}function a(t,e){const i=t.currentConfig.all,M=t.newConfig.all,o=[];if(!e.v1||!e.v2)return e.v1&&o.push(A(e.id,e.id,"tab","deleted",e.v1,null)),e.v2&&o.push(A(e.id,e.id,"tab","added",null,e.v2)),o;const a=e.v1?.tab?{...e.v1.tab.n}:{};a.order=e.v1?.order;const r=e.v2?.tab?{...e.v2.tab.n}:{};r.order=e.v2?.order;const u=e.v1?.tab?.nodes||[],s=e.v2?.tab?.nodes||[];o.push(...g(e.id,"tab","","changed",a,r));const d=u.map(t=>t.id),c=s.map(t=>t.id),l=new Set([...d,...c].filter(t=>n.has(t))),I=t=>"number"!=typeof t?null:t,L=(t,e)=>{const i={...e};for(const e of t)delete i[e];return i};for(const n of l){const A=i[n],a=M[n],r=!(!A||!a);if(t.deleted[n])o.push(...g(e.id,n,"","deleted",A,a));else if(t.added[n])o.push(...g(e.id,n,"","added",A,a));else if(r){let i=!0;if(t.moved[n]&&o.push(...g(e.id,n,"","moved",{z:A.z},{z:a.z})),t.positionChanged[n]){i=!1;const t={x:I(A.x),y:I(A.y)},M={x:I(a.x),y:I(a.y)},r=JSON.stringify(t),u=JSON.stringify(M);o.push(...g(e.id,n,"position","positionChanged",r,u))}if(i){const t=L(["x","y","z","w","h"],A),i=L(["x","y","z","w","h"],a);o.push(...g(e.id,n,"","changed",t,i))}}}return o}function g(t,e,i,n,M,o){const a=[];if("deleted"===n)a.push(A(t,e,n,i,M?"":"deleted",o?"":"deleted"));else if("added"===n)a.push(A(t,e,n,i,M?"added":"",o?"added":""));else if(typeof M!=typeof o)a.push(A(t,e,"changed",i,M||"",o||""));else if(Array.isArray(M))for(let A=0;A{const e=`${"z"===t.prop&&"moved"===t.diffType?"*":t.tab}-${t.item}-${t.diffType}-${t.prop}-${t.value1}-${t.value2}`;return!r.has(e)&&(r.add(e),!0)})}()),{get changes(){return e},get diff(){return t},get tabs(){return i},getNodeInfo:t=>({propertiesChanged:e.filter(e=>e.itemId===t&&e.tab!==t),v1:M.all[t],v2:o.all[t]}),getTabInfo:t=>({propertiesChanged:e.filter(e=>e.tab===t&&"tab"===e.itemId),nodesChanged:e.filter(e=>e.tab===t&&"tab"!==e.itemId),v1:i[t],v2:i[t]})}}function U(t){t&&t.length&&"string"!=typeof t&&"string"==typeof t[0]&&(t=[...t].join(" "));return`\n :root {\n --red-ui-view-grid-color: #eee;\n --red-ui-view-border: 1px solid #bbbbbb;\n --red-ui-node-border: #999;\n --red-ui-node-port-background: #d9d9d9;\n --red-ui-workspace-button-color: #333;\n --red-ui-workspace-button-background: #f3f3f3;\n\n --red-ui-primary-font: Helvetica Neue, Arial, Helvetica, sans-serif;\n --red-ui-primary-font-size: 14px;\n --red-ui-monospace-font: Menlo, Consolas, DejaVu Sans Mono, Courier, monospace;\n --red-ui-primary-background: #f3f3f3;\n\n --red-ui-form-background: #fff;\n --red-ui-form-placeholder-color: #aaa;\n --red-ui-form-text-color: #555;\n --red-ui-form-text-color-disabled: #bbb;\n --red-ui-form-input-focus-color: rgba(85, 150, 230, 0.8);\n --red-ui-form-input-border-color: #ccc;\n --red-ui-form-input-border-selected-color: #aaa;\n --red-ui-form-input-border-error-color: rgb(214, 97, 95);\n --red-ui-form-input-background: #fff;\n --red-ui-form-input-background-disabled: #f9f9f9;\n --red-ui-form-button-background: #efefef;\n\n --red-ui-diff-state-color: #555;\n --red-ui-diff-state-prefix-color: #888;\n --red-ui-diff-state-added: #009900;\n --red-ui-diff-state-deleted: #f80000;\n --red-ui-diff-state-changed: #f89406;\n --red-ui-diff-state-moved: #3f81b3;\n }\n ${t=(t=t||".flow-renderer").split(" ").map(t=>`.${t}`).join(" ").trim()} .diff-table {\n width: 100%;\n font-size: var(--red-ui-primary-font-size);\n font-family: var(--red-ui-primary-font);\n }\n ${t} .diff-table thead tr {\n font-weight: bold;\n padding: 2px 4px;\n /* bottom border only */\n border-bottom: 3px solid #ddd;\n }\n ${t} .diff-table td {\n padding: 2px 4px;\n border-bottom: 1px solid #ddd;\n }\n ${t} .diff-table .diff-info {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n ${t} .diff-value button {\n height: 20px;\n width: 20px;\n padding: 1px;\n }\n ${t} .diff-value span {\n margin-left: 4px;\n margin-top: 2px;\n }\n ${t} .diff-type {\n height: 14px;\n width: 14px;\n margin: 2px;\n }\n ${t} .diff-type-text {\n flex-grow: 1;\n }\n ${t} .diff-type-moved {\n background-color: var(--red-ui-diff-state-moved);\n }\n ${t} .diff-type-added {\n background-color: var(--red-ui-diff-state-added);\n }\n ${t} .diff-type-deleted {\n background-color: var(--red-ui-diff-state-deleted);\n }\n ${t} .diff-type-changed {\n background-color: var(--red-ui-diff-state-changed);\n }\n ${t} .diff-type-positionChanged {\n background-color: var(--red-ui-diff-state-changed);\n }\n\n .red-ui-editor {\n font-size: var(--red-ui-primary-font-size);\n font-family: var(--red-ui-primary-font);\n padding: 0;\n margin: 0;\n background: var(--red-ui-primary-background);\n color: var(--red-ui-primary-text-color);\n line-height: 20px\n }\n ${t} {\n position: relative;\n }\n /* Source view */\n ${t} pre.red-ui-workspace-source {\n height: 100%;\n overflow: auto;\n width: 100%;\n font-family: var(--red-ui-monospace-font);\n background-color: #f7f7f7;\n }\n /* Chart view */\n ${t} .red-ui-workspace-chart {\n box-sizing: border-box;\n border: var(--red-ui-view-border);\n border-radius: 0 4px 4px 4px;\n overflow: scroll;\n height: 100%;\n width: 100%;\n }\n ${t} div.red-ui-footer {\n height: 20px\n }\n ${t}.has-tabs div.red-ui-workspace-chart {\n height: calc(100% - 34px);\n }\n ${t} svg {\n position: relative;\n width: 100%;\n height: 100%;\n min-height: 250px;\n margin: auto;\n display: block;\n border-radius: 2px;\n }\n ${t} svg {\n cursor: default;\n }\n ${t} svg .group-text-label {\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 14px;\n }\n ${t} svg .node-text-label {\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 14px;\n dominant-baseline: middle;\n }\n ${t} svg .subflow-node-text-label {\n color: rgb(85, 85, 85);\n dominant-baseline: middle;\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 10px;\n line-height: 20px;\n pointer-events: none;\n text-anchor: middle;\n user-select: none\n }\n ${t} svg .subflow-node-text-label-number {\n color: rgb(85, 85, 85);\n dominant-baseline: middle;\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 16px;\n line-height: 20px;\n pointer-events: none;\n text-anchor: middle;\n user-select: none\n }\n\n ${t} svg .node {\n fill-opacity: 1;\n stroke-width: 1px;\n }\n ${t} svg .link {\n stroke: #999;\n stroke-width: 3;\n fill: none;\n }\n ${t} svg .link-highlight, .node-highlight {\n stroke: rgb(255, 127, 14);\n }\n ${t} svg .node-highlight {\n stroke-width: 3px;\n }\n ${t} .tab-glow {\n border-radius: 2px;\n animation: tab-glow-animation 1s infinite;\n }\n @keyframes tab-glow-animation {\n 0% {\n box-shadow: 0 0 0px 0px #7d26cddd;\n }\n 50% {\n box-shadow: 0 0 10px 5px #7d26cddd;\n }\n 100% {\n box-shadow: 0 0 0px 0px #7d26cddd;\n }\n }\n\n ${t} svg .node-disabled {\n stroke-dasharray: 8,3;\n fill-opacity: 0.5;\n }\n ${t} svg .group-highlight {\n stroke: rgb(255, 127, 14);\n stroke-width: 4px;\n fill: rgb(255, 127, 14);\n fill-opacity: 0.2;\n }\n ${t} svg .link-disabled {\n stroke-dasharray: 10,8 !important;\n stroke-width: 2 !important;\n stroke: rgb(204, 204, 204);\n }\n ${t} svg .grid-line {\n shape-rendering: geometricprecision;\n stroke: rgb(238, 238, 238);\n stroke-width: 1px;\n fill: none;\n }\n ${t} svg .red-ui-flow-port {\n stroke-width: 1px;\n stroke-miterlimit: 4;\n fill: var(--red-ui-node-port-background);\n }\n ${t} svg .red-ui-flow-port-input {\n stroke-width: 1px;\n stroke-miterlimit: 4;\n fill: var(--red-ui-node-port-background);\n }\n ${t} svg .flow-render-error {\n background-color: rgb(54, 52, 52); \n color: rgb(196, 59, 59); \n width: 100%;\n }\n ${t} svg text {\n user-select: none;\n }\n ${t} .red-ui-tabs {\n display: flex;\n }\n ${t} .red-ui-tab {\n padding: 6px 12px;\n box-sizing: border-box;\n display: block;\n border: 1px solid #bbbbbb;\n border-right: none;\n background-color: #f0f0f0;\n max-width: 200px;\n max-height: 34px; /* for calculating svg height */\n height: 34px; /* for calculating svg height */\n width: 14%;\n overflow: hidden;\n white-space: nowrap;\n position: relative;\n margin-top: -1px;\n transition: 0.2s background-color;\n user-select: none;\n position: relative;\n z-index: 1;\n top: 1px;\n }\n ${t} .red-ui-tab div.red-ui-tab-label {\n position: absolute;\n top: 7px;\n left: 10px;\n }\n ${t} .red-ui-tab-subflow-icon {\n mask-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMjUgMjUuOTRoN2MuNTggMCAxLS40MiAxLTF2LTJjMC0uNTgtLjQyLTEtMS0xaC03Yy0uNTggMC0xIC40Mi0xIDF2MmMwIC41OC40MiAxIDEgMXptLTE3IDEyaDdjLjU4IDAgMS0uNDIgMS0xdi0yYzAtLjU4LS40Mi0xLTEtMUg4Yy0uNTggMC0xIC40Mi0xIDF2MmMwIC41OC40MiAxIDEgMXptLS40MTYgMTFDNS42MjQgNDguOTQgNCA0Ny4zMTUgNCA0NS4zNTZWMTQuNTIyYzAtMS45NiAxLjYyNS0zLjU4MiAzLjU4NC0zLjU4MmgyNC44MzJjMS45NiAwIDMuNTg0IDEuNjIzIDMuNTg0IDMuNTgydjMwLjgzNGMwIDEuOTYtMS42MjUgMy41ODQtMy41ODQgMy41ODR6TTMyIDM2Ljk0SDE5YzAgMi4xOS0xLjgxIDQtNCA0SDd2NC40MTZjMCAuMzUuMjM1LjU4NC41ODQuNTg0aDI0LjgzMmMuMzUgMCAuNTg0LS4yMzUuNTg0LS41ODR2LTguNDE3em0xLTJ2LTZoLThjLTIuMTkgMC00LTEuODEtNC00aC0xYy00LjMzMy0uMDAyLTguNjY3LjAwNC0xMyAwdjZoOGMyLjE5IDAgNCAxLjgxIDQgNGgxM3ptMC0xNnYtNC40MThjMC0uMzUtLjIzNS0uNTgyLS41ODQtLjU4Mkg3LjU4NGMtLjM1IDAtLjU4NC4yMzMtLjU4NC41ODJ2OC40MTdjNC4zMzMuMDAyIDguNjY3LjAwMSAxMyAuMDAxaDFjMC0yLjE5IDEuODEtNCA0LTRoOHoiIGNvbG9yPSIjMDAwIiBmaWxsPSIjZmZmIi8+PC9zdmc+Cg==);\n display: inline-block;\n background-color: grey;\n margin-left: -8px;\n margin-right: 3px;\n margin-top: -1px;\n margin-bottom: 1px;\n opacity: 1;\n width: 16px;\n height: 18px;\n vertical-align: middle;\n mask-size: contain;\n mask-position: center;\n mask-repeat: no-repeat;\n }\n ${t} .red-ui-tab-disabled-icon {\n mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25' viewBox='0 0 1536 1792' style='&%2310;'%3E%3Cscript xmlns=''/%3E%3Cpath d='M1312 893q0-161-87-295l-754 753q137 89 297 89 111 0 211.5-43.5t173.5-116.5 116-174.5 43-212.5zM313 1192l755-754q-135-91-300-91-148 0-273 73t-198 199-73 274q0 162 89 299zM1536 893q0 157-61 300t-163.5 246-245 164-298.5 61-298.5-61-245-164-163.5-246-61-300 61-299.5 163.5-245.5 245-164 298.5-61 298.5 61 245 164 163.5 245.5 61 299.5z' fill='currentColor'/%3E%3Cscript xmlns=''/%3E%3C/svg%3E");\n display: inline-block;\n background-color: grey;\n margin-left: -8px;\n margin-right: 3px;\n margin-top: 0px;\n margin-bottom: 0px;\n opacity: 1;\n width: 16px;\n height: 16px;\n vertical-align: middle;\n mask-size: contain;\n mask-position: center;\n mask-repeat: no-repeat;\n transform: translateY(-2px);\n }\n ${t} .red-ui-tab span {\n font-size: 0.875rem;\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n }\n ${t} .red-ui-tab.active {\n background-color: white;\n border-bottom-color: white;\n font-weight: bold;\n }\n ${t} .red-ui-tab.disabled {\n border-top-style: dashed;\n border-left-style: dashed;\n font-style: italic;\n }\n ${t} .red-ui-tab:first-child {\n border-radius: 4px 0 0 0;\n }\n ${t} .red-ui-tab:last-child {\n border-right: 1px solid #bbbbbb;\n border-radius: 0 4px 0 0;\n }\n ${t} .red-ui-tab:first-child:last-child {\n border-radius: 4px 4px 0 0;\n }\n ${t} .red-ui-tab:last-child.disabled {\n border-right-style: dashed;\n }\n ${t} .red-ui-tab:hover {\n cursor: pointer;\n background-color: white;\n }\n /* positioning of toolbar */\n ${t} .toolbar {\n display: flex;\n flex-direction: row;\n position: absolute;\n bottom: 5px;\n right: 5px;\n opacity: 0.6;\n }\n ${t} .toolbar:hover {\n opacity: 1;\n }\n ${t}.has-scrollbars .toolbar {\n bottom: 24px;\n right: 24px;\n }\n\n ${t} .hidden {\n display: none !important;\n }\n ${t} .toolbar .button-group.hidden {\n display: none !important;\n }\n ${t} .toolbar .icon-button-bg.view-source {\n background-image: url("${I}");\n }\n ${t} .toolbar .icon-button-bg.download-flow {\n background-image: url("${l}");\n }\n ${t} .toolbar .icon-button-bg.copy-flow {\n background-image: url("${c}");\n }\n ${t} .toolbar .icon-button-bg.zoom-reset {\n background-image: url("${d}");\n }\n ${t} .toolbar .icon-button-bg {\n background-repeat: no-repeat;\n background-position: center;\n background-size: 16px 16px; /* Size of the background SVG */\n background-color: transparent;\n padding: 4px;\n cursor: pointer;\n width: 24px;\n height: 24px;\n font-size: 0; /* Hide any default button text if present */\n line-height: 0; /* Hide any default button text if present */\n }\n\n ${t} .toolbar .icon-button-bg:hover {\n background-color: #f0f0f0;\n }\n\n /* styles for button groups and buttons */\n ${t} .button-group {\n display: flex;\n flex-direction: row;\n }\n ${t} .button-group button {\n user-select: none;\n box-sizing: border-box;\n display: inline-block;\n text-align: center;\n cursor: pointer;\n line-height: 22px;\n height: 24px;\n color: var(--red-ui-workspace-button-color) !important;\n background: var(--red-ui-workspace-button-background);\n text-decoration: none;\n border: 1px solid var(--red-ui-form-input-border-color);\n margin: 0px;\n padding: 0px;\n }\n ${t} .button-group button:not(:first-child) {\n border-top-left-radius: 0px;\n border-bottom-left-radius: 0px;\n border-left: none;\n }\n\n /* zoom controls */\n ${t} .zoom-controls.button-group button {\n font-size: 22px;\n width: 24px;\n }\n\n /* copy controls */\n ${t} .copy-controls.button-group {\n margin-right: 8px;\n }\n ${t} .copy-controls.button-group button {\n padding: 0px 4px;\n }\n\n /* source controls */\n ${t} .source-controls.button-group {\n margin-right: 8px;\n }\n ${t} .source-controls.button-group button {\n padding: 0px 4px;\n }\n\n /* compare controls */\n ${t} .compare-controls.button-group {\n margin-right: 24px;\n }\n ${t} .compare-controls input[type='range'].flow-compare-slider {\n width: 100%;\n -webkit-appearance: none;\n }\n ${t} input[type='range'].flow-compare-slider::-webkit-slider-runnable-track {\n height: 16px;\n background: var(--red-ui-workspace-button-background);\n border-radius: 16px;\n }\n /* Track: Mozilla Firefox */\n ${t} input[type='range'].flow-compare-slider::-moz-range-track {\n height: 16px;\n background: var(--red-ui-workspace-button-background);\n border-radius: 16px;\n }\n `}function G(t,e){const i="flow-renderer-css"+(e?"--"+e.toString():"").replace(/[^a-z0-9]/gi,"-").toLowerCase();let n=t.getElementById(i);n||(n=t.createElement("style"),n.id=i,n.innerHTML=U(e),t.head.appendChild(n))}function H(t,e){if(t){const i=t.querySelector(`.flow-layer-${e||0}`);["flow_group_elements","flow_group_select","flow_wires","flow_nodes"].forEach(t=>{const e=i.querySelector(`.${t}`)||k("g",{class:t},i);for(;e.firstChild;)e.removeChild(e.firstChild)})}}function W(t){const e=[],i={},n={},M=[],o={};return t.forEach(function(t){o[t.id]=t,"tab"===t.type?(e.push(t.id),i[t.id]={n:t,nodes:[]}):"subflow"===t.type&&(n[t.id]={n:t,nodes:[]})}),t.forEach(function(t){"tab"!==t.type&&"subflow"!==t.type&&(i[t.z]?i[t.z].nodes.push(t):n[t.z]?n[t.z].nodes.push(t):M.push(t))}),{all:o,tabOrder:e,tabs:i,subflows:n,globals:M}}function P(t,i,n,M,o,A=!1){const a=M-i,g=n-t,r=Math.sqrt(a*a+g*g);let u=.75;if(g*o>0?r0){const A=[[t+o*(e*u),i+0],[n-o*u*e,M-0]];return`M ${t} ${i} C ${A[0][0]} ${A[0][1]} ${A[1][0]} ${A[1][1]} ${n} ${M}`}{let r,s,d,c,l;const I=Math.floor(n-g/2),L=Math.floor(M-a/2);if(Math.abs(a)<10){c=Math.max(i,M)+(A?35:25);const e=c-i;return l=[[t+15*o,i],[t+25*o,i+5],[t+25*o,i+e/2],[t+25*o,i+e-5],[t+15*o,i+e],[t,i+e],[n-15*o,i+e],[n-25*o,i+e-5],[n-25*o,M+(c-M)/2],[n-25*o,M+5],[n-15*o,M],[n,M]],"M "+t+" "+i+" C "+l[0][0]+" "+l[0][1]+" "+l[1][0]+" "+l[1][1]+" "+l[2][0]+" "+l[2][1]+" C "+l[3][0]+" "+l[3][1]+" "+l[4][0]+" "+l[4][1]+" "+l[5][0]+" "+l[5][1]+" h "+g+" C "+l[6][0]+" "+l[6][1]+" "+l[7][0]+" "+l[7][1]+" "+l[8][0]+" "+l[8][1]+" C "+l[9][0]+" "+l[9][1]+" "+l[10][0]+" "+l[10][1]+" "+l[11][0]+" "+l[11][1]+" "}{const A=15,g=(M+L)/2;r=t+o*e*u,s=a>0?Math.min(g-a/2,i+A):Math.max(g-a/2,i-A),d=n-o*e*u,c=a>0?Math.max(g,M-A):Math.min(g,M+A);const N=(t+r)/2,j=a>0?1:-1;return l=[[N,i],[r,a>0?Math.max(i,s-A):Math.min(i,s+A)],[N,a>0?Math.min(L,s+A):Math.max(L,s-A)],[d,a>0?Math.max(L,c-A):Math.min(L,c+A)],[(n+d)/2,M]],l[2][1]===s+j*A&&(Math.abs(a)<10*A&&(l[1][1]=s-j*A/2,l[3][1]=c-j*A/2),l[2][0]=r),"M "+t+" "+i+" C "+l[0][0]+" "+l[0][1]+" "+l[1][0]+" "+l[1][1]+" "+r+" "+s+" S "+l[2][0]+" "+l[2][1]+" "+I+" "+L+" S "+l[3][0]+" "+l[3][1]+" "+d+" "+c+" S "+l[4][0]+" "+l[4][1]+" "+n+" "+M}}}function J(t,e){const i=function(t){let e=[];const i=t.split(/\\n /);if(i.length>1){let t=0;for(t=0;t{switch(t){case"str":return"string";case"num":return"number";case"bool":return"boolean";case"json":return"json";case"date":return"timestamp";case"bin":return"binary";case"env":return"environment";case"flow":return"flow";case"global":return"global";default:return t}},q=["inject","change","switch","function","template","delay","trigger","link in","link out","link call","watch","complete","catch","status","comment","debug","subflow","range","filter","rbe","mqtt in","mqtt out","http in","http response","http request","websocket in","websocket out","tcp in","tcp out","udp in","udp out","tcp request","split","join","sort","batch","csv","json","xml","yaml","html","file in","file","exec"],K=(t,e,i)=>{const n=t.name||e.name;if(n)return n;const M=t.label||t.info||t.text||"";let o="",A="",a="",g="";switch(t.type){case"file":a="write file";case"file in":return a=a||"read file",A=t.filename,"str"!==t.filenameType&&"env"!==t.filenameType&&(A=""),"env"===t.filenameType&&(A="env."+A),"write file"===a&&"delete"===t.overwriteFile?t.name||"delete "+A:t.name||A||a;case"html":o=t.tag;break;case"tcp in":case"tcp out":case"tcp request":a="tcp:";case"udp in":case"udp out":return a=a||"udp:",A=t.host||t.addr||t.server||"",a+(A?A+":":"")+(t.port||"");case"debug":return!0!==t.console&&"true"!==t.console||(g="\t⇲"),"jsonata"===t.targetType?(t.name||"JSONata")+g:!0===t.complete||"true"===t.complete?(t.name||"msg")+g:(t.name||"msg."+(t.complete&&"false"!==t.complete?this.complete:"payload"))+g}return t.type&&t.type.startsWith("ui-")?o=t.type.replace(/^ui-/,""):t.type&&t.type.startsWith("ui_")&&(o=t.type.replace(/^ui_/,"")),o&&o.length<=32?o:M||(t.topic&&t.topic.length<=32&&q.includes(t.type)?t.topic:t.type)},_=(t,e,i)=>(t.name||t.label||t.info||t.text||"").replace(/(.{40,60})([ \n\t])/g,"$1\\n$2")+(t.sumPass?" ⭄":"")+(t.sumPassPrio&&0!=parseInt(t.sumPassPrio)?" ("+t.sumPassPrio+")":""),$={base64:void 0,batch:void 0,catch:(t,e,i)=>{let n="";return t.uncaught&&(n=": uncaught"),t.scope&&(n=": "+t.scope.length),t.scope||t.uncaught||(n=": all"),t.name||t.type+n},change:t=>{function e(t,e){return t+"."+o.utils.parseContextKey(e).key}return t.name?t.name:(t._=t._||function(t,e){let i=t;switch(t){case"change.label.set":i="set {{property}}";break;case"change.label.change":i="change {{property}}";break;case"change.label.move":i="move {{property}}";break;case"change.label.delete":i="delete {{property}}";break;case"change.label.changeCount":i="change {{count}} properties"}for(const n in e)t=i.replace(new RegExp("\\{\\{"+n+"\\}\\}","g"),e[n]);return t},t.rules?1===t.rules.length?"set"===t.rules[0].t?t._("change.label.set",{property:e(t.rules[0].pt||"msg",t.rules[0].p)}):"change"===t.rules[0].t?t._("change.label.change",{property:e(t.rules[0].pt||"msg",t.rules[0].p)}):"move"===t.rules[0].t?t._("change.label.move",{property:e(t.rules[0].pt||"msg",t.rules[0].p)}):t._("change.label.delete",{property:e(t.rules[0].pt||"msg",t.rules[0].p)}):t._("change.label.changeCount",{count:t.rules.length}):"replace"===t.action?t._("change.label.set",{property:"msg."+t.property}):"change"===t.action?t._("change.label.change",{property:"msg."+t.property}):"move"===t.action?t._("change.label.move",{property:"msg."+t.property}):t._("change.label.delete",{property:"msg."+t.property}))},comment:void 0,csv:void 0,debug:void 0,exec:void 0,file:void 0,"file in":void 0,function:void 0,html:void 0,"http response":(t,e,i)=>t.name||"http"+(t.statusCode?" ("+t.statusCode+")":""),"http in":(t,e,i)=>t.name||"["+t.method+"] "+t.url,"http request":void 0,inject:t=>{let e="";if(t.once&&(e=" ¹"),(t.repeat&&0!=t.repeat||t.crontab)&&(e="\t↻"),t.name)return t.name+e;let i="",n="str",M="";const A=t.props;if(A)for(let e=0;e0&&i.length<24?i+e:"inject"+e;if("date"===n||"bin"===n||"env"===n)return""!==M&&M.length<=16?M+":"+X(n)+e:X(n)+e;if("flow"===n||"global"===n){return n+"."+o.utils.parseContextKey(i).key+e}return"inject"+e},join:void 0,json:void 0,junction:void 0,"link in":void 0,"link out":void 0,"link call":(t,e,i)=>{if(!t.links||0===t.links.length)return t.name||t.type;let n;return i.forEach(function(M){n||M.id===t.links[0]&&(n=($[M.type]||K)(M,e,i))}),t.name||n||t.type},markdown:void 0,postgresql:void 0,range:void 0,sort:void 0,split:void 0,switch:void 0,yaml:void 0,xml:void 0,BlogPages:void 0,BlogDetails:void 0,BlogPageInfo:(t,e,i)=>{if(t.name)return t.name;let n;return i.forEach(function(e){n||"link in"===e.type&&e.name.startsWith("[blog] ")&&(e.wires[0]||[]).indexOf(t.id)>-1&&(n=e.name.substring(7))}),n||t.type},PubMedium:void 0,Topic:_,Observation:_,Question:_,Thought:_,Idea:_,Analogy:_,Aphorism:_,Poesie:_,Humour:_,Treasure:_,Consequence:_,Advantage:_,Disadvantage:_,Text:_,"Blog-Post":_,Comment:_,Codebase:_,Sketch:_,Inspiration:_,Quote:_,Definition:_,Book:_,Author:_,"nnb-input-node":void 0,"nnb-layer-node":(t,e,i)=>t.name||t.actfunct+": "+t.bias+", "+t.threshold,"nnb-output-node":void 0,"nnb-backprop":void 0,"nnb-trainer":void 0,Seeker:void 0,Sink:void 0,Screenshot:void 0,Orphans:void 0,IsMobile:void 0,Navigator:void 0,DrawSVG:void 0,GetFlows:void 0,_default:K};function tt(t){const e={};let i=1e4,n=0;for(const M of t)"subflow"===M.type?e[M.id]={id:M.id,label:M.name,type:"subflow",disabled:M.disabled,order:i++}:"tab"!==M.type&&M.z&&(e[M.z]||(e[M.z]={id:M.z,label:"Flow "+(n+1),type:"tab",disabled:!1,order:n++}));const M=t.filter(t=>"tab"===t.type);let o=0;for(const t of M)e[t.id]&&(e[t.id].label=t.label||e[t.id].label,e[t.id].disabled=!!t.disabled,e[t.id].order=o++);const A=Object.keys(e).map(t=>e[t]);return A.sort((t,e)=>t.order-e.order),A}function et(t){Array.isArray(t)||(t=[]);const e=[...t];for(let t=0;t0?i.add(...n):e?.classList?.length&&i.add(...e.classList),0===i.size&&i.add("flow-renderer"),[...i]}(t)),t.container){const i={};["scope","gridLines","arrows","zoom","images","linkLines","labels","autoZoom","autoScroll","flowId"].forEach(function(e){if("string"==typeof t.container.dataset[e]){const n=t.container.dataset[e]||"true";i[e.replace(/-/g,"")]="true"===n}}),e.push(i)}e.push(t)}return Object.assign({},...e)}function nt(e,i){e=et(e);const n=w((i=it(i)).document,t.document,i.container,this),M=i.container;for(;M.firstChild;)M.removeChild(M.firstChild);const o=n.createElement("div");o.classList.add("red-ui-tabs"),M.appendChild(o);const A=E(M);!function(t,e,i=!0){const n=w(t,this),M=n.createElement("pre");M.classList.add("red-ui-workspace-source"),i&&M.classList.add("hidden"),M.setAttribute("data-code-wrap","json");const o=n.createElement("code");o.classList.add("lang-json","hljs","language-json"),o.textContent="object"==typeof e?JSON.stringify(e,null,2):"string"==typeof e?e:"// No content available",M.appendChild(o),t&&t.appendChild(M)}(M,e);const a=function(t){const e=w(t,this);if(!e)return null;let i=t.querySelector(".toolbar");i||(i=v(t));let n=i.querySelector(".source-controls");if(n)return{viewSource:i.querySelector(".view-source")};n=e.createElement("div"),n.classList.add("source-controls"),n.classList.add("button-group");const M=e.createElement("button");return M.classList.add("red-ui-footer-button","icon-button-bg","view-source"),M.title="Toggle Flows / Source",n.appendChild(M),i.appendChild(n),{viewSource:M}}(M);a.viewSource.onclick=function(t){!function(t){t.preventDefault(),t.stopPropagation();const e=t.target.parentElement.parentElement.parentElement.querySelector(".red-ui-workspace-chart");if(!e)return void console.warn("No container found for source view toggle");const i=e.parentElement,n=i.querySelector(".red-ui-tabs"),M=i.querySelector(".red-ui-workspace-source"),o=i.querySelector(".zoom-controls");M&&M.classList.contains("hidden")?(M.classList.remove("hidden"),e.classList.add("hidden"),n.classList.add("hidden"),o?.classList.add("hidden")):(M.classList.add("hidden"),e.classList.remove("hidden"),n.classList.remove("hidden"),o?.classList.remove("hidden"))}(t)};const g=function(t){const e=w(t,this);if(!e)return null;let i=t.querySelector(".toolbar");i||(i=v(t));let n=i.querySelector(".copy-controls");if(n)return{copy:i.querySelector(".copy-flow"),download:i.querySelector(".download-flow")};n=e.createElement("div"),n.classList.add("copy-controls"),n.classList.add("button-group");const M=e.createElement("button");M.classList.add("red-ui-footer-button","icon-button-bg","copy-flow"),M.title="Copy Flow to Clipboard";const o=e.createElement("button");return o.classList.add("red-ui-footer-button","icon-button-bg","download-flow"),o.title="Download Flows",n.appendChild(M),n.appendChild(o),i&&i.appendChild(n),{copy:M,download:o}}(M);g.copy.onclick=function(t){!function(t,e,i){i=i||function(){};let n=e||[];"object"==typeof n?n=JSON.stringify(n,null,0):"string"!=typeof n&&(n=n.toString());const M=w(t&&t.target&&t.target.ownerDocument,this);if("undefined"!=typeof navigator&&navigator.clipboard)return void navigator.clipboard.writeText(n).then(function(){i(null,!0)}).catch(function(t){i(t,!1)});const o=M.createElement("textarea");o.value=n,o.style.position="fixed",o.style.top="0",o.style.left="0";try{M.body.appendChild(o),o.focus(),o.select();const t=M.execCommand("copy");i(null,t),console.info("failed to copy",t)}catch(t){console.error("failed to copy",t)}finally{M.body.removeChild(o)}}(t,e)},g.download.onclick=function(t){!function(t,e,i,n,M){M=M||function(){};let o=e||[];"object"==typeof o?o=JSON.stringify(o,null,2):"string"!=typeof o&&(o=o.toString());const A=w(t&&t.target&&t.target.ownerDocument,this),a=new Blob([o],{type:i}),g=URL.createObjectURL(a),r=A.createElement("a");r.style.display="none",r.href=g,r.download=n,r.style.position="fixed",r.style.top="0",r.style.left="0";try{A.body.appendChild(r),r.focus(),r.click(t),URL.revokeObjectURL(g),M(null,!0)}catch(t){M(t,!1),console.error("failed to download",t)}finally{A.body.removeChild(r)}}(t,e,"application/json","flows.json")};const r=O(A);H(r),f(r),M.classList.add(i.scope);const u=function(t){o.querySelectorAll(".red-ui-tab").forEach(t=>t.classList.remove("active"));return o.querySelector(`[data-flow-id="${t}"]`).classList.add("active"),i.flowId=t,Mt(e,i)};G(n,i.scope);const s=M.querySelectorAll(".red-ui-tab");s&&s.forEach(t=>t.remove());const d=tt(e);if(d.forEach((e,n)=>{!function(e,i,n,M,o){const A=`red-ui-tab-${n}`,a=M.container,g=M.svg||a.querySelector("svg"),r=w(M.document,t.document,a,this),u=i.label;let s=a.querySelector(`.${A}`);if(s||(s=r.createElement("div"),e.appendChild(s),s.classList.add("red-ui-tab"),s.classList.add("red-ui-tab-"+i.type),s.setAttribute("data-flow-id",i.id)),i.disabled){s.classList.add("disabled");const t=r.createElement("i");t.classList.add("red-ui-tab-disabled-icon"),s.appendChild(t)}else if("subflow"===i.type){const t=r.createElement("i");t.classList.add("red-ui-tab-subflow-icon"),s.appendChild(t)}s.title=u;const d=r.createElement("span");d.textContent=u,s.appendChild(d),s.onclick=function(t){z(g,M,M.flowId),o(i.id),h(g,M,i.id)}}(o,e,n,i,u)}),d.length?M.classList.add("has-tabs"):M.classList.remove("has-tabs"),!i.flowId){const t=d.find(t=>"tab"===t.type),e=d.find(t=>"subflow"===t.type);i.flowId=t?t.id:e?e.id:null}let c=null;return c=d.length?u(i.flowId):Mt(e,i),z(r,i,i.flowId),c=c||{},c.tabs=d,c.flowId=i.flowId,c.css=c.css||U(i.scope),c}function Mt(t,i){t=et(t);const n=(i=it(i)).container,A={},r={},d={},c={},l={},I=(i=i||{}).flowId,L=j("junction");let N=!1;const y=tt(t).find(t=>t.id===I);y&&"tab"===y.type&&(N=y.disabled);let w=n&&n.querySelector("svg");w=w||O(n),H(w,i.layer);const b=(i.svgLayer||w).querySelector(".flow_grid");i.gridLines&&b&&B(b),t.forEach(function(t){if("subflow"===t.type){r["subflow:"+t.id]=t;for(let e=0;e0&&t.wires.forEach(function(t){t.forEach(function(t){l[t]=!0})})});const x=(i.svgLayer||w).querySelector(".flow_nodes");t.forEach(function(n){if(n.z===I||n.id===I){const I=D(n),y=function(t){let e=!0;return"link out"!==t.type&&"link in"!==t.type||(e=!1),"junction"===t.type||"tab"===t.type||"subflow"===t.type||(!1===t.l?e=!1:!0===t.l&&(e=!0)),e}(n),w=!i.labels,b=j(n.type);switch(n.type){case"tab":case"ui_spacer":case"ui-spacer":break;case"group":d[n.id]=n;break;case"subflow":c[n.id]={...n};for(let t=0;t1?18:16)+")"});let t=0;c.lines.forEach(function(e){const i=k("text",{y:t,class:"node-text-label"});i.textContent=e,j.appendChild(i),t+=20})}const D=k("g",{"data-node-id":n.id,class:"node"});x.appendChild(D),y&&j&&D.appendChild(j);const C=y?j?.getBBox():{width:0,height:0},p=C.width,T=C.height+13.5,m=y?I.width>p?I.width:p:I.width,S=y?I.height>T?I.height:T:I.height,z={x:n.x,y:n.y,w:m,h:S,outputs:(n.wires||[]).length},h=!!l[n.id];try{y?(z.w=Math.max(e,20*Math.ceil((c.width+48+(h?7:0))/20)),z.h=Math.max(6+24*c.lines.length,15*(z.outputs||0),30)):(z.w=30,z.h=Math.max(30,15*(z.outputs||0)))}catch(t){}if(z.outputs>2&&y&&j&&z.h>T){const t=(z.h-T)/2;j.setAttributeNS(null,"transform","translate(38,"+((c.lines.length>1?16:14)+t)+")")}w&&j&&(j.style.display="none"),D.prepend(k("rect",{...b,rx:5,ry:5,fill:d.color||b.fill,width:z.w,height:z.h,class:"node node-"+n.id})),D.appendChild(k("path",{d:"M5 0 h25 v"+z.h+" h-25 a 5 5 0 0 1 -5 -5 v-"+(z.h-10)+" a 5 5 0 0 1 5 -5",fill:"rgb(0,0,0)","fill-opacity":.05,stroke:"none"})),y&&D.appendChild(k("path",{d:"M 29.5 0.5 l 0 "+(z.h-1),fill:"none",stroke:"rgb(0,0,0)","stroke-opacity":.1,"stroke-width":"1px"}));const f=o.view.tools.calculateGridSnapOffsets(z),E=n.x-z.w/2-f.x,v=n.y-z.h/2-f.y;if(D.setAttribute("transform",`translate(${E}, ${v})`),n.bbox=D.getBBox(),n.bbox.x=E,n.bbox.y=v,i.images){const t={x:0,y:Math.max(z.h/2-15,0),width:30,height:30},e=function(t){let e=u[t];return e||(t.startsWith("subflow:")?e=u.subflow:t.startsWith("ui-")?e=u["ui-template"]:t.startsWith("ui_")&&(e=u.ui_template)),e&&s[e]||""}(n.type);if(e)D.appendChild(k("image",{href:e,...t}));else if(n.type.startsWith("subflow:")){const e=d.icon&&s[d.icon]||s["subflow.svg"];D.appendChild(k("image",{href:e,...t}))}}(d.in&&d.in.length>0||l[n.id])&&(i.arrows?D.appendChild(k("path",{...L,transform:"translate(-3,"+(n.bbox.height/2-5)+")",d:i.arrows?"M 0,10 9,5 0,0 Z":"M -1,9.5 8,9.5 8,0.5 -1,0.5 Z",class:"red-ui-flow-port-input input-arrows","stroke-linecap":"round","stroke-linejoin":"round"})):D.appendChild(k("rect",{...L,transform:"translate(-5,"+(n.bbox.height/2-5)+")",...a,...g,class:"red-ui-flow-port-input"})));const O={...L,...a,...g,class:"red-ui-flow-port"};if(n.wires&&Array.isArray(n.wires)){const t=1===n.wires.length?n.bbox.height/2-5:n.wires.length%2==0?3.5:4.5;for(let e=0;e0;){h-=1;for(const t in d){if(m.indexOf(t)>-1)continue;const e=d[t];let i=0,n=0,M=!1;if(e.nodes.forEach(function(t){const o=(A[t]||{}).bbox;o?(i=Math.max(i,o.x-e.x+o.width),n=Math.max(n,o.y-e.y+o.height)):M=!0}),M)continue;const o=k("g",{"data-node-id":t});o.setAttribute("transform",`translate(${e.x}, ${e.y})`),o.appendChild(k("rect",{rx:5,ry:5,width:e.w,height:e.h,fill:"none","fill-opacity":0,"stroke-width":2,stroke:"grey",class:"group-"+e.id,...e.style})),T.prepend(o);const a=A[t];a.bbox=o.getBBox(),a.bbox.x=e.x,a.bbox.y=e.y;const g=k("g",{});if(o.appendChild(g),e.style.label&&e.name){const t=e.style["label-position"]||"nw",i=J(e.name,"group-text-label");let n=0,M=0,o="start";if(M="n"===t[0]?15:a.bbox.height-5-16*(i.lines.length-1),"w"===t[1]?(n=5,o="start"):"e"===t[1]?(n=a.bbox.width-5,o="end"):(n=a.bbox.width/2,o="middle"),g.setAttribute("transform",`translate(${n}, ${M})`),g.setAttribute("text-anchor",o),i){let t=0;i.lines.forEach(function(i){const n=k("text",{class:"group-text-label",x:0,y:t,fill:e.style.color||"grey"});n.textContent=i,g.appendChild(n),t+=16})}}m.push(t)}}const f=(i.svgLayer||w).querySelector(".flow_wires"),E=[],v=Object.keys(c);for(let t=0;t2&&e.splice(2);const n=new Map,M=Q(function(t,e){const i=W(t),n=W(e),M={},o={},A={},a={},g={};return Object.keys(i.all).forEach(function(t){if(!N(n.all,t))return void(o[t]=!0);const e=JSON.stringify(i.all[t]),M=JSON.stringify(n.all[t]);if(e!==M)if(A[t]=!0,i.all[t].z!==n.all[t].z)g[t]=!0;else if(i.all[t].x!==n.all[t].x||i.all[t].y!==n.all[t].y||i.all[t].w!==n.all[t].w||i.all[t].h!==n.all[t].h){const i=JSON.parse(e),n=JSON.parse(M);delete i.x,delete i.y,delete i.w,delete i.h,delete n.x,delete n.y,delete n.w,delete n.h,JSON.stringify(i)===JSON.stringify(n)&&(a[t]=!0)}}),Object.keys(n.all).forEach(function(t){N(i.all,t)||(M[t]=!0)}),{currentConfig:i,newConfig:n,added:M,deleted:o,changed:A,positionChanged:a,moved:g}}(e[0],e[1]));M.changes.forEach(t=>{t.highlight=e=>function(t=-1,e){clearTimeout(L),clearTimeout(j);r.querySelectorAll(".red-ui-tab").forEach(t=>t.classList.remove("tab-glow"));s.querySelectorAll("g[data-node-id]").forEach(t=>{t.style.filter=""});const i=r.querySelector(".red-ui-tab.active").getAttribute("data-flow-id");let n=e.tab;"moved"===e.diffType&&(-1===t?t=e.v1:0===t?n=e.value1:1===t&&(n=e.value2));"added"===e.diffType&&-1===t?t=1:("deleted"===e.diffType&&-1===t||-1===t)&&(t=0);const M=r.querySelector(`.red-ui-tab[data-flow-id="${n}"]`);("tab"===e.item&&"changed"===e.diffType||n!==i)&&M&&(M.click(),M.classList.add("tab-glow"),j=setTimeout(()=>{M.classList.remove("tab-glow")},1e4));if(parseInt(c.value)<10||parseInt(c.value)>90){const e=0===t?10:90;!async function(){let t=parseInt(c.value);const i=e>t?1:-1;for(;t!==e;){t+=i,c.value=t;const e=new Event("input",{bubbles:!0});c.dispatchEvent(e),await new Promise(t=>setTimeout(t,10))}}()}const o=[e.item,e.tab][0],A=s.querySelector(`g.flow-layer-0 g[data-node-id="${o}"]`),a=s.querySelector(`g.flow-layer-1 g[data-node-id="${o}"]`);if(!A&&!a)return;(A||a).scrollIntoView({behavior:"smooth",block:"center",inline:"center"}),A&&(A.style.filter="url(#node-glow)");a&&(a.style.filter="url(#node-glow)");L=setTimeout(()=>{try{A&&(A.style.filter=""),a&&(a.style.filter="")}catch(t){}},1e4)}(e,t)}),M.tabMap=n;const o=w((i=it(i)).document,t.document,i.container,this),A=i.container;G(o,i.scope);const a=i.zoom,g=i.gridLines;for(i.zoom=!1,i.gridLines=!1;A.firstChild;)A.removeChild(A.firstChild);const r=Y("div",null,"red-ui-tabs",null,A),u=E(A),s=O(u,{addDefaultLayer:!1}),d=[...s.childNodes].find(t=>"g"===t.tagName&&t.classList.contains("outerContainer")),c=function(t){if(!w(t,this))return null;let e=t.querySelector(".toolbar");e||(e=v(t));let i=e.querySelector(".compare-controls");if(i)return e.querySelector(".flow-compare-slider");i=Y("div",null,"button-group compare-controls",null,e);const n=Y("input",null,"flow-compare-slider",null,i);return n.type="range",n.min="0",n.max="100",n}(A);c.type="range",c.min=0,c.max=100,c.value=0,c.step=5,c.style.width="100%",c.classList.add("flow-compare-slider");const l=A,I=u;f(s);for(let t=0;t{const M=n[0],o=n[1],u={...i,flowId:M,container:null,layers:o};!function(e,i,n){const M=w(i.document,t.document,A,this),o=i.layers;for(const t of Object.values(o)){const A=t.tab,a=A.label,g=`red-ui-tab-${t.index}`,r=`red-ui-tab-${A.id}`;let u=e.querySelector(`.${r}`);u||(u=M.createElement("div"),e.appendChild(u),u.classList.add("red-ui-tab"),u.classList.add(g),u.classList.add(r),u.classList.add("red-ui-tab-"+o.type),u.setAttribute("data-flow-id",A.id));let d=u.querySelector(`.red-ui-tab-label-${t.index}`);if(d||(d=M.createElement("div"),d.classList.add(`red-ui-tab-label-${t.index}`)),d.classList.add("red-ui-tab-label"),d.setAttribute("data-layer",t.index),d.style.opacity=0,u.appendChild(d),A.disabled){d.classList.add("disabled");const t=M.createElement("i");t.classList.add("red-ui-tab-disabled-icon"),d.appendChild(t)}else if("subflow"===A.type){const t=M.createElement("i");t.classList.add("red-ui-tab-subflow-icon"),d.appendChild(t)}d.title=a;const c=M.createElement("span");c.textContent=a,d.appendChild(c),u.onclick=function(t){z(s,i,i.flowId),n(i),h(s,i,A.id)}}}(r,u,function(t){r.querySelectorAll(".red-ui-tab").forEach(t=>t.classList.remove("active"));r.querySelector(`[data-flow-id="${t.flowId}"]`).classList.add("active");const n=Object.values(t.layers),M={0:!0,1:!0};n.forEach(t=>{t.svgLayer.setAttribute("opacity",0);const i=t.renderOptions;Mt(e[i.index]||[],i),M[i.index]=!1});const o=M[0]||M[1],u={...i,flowId:t.flowId,container:o?.container||o?.flowRenderer||A};if(M[0]&&(u.layer=0,u.svgLayer=s.querySelector("g.flow-layer-0"),Mt(e[0]||[],u)),M[1]&&(u.layer=1,u.svgLayer=s.querySelector("g.flow-layer-1"),Mt(e[1]||[],u)),a&&p(s,A),g){let t=[...d.childNodes].find(t=>"g"===t.tagName&&t.classList.contains("flow_grid"));t||(t=k("g",{class:"flow_grid"}),d.insertBefore(t,s.firstChild)),t&&B(t)}D()})}),c.addEventListener("input",function(t){D()});let L=null,j=null;function D(){const t=parseInt(c.value),i=[1-t/100,t/100];i.forEach((t,e)=>{t=t>.05?b(t+.15,0,1):t;const i=function(t,e){return t.querySelector(`g.flow-layer-${e||0}`)}(s,e);i?.setAttribute("opacity",t)});r.querySelectorAll(".red-ui-tab-label").forEach((t,n)=>{let M=parseInt(t.getAttribute("data-layer"));(isNaN(M)||M<0||M>=e.length)&&(M=0),t.style.opacity=i[M]||0})}const y=r.querySelector(".red-ui-tab");y&&y.click(),n.size>0?A.classList.add("has-tabs"):A.classList.remove("has-tabs");const x=C(s.parentElement);return x.hasHorizontalScrollbar||x.hasVerticalScrollbar?A.classList.add("has-scrollbars"):A.classList.remove("has-scrollbars"),M},renderFlows:nt,renderFlow:Mt,normaliseOptions:it,getStyles:U}};"object"==typeof module&&module.exports?module.exports=FlowRenderer:"object"==typeof window?window.FlowRenderer=FlowRenderer:global.FlowRenderer=FlowRenderer;export default FlowRenderer; \ No newline at end of file +const FlowRenderer=function(){const t=this||{},e=100,i=8e3,n=8e3,M=13.5,o={view:{}};o.view.tools={},o.utils={},o.view.gridSize=function(){return 20},o.view.tools.calculateGridSnapOffsets=function(t,e){0;e=e||{align:"nearest"};const i={x:0,y:0},n=o.view.gridSize(),M=t.x-(n*Math.round((t.x-t.w/2)/n)+t.w/2),A=t.x-(n*Math.round((t.x+t.w/2)/n)-t.w/2);i.x=A,"right"===e.align||("left"===e.align||Math.abs(M)t.clientWidth,hasVerticalScrollbar:t.scrollHeight>t.clientHeight}}function C(t,e){let i=1;const n=t.getAttribute("transform");if(n){const t=n.match(/scale\(([^,]+)\)/);t&&(i=b(parseFloat(t[1]||1),.25,3,1))}const M=t.querySelector("g.outerContainer");m(M,i,!0),e.onwheel=function(t){if(t.ctrlKey||t.metaKey){t.preventDefault();let e=x(M);e-=.075*Math.sign(t.deltaY),e=b(e,.2,3,1),m(M,e)}};const o=function(t){const e=w(t,this);if(!e)return null;let i=t.querySelector(".toolbar");i||(i=E(t));let n=i.querySelector(".zoom-controls");if(n)return{zoomIn:i.querySelector(".zoom-in"),zoomOut:i.querySelector(".zoom-out"),zoomReset:i.querySelector(".zoom-reset")};n=e.createElement("div"),n.classList.add("zoom-controls"),n.classList.add("button-group");const M=e.createElement("button");M.classList.add("red-ui-footer-button","icon-button-bg","zoom-in"),M.innerHTML="+",M.title="Zoom In (Ctrl + Mouse Wheel Up)";const o=e.createElement("button");o.classList.add("red-ui-footer-button","icon-button-bg","zoom-reset"),o.title="Zoom & Scroll Reset";const A=e.createElement("button");A.classList.add("red-ui-footer-button","icon-button-bg","zoom-out"),A.innerHTML="-",A.title="Zoom Out (Ctrl + Mouse Wheel Down)",n.appendChild(A),n.appendChild(o),n.appendChild(M),i&&i.appendChild(n);return{zoomIn:M,zoomOut:A,zoomReset:o}}(e);o.zoomIn.onclick=function(){const t=b(x(M)+.1,.2,3,1);m(M,t)},o.zoomOut.onclick=function(){const t=b(x(M)-.1,.2,3,1);m(M,t)},o.zoomReset.onclick=function(){!function(t){const e=t.getAttribute("_scale_original")||1;m(t,e)}(M),function(t){t.scrollLeft=t.getAttribute("_scroll_x")||0,t.scrollTop=t.getAttribute("_scroll_y")||0}(e.querySelector(".red-ui-workspace-chart"))}}function x(t){return parseFloat(t.getAttribute("_scale_current")||1)}function m(t,e,M=!1){t.setAttribute("transform",`scale(${e})`);const o=t.ownerSVGElement||t;o.style.width=i*e+"px",o.style.height=n*e+"px",t.setAttribute("_scale_current",e),M&&t.setAttribute("_scale_original",e)}function T(t,e,i,n=!1){t.scrollLeft=e,t.scrollTop=i,n&&(t.setAttribute("_scroll_x",e),t.setAttribute("_scroll_y",i))}function S(t,e,M){const o=M.autoZoom||M.autoScroll?function(t,e){const M=.2,o=1,A=e.container.querySelector(".red-ui-workspace-chart"),a=A.getBoundingClientRect(),r=a.width-25,g=a.height-25;let u=i,s=n,d=0,c=0;const l=e.flowId,I=t.filter(t=>"tab"!==t.type&&"subflow"!==t.type&&t.z===l);if(0===I.length)return{scale:1,scrollX:0,scrollY:0};for(const t of I){if("tab"===t.type||"subflow"===t.type||"junction"===t.type)continue;const e=t.x||0,i=t.y||0,n=D(t),M=(n.width||100)/2,o=(n.height||30)/2,A=e-M,a=i-o,r=e+M,g=i+o;u=Math.min(u,A),s=Math.min(s,a),d=Math.max(d,r),c=Math.max(c,g)}let L=1;const N=d-u,j=c-s,y=r/N,w=g/j;(N>r||j>g)&&(L=Math.min(y,w),L*=.95);L=b(L,M,o,1);let p=u,C=s;p<50&&(p=0);C<40&&(C=0);p>0&&(p-=50);C>0&&(C-=40);return p=b(p*L,0,A.scrollWidth),C=b(C*L,0,A.scrollHeight),{scale:L,scrollX:p,scrollY:C,minX:u,minY:s,maxX:d,maxY:c}}(e,M):null;if(t=t.ownerSVGElement||t,M.zoom&&o&&M.autoZoom){m(t.querySelector("g.outerContainer"),o.scale,!0)}return o&&M.autoScroll&&T(t.parentElement,o.scrollX,o.scrollY,!0),o}function z(t,e,i){const n=t.parentElement,M=t.querySelector("g.outerContainer"),o=n.scrollLeft,A=n.scrollTop,a=x(M),r=i||e.flowId||"global";n.setAttribute(`data-tab-${r}-x`,o),n.setAttribute(`data-tab-${r}-y`,A),n.setAttribute(`data-tab-${r}-scale`,a)}function h(t,e,i){const n=t.parentElement,M=t.querySelector("g.outerContainer"),o=i||e.flowId||"global",A=n.getAttribute(`data-tab-${o}-x`),a=n.getAttribute(`data-tab-${o}-y`),r=n.getAttribute(`data-tab-${o}-scale`);"string"==typeof A&&"string"==typeof a&&T(n,A,a),"string"==typeof r&&m(M,r)}function f(t){const e=t.parentElement,i=t.querySelector("g.outerContainer");for(const t in i.dataset)/^tab-\w+-.*/.test(t)&&e.removeAttribute(t)}function v(t){const e=w(t,this).createElement("div");return e.classList.add("red-ui-workspace-chart"),t?(t.appendChild(e),e):e}function E(t){const e=w(t,this);if(!e)return null;let i=t.querySelector(".toolbar");return i||(i=e.createElement("div"),i.classList.add("toolbar"),t&&t.appendChild(i),i)}function O(t,{addDefaultLayer:e=!0,layer:M=0}={}){const o=w(t,this),A=o.createElementNS("http://www.w3.org/2000/svg","svg");A.setAttribute("style",`width:${i}px; height:${n}px;`),t.appendChild(A);const a=o.createElementNS("http://www.w3.org/2000/svg","defs");A.appendChild(a);a.innerHTML='\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ';const r=k("g",{class:"outerContainer"});return A.appendChild(r),e&&Z(A,{layer:M}),A}function k(t,e,i){const n=w(i,this).createElementNS("http://www.w3.org/2000/svg",t);if("object"==typeof e)for(const t in e)n.setAttribute(t,e[t]);return i&&i.appendChild(n),n}function Z(t,{layer:e=0,opacity:i=1}={}){let n=t.querySelector("g.outerContainer");n||(n=k("g",{class:"outerContainer"},t)),n.querySelector("g.flow_grid")||k("g",{class:"flow_grid"},n);let M=n.querySelector(`g.flow-layer-${e}`);for(M||(M=k("g",{class:`flow-layer-${e||0}`},n));M.firstChild;)M.removeChild(M.firstChild);return M.setAttribute("opacity",i),k("g","flow_group_elements",M),k("g","flow_group_select",M),k("g","flow_wires",M),k("g","flow_nodes",M),M}function B(t){if(t.childNodes.length>0)return;k("rect",{width:`${i}px`,height:`${n}px`,fill:"url(#grid)"},t).style.transform="translate(-1px, -1px)"}function Y(t,e,i,n,M){const o=w(M,this).createElement(t);if("object"==typeof e)for(const t in e)o.setAttribute(t,e[t]);return i&&"string"==typeof i?o.classList.add(...i.split(" ")):Array.isArray(i)&&o.classList.add(...i),"string"==typeof n&&(o.textContent=n),M&&M.appendChild(o),o}function Q(t){const e=[],i={},n=new Set([...Object.keys(t.changed),...Object.keys(t.added),...Object.keys(t.deleted),...Object.keys(t.moved),...Object.keys(t.positionChanged)]),M=t.currentConfig,o=t.newConfig;function A(e,i,n,M,o,A){const a={tab:e,item:i,diffType:n,prop:M,value1:o,value2:A,toString:()=>""},r=t=>t?`'${t}'`:"''",g=t=>t?r(function(t,e,i){const n=$[t.type]||$._default,M=e&&e[t.type]||{};return n(t,M,i)}(t)):"'n/a'",u=t.currentConfig.all[e]||t.newConfig.all[e],s=g(u),d=t.currentConfig.all[i]||t.newConfig.all[i],c="tab"===i?u:t.currentConfig.all[i],l="tab"===i?u:t.newConfig.all[i],I="tab"===i?"tab":"node",L=/wires\[\d+\]/.test(M);let N="";L&&(a.value1&&!a.value2?N=`had wire removed from ${g(c)}`:!a.value1&&a.value2&&(N=`was wired up to ${g(l)}`));const j=o&&("z"===M||/wires\[\d+\]/.test(M))?t.currentConfig.all[o]:null,D=A&&("z"===M||/wires\[\d+\]/.test(M))?t.newConfig.all[A]:null;return a.toString=function(){const t=[];switch(n){case"deleted":t.push("deleted",I,g(d));break;case"added":t.push("added",I,g(d));break;case"moved":t.push(g(d),"moved from ",g(j),"to",g(D));break;case"changed":"g"===M?o&&!A?t.push(s,g(d),"was removed from group",r(g(o))):!o&&A?t.push(s,g(d),"was added to group",r(g(A))):t.push(s,g(d),"moved group from",r(o),"to",r(A)):L?t.push(s,g(d),N):"tab"===i?t.push("tab",s,"property",r(a.prop),"was",r(a.value1||"")+", now",r(a.value2||"")):t.push(g(d),"property",r(a.prop),"was",r(a.value1||""),"now",r(a.value2||""));break;case"positionChanged":t.push(g(d),"moved from",a.value1,"to",a.value2);break;default:t.push(s,g(d),r(a.prop),"was",r(a.value1||""),"now",r(a.value2||""))}return t.join(" ")},a}function a(t,e){const i=t.currentConfig.all,M=t.newConfig.all,o=[];if(!e.v1||!e.v2)return e.v1&&o.push(A(e.id,e.id,"tab","deleted",e.v1,null)),e.v2&&o.push(A(e.id,e.id,"tab","added",null,e.v2)),o;const a=e.v1?.tab?{...e.v1.tab.n}:{};a.order=e.v1?.order;const g=e.v2?.tab?{...e.v2.tab.n}:{};g.order=e.v2?.order;const u=e.v1?.tab?.nodes||[],s=e.v2?.tab?.nodes||[];o.push(...r(e.id,"tab","","changed",a,g));const d=u.map(t=>t.id),c=s.map(t=>t.id),l=new Set([...d,...c].filter(t=>n.has(t))),I=t=>"number"!=typeof t?null:t,L=(t,e)=>{const i={...e};for(const e of t)delete i[e];return i};for(const n of l){const A=i[n],a=M[n],g=!(!A||!a);if(t.deleted[n])o.push(...r(e.id,n,"","deleted",A,a));else if(t.added[n])o.push(...r(e.id,n,"","added",A,a));else if(g){let i=!0;if(t.moved[n]&&o.push(...r(e.id,n,"","moved",{z:A.z},{z:a.z})),t.positionChanged[n]){i=!1;const t={x:I(A.x),y:I(A.y)},M={x:I(a.x),y:I(a.y)},g=JSON.stringify(t),u=JSON.stringify(M);o.push(...r(e.id,n,"position","positionChanged",g,u))}if(i){const t=L(["x","y","z","w","h"],A),i=L(["x","y","z","w","h"],a);o.push(...r(e.id,n,"","changed",t,i))}}}return o}function r(t,e,i,n,M,o){const a=[];if("deleted"===n)a.push(A(t,e,n,i,M?"":"deleted",o?"":"deleted"));else if("added"===n)a.push(A(t,e,n,i,M?"added":"",o?"added":""));else if(typeof M!=typeof o)a.push(A(t,e,"changed",i,M||"",o||""));else if(Array.isArray(M))for(let A=0;A{const e=`${"z"===t.prop&&"moved"===t.diffType?"*":t.tab}-${t.item}-${t.diffType}-${t.prop}-${t.value1}-${t.value2}`;return!g.has(e)&&(g.add(e),!0)})}()),{get changes(){return e},get diff(){return t},get tabs(){return i},getNodeInfo:t=>({propertiesChanged:e.filter(e=>e.itemId===t&&e.tab!==t),v1:M.all[t],v2:o.all[t]}),getTabInfo:t=>({propertiesChanged:e.filter(e=>e.tab===t&&"tab"===e.itemId),nodesChanged:e.filter(e=>e.tab===t&&"tab"!==e.itemId),v1:i[t],v2:i[t]})}}function U(t){t&&t.length&&"string"!=typeof t&&"string"==typeof t[0]&&(t=[...t].join(" "));return`\n :root {\n --red-ui-view-grid-color: #eee;\n --red-ui-view-border: 1px solid #bbbbbb;\n --red-ui-node-border: #999;\n --red-ui-node-port-background: #d9d9d9;\n --red-ui-workspace-button-color: #333;\n --red-ui-workspace-button-background: #f3f3f3;\n\n --red-ui-primary-font: Helvetica Neue, Arial, Helvetica, sans-serif;\n --red-ui-primary-font-size: 14px;\n --red-ui-monospace-font: Menlo, Consolas, DejaVu Sans Mono, Courier, monospace;\n --red-ui-primary-background: #f3f3f3;\n\n --red-ui-form-background: #fff;\n --red-ui-form-placeholder-color: #aaa;\n --red-ui-form-text-color: #555;\n --red-ui-form-text-color-disabled: #bbb;\n --red-ui-form-input-focus-color: rgba(85, 150, 230, 0.8);\n --red-ui-form-input-border-color: #ccc;\n --red-ui-form-input-border-selected-color: #aaa;\n --red-ui-form-input-border-error-color: rgb(214, 97, 95);\n --red-ui-form-input-background: #fff;\n --red-ui-form-input-background-disabled: #f9f9f9;\n --red-ui-form-button-background: #efefef;\n\n --red-ui-diff-state-color: #555;\n --red-ui-diff-state-prefix-color: #888;\n --red-ui-diff-state-added: #009900;\n --red-ui-diff-state-deleted: #f80000;\n --red-ui-diff-state-changed: #f89406;\n --red-ui-diff-state-moved: #3f81b3;\n }\n ${t=(t=t||".flow-renderer").split(" ").map(t=>`.${t}`).join(" ").trim()} .diff-table {\n width: 100%;\n font-size: var(--red-ui-primary-font-size);\n font-family: var(--red-ui-primary-font);\n }\n ${t} .diff-table thead tr {\n font-weight: bold;\n padding: 2px 4px;\n /* bottom border only */\n border-bottom: 3px solid #ddd;\n }\n ${t} .diff-table td {\n padding: 2px 4px;\n border-bottom: 1px solid #ddd;\n }\n ${t} .diff-table .diff-info {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n ${t} .diff-value button {\n height: 20px;\n width: 20px;\n padding: 1px;\n }\n ${t} .diff-value span {\n margin-left: 4px;\n margin-top: 2px;\n }\n ${t} .diff-type {\n height: 14px;\n width: 14px;\n margin: 2px;\n }\n ${t} .diff-type-text {\n flex-grow: 1;\n }\n ${t} .diff-type-moved {\n background-color: var(--red-ui-diff-state-moved);\n }\n ${t} .diff-type-added {\n background-color: var(--red-ui-diff-state-added);\n }\n ${t} .diff-type-deleted {\n background-color: var(--red-ui-diff-state-deleted);\n }\n ${t} .diff-type-changed {\n background-color: var(--red-ui-diff-state-changed);\n }\n ${t} .diff-type-positionChanged {\n background-color: var(--red-ui-diff-state-changed);\n }\n\n .red-ui-editor {\n font-size: var(--red-ui-primary-font-size);\n font-family: var(--red-ui-primary-font);\n padding: 0;\n margin: 0;\n background: var(--red-ui-primary-background);\n color: var(--red-ui-primary-text-color);\n line-height: 20px\n }\n ${t} {\n position: relative;\n }\n /* Source view */\n ${t} pre.red-ui-workspace-source {\n height: 100%;\n overflow: auto;\n width: 100%;\n font-family: var(--red-ui-monospace-font);\n background-color: #f7f7f7;\n }\n /* Chart view */\n ${t} .red-ui-workspace-chart {\n box-sizing: border-box;\n border: var(--red-ui-view-border);\n border-radius: 0 4px 4px 4px;\n overflow: scroll;\n height: 100%;\n width: 100%;\n }\n ${t} div.red-ui-footer {\n height: 20px\n }\n ${t}.has-tabs div.red-ui-workspace-chart {\n height: calc(100% - 34px);\n }\n ${t} svg {\n position: relative;\n width: 100%;\n height: 100%;\n min-height: 250px;\n margin: auto;\n display: block;\n border-radius: 2px;\n }\n ${t} svg {\n cursor: default;\n }\n ${t} svg .group-text-label {\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 14px;\n }\n ${t} svg .node-text-label {\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 14px;\n dominant-baseline: middle;\n }\n ${t} svg .subflow-node-text-label {\n color: rgb(85, 85, 85);\n dominant-baseline: middle;\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 10px;\n line-height: 20px;\n pointer-events: none;\n text-anchor: middle;\n user-select: none\n }\n ${t} svg .subflow-node-text-label-number {\n color: rgb(85, 85, 85);\n dominant-baseline: middle;\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 16px;\n line-height: 20px;\n pointer-events: none;\n text-anchor: middle;\n user-select: none\n }\n\n ${t} svg .node {\n fill-opacity: 1;\n stroke-width: 1px;\n }\n ${t} svg .link {\n stroke: #999;\n stroke-width: 3;\n fill: none;\n }\n ${t} svg .link-highlight, .node-highlight {\n stroke: rgb(255, 127, 14);\n }\n ${t} svg .node-highlight {\n stroke-width: 3px;\n }\n ${t} .tab-glow {\n border-radius: 2px;\n animation: tab-glow-animation 1s infinite;\n }\n @keyframes tab-glow-animation {\n 0% {\n box-shadow: 0 0 0px 0px #7d26cddd;\n }\n 50% {\n box-shadow: 0 0 10px 5px #7d26cddd;\n }\n 100% {\n box-shadow: 0 0 0px 0px #7d26cddd;\n }\n }\n\n ${t} svg .node-disabled {\n stroke-dasharray: 8,3;\n fill-opacity: 0.5;\n }\n ${t} svg .group-highlight {\n stroke: rgb(255, 127, 14);\n stroke-width: 4px;\n fill: rgb(255, 127, 14);\n fill-opacity: 0.2;\n }\n ${t} svg .link-disabled {\n stroke-dasharray: 10,8 !important;\n stroke-width: 2 !important;\n stroke: rgb(204, 204, 204);\n }\n ${t} svg .grid-line {\n shape-rendering: geometricprecision;\n stroke: rgb(238, 238, 238);\n stroke-width: 1px;\n fill: none;\n }\n ${t} svg .red-ui-flow-port {\n stroke-width: 1px;\n stroke-miterlimit: 4;\n fill: var(--red-ui-node-port-background);\n }\n ${t} svg .red-ui-flow-port-input {\n stroke-width: 1px;\n stroke-miterlimit: 4;\n fill: var(--red-ui-node-port-background);\n }\n ${t} svg .flow-render-error {\n background-color: rgb(54, 52, 52); \n color: rgb(196, 59, 59); \n width: 100%;\n }\n ${t} svg text {\n user-select: none;\n }\n ${t} .red-ui-tabs {\n display: flex;\n }\n ${t} .red-ui-tab {\n padding: 6px 12px;\n box-sizing: border-box;\n display: block;\n border: 1px solid #bbbbbb;\n border-right: none;\n background-color: #f0f0f0;\n max-width: 200px;\n max-height: 34px; /* for calculating svg height */\n height: 34px; /* for calculating svg height */\n width: 14%;\n overflow: hidden;\n white-space: nowrap;\n position: relative;\n margin-top: -1px;\n transition: 0.2s background-color;\n user-select: none;\n position: relative;\n z-index: 1;\n top: 1px;\n }\n ${t} .red-ui-tab div.red-ui-tab-label {\n position: absolute;\n top: 7px;\n left: 10px;\n }\n ${t} .red-ui-tab-subflow-icon {\n mask-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMjUgMjUuOTRoN2MuNTggMCAxLS40MiAxLTF2LTJjMC0uNTgtLjQyLTEtMS0xaC03Yy0uNTggMC0xIC40Mi0xIDF2MmMwIC41OC40MiAxIDEgMXptLTE3IDEyaDdjLjU4IDAgMS0uNDIgMS0xdi0yYzAtLjU4LS40Mi0xLTEtMUg4Yy0uNTggMC0xIC40Mi0xIDF2MmMwIC41OC40MiAxIDEgMXptLS40MTYgMTFDNS42MjQgNDguOTQgNCA0Ny4zMTUgNCA0NS4zNTZWMTQuNTIyYzAtMS45NiAxLjYyNS0zLjU4MiAzLjU4NC0zLjU4MmgyNC44MzJjMS45NiAwIDMuNTg0IDEuNjIzIDMuNTg0IDMuNTgydjMwLjgzNGMwIDEuOTYtMS42MjUgMy41ODQtMy41ODQgMy41ODR6TTMyIDM2Ljk0SDE5YzAgMi4xOS0xLjgxIDQtNCA0SDd2NC40MTZjMCAuMzUuMjM1LjU4NC41ODQuNTg0aDI0LjgzMmMuMzUgMCAuNTg0LS4yMzUuNTg0LS41ODR2LTguNDE3em0xLTJ2LTZoLThjLTIuMTkgMC00LTEuODEtNC00aC0xYy00LjMzMy0uMDAyLTguNjY3LjAwNC0xMyAwdjZoOGMyLjE5IDAgNCAxLjgxIDQgNGgxM3ptMC0xNnYtNC40MThjMC0uMzUtLjIzNS0uNTgyLS41ODQtLjU4Mkg3LjU4NGMtLjM1IDAtLjU4NC4yMzMtLjU4NC41ODJ2OC40MTdjNC4zMzMuMDAyIDguNjY3LjAwMSAxMyAuMDAxaDFjMC0yLjE5IDEuODEtNCA0LTRoOHoiIGNvbG9yPSIjMDAwIiBmaWxsPSIjZmZmIi8+PC9zdmc+Cg==);\n display: inline-block;\n background-color: grey;\n margin-left: -8px;\n margin-right: 3px;\n margin-top: -1px;\n margin-bottom: 1px;\n opacity: 1;\n width: 16px;\n height: 18px;\n vertical-align: middle;\n mask-size: contain;\n mask-position: center;\n mask-repeat: no-repeat;\n }\n ${t} .red-ui-tab-disabled-icon {\n mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25' viewBox='0 0 1536 1792' style='&%2310;'%3E%3Cscript xmlns=''/%3E%3Cpath d='M1312 893q0-161-87-295l-754 753q137 89 297 89 111 0 211.5-43.5t173.5-116.5 116-174.5 43-212.5zM313 1192l755-754q-135-91-300-91-148 0-273 73t-198 199-73 274q0 162 89 299zM1536 893q0 157-61 300t-163.5 246-245 164-298.5 61-298.5-61-245-164-163.5-246-61-300 61-299.5 163.5-245.5 245-164 298.5-61 298.5 61 245 164 163.5 245.5 61 299.5z' fill='currentColor'/%3E%3Cscript xmlns=''/%3E%3C/svg%3E");\n display: inline-block;\n background-color: grey;\n margin-left: -8px;\n margin-right: 3px;\n margin-top: 0px;\n margin-bottom: 0px;\n opacity: 1;\n width: 16px;\n height: 16px;\n vertical-align: middle;\n mask-size: contain;\n mask-position: center;\n mask-repeat: no-repeat;\n transform: translateY(-2px);\n }\n ${t} .red-ui-tab span {\n font-size: 0.875rem;\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n }\n ${t} .red-ui-tab.active {\n background-color: white;\n border-bottom-color: white;\n font-weight: bold;\n }\n ${t} .red-ui-tab.disabled {\n border-top-style: dashed;\n border-left-style: dashed;\n font-style: italic;\n }\n ${t} .red-ui-tab:first-child {\n border-radius: 4px 0 0 0;\n }\n ${t} .red-ui-tab:last-child {\n border-right: 1px solid #bbbbbb;\n border-radius: 0 4px 0 0;\n }\n ${t} .red-ui-tab:first-child:last-child {\n border-radius: 4px 4px 0 0;\n }\n ${t} .red-ui-tab:last-child.disabled {\n border-right-style: dashed;\n }\n ${t} .red-ui-tab:hover {\n cursor: pointer;\n background-color: white;\n }\n /* positioning of toolbar */\n ${t} .toolbar {\n display: flex;\n flex-direction: row;\n position: absolute;\n bottom: 5px;\n right: 5px;\n opacity: 0.6;\n }\n ${t} .toolbar:hover {\n opacity: 1;\n }\n ${t}.has-scrollbars .toolbar {\n bottom: 24px;\n right: 24px;\n }\n\n ${t} .hidden {\n display: none !important;\n }\n ${t} .toolbar .button-group.hidden {\n display: none !important;\n }\n ${t} .toolbar .icon-button-bg.view-source {\n background-image: url("${I}");\n }\n ${t} .toolbar .icon-button-bg.download-flow {\n background-image: url("${l}");\n }\n ${t} .toolbar .icon-button-bg.copy-flow {\n background-image: url("${c}");\n }\n ${t} .toolbar .icon-button-bg.zoom-reset {\n background-image: url("${d}");\n }\n ${t} .toolbar .icon-button-bg {\n background-repeat: no-repeat;\n background-position: center;\n background-size: 16px 16px; /* Size of the background SVG */\n background-color: transparent;\n padding: 4px;\n cursor: pointer;\n width: 24px;\n height: 24px;\n font-size: 0; /* Hide any default button text if present */\n line-height: 0; /* Hide any default button text if present */\n }\n\n ${t} .toolbar .icon-button-bg:hover {\n background-color: #f0f0f0;\n }\n\n /* styles for button groups and buttons */\n ${t} .button-group {\n display: flex;\n flex-direction: row;\n }\n ${t} .button-group button {\n user-select: none;\n box-sizing: border-box;\n display: inline-block;\n text-align: center;\n cursor: pointer;\n line-height: 22px;\n height: 24px;\n color: var(--red-ui-workspace-button-color) !important;\n background: var(--red-ui-workspace-button-background);\n text-decoration: none;\n border: 1px solid var(--red-ui-form-input-border-color);\n margin: 0px;\n padding: 0px;\n }\n ${t} .button-group button:not(:first-child) {\n border-top-left-radius: 0px;\n border-bottom-left-radius: 0px;\n border-left: none;\n }\n\n /* zoom controls */\n ${t} .zoom-controls.button-group button {\n font-size: 22px;\n width: 24px;\n }\n\n /* copy controls */\n ${t} .copy-controls.button-group {\n margin-right: 8px;\n }\n ${t} .copy-controls.button-group button {\n padding: 0px 4px;\n }\n\n /* source controls */\n ${t} .source-controls.button-group {\n margin-right: 8px;\n }\n ${t} .source-controls.button-group button {\n padding: 0px 4px;\n }\n\n /* compare controls */\n ${t} .compare-controls.button-group {\n margin-right: 24px;\n }\n ${t} .compare-controls input[type='range'].flow-compare-slider {\n width: 100%;\n -webkit-appearance: none;\n }\n ${t} input[type='range'].flow-compare-slider::-webkit-slider-runnable-track {\n height: 16px;\n background: var(--red-ui-workspace-button-background);\n border-radius: 16px;\n }\n /* Track: Mozilla Firefox */\n ${t} input[type='range'].flow-compare-slider::-moz-range-track {\n height: 16px;\n background: var(--red-ui-workspace-button-background);\n border-radius: 16px;\n }\n `}function G(t,e){const i="flow-renderer-css"+(e?"--"+e.toString():"").replace(/[^a-z0-9]/gi,"-").toLowerCase();let n=t.getElementById(i);n||(n=t.createElement("style"),n.id=i,n.innerHTML=U(e),t.head.appendChild(n))}function H(t,e){if(t){const i=t.querySelector(`.flow-layer-${e||0}`);["flow_group_elements","flow_group_select","flow_wires","flow_nodes"].forEach(t=>{const e=i.querySelector(`.${t}`)||k("g",{class:t},i);for(;e.firstChild;)e.removeChild(e.firstChild)})}}function W(t){const e=[],i={},n={},M=[],o={};return t.forEach(function(t){o[t.id]=t,"tab"===t.type?(e.push(t.id),i[t.id]={n:t,nodes:[]}):"subflow"===t.type&&(n[t.id]={n:t,nodes:[]})}),t.forEach(function(t){"tab"!==t.type&&"subflow"!==t.type&&(i[t.z]?i[t.z].nodes.push(t):n[t.z]?n[t.z].nodes.push(t):M.push(t))}),{all:o,tabOrder:e,tabs:i,subflows:n,globals:M}}function P(t,i,n,M,o,A=!1){const a=M-i,r=n-t,g=Math.sqrt(a*a+r*r);let u=.75;if(r*o>0?g0){const A=[[t+o*(e*u),i+0],[n-o*u*e,M-0]];return`M ${t} ${i} C ${A[0][0]} ${A[0][1]} ${A[1][0]} ${A[1][1]} ${n} ${M}`}{let g,s,d,c,l;const I=Math.floor(n-r/2),L=Math.floor(M-a/2);if(Math.abs(a)<10){c=Math.max(i,M)+(A?35:25);const e=c-i;return l=[[t+15*o,i],[t+25*o,i+5],[t+25*o,i+e/2],[t+25*o,i+e-5],[t+15*o,i+e],[t,i+e],[n-15*o,i+e],[n-25*o,i+e-5],[n-25*o,M+(c-M)/2],[n-25*o,M+5],[n-15*o,M],[n,M]],"M "+t+" "+i+" C "+l[0][0]+" "+l[0][1]+" "+l[1][0]+" "+l[1][1]+" "+l[2][0]+" "+l[2][1]+" C "+l[3][0]+" "+l[3][1]+" "+l[4][0]+" "+l[4][1]+" "+l[5][0]+" "+l[5][1]+" h "+r+" C "+l[6][0]+" "+l[6][1]+" "+l[7][0]+" "+l[7][1]+" "+l[8][0]+" "+l[8][1]+" C "+l[9][0]+" "+l[9][1]+" "+l[10][0]+" "+l[10][1]+" "+l[11][0]+" "+l[11][1]+" "}{const A=15,r=(M+L)/2;g=t+o*e*u,s=a>0?Math.min(r-a/2,i+A):Math.max(r-a/2,i-A),d=n-o*e*u,c=a>0?Math.max(r,M-A):Math.min(r,M+A);const N=(t+g)/2,j=a>0?1:-1;return l=[[N,i],[g,a>0?Math.max(i,s-A):Math.min(i,s+A)],[N,a>0?Math.min(L,s+A):Math.max(L,s-A)],[d,a>0?Math.max(L,c-A):Math.min(L,c+A)],[(n+d)/2,M]],l[2][1]===s+j*A&&(Math.abs(a)<10*A&&(l[1][1]=s-j*A/2,l[3][1]=c-j*A/2),l[2][0]=g),"M "+t+" "+i+" C "+l[0][0]+" "+l[0][1]+" "+l[1][0]+" "+l[1][1]+" "+g+" "+s+" S "+l[2][0]+" "+l[2][1]+" "+I+" "+L+" S "+l[3][0]+" "+l[3][1]+" "+d+" "+c+" S "+l[4][0]+" "+l[4][1]+" "+n+" "+M}}}function J(t,e){const i=function(t){let e=[];const i=t.split(/\\n /);if(i.length>1){let t=0;for(t=0;t{switch(t){case"str":return"string";case"num":return"number";case"bool":return"boolean";case"json":return"json";case"date":return"timestamp";case"bin":return"binary";case"env":return"environment";case"flow":return"flow";case"global":return"global";default:return t}},q=["inject","change","switch","function","template","delay","trigger","link in","link out","link call","watch","complete","catch","status","comment","debug","subflow","range","filter","rbe","mqtt in","mqtt out","http in","http response","http request","websocket in","websocket out","tcp in","tcp out","udp in","udp out","tcp request","split","join","sort","batch","csv","json","xml","yaml","html","file in","file","exec"],K=(t,e,i)=>{const n=t.name||e.name;if(n)return n;const M=t.label||t.info||t.text||"";let o="",A="",a="",r="";switch(t.type){case"file":a="write file";case"file in":return a=a||"read file",A=t.filename,"str"!==t.filenameType&&"env"!==t.filenameType&&(A=""),"env"===t.filenameType&&(A="env."+A),"write file"===a&&"delete"===t.overwriteFile?t.name||"delete "+A:t.name||A||a;case"html":o=t.tag;break;case"tcp in":case"tcp out":case"tcp request":a="tcp:";case"udp in":case"udp out":return a=a||"udp:",A=t.host||t.addr||t.server||"",a+(A?A+":":"")+(t.port||"");case"debug":return!0!==t.console&&"true"!==t.console||(r="\t⇲"),"jsonata"===t.targetType?(t.name||"JSONata")+r:!0===t.complete||"true"===t.complete?(t.name||"msg")+r:(t.name||"msg."+(t.complete&&"false"!==t.complete?this.complete:"payload"))+r}return t.type&&t.type.startsWith("ui-")?o=t.type.replace(/^ui-/,""):t.type&&t.type.startsWith("ui_")&&(o=t.type.replace(/^ui_/,"")),o&&o.length<=32?o:M||(t.topic&&t.topic.length<=32&&q.includes(t.type)?t.topic:t.type)},_=(t,e,i)=>(t.name||t.label||t.info||t.text||"").replace(/(.{40,60})([ \n\t])/g,"$1\\n$2")+(t.sumPass?" ⭄":"")+(t.sumPassPrio&&0!=parseInt(t.sumPassPrio)?" ("+t.sumPassPrio+")":""),$={base64:void 0,batch:void 0,catch:(t,e,i)=>{let n="";return t.uncaught&&(n=": uncaught"),t.scope&&(n=": "+t.scope.length),t.scope||t.uncaught||(n=": all"),t.name||t.type+n},change:t=>{function e(t,e){return t+"."+o.utils.parseContextKey(e).key}return t.name?t.name:(t._=t._||function(t,e){let i=t;switch(t){case"change.label.set":i="set {{property}}";break;case"change.label.change":i="change {{property}}";break;case"change.label.move":i="move {{property}}";break;case"change.label.delete":i="delete {{property}}";break;case"change.label.changeCount":i="change {{count}} properties"}for(const n in e)t=i.replace(new RegExp("\\{\\{"+n+"\\}\\}","g"),e[n]);return t},t.rules?1===t.rules.length?"set"===t.rules[0].t?t._("change.label.set",{property:e(t.rules[0].pt||"msg",t.rules[0].p)}):"change"===t.rules[0].t?t._("change.label.change",{property:e(t.rules[0].pt||"msg",t.rules[0].p)}):"move"===t.rules[0].t?t._("change.label.move",{property:e(t.rules[0].pt||"msg",t.rules[0].p)}):t._("change.label.delete",{property:e(t.rules[0].pt||"msg",t.rules[0].p)}):t._("change.label.changeCount",{count:t.rules.length}):"replace"===t.action?t._("change.label.set",{property:"msg."+t.property}):"change"===t.action?t._("change.label.change",{property:"msg."+t.property}):"move"===t.action?t._("change.label.move",{property:"msg."+t.property}):t._("change.label.delete",{property:"msg."+t.property}))},comment:void 0,csv:void 0,debug:void 0,exec:void 0,file:void 0,"file in":void 0,function:void 0,html:void 0,"http response":(t,e,i)=>t.name||"http"+(t.statusCode?" ("+t.statusCode+")":""),"http in":(t,e,i)=>t.name||"["+t.method+"] "+t.url,"http request":void 0,inject:t=>{let e="";if(t.once&&(e=" ¹"),(t.repeat&&0!=t.repeat||t.crontab)&&(e="\t↻"),t.name)return t.name+e;let i="",n="str",M="";const A=t.props;if(A)for(let e=0;e0&&i.length<24?i+e:"inject"+e;if("date"===n||"bin"===n||"env"===n)return""!==M&&M.length<=16?M+":"+X(n)+e:X(n)+e;if("flow"===n||"global"===n){return n+"."+o.utils.parseContextKey(i).key+e}return"inject"+e},join:void 0,json:void 0,junction:void 0,"link in":void 0,"link out":void 0,"link call":(t,e,i)=>{if(!t.links||0===t.links.length)return t.name||t.type;let n;return i.forEach(function(M){n||M.id===t.links[0]&&(n=($[M.type]||K)(M,e,i))}),t.name||n||t.type},markdown:void 0,postgresql:void 0,range:void 0,sort:void 0,split:void 0,switch:void 0,yaml:void 0,xml:void 0,BlogPages:void 0,BlogDetails:void 0,BlogPageInfo:(t,e,i)=>{if(t.name)return t.name;let n;return i.forEach(function(e){n||"link in"===e.type&&e.name.startsWith("[blog] ")&&(e.wires[0]||[]).indexOf(t.id)>-1&&(n=e.name.substring(7))}),n||t.type},PubMedium:void 0,Topic:_,Observation:_,Question:_,Thought:_,Idea:_,Analogy:_,Aphorism:_,Poesie:_,Humour:_,Treasure:_,Consequence:_,Advantage:_,Disadvantage:_,Text:_,"Blog-Post":_,Comment:_,Codebase:_,Sketch:_,Inspiration:_,Quote:_,Definition:_,Book:_,Author:_,"nnb-input-node":void 0,"nnb-layer-node":(t,e,i)=>t.name||t.actfunct+": "+t.bias+", "+t.threshold,"nnb-output-node":void 0,"nnb-backprop":void 0,"nnb-trainer":void 0,Seeker:void 0,Sink:void 0,Screenshot:void 0,Orphans:void 0,IsMobile:void 0,Navigator:void 0,DrawSVG:void 0,GetFlows:void 0,_default:K};function tt(t){const e={};let i=1e4,n=0;for(const M of t)"subflow"===M.type?e[M.id]={id:M.id,label:M.name,type:"subflow",disabled:M.disabled,order:i++}:"tab"!==M.type&&M.z&&(e[M.z]||(e[M.z]={id:M.z,label:"Flow "+(n+1),type:"tab",disabled:!1,order:n++}));const M=t.filter(t=>"tab"===t.type);let o=0;for(const t of M)e[t.id]&&(e[t.id].label=t.label||e[t.id].label,e[t.id].disabled=!!t.disabled,e[t.id].order=o++);const A=Object.keys(e).map(t=>e[t]);return A.sort((t,e)=>t.order-e.order),A}function et(t){Array.isArray(t)||(t=[]);const e=[...t];for(let t=0;t0?i.add(...n):e?.classList?.length&&i.add(...e.classList),0===i.size&&i.add("flow-renderer"),[...i]}(t)),t.container){const i={};["scope","gridLines","arrows","zoom","images","linkLines","labels","autoZoom","autoScroll","flowId"].forEach(function(e){if("string"==typeof t.container.dataset[e]){const n=t.container.dataset[e]||"true";i[e.replace(/-/g,"")]="true"===n}}),e.push(i)}e.push(t)}return Object.assign({},...e)}function nt(e,i){e=et(e);const n=w((i=it(i)).document,t.document,i.container,this),M=i.container;for(;M.firstChild;)M.removeChild(M.firstChild);const o=n.createElement("div");o.classList.add("red-ui-tabs"),M.appendChild(o);const A=v(M);!function(t,e,i=!0){const n=w(t,this),M=n.createElement("pre");M.classList.add("red-ui-workspace-source"),i&&M.classList.add("hidden"),M.setAttribute("data-code-wrap","json");const o=n.createElement("code");o.classList.add("lang-json","hljs","language-json"),o.textContent="object"==typeof e?JSON.stringify(e,null,2):"string"==typeof e?e:"// No content available",M.appendChild(o),t&&t.appendChild(M)}(M,e);const a=function(t){const e=w(t,this);if(!e)return null;let i=t.querySelector(".toolbar");i||(i=E(t));let n=i.querySelector(".source-controls");if(n)return{viewSource:i.querySelector(".view-source")};n=e.createElement("div"),n.classList.add("source-controls"),n.classList.add("button-group");const M=e.createElement("button");return M.classList.add("red-ui-footer-button","icon-button-bg","view-source"),M.title="Toggle Flows / Source",n.appendChild(M),i.appendChild(n),{viewSource:M}}(M);a.viewSource.onclick=function(t){!function(t){t.preventDefault(),t.stopPropagation();const e=t.target.parentElement.parentElement.parentElement.querySelector(".red-ui-workspace-chart");if(!e)return void console.warn("No container found for source view toggle");const i=e.parentElement,n=i.querySelector(".red-ui-tabs"),M=i.querySelector(".red-ui-workspace-source"),o=i.querySelector(".zoom-controls");M&&M.classList.contains("hidden")?(M.classList.remove("hidden"),e.classList.add("hidden"),n.classList.add("hidden"),o?.classList.add("hidden")):(M.classList.add("hidden"),e.classList.remove("hidden"),n.classList.remove("hidden"),o?.classList.remove("hidden"))}(t)};const r=function(t){const e=w(t,this);if(!e)return null;let i=t.querySelector(".toolbar");i||(i=E(t));let n=i.querySelector(".copy-controls");if(n)return{copy:i.querySelector(".copy-flow"),download:i.querySelector(".download-flow")};n=e.createElement("div"),n.classList.add("copy-controls"),n.classList.add("button-group");const M=e.createElement("button");M.classList.add("red-ui-footer-button","icon-button-bg","copy-flow"),M.title="Copy Flow to Clipboard";const o=e.createElement("button");return o.classList.add("red-ui-footer-button","icon-button-bg","download-flow"),o.title="Download Flows",n.appendChild(M),n.appendChild(o),i&&i.appendChild(n),{copy:M,download:o}}(M);r.copy.onclick=function(t){!function(t,e,i){i=i||function(){};let n=e||[];"object"==typeof n?n=JSON.stringify(n,null,0):"string"!=typeof n&&(n=n.toString());const M=w(t&&t.target&&t.target.ownerDocument,this);if("undefined"!=typeof navigator&&navigator.clipboard)return void navigator.clipboard.writeText(n).then(function(){i(null,!0)}).catch(function(t){i(t,!1)});const o=M.createElement("textarea");o.value=n,o.style.position="fixed",o.style.top="0",o.style.left="0";try{M.body.appendChild(o),o.focus(),o.select();const t=M.execCommand("copy");i(null,t),console.info("failed to copy",t)}catch(t){console.error("failed to copy",t)}finally{M.body.removeChild(o)}}(t,e)},r.download.onclick=function(t){!function(t,e,i,n,M){M=M||function(){};let o=e||[];"object"==typeof o?o=JSON.stringify(o,null,2):"string"!=typeof o&&(o=o.toString());const A=w(t&&t.target&&t.target.ownerDocument,this),a=new Blob([o],{type:i}),r=URL.createObjectURL(a),g=A.createElement("a");g.style.display="none",g.href=r,g.download=n,g.style.position="fixed",g.style.top="0",g.style.left="0";try{A.body.appendChild(g),g.focus(),g.click(t),URL.revokeObjectURL(r),M(null,!0)}catch(t){M(t,!1),console.error("failed to download",t)}finally{A.body.removeChild(g)}}(t,e,"application/json","flows.json")};const g=O(A);H(g),f(g),M.classList.add(i.scope);const u=function(t){o.querySelectorAll(".red-ui-tab").forEach(t=>t.classList.remove("active"));return o.querySelector(`[data-flow-id="${t}"]`).classList.add("active"),i.flowId=t,Mt(e,i)};G(n,i.scope);const s=M.querySelectorAll(".red-ui-tab");s&&s.forEach(t=>t.remove());const d=tt(e);if(d.forEach((e,n)=>{!function(e,i,n,M,o){const A=`red-ui-tab-${n}`,a=M.container,r=M.svg||a.querySelector("svg"),g=w(M.document,t.document,a,this),u=i.label;let s=a.querySelector(`.${A}`);if(s||(s=g.createElement("div"),e.appendChild(s),s.classList.add("red-ui-tab"),s.classList.add("red-ui-tab-"+i.type),s.setAttribute("data-flow-id",i.id)),i.disabled){s.classList.add("disabled");const t=g.createElement("i");t.classList.add("red-ui-tab-disabled-icon"),s.appendChild(t)}else if("subflow"===i.type){const t=g.createElement("i");t.classList.add("red-ui-tab-subflow-icon"),s.appendChild(t)}s.title=u;const d=g.createElement("span");d.textContent=u,s.appendChild(d),s.onclick=function(t){z(r,M,M.flowId),o(i.id),h(r,M,i.id)}}(o,e,n,i,u)}),d.length?M.classList.add("has-tabs"):M.classList.remove("has-tabs"),!i.flowId){const t=d.find(t=>"tab"===t.type),e=d.find(t=>"subflow"===t.type);i.flowId=t?t.id:e?e.id:null}let c=null;return c=d.length?u(i.flowId):Mt(e,i),z(g,i,i.flowId),c=c||{},c.tabs=d,c.flowId=i.flowId,c.css=c.css||U(i.scope),c}function Mt(t,i){t=et(t);const n=(i=it(i)).container,A={},g={},d={},c={},l={},I=(i=i||{}).flowId,L=j("junction");let N=!1;const y=tt(t).find(t=>t.id===I);y&&"tab"===y.type&&(N=y.disabled);let w=n&&n.querySelector("svg");w=w||O(n),H(w,i.layer);const b=(i.svgLayer||w).querySelector(".flow_grid");i.gridLines&&b&&B(b),t.forEach(function(t){if("subflow"===t.type){g["subflow:"+t.id]=t;for(let e=0;e0&&t.wires.forEach(function(t){t.forEach(function(t){l[t]=!0})})});const x=(i.svgLayer||w).querySelector(".flow_nodes");t.forEach(function(n){if(n.z===I||n.id===I){const I=D(n),y=function(t){let e=!0;return"link out"!==t.type&&"link in"!==t.type||(e=!1),"junction"===t.type||"tab"===t.type||"subflow"===t.type||(!1===t.l?e=!1:!0===t.l&&(e=!0)),e}(n),w=!i.labels,b=j(n.type);switch(n.type){case"tab":case"ui_spacer":case"ui-spacer":break;case"group":d[n.id]=n;break;case"subflow":c[n.id]={...n};for(let t=0;t1?18:16)+")"});let t=0;c.lines.forEach(function(e){const i=k("text",{y:t,class:"node-text-label"});i.textContent=e,j.appendChild(i),t+=20})}const D=k("g",{"data-node-id":n.id,class:"node"});x.appendChild(D),y&&j&&D.appendChild(j);const p=y?j?.getBBox():{width:0,height:0},C=p.width,m=p.height+13.5,T=y?I.width>C?I.width:C:I.width,S=y?I.height>m?I.height:m:I.height,z={x:n.x,y:n.y,w:T,h:S,outputs:(n.wires||[]).length},h=!!l[n.id];try{y?(z.w=Math.max(e,20*Math.ceil((c.width+48+(h?7:0))/20)),z.h=Math.max(6+24*c.lines.length,15*(z.outputs||0),30)):(z.w=30,z.h=Math.max(30,15*(z.outputs||0)))}catch(t){}if(z.outputs>2&&y&&j&&z.h>m){const t=(z.h-m)/2;j.setAttributeNS(null,"transform","translate(38,"+((c.lines.length>1?16:14)+t)+")")}w&&j&&(j.style.display="none"),D.prepend(k("rect",{...b,rx:5,ry:5,fill:d.color||b.fill,width:z.w,height:z.h,class:"node node-"+n.id})),D.appendChild(k("path",{d:"M5 0 h25 v"+z.h+" h-25 a 5 5 0 0 1 -5 -5 v-"+(z.h-10)+" a 5 5 0 0 1 5 -5",fill:"rgb(0,0,0)","fill-opacity":.05,stroke:"none"})),y&&D.appendChild(k("path",{d:"M 29.5 0.5 l 0 "+(z.h-1),fill:"none",stroke:"rgb(0,0,0)","stroke-opacity":.1,"stroke-width":"1px"}));const f=o.view.tools.calculateGridSnapOffsets(z),v=n.x-z.w/2-f.x,E=n.y-z.h/2-f.y;if(D.setAttribute("transform",`translate(${v}, ${E})`),n.bbox=D.getBBox(),n.bbox.x=v,n.bbox.y=E,i.images){const t={x:0,y:Math.max(z.h/2-15,0),width:30,height:30},e=function(t){let e=u[t];return e||(t.startsWith("subflow:")?e=u.subflow:t.startsWith("ui-")?e=u["ui-template"]:t.startsWith("ui_")&&(e=u.ui_template)),e&&s[e]||""}(n.type);if(e)D.appendChild(k("image",{href:e,...t}));else if(n.type.startsWith("subflow:")){const e=d.icon&&s[d.icon]||s["subflow.svg"];D.appendChild(k("image",{href:e,...t}))}}(d.in&&d.in.length>0||l[n.id])&&(i.arrows?D.appendChild(k("path",{...L,transform:"translate(-3,"+(n.bbox.height/2-5)+")",d:i.arrows?"M 0,10 9,5 0,0 Z":"M -1,9.5 8,9.5 8,0.5 -1,0.5 Z",class:"red-ui-flow-port-input input-arrows","stroke-linecap":"round","stroke-linejoin":"round"})):D.appendChild(k("rect",{...L,transform:"translate(-5,"+(n.bbox.height/2-5)+")",...a,...r,class:"red-ui-flow-port-input"})));const O={...L,...a,...r,class:"red-ui-flow-port"};if(n.wires&&Array.isArray(n.wires)){const t=1===n.wires.length?n.bbox.height/2-5:n.wires.length%2==0?3.5:4.5;for(let e=0;e0;){h-=1;for(const t in d){if(T.indexOf(t)>-1)continue;const e=d[t];let i=0,n=0,M=!1;if(e.nodes.forEach(function(t){const o=(A[t]||{}).bbox;o?(i=Math.max(i,o.x-e.x+o.width),n=Math.max(n,o.y-e.y+o.height)):M=!0}),M)continue;const o=k("g",{"data-node-id":t});o.setAttribute("transform",`translate(${e.x}, ${e.y})`),o.appendChild(k("rect",{rx:5,ry:5,width:e.w,height:e.h,fill:"none","fill-opacity":0,"stroke-width":2,stroke:"grey",class:"group-"+e.id,...e.style})),m.prepend(o);const a=A[t];a.bbox=o.getBBox(),a.bbox.x=e.x,a.bbox.y=e.y;const r=k("g",{});if(o.appendChild(r),e.style.label&&e.name){const t=e.style["label-position"]||"nw",i=J(e.name,"group-text-label");let n=0,M=0,o="start";if(M="n"===t[0]?15:a.bbox.height-5-16*(i.lines.length-1),"w"===t[1]?(n=5,o="start"):"e"===t[1]?(n=a.bbox.width-5,o="end"):(n=a.bbox.width/2,o="middle"),r.setAttribute("transform",`translate(${n}, ${M})`),r.setAttribute("text-anchor",o),i){let t=0;i.lines.forEach(function(i){const n=k("text",{class:"group-text-label",x:0,y:t,fill:e.style.color||"grey"});n.textContent=i,r.appendChild(n),t+=16})}}T.push(t)}}const f=(i.svgLayer||w).querySelector(".flow_wires"),v=[],E=Object.keys(c);for(let t=0;t2&&e.splice(2);const n=new Map,M=Q(function(t,e){const i=W(t),n=W(e),M={},o={},A={},a={},r={};return Object.keys(i.all).forEach(function(t){if(!N(n.all,t))return void(o[t]=!0);const e=JSON.stringify(i.all[t]),M=JSON.stringify(n.all[t]);if(e!==M)if(A[t]=!0,i.all[t].z!==n.all[t].z)r[t]=!0;else if(i.all[t].x!==n.all[t].x||i.all[t].y!==n.all[t].y||i.all[t].w!==n.all[t].w||i.all[t].h!==n.all[t].h){const i=JSON.parse(e),n=JSON.parse(M);delete i.x,delete i.y,delete i.w,delete i.h,delete n.x,delete n.y,delete n.w,delete n.h,JSON.stringify(i)===JSON.stringify(n)&&(a[t]=!0)}}),Object.keys(n.all).forEach(function(t){N(i.all,t)||(M[t]=!0)}),{currentConfig:i,newConfig:n,added:M,deleted:o,changed:A,positionChanged:a,moved:r}}(e[0],e[1]));M.changes.forEach(t=>{t.highlight=e=>function(t=-1,e){clearTimeout(L),clearTimeout(j);g.querySelectorAll(".red-ui-tab").forEach(t=>t.classList.remove("tab-glow"));s.querySelectorAll("g[data-node-id]").forEach(t=>{t.style.filter=""});const i=g.querySelector(".red-ui-tab.active").getAttribute("data-flow-id");let n=e.tab;"moved"===e.diffType&&(-1===t?t=e.v1:0===t?n=e.value1:1===t&&(n=e.value2));"added"===e.diffType&&-1===t?t=1:("deleted"===e.diffType&&-1===t||-1===t)&&(t=0);const M=g.querySelector(`.red-ui-tab[data-flow-id="${n}"]`);("tab"===e.item&&"changed"===e.diffType||n!==i)&&M&&(M.click(),M.classList.add("tab-glow"),j=setTimeout(()=>{M.classList.remove("tab-glow")},1e4));if(parseInt(c.value)<10||parseInt(c.value)>90){const e=0===t?10:90;!async function(){let t=parseInt(c.value);const i=e>t?1:-1;for(;t!==e;){t+=i,c.value=t;const e=new Event("input",{bubbles:!0});c.dispatchEvent(e),await new Promise(t=>setTimeout(t,10))}}()}const o=[e.item,e.tab][0],A=s.querySelector(`g.flow-layer-0 g[data-node-id="${o}"]`),a=s.querySelector(`g.flow-layer-1 g[data-node-id="${o}"]`);if(!A&&!a)return;(A||a).scrollIntoView({behavior:"smooth",block:"center",inline:"center"}),A&&(A.style.filter="url(#node-glow)");a&&(a.style.filter="url(#node-glow)");L=setTimeout(()=>{try{A&&(A.style.filter=""),a&&(a.style.filter="")}catch(t){}},1e4)}(e,t)}),M.tabMap=n;const o=w((i=it(i)).document,t.document,i.container,this),A=i.container;G(o,i.scope);const a=i.zoom,r=i.gridLines;for(i.zoom=!1,i.gridLines=!1;A.firstChild;)A.removeChild(A.firstChild);const g=Y("div",null,"red-ui-tabs",null,A),u=v(A),s=O(u,{addDefaultLayer:!1}),d=[...s.childNodes].find(t=>"g"===t.tagName&&t.classList.contains("outerContainer")),c=function(t){if(!w(t,this))return null;let e=t.querySelector(".toolbar");e||(e=E(t));let i=e.querySelector(".compare-controls");if(i)return e.querySelector(".flow-compare-slider");i=Y("div",null,"button-group compare-controls",null,e);const n=Y("input",null,"flow-compare-slider",null,i);return n.type="range",n.min="0",n.max="100",n}(A);c.type="range",c.min=0,c.max=100,c.value=0,c.step=5,c.style.width="100%",c.classList.add("flow-compare-slider");const l=A,I=u;f(s);for(let t=0;t{const M=n[0],o=n[1],u={...i,flowId:M,container:null,layers:o};!function(e,i,n){const M=w(i.document,t.document,A,this),o=i.layers;for(const t of Object.values(o)){const A=t.tab,a=A.label,r=`red-ui-tab-${t.index}`,g=`red-ui-tab-${A.id}`;let u=e.querySelector(`.${g}`);u||(u=M.createElement("div"),e.appendChild(u),u.classList.add("red-ui-tab"),u.classList.add(r),u.classList.add(g),u.classList.add("red-ui-tab-"+o.type),u.setAttribute("data-flow-id",A.id));let d=u.querySelector(`.red-ui-tab-label-${t.index}`);if(d||(d=M.createElement("div"),d.classList.add(`red-ui-tab-label-${t.index}`)),d.classList.add("red-ui-tab-label"),d.setAttribute("data-layer",t.index),d.style.opacity=0,u.appendChild(d),A.disabled){d.classList.add("disabled");const t=M.createElement("i");t.classList.add("red-ui-tab-disabled-icon"),d.appendChild(t)}else if("subflow"===A.type){const t=M.createElement("i");t.classList.add("red-ui-tab-subflow-icon"),d.appendChild(t)}d.title=a;const c=M.createElement("span");c.textContent=a,d.appendChild(c),u.onclick=function(t){z(s,i,i.flowId),n(i),h(s,i,A.id)}}}(g,u,function(t){g.querySelectorAll(".red-ui-tab").forEach(t=>t.classList.remove("active"));g.querySelector(`[data-flow-id="${t.flowId}"]`).classList.add("active");const n=Object.values(t.layers),M={0:!0,1:!0};n.forEach(t=>{t.svgLayer.setAttribute("opacity",0);const i=t.renderOptions;Mt(e[i.index]||[],i),M[i.index]=!1});const o=M[0]||M[1],u={...i,flowId:t.flowId,container:o?.container||o?.flowRenderer||A};if(M[0]&&(u.layer=0,u.svgLayer=s.querySelector("g.flow-layer-0"),Mt(e[0]||[],u)),M[1]&&(u.layer=1,u.svgLayer=s.querySelector("g.flow-layer-1"),Mt(e[1]||[],u)),a&&C(s,A),r){let t=[...d.childNodes].find(t=>"g"===t.tagName&&t.classList.contains("flow_grid"));t||(t=k("g",{class:"flow_grid"}),d.insertBefore(t,s.firstChild)),t&&B(t)}D()})}),c.addEventListener("input",function(t){D()});let L=null,j=null;function D(){const t=parseInt(c.value),i=[1-t/100,t/100];i.forEach((t,e)=>{t=t>.05?b(t+.15,0,1):t;const i=function(t,e){return t.querySelector(`g.flow-layer-${e||0}`)}(s,e);i?.setAttribute("opacity",t)});g.querySelectorAll(".red-ui-tab-label").forEach((t,n)=>{let M=parseInt(t.getAttribute("data-layer"));(isNaN(M)||M<0||M>=e.length)&&(M=0),t.style.opacity=i[M]||0})}const y=g.querySelector(".red-ui-tab");y&&y.click(),n.size>0?A.classList.add("has-tabs"):A.classList.remove("has-tabs");const x=p(s.parentElement);return x.hasHorizontalScrollbar||x.hasVerticalScrollbar?A.classList.add("has-scrollbars"):A.classList.remove("has-scrollbars"),M},renderFlows:nt,renderFlow:Mt,normaliseOptions:it,getStyles:U}};"object"==typeof module&&module.exports?module.exports=FlowRenderer:"object"==typeof window?window.FlowRenderer=FlowRenderer:global.FlowRenderer=FlowRenderer;export default FlowRenderer; \ No newline at end of file From c6fe61aa1ea8ab7ce7ef076e30fc6144d62975e3 Mon Sep 17 00:00:00 2001 From: Nicolas Date: Wed, 11 Mar 2026 00:02:41 +0100 Subject: [PATCH 3/3] Add victron node naming. --- index.js | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++ index.min.js | 2 +- 2 files changed, 160 insertions(+), 1 deletion(-) diff --git a/index.js b/index.js index 5f36fb0..c1a20c0 100644 --- a/index.js +++ b/index.js @@ -2836,6 +2836,105 @@ const FlowRenderer = function () { return lbl || obj.type } + const victronPaletteLabelByType = { + 'victron-virtual-switch': 'Virtual Switch', + 'victron-virtual': 'Virtual Device', + 'victron-inject': 'Inject Notification', + 'vrm-api': 'VRM API', + + 'victron-input-accharger': 'AC Charger', + 'victron-input-acload': 'AC Load', + 'victron-input-acsystem': 'AC System', + 'victron-input-alternator': 'Alternator', + 'victron-input-battery': 'Battery Monitor', + 'victron-input-dcdc': 'DC-DC', + 'victron-input-dcload': 'DC Load', + 'victron-input-dcsource': 'DC Source', + 'victron-input-dcsystem': 'DC System', + 'victron-input-dess': 'Dynamic ESS', + 'victron-input-digitalinput': 'Digital Input', + 'victron-input-ess': 'ESS', + 'victron-input-evcharger': 'EV Charger', + 'victron-input-fuelcell': 'Fuel cell', + 'victron-input-generator': 'Generator', + 'victron-input-gps': 'GPS', + 'victron-input-gridmeter': 'Grid Meter', + 'victron-input-inverter': 'Inverter', + 'victron-input-meteo': 'Meteo', + 'victron-input-motordrive': 'E-drive', + 'victron-input-multi': 'Multi RS', + 'victron-input-pulsemeter': 'Pulsemeter', + 'victron-input-pump': 'Pump', + 'victron-input-pvinverter': 'PV Inverter', + 'victron-input-relay': 'Relay', + 'victron-input-settings': 'Settings', + 'victron-input-solarcharger': 'Solar Charger', + 'victron-input-switch': 'Switch', + 'victron-input-system': 'System', + 'victron-input-tank': 'Tank Sensor', + 'victron-input-temperature': 'Temperature Sensor', + 'victron-input-vebus': 'VE.Bus System', + + 'victron-output-accharger': 'AC Charger Control', + 'victron-output-acsystem': 'AC System Control', + 'victron-output-battery': 'Battery Monitor Control', + 'victron-output-charger': 'Charger Control', + 'victron-output-dcdc': 'DC-DC Control', + 'victron-output-dess': 'Dynamic ESS Control', + 'victron-output-ess': 'ESS Control', + 'victron-output-evcharger': 'EV Charger Control', + 'victron-output-generator': 'GX Generator Control', + 'victron-output-inverter': 'Inverter Control', + 'victron-output-multi': 'Multi RS Control', + 'victron-output-pump': 'Pump Control', + 'victron-output-pvinverter': 'PV Inverter Control', + 'victron-output-relay': 'Relay Control', + 'victron-output-settings': 'Settings Control', + 'victron-output-solarcharger': 'Solar Charger Control', + 'victron-output-switch': 'Switch Control', + 'victron-output-vebus': 'VE.Bus System Control', + + 'victron-input-custom': 'Custom Input', + 'victron-output-custom': 'Custom Control' + + } + + const victronLabelFunct = (node, subflowObj, flowdata) => { + + let altName='' + if (node.serviceObj && node.path) { + var svc = node.serviceObj.name; + var path = node.pathObj.name; + altName = "".concat(svc, " | ").concat(path); + } + if (node.device) { + altName = "Virtual " + node.device; + } + + if (node.type == 'vrm-api') { + altName = node.api_type + switch (node.api_type) { + case 'users': { + altName += ' - ' + (node.usersQuery || 'me') + } + break; + case 'installations': { + if ( node.installations === 'stats' ) { + altName += ' - Stats: ' + node.attribute + } else { + altName += ' - ' + node.installations + } + } + break; + case 'widgets': { + altName += ' - ' + node.widgets + } + } + } + + return node.name || altName || victronPaletteLabelByType[node.type] || node.type + } + const labelByFunct = { base64: undefined, batch: undefined, @@ -2913,6 +3012,66 @@ const FlowRenderer = function () { DrawSVG: undefined, GetFlows: undefined, + 'victron-virtual-switch': victronLabelFunct, + 'victron-virtual': victronLabelFunct, + 'victron-inject': victronLabelFunct, + 'vrm-api': victronLabelFunct, + + 'victron-input-accharger': victronLabelFunct, + 'victron-input-acload': victronLabelFunct, + 'victron-input-acsystem': victronLabelFunct, + 'victron-input-alternator': victronLabelFunct, + 'victron-input-battery': victronLabelFunct, + 'victron-input-dcdc': victronLabelFunct, + 'victron-input-dcload': victronLabelFunct, + 'victron-input-dcsource': victronLabelFunct, + 'victron-input-dcsystem': victronLabelFunct, + 'victron-input-dess': victronLabelFunct, + 'victron-input-digitalinput': victronLabelFunct, + 'victron-input-ess': victronLabelFunct, + 'victron-input-evcharger': victronLabelFunct, + 'victron-input-fuelcell': victronLabelFunct, + 'victron-input-generator': victronLabelFunct, + 'victron-input-gps': victronLabelFunct, + 'victron-input-gridmeter': victronLabelFunct, + 'victron-input-inverter': victronLabelFunct, + 'victron-input-meteo': victronLabelFunct, + 'victron-input-motordrive': victronLabelFunct, + 'victron-input-multi': victronLabelFunct, + 'victron-input-pulsemeter': victronLabelFunct, + 'victron-input-pump': victronLabelFunct, + 'victron-input-pvinverter': victronLabelFunct, + 'victron-input-relay': victronLabelFunct, + 'victron-input-settings': victronLabelFunct, + 'victron-input-solarcharger': victronLabelFunct, + 'victron-input-switch': victronLabelFunct, + 'victron-input-system': victronLabelFunct, + 'victron-input-tank': victronLabelFunct, + 'victron-input-temperature': victronLabelFunct, + 'victron-input-vebus': victronLabelFunct, + + 'victron-output-accharger': victronLabelFunct, + 'victron-output-acsystem': victronLabelFunct, + 'victron-output-battery': victronLabelFunct, + 'victron-output-charger': victronLabelFunct, + 'victron-output-dcdc': victronLabelFunct, + 'victron-output-dess': victronLabelFunct, + 'victron-output-ess': victronLabelFunct, + 'victron-output-evcharger': victronLabelFunct, + 'victron-output-generator': victronLabelFunct, + 'victron-output-inverter': victronLabelFunct, + 'victron-output-multi': victronLabelFunct, + 'victron-output-pump': victronLabelFunct, + 'victron-output-pvinverter': victronLabelFunct, + 'victron-output-relay': victronLabelFunct, + 'victron-output-settings': victronLabelFunct, + 'victron-output-solarcharger': victronLabelFunct, + 'victron-output-switch': victronLabelFunct, + 'victron-output-vebus': victronLabelFunct, + + 'victron-input-custom': victronLabelFunct, + 'victron-output-custom': victronLabelFunct, + _default: defaultLabelFunct } diff --git a/index.min.js b/index.min.js index e692afd..1ea3539 100644 --- a/index.min.js +++ b/index.min.js @@ -1 +1 @@ -const FlowRenderer=function(){const t=this||{},e=100,i=8e3,n=8e3,M=13.5,o={view:{}};o.view.tools={},o.utils={},o.view.gridSize=function(){return 20},o.view.tools.calculateGridSnapOffsets=function(t,e){0;e=e||{align:"nearest"};const i={x:0,y:0},n=o.view.gridSize(),M=t.x-(n*Math.round((t.x-t.w/2)/n)+t.w/2),A=t.x-(n*Math.round((t.x+t.w/2)/n)-t.w/2);i.x=A,"right"===e.align||("left"===e.align||Math.abs(M)t.clientWidth,hasVerticalScrollbar:t.scrollHeight>t.clientHeight}}function C(t,e){let i=1;const n=t.getAttribute("transform");if(n){const t=n.match(/scale\(([^,]+)\)/);t&&(i=b(parseFloat(t[1]||1),.25,3,1))}const M=t.querySelector("g.outerContainer");m(M,i,!0),e.onwheel=function(t){if(t.ctrlKey||t.metaKey){t.preventDefault();let e=x(M);e-=.075*Math.sign(t.deltaY),e=b(e,.2,3,1),m(M,e)}};const o=function(t){const e=w(t,this);if(!e)return null;let i=t.querySelector(".toolbar");i||(i=E(t));let n=i.querySelector(".zoom-controls");if(n)return{zoomIn:i.querySelector(".zoom-in"),zoomOut:i.querySelector(".zoom-out"),zoomReset:i.querySelector(".zoom-reset")};n=e.createElement("div"),n.classList.add("zoom-controls"),n.classList.add("button-group");const M=e.createElement("button");M.classList.add("red-ui-footer-button","icon-button-bg","zoom-in"),M.innerHTML="+",M.title="Zoom In (Ctrl + Mouse Wheel Up)";const o=e.createElement("button");o.classList.add("red-ui-footer-button","icon-button-bg","zoom-reset"),o.title="Zoom & Scroll Reset";const A=e.createElement("button");A.classList.add("red-ui-footer-button","icon-button-bg","zoom-out"),A.innerHTML="-",A.title="Zoom Out (Ctrl + Mouse Wheel Down)",n.appendChild(A),n.appendChild(o),n.appendChild(M),i&&i.appendChild(n);return{zoomIn:M,zoomOut:A,zoomReset:o}}(e);o.zoomIn.onclick=function(){const t=b(x(M)+.1,.2,3,1);m(M,t)},o.zoomOut.onclick=function(){const t=b(x(M)-.1,.2,3,1);m(M,t)},o.zoomReset.onclick=function(){!function(t){const e=t.getAttribute("_scale_original")||1;m(t,e)}(M),function(t){t.scrollLeft=t.getAttribute("_scroll_x")||0,t.scrollTop=t.getAttribute("_scroll_y")||0}(e.querySelector(".red-ui-workspace-chart"))}}function x(t){return parseFloat(t.getAttribute("_scale_current")||1)}function m(t,e,M=!1){t.setAttribute("transform",`scale(${e})`);const o=t.ownerSVGElement||t;o.style.width=i*e+"px",o.style.height=n*e+"px",t.setAttribute("_scale_current",e),M&&t.setAttribute("_scale_original",e)}function T(t,e,i,n=!1){t.scrollLeft=e,t.scrollTop=i,n&&(t.setAttribute("_scroll_x",e),t.setAttribute("_scroll_y",i))}function S(t,e,M){const o=M.autoZoom||M.autoScroll?function(t,e){const M=.2,o=1,A=e.container.querySelector(".red-ui-workspace-chart"),a=A.getBoundingClientRect(),r=a.width-25,g=a.height-25;let u=i,s=n,d=0,c=0;const l=e.flowId,I=t.filter(t=>"tab"!==t.type&&"subflow"!==t.type&&t.z===l);if(0===I.length)return{scale:1,scrollX:0,scrollY:0};for(const t of I){if("tab"===t.type||"subflow"===t.type||"junction"===t.type)continue;const e=t.x||0,i=t.y||0,n=D(t),M=(n.width||100)/2,o=(n.height||30)/2,A=e-M,a=i-o,r=e+M,g=i+o;u=Math.min(u,A),s=Math.min(s,a),d=Math.max(d,r),c=Math.max(c,g)}let L=1;const N=d-u,j=c-s,y=r/N,w=g/j;(N>r||j>g)&&(L=Math.min(y,w),L*=.95);L=b(L,M,o,1);let p=u,C=s;p<50&&(p=0);C<40&&(C=0);p>0&&(p-=50);C>0&&(C-=40);return p=b(p*L,0,A.scrollWidth),C=b(C*L,0,A.scrollHeight),{scale:L,scrollX:p,scrollY:C,minX:u,minY:s,maxX:d,maxY:c}}(e,M):null;if(t=t.ownerSVGElement||t,M.zoom&&o&&M.autoZoom){m(t.querySelector("g.outerContainer"),o.scale,!0)}return o&&M.autoScroll&&T(t.parentElement,o.scrollX,o.scrollY,!0),o}function z(t,e,i){const n=t.parentElement,M=t.querySelector("g.outerContainer"),o=n.scrollLeft,A=n.scrollTop,a=x(M),r=i||e.flowId||"global";n.setAttribute(`data-tab-${r}-x`,o),n.setAttribute(`data-tab-${r}-y`,A),n.setAttribute(`data-tab-${r}-scale`,a)}function h(t,e,i){const n=t.parentElement,M=t.querySelector("g.outerContainer"),o=i||e.flowId||"global",A=n.getAttribute(`data-tab-${o}-x`),a=n.getAttribute(`data-tab-${o}-y`),r=n.getAttribute(`data-tab-${o}-scale`);"string"==typeof A&&"string"==typeof a&&T(n,A,a),"string"==typeof r&&m(M,r)}function f(t){const e=t.parentElement,i=t.querySelector("g.outerContainer");for(const t in i.dataset)/^tab-\w+-.*/.test(t)&&e.removeAttribute(t)}function v(t){const e=w(t,this).createElement("div");return e.classList.add("red-ui-workspace-chart"),t?(t.appendChild(e),e):e}function E(t){const e=w(t,this);if(!e)return null;let i=t.querySelector(".toolbar");return i||(i=e.createElement("div"),i.classList.add("toolbar"),t&&t.appendChild(i),i)}function O(t,{addDefaultLayer:e=!0,layer:M=0}={}){const o=w(t,this),A=o.createElementNS("http://www.w3.org/2000/svg","svg");A.setAttribute("style",`width:${i}px; height:${n}px;`),t.appendChild(A);const a=o.createElementNS("http://www.w3.org/2000/svg","defs");A.appendChild(a);a.innerHTML='\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ';const r=k("g",{class:"outerContainer"});return A.appendChild(r),e&&Z(A,{layer:M}),A}function k(t,e,i){const n=w(i,this).createElementNS("http://www.w3.org/2000/svg",t);if("object"==typeof e)for(const t in e)n.setAttribute(t,e[t]);return i&&i.appendChild(n),n}function Z(t,{layer:e=0,opacity:i=1}={}){let n=t.querySelector("g.outerContainer");n||(n=k("g",{class:"outerContainer"},t)),n.querySelector("g.flow_grid")||k("g",{class:"flow_grid"},n);let M=n.querySelector(`g.flow-layer-${e}`);for(M||(M=k("g",{class:`flow-layer-${e||0}`},n));M.firstChild;)M.removeChild(M.firstChild);return M.setAttribute("opacity",i),k("g","flow_group_elements",M),k("g","flow_group_select",M),k("g","flow_wires",M),k("g","flow_nodes",M),M}function B(t){if(t.childNodes.length>0)return;k("rect",{width:`${i}px`,height:`${n}px`,fill:"url(#grid)"},t).style.transform="translate(-1px, -1px)"}function Y(t,e,i,n,M){const o=w(M,this).createElement(t);if("object"==typeof e)for(const t in e)o.setAttribute(t,e[t]);return i&&"string"==typeof i?o.classList.add(...i.split(" ")):Array.isArray(i)&&o.classList.add(...i),"string"==typeof n&&(o.textContent=n),M&&M.appendChild(o),o}function Q(t){const e=[],i={},n=new Set([...Object.keys(t.changed),...Object.keys(t.added),...Object.keys(t.deleted),...Object.keys(t.moved),...Object.keys(t.positionChanged)]),M=t.currentConfig,o=t.newConfig;function A(e,i,n,M,o,A){const a={tab:e,item:i,diffType:n,prop:M,value1:o,value2:A,toString:()=>""},r=t=>t?`'${t}'`:"''",g=t=>t?r(function(t,e,i){const n=$[t.type]||$._default,M=e&&e[t.type]||{};return n(t,M,i)}(t)):"'n/a'",u=t.currentConfig.all[e]||t.newConfig.all[e],s=g(u),d=t.currentConfig.all[i]||t.newConfig.all[i],c="tab"===i?u:t.currentConfig.all[i],l="tab"===i?u:t.newConfig.all[i],I="tab"===i?"tab":"node",L=/wires\[\d+\]/.test(M);let N="";L&&(a.value1&&!a.value2?N=`had wire removed from ${g(c)}`:!a.value1&&a.value2&&(N=`was wired up to ${g(l)}`));const j=o&&("z"===M||/wires\[\d+\]/.test(M))?t.currentConfig.all[o]:null,D=A&&("z"===M||/wires\[\d+\]/.test(M))?t.newConfig.all[A]:null;return a.toString=function(){const t=[];switch(n){case"deleted":t.push("deleted",I,g(d));break;case"added":t.push("added",I,g(d));break;case"moved":t.push(g(d),"moved from ",g(j),"to",g(D));break;case"changed":"g"===M?o&&!A?t.push(s,g(d),"was removed from group",r(g(o))):!o&&A?t.push(s,g(d),"was added to group",r(g(A))):t.push(s,g(d),"moved group from",r(o),"to",r(A)):L?t.push(s,g(d),N):"tab"===i?t.push("tab",s,"property",r(a.prop),"was",r(a.value1||"")+", now",r(a.value2||"")):t.push(g(d),"property",r(a.prop),"was",r(a.value1||""),"now",r(a.value2||""));break;case"positionChanged":t.push(g(d),"moved from",a.value1,"to",a.value2);break;default:t.push(s,g(d),r(a.prop),"was",r(a.value1||""),"now",r(a.value2||""))}return t.join(" ")},a}function a(t,e){const i=t.currentConfig.all,M=t.newConfig.all,o=[];if(!e.v1||!e.v2)return e.v1&&o.push(A(e.id,e.id,"tab","deleted",e.v1,null)),e.v2&&o.push(A(e.id,e.id,"tab","added",null,e.v2)),o;const a=e.v1?.tab?{...e.v1.tab.n}:{};a.order=e.v1?.order;const g=e.v2?.tab?{...e.v2.tab.n}:{};g.order=e.v2?.order;const u=e.v1?.tab?.nodes||[],s=e.v2?.tab?.nodes||[];o.push(...r(e.id,"tab","","changed",a,g));const d=u.map(t=>t.id),c=s.map(t=>t.id),l=new Set([...d,...c].filter(t=>n.has(t))),I=t=>"number"!=typeof t?null:t,L=(t,e)=>{const i={...e};for(const e of t)delete i[e];return i};for(const n of l){const A=i[n],a=M[n],g=!(!A||!a);if(t.deleted[n])o.push(...r(e.id,n,"","deleted",A,a));else if(t.added[n])o.push(...r(e.id,n,"","added",A,a));else if(g){let i=!0;if(t.moved[n]&&o.push(...r(e.id,n,"","moved",{z:A.z},{z:a.z})),t.positionChanged[n]){i=!1;const t={x:I(A.x),y:I(A.y)},M={x:I(a.x),y:I(a.y)},g=JSON.stringify(t),u=JSON.stringify(M);o.push(...r(e.id,n,"position","positionChanged",g,u))}if(i){const t=L(["x","y","z","w","h"],A),i=L(["x","y","z","w","h"],a);o.push(...r(e.id,n,"","changed",t,i))}}}return o}function r(t,e,i,n,M,o){const a=[];if("deleted"===n)a.push(A(t,e,n,i,M?"":"deleted",o?"":"deleted"));else if("added"===n)a.push(A(t,e,n,i,M?"added":"",o?"added":""));else if(typeof M!=typeof o)a.push(A(t,e,"changed",i,M||"",o||""));else if(Array.isArray(M))for(let A=0;A{const e=`${"z"===t.prop&&"moved"===t.diffType?"*":t.tab}-${t.item}-${t.diffType}-${t.prop}-${t.value1}-${t.value2}`;return!g.has(e)&&(g.add(e),!0)})}()),{get changes(){return e},get diff(){return t},get tabs(){return i},getNodeInfo:t=>({propertiesChanged:e.filter(e=>e.itemId===t&&e.tab!==t),v1:M.all[t],v2:o.all[t]}),getTabInfo:t=>({propertiesChanged:e.filter(e=>e.tab===t&&"tab"===e.itemId),nodesChanged:e.filter(e=>e.tab===t&&"tab"!==e.itemId),v1:i[t],v2:i[t]})}}function U(t){t&&t.length&&"string"!=typeof t&&"string"==typeof t[0]&&(t=[...t].join(" "));return`\n :root {\n --red-ui-view-grid-color: #eee;\n --red-ui-view-border: 1px solid #bbbbbb;\n --red-ui-node-border: #999;\n --red-ui-node-port-background: #d9d9d9;\n --red-ui-workspace-button-color: #333;\n --red-ui-workspace-button-background: #f3f3f3;\n\n --red-ui-primary-font: Helvetica Neue, Arial, Helvetica, sans-serif;\n --red-ui-primary-font-size: 14px;\n --red-ui-monospace-font: Menlo, Consolas, DejaVu Sans Mono, Courier, monospace;\n --red-ui-primary-background: #f3f3f3;\n\n --red-ui-form-background: #fff;\n --red-ui-form-placeholder-color: #aaa;\n --red-ui-form-text-color: #555;\n --red-ui-form-text-color-disabled: #bbb;\n --red-ui-form-input-focus-color: rgba(85, 150, 230, 0.8);\n --red-ui-form-input-border-color: #ccc;\n --red-ui-form-input-border-selected-color: #aaa;\n --red-ui-form-input-border-error-color: rgb(214, 97, 95);\n --red-ui-form-input-background: #fff;\n --red-ui-form-input-background-disabled: #f9f9f9;\n --red-ui-form-button-background: #efefef;\n\n --red-ui-diff-state-color: #555;\n --red-ui-diff-state-prefix-color: #888;\n --red-ui-diff-state-added: #009900;\n --red-ui-diff-state-deleted: #f80000;\n --red-ui-diff-state-changed: #f89406;\n --red-ui-diff-state-moved: #3f81b3;\n }\n ${t=(t=t||".flow-renderer").split(" ").map(t=>`.${t}`).join(" ").trim()} .diff-table {\n width: 100%;\n font-size: var(--red-ui-primary-font-size);\n font-family: var(--red-ui-primary-font);\n }\n ${t} .diff-table thead tr {\n font-weight: bold;\n padding: 2px 4px;\n /* bottom border only */\n border-bottom: 3px solid #ddd;\n }\n ${t} .diff-table td {\n padding: 2px 4px;\n border-bottom: 1px solid #ddd;\n }\n ${t} .diff-table .diff-info {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n ${t} .diff-value button {\n height: 20px;\n width: 20px;\n padding: 1px;\n }\n ${t} .diff-value span {\n margin-left: 4px;\n margin-top: 2px;\n }\n ${t} .diff-type {\n height: 14px;\n width: 14px;\n margin: 2px;\n }\n ${t} .diff-type-text {\n flex-grow: 1;\n }\n ${t} .diff-type-moved {\n background-color: var(--red-ui-diff-state-moved);\n }\n ${t} .diff-type-added {\n background-color: var(--red-ui-diff-state-added);\n }\n ${t} .diff-type-deleted {\n background-color: var(--red-ui-diff-state-deleted);\n }\n ${t} .diff-type-changed {\n background-color: var(--red-ui-diff-state-changed);\n }\n ${t} .diff-type-positionChanged {\n background-color: var(--red-ui-diff-state-changed);\n }\n\n .red-ui-editor {\n font-size: var(--red-ui-primary-font-size);\n font-family: var(--red-ui-primary-font);\n padding: 0;\n margin: 0;\n background: var(--red-ui-primary-background);\n color: var(--red-ui-primary-text-color);\n line-height: 20px\n }\n ${t} {\n position: relative;\n }\n /* Source view */\n ${t} pre.red-ui-workspace-source {\n height: 100%;\n overflow: auto;\n width: 100%;\n font-family: var(--red-ui-monospace-font);\n background-color: #f7f7f7;\n }\n /* Chart view */\n ${t} .red-ui-workspace-chart {\n box-sizing: border-box;\n border: var(--red-ui-view-border);\n border-radius: 0 4px 4px 4px;\n overflow: scroll;\n height: 100%;\n width: 100%;\n }\n ${t} div.red-ui-footer {\n height: 20px\n }\n ${t}.has-tabs div.red-ui-workspace-chart {\n height: calc(100% - 34px);\n }\n ${t} svg {\n position: relative;\n width: 100%;\n height: 100%;\n min-height: 250px;\n margin: auto;\n display: block;\n border-radius: 2px;\n }\n ${t} svg {\n cursor: default;\n }\n ${t} svg .group-text-label {\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 14px;\n }\n ${t} svg .node-text-label {\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 14px;\n dominant-baseline: middle;\n }\n ${t} svg .subflow-node-text-label {\n color: rgb(85, 85, 85);\n dominant-baseline: middle;\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 10px;\n line-height: 20px;\n pointer-events: none;\n text-anchor: middle;\n user-select: none\n }\n ${t} svg .subflow-node-text-label-number {\n color: rgb(85, 85, 85);\n dominant-baseline: middle;\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 16px;\n line-height: 20px;\n pointer-events: none;\n text-anchor: middle;\n user-select: none\n }\n\n ${t} svg .node {\n fill-opacity: 1;\n stroke-width: 1px;\n }\n ${t} svg .link {\n stroke: #999;\n stroke-width: 3;\n fill: none;\n }\n ${t} svg .link-highlight, .node-highlight {\n stroke: rgb(255, 127, 14);\n }\n ${t} svg .node-highlight {\n stroke-width: 3px;\n }\n ${t} .tab-glow {\n border-radius: 2px;\n animation: tab-glow-animation 1s infinite;\n }\n @keyframes tab-glow-animation {\n 0% {\n box-shadow: 0 0 0px 0px #7d26cddd;\n }\n 50% {\n box-shadow: 0 0 10px 5px #7d26cddd;\n }\n 100% {\n box-shadow: 0 0 0px 0px #7d26cddd;\n }\n }\n\n ${t} svg .node-disabled {\n stroke-dasharray: 8,3;\n fill-opacity: 0.5;\n }\n ${t} svg .group-highlight {\n stroke: rgb(255, 127, 14);\n stroke-width: 4px;\n fill: rgb(255, 127, 14);\n fill-opacity: 0.2;\n }\n ${t} svg .link-disabled {\n stroke-dasharray: 10,8 !important;\n stroke-width: 2 !important;\n stroke: rgb(204, 204, 204);\n }\n ${t} svg .grid-line {\n shape-rendering: geometricprecision;\n stroke: rgb(238, 238, 238);\n stroke-width: 1px;\n fill: none;\n }\n ${t} svg .red-ui-flow-port {\n stroke-width: 1px;\n stroke-miterlimit: 4;\n fill: var(--red-ui-node-port-background);\n }\n ${t} svg .red-ui-flow-port-input {\n stroke-width: 1px;\n stroke-miterlimit: 4;\n fill: var(--red-ui-node-port-background);\n }\n ${t} svg .flow-render-error {\n background-color: rgb(54, 52, 52); \n color: rgb(196, 59, 59); \n width: 100%;\n }\n ${t} svg text {\n user-select: none;\n }\n ${t} .red-ui-tabs {\n display: flex;\n }\n ${t} .red-ui-tab {\n padding: 6px 12px;\n box-sizing: border-box;\n display: block;\n border: 1px solid #bbbbbb;\n border-right: none;\n background-color: #f0f0f0;\n max-width: 200px;\n max-height: 34px; /* for calculating svg height */\n height: 34px; /* for calculating svg height */\n width: 14%;\n overflow: hidden;\n white-space: nowrap;\n position: relative;\n margin-top: -1px;\n transition: 0.2s background-color;\n user-select: none;\n position: relative;\n z-index: 1;\n top: 1px;\n }\n ${t} .red-ui-tab div.red-ui-tab-label {\n position: absolute;\n top: 7px;\n left: 10px;\n }\n ${t} .red-ui-tab-subflow-icon {\n mask-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMjUgMjUuOTRoN2MuNTggMCAxLS40MiAxLTF2LTJjMC0uNTgtLjQyLTEtMS0xaC03Yy0uNTggMC0xIC40Mi0xIDF2MmMwIC41OC40MiAxIDEgMXptLTE3IDEyaDdjLjU4IDAgMS0uNDIgMS0xdi0yYzAtLjU4LS40Mi0xLTEtMUg4Yy0uNTggMC0xIC40Mi0xIDF2MmMwIC41OC40MiAxIDEgMXptLS40MTYgMTFDNS42MjQgNDguOTQgNCA0Ny4zMTUgNCA0NS4zNTZWMTQuNTIyYzAtMS45NiAxLjYyNS0zLjU4MiAzLjU4NC0zLjU4MmgyNC44MzJjMS45NiAwIDMuNTg0IDEuNjIzIDMuNTg0IDMuNTgydjMwLjgzNGMwIDEuOTYtMS42MjUgMy41ODQtMy41ODQgMy41ODR6TTMyIDM2Ljk0SDE5YzAgMi4xOS0xLjgxIDQtNCA0SDd2NC40MTZjMCAuMzUuMjM1LjU4NC41ODQuNTg0aDI0LjgzMmMuMzUgMCAuNTg0LS4yMzUuNTg0LS41ODR2LTguNDE3em0xLTJ2LTZoLThjLTIuMTkgMC00LTEuODEtNC00aC0xYy00LjMzMy0uMDAyLTguNjY3LjAwNC0xMyAwdjZoOGMyLjE5IDAgNCAxLjgxIDQgNGgxM3ptMC0xNnYtNC40MThjMC0uMzUtLjIzNS0uNTgyLS41ODQtLjU4Mkg3LjU4NGMtLjM1IDAtLjU4NC4yMzMtLjU4NC41ODJ2OC40MTdjNC4zMzMuMDAyIDguNjY3LjAwMSAxMyAuMDAxaDFjMC0yLjE5IDEuODEtNCA0LTRoOHoiIGNvbG9yPSIjMDAwIiBmaWxsPSIjZmZmIi8+PC9zdmc+Cg==);\n display: inline-block;\n background-color: grey;\n margin-left: -8px;\n margin-right: 3px;\n margin-top: -1px;\n margin-bottom: 1px;\n opacity: 1;\n width: 16px;\n height: 18px;\n vertical-align: middle;\n mask-size: contain;\n mask-position: center;\n mask-repeat: no-repeat;\n }\n ${t} .red-ui-tab-disabled-icon {\n mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25' viewBox='0 0 1536 1792' style='&%2310;'%3E%3Cscript xmlns=''/%3E%3Cpath d='M1312 893q0-161-87-295l-754 753q137 89 297 89 111 0 211.5-43.5t173.5-116.5 116-174.5 43-212.5zM313 1192l755-754q-135-91-300-91-148 0-273 73t-198 199-73 274q0 162 89 299zM1536 893q0 157-61 300t-163.5 246-245 164-298.5 61-298.5-61-245-164-163.5-246-61-300 61-299.5 163.5-245.5 245-164 298.5-61 298.5 61 245 164 163.5 245.5 61 299.5z' fill='currentColor'/%3E%3Cscript xmlns=''/%3E%3C/svg%3E");\n display: inline-block;\n background-color: grey;\n margin-left: -8px;\n margin-right: 3px;\n margin-top: 0px;\n margin-bottom: 0px;\n opacity: 1;\n width: 16px;\n height: 16px;\n vertical-align: middle;\n mask-size: contain;\n mask-position: center;\n mask-repeat: no-repeat;\n transform: translateY(-2px);\n }\n ${t} .red-ui-tab span {\n font-size: 0.875rem;\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n }\n ${t} .red-ui-tab.active {\n background-color: white;\n border-bottom-color: white;\n font-weight: bold;\n }\n ${t} .red-ui-tab.disabled {\n border-top-style: dashed;\n border-left-style: dashed;\n font-style: italic;\n }\n ${t} .red-ui-tab:first-child {\n border-radius: 4px 0 0 0;\n }\n ${t} .red-ui-tab:last-child {\n border-right: 1px solid #bbbbbb;\n border-radius: 0 4px 0 0;\n }\n ${t} .red-ui-tab:first-child:last-child {\n border-radius: 4px 4px 0 0;\n }\n ${t} .red-ui-tab:last-child.disabled {\n border-right-style: dashed;\n }\n ${t} .red-ui-tab:hover {\n cursor: pointer;\n background-color: white;\n }\n /* positioning of toolbar */\n ${t} .toolbar {\n display: flex;\n flex-direction: row;\n position: absolute;\n bottom: 5px;\n right: 5px;\n opacity: 0.6;\n }\n ${t} .toolbar:hover {\n opacity: 1;\n }\n ${t}.has-scrollbars .toolbar {\n bottom: 24px;\n right: 24px;\n }\n\n ${t} .hidden {\n display: none !important;\n }\n ${t} .toolbar .button-group.hidden {\n display: none !important;\n }\n ${t} .toolbar .icon-button-bg.view-source {\n background-image: url("${I}");\n }\n ${t} .toolbar .icon-button-bg.download-flow {\n background-image: url("${l}");\n }\n ${t} .toolbar .icon-button-bg.copy-flow {\n background-image: url("${c}");\n }\n ${t} .toolbar .icon-button-bg.zoom-reset {\n background-image: url("${d}");\n }\n ${t} .toolbar .icon-button-bg {\n background-repeat: no-repeat;\n background-position: center;\n background-size: 16px 16px; /* Size of the background SVG */\n background-color: transparent;\n padding: 4px;\n cursor: pointer;\n width: 24px;\n height: 24px;\n font-size: 0; /* Hide any default button text if present */\n line-height: 0; /* Hide any default button text if present */\n }\n\n ${t} .toolbar .icon-button-bg:hover {\n background-color: #f0f0f0;\n }\n\n /* styles for button groups and buttons */\n ${t} .button-group {\n display: flex;\n flex-direction: row;\n }\n ${t} .button-group button {\n user-select: none;\n box-sizing: border-box;\n display: inline-block;\n text-align: center;\n cursor: pointer;\n line-height: 22px;\n height: 24px;\n color: var(--red-ui-workspace-button-color) !important;\n background: var(--red-ui-workspace-button-background);\n text-decoration: none;\n border: 1px solid var(--red-ui-form-input-border-color);\n margin: 0px;\n padding: 0px;\n }\n ${t} .button-group button:not(:first-child) {\n border-top-left-radius: 0px;\n border-bottom-left-radius: 0px;\n border-left: none;\n }\n\n /* zoom controls */\n ${t} .zoom-controls.button-group button {\n font-size: 22px;\n width: 24px;\n }\n\n /* copy controls */\n ${t} .copy-controls.button-group {\n margin-right: 8px;\n }\n ${t} .copy-controls.button-group button {\n padding: 0px 4px;\n }\n\n /* source controls */\n ${t} .source-controls.button-group {\n margin-right: 8px;\n }\n ${t} .source-controls.button-group button {\n padding: 0px 4px;\n }\n\n /* compare controls */\n ${t} .compare-controls.button-group {\n margin-right: 24px;\n }\n ${t} .compare-controls input[type='range'].flow-compare-slider {\n width: 100%;\n -webkit-appearance: none;\n }\n ${t} input[type='range'].flow-compare-slider::-webkit-slider-runnable-track {\n height: 16px;\n background: var(--red-ui-workspace-button-background);\n border-radius: 16px;\n }\n /* Track: Mozilla Firefox */\n ${t} input[type='range'].flow-compare-slider::-moz-range-track {\n height: 16px;\n background: var(--red-ui-workspace-button-background);\n border-radius: 16px;\n }\n `}function G(t,e){const i="flow-renderer-css"+(e?"--"+e.toString():"").replace(/[^a-z0-9]/gi,"-").toLowerCase();let n=t.getElementById(i);n||(n=t.createElement("style"),n.id=i,n.innerHTML=U(e),t.head.appendChild(n))}function H(t,e){if(t){const i=t.querySelector(`.flow-layer-${e||0}`);["flow_group_elements","flow_group_select","flow_wires","flow_nodes"].forEach(t=>{const e=i.querySelector(`.${t}`)||k("g",{class:t},i);for(;e.firstChild;)e.removeChild(e.firstChild)})}}function W(t){const e=[],i={},n={},M=[],o={};return t.forEach(function(t){o[t.id]=t,"tab"===t.type?(e.push(t.id),i[t.id]={n:t,nodes:[]}):"subflow"===t.type&&(n[t.id]={n:t,nodes:[]})}),t.forEach(function(t){"tab"!==t.type&&"subflow"!==t.type&&(i[t.z]?i[t.z].nodes.push(t):n[t.z]?n[t.z].nodes.push(t):M.push(t))}),{all:o,tabOrder:e,tabs:i,subflows:n,globals:M}}function P(t,i,n,M,o,A=!1){const a=M-i,r=n-t,g=Math.sqrt(a*a+r*r);let u=.75;if(r*o>0?g0){const A=[[t+o*(e*u),i+0],[n-o*u*e,M-0]];return`M ${t} ${i} C ${A[0][0]} ${A[0][1]} ${A[1][0]} ${A[1][1]} ${n} ${M}`}{let g,s,d,c,l;const I=Math.floor(n-r/2),L=Math.floor(M-a/2);if(Math.abs(a)<10){c=Math.max(i,M)+(A?35:25);const e=c-i;return l=[[t+15*o,i],[t+25*o,i+5],[t+25*o,i+e/2],[t+25*o,i+e-5],[t+15*o,i+e],[t,i+e],[n-15*o,i+e],[n-25*o,i+e-5],[n-25*o,M+(c-M)/2],[n-25*o,M+5],[n-15*o,M],[n,M]],"M "+t+" "+i+" C "+l[0][0]+" "+l[0][1]+" "+l[1][0]+" "+l[1][1]+" "+l[2][0]+" "+l[2][1]+" C "+l[3][0]+" "+l[3][1]+" "+l[4][0]+" "+l[4][1]+" "+l[5][0]+" "+l[5][1]+" h "+r+" C "+l[6][0]+" "+l[6][1]+" "+l[7][0]+" "+l[7][1]+" "+l[8][0]+" "+l[8][1]+" C "+l[9][0]+" "+l[9][1]+" "+l[10][0]+" "+l[10][1]+" "+l[11][0]+" "+l[11][1]+" "}{const A=15,r=(M+L)/2;g=t+o*e*u,s=a>0?Math.min(r-a/2,i+A):Math.max(r-a/2,i-A),d=n-o*e*u,c=a>0?Math.max(r,M-A):Math.min(r,M+A);const N=(t+g)/2,j=a>0?1:-1;return l=[[N,i],[g,a>0?Math.max(i,s-A):Math.min(i,s+A)],[N,a>0?Math.min(L,s+A):Math.max(L,s-A)],[d,a>0?Math.max(L,c-A):Math.min(L,c+A)],[(n+d)/2,M]],l[2][1]===s+j*A&&(Math.abs(a)<10*A&&(l[1][1]=s-j*A/2,l[3][1]=c-j*A/2),l[2][0]=g),"M "+t+" "+i+" C "+l[0][0]+" "+l[0][1]+" "+l[1][0]+" "+l[1][1]+" "+g+" "+s+" S "+l[2][0]+" "+l[2][1]+" "+I+" "+L+" S "+l[3][0]+" "+l[3][1]+" "+d+" "+c+" S "+l[4][0]+" "+l[4][1]+" "+n+" "+M}}}function J(t,e){const i=function(t){let e=[];const i=t.split(/\\n /);if(i.length>1){let t=0;for(t=0;t{switch(t){case"str":return"string";case"num":return"number";case"bool":return"boolean";case"json":return"json";case"date":return"timestamp";case"bin":return"binary";case"env":return"environment";case"flow":return"flow";case"global":return"global";default:return t}},q=["inject","change","switch","function","template","delay","trigger","link in","link out","link call","watch","complete","catch","status","comment","debug","subflow","range","filter","rbe","mqtt in","mqtt out","http in","http response","http request","websocket in","websocket out","tcp in","tcp out","udp in","udp out","tcp request","split","join","sort","batch","csv","json","xml","yaml","html","file in","file","exec"],K=(t,e,i)=>{const n=t.name||e.name;if(n)return n;const M=t.label||t.info||t.text||"";let o="",A="",a="",r="";switch(t.type){case"file":a="write file";case"file in":return a=a||"read file",A=t.filename,"str"!==t.filenameType&&"env"!==t.filenameType&&(A=""),"env"===t.filenameType&&(A="env."+A),"write file"===a&&"delete"===t.overwriteFile?t.name||"delete "+A:t.name||A||a;case"html":o=t.tag;break;case"tcp in":case"tcp out":case"tcp request":a="tcp:";case"udp in":case"udp out":return a=a||"udp:",A=t.host||t.addr||t.server||"",a+(A?A+":":"")+(t.port||"");case"debug":return!0!==t.console&&"true"!==t.console||(r="\t⇲"),"jsonata"===t.targetType?(t.name||"JSONata")+r:!0===t.complete||"true"===t.complete?(t.name||"msg")+r:(t.name||"msg."+(t.complete&&"false"!==t.complete?this.complete:"payload"))+r}return t.type&&t.type.startsWith("ui-")?o=t.type.replace(/^ui-/,""):t.type&&t.type.startsWith("ui_")&&(o=t.type.replace(/^ui_/,"")),o&&o.length<=32?o:M||(t.topic&&t.topic.length<=32&&q.includes(t.type)?t.topic:t.type)},_=(t,e,i)=>(t.name||t.label||t.info||t.text||"").replace(/(.{40,60})([ \n\t])/g,"$1\\n$2")+(t.sumPass?" ⭄":"")+(t.sumPassPrio&&0!=parseInt(t.sumPassPrio)?" ("+t.sumPassPrio+")":""),$={base64:void 0,batch:void 0,catch:(t,e,i)=>{let n="";return t.uncaught&&(n=": uncaught"),t.scope&&(n=": "+t.scope.length),t.scope||t.uncaught||(n=": all"),t.name||t.type+n},change:t=>{function e(t,e){return t+"."+o.utils.parseContextKey(e).key}return t.name?t.name:(t._=t._||function(t,e){let i=t;switch(t){case"change.label.set":i="set {{property}}";break;case"change.label.change":i="change {{property}}";break;case"change.label.move":i="move {{property}}";break;case"change.label.delete":i="delete {{property}}";break;case"change.label.changeCount":i="change {{count}} properties"}for(const n in e)t=i.replace(new RegExp("\\{\\{"+n+"\\}\\}","g"),e[n]);return t},t.rules?1===t.rules.length?"set"===t.rules[0].t?t._("change.label.set",{property:e(t.rules[0].pt||"msg",t.rules[0].p)}):"change"===t.rules[0].t?t._("change.label.change",{property:e(t.rules[0].pt||"msg",t.rules[0].p)}):"move"===t.rules[0].t?t._("change.label.move",{property:e(t.rules[0].pt||"msg",t.rules[0].p)}):t._("change.label.delete",{property:e(t.rules[0].pt||"msg",t.rules[0].p)}):t._("change.label.changeCount",{count:t.rules.length}):"replace"===t.action?t._("change.label.set",{property:"msg."+t.property}):"change"===t.action?t._("change.label.change",{property:"msg."+t.property}):"move"===t.action?t._("change.label.move",{property:"msg."+t.property}):t._("change.label.delete",{property:"msg."+t.property}))},comment:void 0,csv:void 0,debug:void 0,exec:void 0,file:void 0,"file in":void 0,function:void 0,html:void 0,"http response":(t,e,i)=>t.name||"http"+(t.statusCode?" ("+t.statusCode+")":""),"http in":(t,e,i)=>t.name||"["+t.method+"] "+t.url,"http request":void 0,inject:t=>{let e="";if(t.once&&(e=" ¹"),(t.repeat&&0!=t.repeat||t.crontab)&&(e="\t↻"),t.name)return t.name+e;let i="",n="str",M="";const A=t.props;if(A)for(let e=0;e0&&i.length<24?i+e:"inject"+e;if("date"===n||"bin"===n||"env"===n)return""!==M&&M.length<=16?M+":"+X(n)+e:X(n)+e;if("flow"===n||"global"===n){return n+"."+o.utils.parseContextKey(i).key+e}return"inject"+e},join:void 0,json:void 0,junction:void 0,"link in":void 0,"link out":void 0,"link call":(t,e,i)=>{if(!t.links||0===t.links.length)return t.name||t.type;let n;return i.forEach(function(M){n||M.id===t.links[0]&&(n=($[M.type]||K)(M,e,i))}),t.name||n||t.type},markdown:void 0,postgresql:void 0,range:void 0,sort:void 0,split:void 0,switch:void 0,yaml:void 0,xml:void 0,BlogPages:void 0,BlogDetails:void 0,BlogPageInfo:(t,e,i)=>{if(t.name)return t.name;let n;return i.forEach(function(e){n||"link in"===e.type&&e.name.startsWith("[blog] ")&&(e.wires[0]||[]).indexOf(t.id)>-1&&(n=e.name.substring(7))}),n||t.type},PubMedium:void 0,Topic:_,Observation:_,Question:_,Thought:_,Idea:_,Analogy:_,Aphorism:_,Poesie:_,Humour:_,Treasure:_,Consequence:_,Advantage:_,Disadvantage:_,Text:_,"Blog-Post":_,Comment:_,Codebase:_,Sketch:_,Inspiration:_,Quote:_,Definition:_,Book:_,Author:_,"nnb-input-node":void 0,"nnb-layer-node":(t,e,i)=>t.name||t.actfunct+": "+t.bias+", "+t.threshold,"nnb-output-node":void 0,"nnb-backprop":void 0,"nnb-trainer":void 0,Seeker:void 0,Sink:void 0,Screenshot:void 0,Orphans:void 0,IsMobile:void 0,Navigator:void 0,DrawSVG:void 0,GetFlows:void 0,_default:K};function tt(t){const e={};let i=1e4,n=0;for(const M of t)"subflow"===M.type?e[M.id]={id:M.id,label:M.name,type:"subflow",disabled:M.disabled,order:i++}:"tab"!==M.type&&M.z&&(e[M.z]||(e[M.z]={id:M.z,label:"Flow "+(n+1),type:"tab",disabled:!1,order:n++}));const M=t.filter(t=>"tab"===t.type);let o=0;for(const t of M)e[t.id]&&(e[t.id].label=t.label||e[t.id].label,e[t.id].disabled=!!t.disabled,e[t.id].order=o++);const A=Object.keys(e).map(t=>e[t]);return A.sort((t,e)=>t.order-e.order),A}function et(t){Array.isArray(t)||(t=[]);const e=[...t];for(let t=0;t0?i.add(...n):e?.classList?.length&&i.add(...e.classList),0===i.size&&i.add("flow-renderer"),[...i]}(t)),t.container){const i={};["scope","gridLines","arrows","zoom","images","linkLines","labels","autoZoom","autoScroll","flowId"].forEach(function(e){if("string"==typeof t.container.dataset[e]){const n=t.container.dataset[e]||"true";i[e.replace(/-/g,"")]="true"===n}}),e.push(i)}e.push(t)}return Object.assign({},...e)}function nt(e,i){e=et(e);const n=w((i=it(i)).document,t.document,i.container,this),M=i.container;for(;M.firstChild;)M.removeChild(M.firstChild);const o=n.createElement("div");o.classList.add("red-ui-tabs"),M.appendChild(o);const A=v(M);!function(t,e,i=!0){const n=w(t,this),M=n.createElement("pre");M.classList.add("red-ui-workspace-source"),i&&M.classList.add("hidden"),M.setAttribute("data-code-wrap","json");const o=n.createElement("code");o.classList.add("lang-json","hljs","language-json"),o.textContent="object"==typeof e?JSON.stringify(e,null,2):"string"==typeof e?e:"// No content available",M.appendChild(o),t&&t.appendChild(M)}(M,e);const a=function(t){const e=w(t,this);if(!e)return null;let i=t.querySelector(".toolbar");i||(i=E(t));let n=i.querySelector(".source-controls");if(n)return{viewSource:i.querySelector(".view-source")};n=e.createElement("div"),n.classList.add("source-controls"),n.classList.add("button-group");const M=e.createElement("button");return M.classList.add("red-ui-footer-button","icon-button-bg","view-source"),M.title="Toggle Flows / Source",n.appendChild(M),i.appendChild(n),{viewSource:M}}(M);a.viewSource.onclick=function(t){!function(t){t.preventDefault(),t.stopPropagation();const e=t.target.parentElement.parentElement.parentElement.querySelector(".red-ui-workspace-chart");if(!e)return void console.warn("No container found for source view toggle");const i=e.parentElement,n=i.querySelector(".red-ui-tabs"),M=i.querySelector(".red-ui-workspace-source"),o=i.querySelector(".zoom-controls");M&&M.classList.contains("hidden")?(M.classList.remove("hidden"),e.classList.add("hidden"),n.classList.add("hidden"),o?.classList.add("hidden")):(M.classList.add("hidden"),e.classList.remove("hidden"),n.classList.remove("hidden"),o?.classList.remove("hidden"))}(t)};const r=function(t){const e=w(t,this);if(!e)return null;let i=t.querySelector(".toolbar");i||(i=E(t));let n=i.querySelector(".copy-controls");if(n)return{copy:i.querySelector(".copy-flow"),download:i.querySelector(".download-flow")};n=e.createElement("div"),n.classList.add("copy-controls"),n.classList.add("button-group");const M=e.createElement("button");M.classList.add("red-ui-footer-button","icon-button-bg","copy-flow"),M.title="Copy Flow to Clipboard";const o=e.createElement("button");return o.classList.add("red-ui-footer-button","icon-button-bg","download-flow"),o.title="Download Flows",n.appendChild(M),n.appendChild(o),i&&i.appendChild(n),{copy:M,download:o}}(M);r.copy.onclick=function(t){!function(t,e,i){i=i||function(){};let n=e||[];"object"==typeof n?n=JSON.stringify(n,null,0):"string"!=typeof n&&(n=n.toString());const M=w(t&&t.target&&t.target.ownerDocument,this);if("undefined"!=typeof navigator&&navigator.clipboard)return void navigator.clipboard.writeText(n).then(function(){i(null,!0)}).catch(function(t){i(t,!1)});const o=M.createElement("textarea");o.value=n,o.style.position="fixed",o.style.top="0",o.style.left="0";try{M.body.appendChild(o),o.focus(),o.select();const t=M.execCommand("copy");i(null,t),console.info("failed to copy",t)}catch(t){console.error("failed to copy",t)}finally{M.body.removeChild(o)}}(t,e)},r.download.onclick=function(t){!function(t,e,i,n,M){M=M||function(){};let o=e||[];"object"==typeof o?o=JSON.stringify(o,null,2):"string"!=typeof o&&(o=o.toString());const A=w(t&&t.target&&t.target.ownerDocument,this),a=new Blob([o],{type:i}),r=URL.createObjectURL(a),g=A.createElement("a");g.style.display="none",g.href=r,g.download=n,g.style.position="fixed",g.style.top="0",g.style.left="0";try{A.body.appendChild(g),g.focus(),g.click(t),URL.revokeObjectURL(r),M(null,!0)}catch(t){M(t,!1),console.error("failed to download",t)}finally{A.body.removeChild(g)}}(t,e,"application/json","flows.json")};const g=O(A);H(g),f(g),M.classList.add(i.scope);const u=function(t){o.querySelectorAll(".red-ui-tab").forEach(t=>t.classList.remove("active"));return o.querySelector(`[data-flow-id="${t}"]`).classList.add("active"),i.flowId=t,Mt(e,i)};G(n,i.scope);const s=M.querySelectorAll(".red-ui-tab");s&&s.forEach(t=>t.remove());const d=tt(e);if(d.forEach((e,n)=>{!function(e,i,n,M,o){const A=`red-ui-tab-${n}`,a=M.container,r=M.svg||a.querySelector("svg"),g=w(M.document,t.document,a,this),u=i.label;let s=a.querySelector(`.${A}`);if(s||(s=g.createElement("div"),e.appendChild(s),s.classList.add("red-ui-tab"),s.classList.add("red-ui-tab-"+i.type),s.setAttribute("data-flow-id",i.id)),i.disabled){s.classList.add("disabled");const t=g.createElement("i");t.classList.add("red-ui-tab-disabled-icon"),s.appendChild(t)}else if("subflow"===i.type){const t=g.createElement("i");t.classList.add("red-ui-tab-subflow-icon"),s.appendChild(t)}s.title=u;const d=g.createElement("span");d.textContent=u,s.appendChild(d),s.onclick=function(t){z(r,M,M.flowId),o(i.id),h(r,M,i.id)}}(o,e,n,i,u)}),d.length?M.classList.add("has-tabs"):M.classList.remove("has-tabs"),!i.flowId){const t=d.find(t=>"tab"===t.type),e=d.find(t=>"subflow"===t.type);i.flowId=t?t.id:e?e.id:null}let c=null;return c=d.length?u(i.flowId):Mt(e,i),z(g,i,i.flowId),c=c||{},c.tabs=d,c.flowId=i.flowId,c.css=c.css||U(i.scope),c}function Mt(t,i){t=et(t);const n=(i=it(i)).container,A={},g={},d={},c={},l={},I=(i=i||{}).flowId,L=j("junction");let N=!1;const y=tt(t).find(t=>t.id===I);y&&"tab"===y.type&&(N=y.disabled);let w=n&&n.querySelector("svg");w=w||O(n),H(w,i.layer);const b=(i.svgLayer||w).querySelector(".flow_grid");i.gridLines&&b&&B(b),t.forEach(function(t){if("subflow"===t.type){g["subflow:"+t.id]=t;for(let e=0;e0&&t.wires.forEach(function(t){t.forEach(function(t){l[t]=!0})})});const x=(i.svgLayer||w).querySelector(".flow_nodes");t.forEach(function(n){if(n.z===I||n.id===I){const I=D(n),y=function(t){let e=!0;return"link out"!==t.type&&"link in"!==t.type||(e=!1),"junction"===t.type||"tab"===t.type||"subflow"===t.type||(!1===t.l?e=!1:!0===t.l&&(e=!0)),e}(n),w=!i.labels,b=j(n.type);switch(n.type){case"tab":case"ui_spacer":case"ui-spacer":break;case"group":d[n.id]=n;break;case"subflow":c[n.id]={...n};for(let t=0;t1?18:16)+")"});let t=0;c.lines.forEach(function(e){const i=k("text",{y:t,class:"node-text-label"});i.textContent=e,j.appendChild(i),t+=20})}const D=k("g",{"data-node-id":n.id,class:"node"});x.appendChild(D),y&&j&&D.appendChild(j);const p=y?j?.getBBox():{width:0,height:0},C=p.width,m=p.height+13.5,T=y?I.width>C?I.width:C:I.width,S=y?I.height>m?I.height:m:I.height,z={x:n.x,y:n.y,w:T,h:S,outputs:(n.wires||[]).length},h=!!l[n.id];try{y?(z.w=Math.max(e,20*Math.ceil((c.width+48+(h?7:0))/20)),z.h=Math.max(6+24*c.lines.length,15*(z.outputs||0),30)):(z.w=30,z.h=Math.max(30,15*(z.outputs||0)))}catch(t){}if(z.outputs>2&&y&&j&&z.h>m){const t=(z.h-m)/2;j.setAttributeNS(null,"transform","translate(38,"+((c.lines.length>1?16:14)+t)+")")}w&&j&&(j.style.display="none"),D.prepend(k("rect",{...b,rx:5,ry:5,fill:d.color||b.fill,width:z.w,height:z.h,class:"node node-"+n.id})),D.appendChild(k("path",{d:"M5 0 h25 v"+z.h+" h-25 a 5 5 0 0 1 -5 -5 v-"+(z.h-10)+" a 5 5 0 0 1 5 -5",fill:"rgb(0,0,0)","fill-opacity":.05,stroke:"none"})),y&&D.appendChild(k("path",{d:"M 29.5 0.5 l 0 "+(z.h-1),fill:"none",stroke:"rgb(0,0,0)","stroke-opacity":.1,"stroke-width":"1px"}));const f=o.view.tools.calculateGridSnapOffsets(z),v=n.x-z.w/2-f.x,E=n.y-z.h/2-f.y;if(D.setAttribute("transform",`translate(${v}, ${E})`),n.bbox=D.getBBox(),n.bbox.x=v,n.bbox.y=E,i.images){const t={x:0,y:Math.max(z.h/2-15,0),width:30,height:30},e=function(t){let e=u[t];return e||(t.startsWith("subflow:")?e=u.subflow:t.startsWith("ui-")?e=u["ui-template"]:t.startsWith("ui_")&&(e=u.ui_template)),e&&s[e]||""}(n.type);if(e)D.appendChild(k("image",{href:e,...t}));else if(n.type.startsWith("subflow:")){const e=d.icon&&s[d.icon]||s["subflow.svg"];D.appendChild(k("image",{href:e,...t}))}}(d.in&&d.in.length>0||l[n.id])&&(i.arrows?D.appendChild(k("path",{...L,transform:"translate(-3,"+(n.bbox.height/2-5)+")",d:i.arrows?"M 0,10 9,5 0,0 Z":"M -1,9.5 8,9.5 8,0.5 -1,0.5 Z",class:"red-ui-flow-port-input input-arrows","stroke-linecap":"round","stroke-linejoin":"round"})):D.appendChild(k("rect",{...L,transform:"translate(-5,"+(n.bbox.height/2-5)+")",...a,...r,class:"red-ui-flow-port-input"})));const O={...L,...a,...r,class:"red-ui-flow-port"};if(n.wires&&Array.isArray(n.wires)){const t=1===n.wires.length?n.bbox.height/2-5:n.wires.length%2==0?3.5:4.5;for(let e=0;e0;){h-=1;for(const t in d){if(T.indexOf(t)>-1)continue;const e=d[t];let i=0,n=0,M=!1;if(e.nodes.forEach(function(t){const o=(A[t]||{}).bbox;o?(i=Math.max(i,o.x-e.x+o.width),n=Math.max(n,o.y-e.y+o.height)):M=!0}),M)continue;const o=k("g",{"data-node-id":t});o.setAttribute("transform",`translate(${e.x}, ${e.y})`),o.appendChild(k("rect",{rx:5,ry:5,width:e.w,height:e.h,fill:"none","fill-opacity":0,"stroke-width":2,stroke:"grey",class:"group-"+e.id,...e.style})),m.prepend(o);const a=A[t];a.bbox=o.getBBox(),a.bbox.x=e.x,a.bbox.y=e.y;const r=k("g",{});if(o.appendChild(r),e.style.label&&e.name){const t=e.style["label-position"]||"nw",i=J(e.name,"group-text-label");let n=0,M=0,o="start";if(M="n"===t[0]?15:a.bbox.height-5-16*(i.lines.length-1),"w"===t[1]?(n=5,o="start"):"e"===t[1]?(n=a.bbox.width-5,o="end"):(n=a.bbox.width/2,o="middle"),r.setAttribute("transform",`translate(${n}, ${M})`),r.setAttribute("text-anchor",o),i){let t=0;i.lines.forEach(function(i){const n=k("text",{class:"group-text-label",x:0,y:t,fill:e.style.color||"grey"});n.textContent=i,r.appendChild(n),t+=16})}}T.push(t)}}const f=(i.svgLayer||w).querySelector(".flow_wires"),v=[],E=Object.keys(c);for(let t=0;t2&&e.splice(2);const n=new Map,M=Q(function(t,e){const i=W(t),n=W(e),M={},o={},A={},a={},r={};return Object.keys(i.all).forEach(function(t){if(!N(n.all,t))return void(o[t]=!0);const e=JSON.stringify(i.all[t]),M=JSON.stringify(n.all[t]);if(e!==M)if(A[t]=!0,i.all[t].z!==n.all[t].z)r[t]=!0;else if(i.all[t].x!==n.all[t].x||i.all[t].y!==n.all[t].y||i.all[t].w!==n.all[t].w||i.all[t].h!==n.all[t].h){const i=JSON.parse(e),n=JSON.parse(M);delete i.x,delete i.y,delete i.w,delete i.h,delete n.x,delete n.y,delete n.w,delete n.h,JSON.stringify(i)===JSON.stringify(n)&&(a[t]=!0)}}),Object.keys(n.all).forEach(function(t){N(i.all,t)||(M[t]=!0)}),{currentConfig:i,newConfig:n,added:M,deleted:o,changed:A,positionChanged:a,moved:r}}(e[0],e[1]));M.changes.forEach(t=>{t.highlight=e=>function(t=-1,e){clearTimeout(L),clearTimeout(j);g.querySelectorAll(".red-ui-tab").forEach(t=>t.classList.remove("tab-glow"));s.querySelectorAll("g[data-node-id]").forEach(t=>{t.style.filter=""});const i=g.querySelector(".red-ui-tab.active").getAttribute("data-flow-id");let n=e.tab;"moved"===e.diffType&&(-1===t?t=e.v1:0===t?n=e.value1:1===t&&(n=e.value2));"added"===e.diffType&&-1===t?t=1:("deleted"===e.diffType&&-1===t||-1===t)&&(t=0);const M=g.querySelector(`.red-ui-tab[data-flow-id="${n}"]`);("tab"===e.item&&"changed"===e.diffType||n!==i)&&M&&(M.click(),M.classList.add("tab-glow"),j=setTimeout(()=>{M.classList.remove("tab-glow")},1e4));if(parseInt(c.value)<10||parseInt(c.value)>90){const e=0===t?10:90;!async function(){let t=parseInt(c.value);const i=e>t?1:-1;for(;t!==e;){t+=i,c.value=t;const e=new Event("input",{bubbles:!0});c.dispatchEvent(e),await new Promise(t=>setTimeout(t,10))}}()}const o=[e.item,e.tab][0],A=s.querySelector(`g.flow-layer-0 g[data-node-id="${o}"]`),a=s.querySelector(`g.flow-layer-1 g[data-node-id="${o}"]`);if(!A&&!a)return;(A||a).scrollIntoView({behavior:"smooth",block:"center",inline:"center"}),A&&(A.style.filter="url(#node-glow)");a&&(a.style.filter="url(#node-glow)");L=setTimeout(()=>{try{A&&(A.style.filter=""),a&&(a.style.filter="")}catch(t){}},1e4)}(e,t)}),M.tabMap=n;const o=w((i=it(i)).document,t.document,i.container,this),A=i.container;G(o,i.scope);const a=i.zoom,r=i.gridLines;for(i.zoom=!1,i.gridLines=!1;A.firstChild;)A.removeChild(A.firstChild);const g=Y("div",null,"red-ui-tabs",null,A),u=v(A),s=O(u,{addDefaultLayer:!1}),d=[...s.childNodes].find(t=>"g"===t.tagName&&t.classList.contains("outerContainer")),c=function(t){if(!w(t,this))return null;let e=t.querySelector(".toolbar");e||(e=E(t));let i=e.querySelector(".compare-controls");if(i)return e.querySelector(".flow-compare-slider");i=Y("div",null,"button-group compare-controls",null,e);const n=Y("input",null,"flow-compare-slider",null,i);return n.type="range",n.min="0",n.max="100",n}(A);c.type="range",c.min=0,c.max=100,c.value=0,c.step=5,c.style.width="100%",c.classList.add("flow-compare-slider");const l=A,I=u;f(s);for(let t=0;t{const M=n[0],o=n[1],u={...i,flowId:M,container:null,layers:o};!function(e,i,n){const M=w(i.document,t.document,A,this),o=i.layers;for(const t of Object.values(o)){const A=t.tab,a=A.label,r=`red-ui-tab-${t.index}`,g=`red-ui-tab-${A.id}`;let u=e.querySelector(`.${g}`);u||(u=M.createElement("div"),e.appendChild(u),u.classList.add("red-ui-tab"),u.classList.add(r),u.classList.add(g),u.classList.add("red-ui-tab-"+o.type),u.setAttribute("data-flow-id",A.id));let d=u.querySelector(`.red-ui-tab-label-${t.index}`);if(d||(d=M.createElement("div"),d.classList.add(`red-ui-tab-label-${t.index}`)),d.classList.add("red-ui-tab-label"),d.setAttribute("data-layer",t.index),d.style.opacity=0,u.appendChild(d),A.disabled){d.classList.add("disabled");const t=M.createElement("i");t.classList.add("red-ui-tab-disabled-icon"),d.appendChild(t)}else if("subflow"===A.type){const t=M.createElement("i");t.classList.add("red-ui-tab-subflow-icon"),d.appendChild(t)}d.title=a;const c=M.createElement("span");c.textContent=a,d.appendChild(c),u.onclick=function(t){z(s,i,i.flowId),n(i),h(s,i,A.id)}}}(g,u,function(t){g.querySelectorAll(".red-ui-tab").forEach(t=>t.classList.remove("active"));g.querySelector(`[data-flow-id="${t.flowId}"]`).classList.add("active");const n=Object.values(t.layers),M={0:!0,1:!0};n.forEach(t=>{t.svgLayer.setAttribute("opacity",0);const i=t.renderOptions;Mt(e[i.index]||[],i),M[i.index]=!1});const o=M[0]||M[1],u={...i,flowId:t.flowId,container:o?.container||o?.flowRenderer||A};if(M[0]&&(u.layer=0,u.svgLayer=s.querySelector("g.flow-layer-0"),Mt(e[0]||[],u)),M[1]&&(u.layer=1,u.svgLayer=s.querySelector("g.flow-layer-1"),Mt(e[1]||[],u)),a&&C(s,A),r){let t=[...d.childNodes].find(t=>"g"===t.tagName&&t.classList.contains("flow_grid"));t||(t=k("g",{class:"flow_grid"}),d.insertBefore(t,s.firstChild)),t&&B(t)}D()})}),c.addEventListener("input",function(t){D()});let L=null,j=null;function D(){const t=parseInt(c.value),i=[1-t/100,t/100];i.forEach((t,e)=>{t=t>.05?b(t+.15,0,1):t;const i=function(t,e){return t.querySelector(`g.flow-layer-${e||0}`)}(s,e);i?.setAttribute("opacity",t)});g.querySelectorAll(".red-ui-tab-label").forEach((t,n)=>{let M=parseInt(t.getAttribute("data-layer"));(isNaN(M)||M<0||M>=e.length)&&(M=0),t.style.opacity=i[M]||0})}const y=g.querySelector(".red-ui-tab");y&&y.click(),n.size>0?A.classList.add("has-tabs"):A.classList.remove("has-tabs");const x=p(s.parentElement);return x.hasHorizontalScrollbar||x.hasVerticalScrollbar?A.classList.add("has-scrollbars"):A.classList.remove("has-scrollbars"),M},renderFlows:nt,renderFlow:Mt,normaliseOptions:it,getStyles:U}};"object"==typeof module&&module.exports?module.exports=FlowRenderer:"object"==typeof window?window.FlowRenderer=FlowRenderer:global.FlowRenderer=FlowRenderer;export default FlowRenderer; \ No newline at end of file +const FlowRenderer=function(){const t=this||{},e=100,i=8e3,n=8e3,o=13.5,M={view:{}};M.view.tools={},M.utils={},M.view.gridSize=function(){return 20},M.view.tools.calculateGridSnapOffsets=function(t,e){0;e=e||{align:"nearest"};const i={x:0,y:0},n=M.view.gridSize(),o=t.x-(n*Math.round((t.x-t.w/2)/n)+t.w/2),r=t.x-(n*Math.round((t.x+t.w/2)/n)-t.w/2);i.x=r,"right"===e.align||("left"===e.align||Math.abs(o)t.clientWidth,hasVerticalScrollbar:t.scrollHeight>t.clientHeight}}function C(t,e){let i=1;const n=t.getAttribute("transform");if(n){const t=n.match(/scale\(([^,]+)\)/);t&&(i=w(parseFloat(t[1]||1),.25,3,1))}const o=t.querySelector("g.outerContainer");x(o,i,!0),e.onwheel=function(t){if(t.ctrlKey||t.metaKey){t.preventDefault();let e=m(o);e-=.075*Math.sign(t.deltaY),e=w(e,.2,3,1),x(o,e)}};const M=function(t){const e=p(t,this);if(!e)return null;let i=t.querySelector(".toolbar");i||(i=E(t));let n=i.querySelector(".zoom-controls");if(n)return{zoomIn:i.querySelector(".zoom-in"),zoomOut:i.querySelector(".zoom-out"),zoomReset:i.querySelector(".zoom-reset")};n=e.createElement("div"),n.classList.add("zoom-controls"),n.classList.add("button-group");const o=e.createElement("button");o.classList.add("red-ui-footer-button","icon-button-bg","zoom-in"),o.innerHTML="+",o.title="Zoom In (Ctrl + Mouse Wheel Up)";const M=e.createElement("button");M.classList.add("red-ui-footer-button","icon-button-bg","zoom-reset"),M.title="Zoom & Scroll Reset";const r=e.createElement("button");r.classList.add("red-ui-footer-button","icon-button-bg","zoom-out"),r.innerHTML="-",r.title="Zoom Out (Ctrl + Mouse Wheel Down)",n.appendChild(r),n.appendChild(M),n.appendChild(o),i&&i.appendChild(n);return{zoomIn:o,zoomOut:r,zoomReset:M}}(e);M.zoomIn.onclick=function(){const t=w(m(o)+.1,.2,3,1);x(o,t)},M.zoomOut.onclick=function(){const t=w(m(o)-.1,.2,3,1);x(o,t)},M.zoomReset.onclick=function(){!function(t){const e=t.getAttribute("_scale_original")||1;x(t,e)}(o),function(t){t.scrollLeft=t.getAttribute("_scroll_x")||0,t.scrollTop=t.getAttribute("_scroll_y")||0}(e.querySelector(".red-ui-workspace-chart"))}}function m(t){return parseFloat(t.getAttribute("_scale_current")||1)}function x(t,e,o=!1){t.setAttribute("transform",`scale(${e})`);const M=t.ownerSVGElement||t;M.style.width=i*e+"px",M.style.height=n*e+"px",t.setAttribute("_scale_current",e),o&&t.setAttribute("_scale_original",e)}function S(t,e,i,n=!1){t.scrollLeft=e,t.scrollTop=i,n&&(t.setAttribute("_scroll_x",e),t.setAttribute("_scroll_y",i))}function T(t,e,o){const M=o.autoZoom||o.autoScroll?function(t,e){const o=.2,M=1,r=e.container.querySelector(".red-ui-workspace-chart"),u=r.getBoundingClientRect(),a=u.width-25,A=u.height-25;let g=i,s=n,c=0,d=0;const l=e.flowId,I=t.filter(t=>"tab"!==t.type&&"subflow"!==t.type&&t.z===l);if(0===I.length)return{scale:1,scrollX:0,scrollY:0};for(const t of I){if("tab"===t.type||"subflow"===t.type||"junction"===t.type)continue;const e=t.x||0,i=t.y||0,n=D(t),o=(n.width||100)/2,M=(n.height||30)/2,r=e-o,u=i-M,a=e+o,A=i+M;g=Math.min(g,r),s=Math.min(s,u),c=Math.max(c,a),d=Math.max(d,A)}let L=1;const N=c-g,j=d-s,y=a/N,p=A/j;(N>a||j>A)&&(L=Math.min(y,p),L*=.95);L=w(L,o,M,1);let b=g,C=s;b<50&&(b=0);C<40&&(C=0);b>0&&(b-=50);C>0&&(C-=40);return b=w(b*L,0,r.scrollWidth),C=w(C*L,0,r.scrollHeight),{scale:L,scrollX:b,scrollY:C,minX:g,minY:s,maxX:c,maxY:d}}(e,o):null;if(t=t.ownerSVGElement||t,o.zoom&&M&&o.autoZoom){x(t.querySelector("g.outerContainer"),M.scale,!0)}return M&&o.autoScroll&&S(t.parentElement,M.scrollX,M.scrollY,!0),M}function z(t,e,i){const n=t.parentElement,o=t.querySelector("g.outerContainer"),M=n.scrollLeft,r=n.scrollTop,u=m(o),a=i||e.flowId||"global";n.setAttribute(`data-tab-${a}-x`,M),n.setAttribute(`data-tab-${a}-y`,r),n.setAttribute(`data-tab-${a}-scale`,u)}function h(t,e,i){const n=t.parentElement,o=t.querySelector("g.outerContainer"),M=i||e.flowId||"global",r=n.getAttribute(`data-tab-${M}-x`),u=n.getAttribute(`data-tab-${M}-y`),a=n.getAttribute(`data-tab-${M}-scale`);"string"==typeof r&&"string"==typeof u&&S(n,r,u),"string"==typeof a&&x(o,a)}function v(t){const e=t.parentElement,i=t.querySelector("g.outerContainer");for(const t in i.dataset)/^tab-\w+-.*/.test(t)&&e.removeAttribute(t)}function f(t){const e=p(t,this).createElement("div");return e.classList.add("red-ui-workspace-chart"),t?(t.appendChild(e),e):e}function E(t){const e=p(t,this);if(!e)return null;let i=t.querySelector(".toolbar");return i||(i=e.createElement("div"),i.classList.add("toolbar"),t&&t.appendChild(i),i)}function O(t,{addDefaultLayer:e=!0,layer:o=0}={}){const M=p(t,this),r=M.createElementNS("http://www.w3.org/2000/svg","svg");r.setAttribute("style",`width:${i}px; height:${n}px;`),t.appendChild(r);const u=M.createElementNS("http://www.w3.org/2000/svg","defs");r.appendChild(u);u.innerHTML='\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ';const a=k("g",{class:"outerContainer"});return r.appendChild(a),e&&Z(r,{layer:o}),r}function k(t,e,i){const n=p(i,this).createElementNS("http://www.w3.org/2000/svg",t);if("object"==typeof e)for(const t in e)n.setAttribute(t,e[t]);return i&&i.appendChild(n),n}function Z(t,{layer:e=0,opacity:i=1}={}){let n=t.querySelector("g.outerContainer");n||(n=k("g",{class:"outerContainer"},t)),n.querySelector("g.flow_grid")||k("g",{class:"flow_grid"},n);let o=n.querySelector(`g.flow-layer-${e}`);for(o||(o=k("g",{class:`flow-layer-${e||0}`},n));o.firstChild;)o.removeChild(o.firstChild);return o.setAttribute("opacity",i),k("g","flow_group_elements",o),k("g","flow_group_select",o),k("g","flow_wires",o),k("g","flow_nodes",o),o}function B(t){if(t.childNodes.length>0)return;k("rect",{width:`${i}px`,height:`${n}px`,fill:"url(#grid)"},t).style.transform="translate(-1px, -1px)"}function Y(t,e,i,n,o){const M=p(o,this).createElement(t);if("object"==typeof e)for(const t in e)M.setAttribute(t,e[t]);return i&&"string"==typeof i?M.classList.add(...i.split(" ")):Array.isArray(i)&&M.classList.add(...i),"string"==typeof n&&(M.textContent=n),o&&o.appendChild(M),M}function Q(t){const e=[],i={},n=new Set([...Object.keys(t.changed),...Object.keys(t.added),...Object.keys(t.deleted),...Object.keys(t.moved),...Object.keys(t.positionChanged)]),o=t.currentConfig,M=t.newConfig;function r(e,i,n,o,M,r){const u={tab:e,item:i,diffType:n,prop:o,value1:M,value2:r,toString:()=>""},a=t=>t?`'${t}'`:"''",A=t=>t?a(function(t,e,i){const n=et[t.type]||et._default,o=e&&e[t.type]||{};return n(t,o,i)}(t)):"'n/a'",g=t.currentConfig.all[e]||t.newConfig.all[e],s=A(g),c=t.currentConfig.all[i]||t.newConfig.all[i],d="tab"===i?g:t.currentConfig.all[i],l="tab"===i?g:t.newConfig.all[i],I="tab"===i?"tab":"node",L=/wires\[\d+\]/.test(o);let N="";L&&(u.value1&&!u.value2?N=`had wire removed from ${A(d)}`:!u.value1&&u.value2&&(N=`was wired up to ${A(l)}`));const j=M&&("z"===o||/wires\[\d+\]/.test(o))?t.currentConfig.all[M]:null,D=r&&("z"===o||/wires\[\d+\]/.test(o))?t.newConfig.all[r]:null;return u.toString=function(){const t=[];switch(n){case"deleted":t.push("deleted",I,A(c));break;case"added":t.push("added",I,A(c));break;case"moved":t.push(A(c),"moved from ",A(j),"to",A(D));break;case"changed":"g"===o?M&&!r?t.push(s,A(c),"was removed from group",a(A(M))):!M&&r?t.push(s,A(c),"was added to group",a(A(r))):t.push(s,A(c),"moved group from",a(M),"to",a(r)):L?t.push(s,A(c),N):"tab"===i?t.push("tab",s,"property",a(u.prop),"was",a(u.value1||"")+", now",a(u.value2||"")):t.push(A(c),"property",a(u.prop),"was",a(u.value1||""),"now",a(u.value2||""));break;case"positionChanged":t.push(A(c),"moved from",u.value1,"to",u.value2);break;default:t.push(s,A(c),a(u.prop),"was",a(u.value1||""),"now",a(u.value2||""))}return t.join(" ")},u}function u(t,e){const i=t.currentConfig.all,o=t.newConfig.all,M=[];if(!e.v1||!e.v2)return e.v1&&M.push(r(e.id,e.id,"tab","deleted",e.v1,null)),e.v2&&M.push(r(e.id,e.id,"tab","added",null,e.v2)),M;const u=e.v1?.tab?{...e.v1.tab.n}:{};u.order=e.v1?.order;const A=e.v2?.tab?{...e.v2.tab.n}:{};A.order=e.v2?.order;const g=e.v1?.tab?.nodes||[],s=e.v2?.tab?.nodes||[];M.push(...a(e.id,"tab","","changed",u,A));const c=g.map(t=>t.id),d=s.map(t=>t.id),l=new Set([...c,...d].filter(t=>n.has(t))),I=t=>"number"!=typeof t?null:t,L=(t,e)=>{const i={...e};for(const e of t)delete i[e];return i};for(const n of l){const r=i[n],u=o[n],A=!(!r||!u);if(t.deleted[n])M.push(...a(e.id,n,"","deleted",r,u));else if(t.added[n])M.push(...a(e.id,n,"","added",r,u));else if(A){let i=!0;if(t.moved[n]&&M.push(...a(e.id,n,"","moved",{z:r.z},{z:u.z})),t.positionChanged[n]){i=!1;const t={x:I(r.x),y:I(r.y)},o={x:I(u.x),y:I(u.y)},A=JSON.stringify(t),g=JSON.stringify(o);M.push(...a(e.id,n,"position","positionChanged",A,g))}if(i){const t=L(["x","y","z","w","h"],r),i=L(["x","y","z","w","h"],u);M.push(...a(e.id,n,"","changed",t,i))}}}return M}function a(t,e,i,n,o,M){const u=[];if("deleted"===n)u.push(r(t,e,n,i,o?"":"deleted",M?"":"deleted"));else if("added"===n)u.push(r(t,e,n,i,o?"added":"",M?"added":""));else if(typeof o!=typeof M)u.push(r(t,e,"changed",i,o||"",M||""));else if(Array.isArray(o))for(let r=0;r{const e=`${"z"===t.prop&&"moved"===t.diffType?"*":t.tab}-${t.item}-${t.diffType}-${t.prop}-${t.value1}-${t.value2}`;return!A.has(e)&&(A.add(e),!0)})}()),{get changes(){return e},get diff(){return t},get tabs(){return i},getNodeInfo:t=>({propertiesChanged:e.filter(e=>e.itemId===t&&e.tab!==t),v1:o.all[t],v2:M.all[t]}),getTabInfo:t=>({propertiesChanged:e.filter(e=>e.tab===t&&"tab"===e.itemId),nodesChanged:e.filter(e=>e.tab===t&&"tab"!==e.itemId),v1:i[t],v2:i[t]})}}function U(t){t&&t.length&&"string"!=typeof t&&"string"==typeof t[0]&&(t=[...t].join(" "));return`\n :root {\n --red-ui-view-grid-color: #eee;\n --red-ui-view-border: 1px solid #bbbbbb;\n --red-ui-node-border: #999;\n --red-ui-node-port-background: #d9d9d9;\n --red-ui-workspace-button-color: #333;\n --red-ui-workspace-button-background: #f3f3f3;\n\n --red-ui-primary-font: Helvetica Neue, Arial, Helvetica, sans-serif;\n --red-ui-primary-font-size: 14px;\n --red-ui-monospace-font: Menlo, Consolas, DejaVu Sans Mono, Courier, monospace;\n --red-ui-primary-background: #f3f3f3;\n\n --red-ui-form-background: #fff;\n --red-ui-form-placeholder-color: #aaa;\n --red-ui-form-text-color: #555;\n --red-ui-form-text-color-disabled: #bbb;\n --red-ui-form-input-focus-color: rgba(85, 150, 230, 0.8);\n --red-ui-form-input-border-color: #ccc;\n --red-ui-form-input-border-selected-color: #aaa;\n --red-ui-form-input-border-error-color: rgb(214, 97, 95);\n --red-ui-form-input-background: #fff;\n --red-ui-form-input-background-disabled: #f9f9f9;\n --red-ui-form-button-background: #efefef;\n\n --red-ui-diff-state-color: #555;\n --red-ui-diff-state-prefix-color: #888;\n --red-ui-diff-state-added: #009900;\n --red-ui-diff-state-deleted: #f80000;\n --red-ui-diff-state-changed: #f89406;\n --red-ui-diff-state-moved: #3f81b3;\n }\n ${t=(t=t||".flow-renderer").split(" ").map(t=>`.${t}`).join(" ").trim()} .diff-table {\n width: 100%;\n font-size: var(--red-ui-primary-font-size);\n font-family: var(--red-ui-primary-font);\n }\n ${t} .diff-table thead tr {\n font-weight: bold;\n padding: 2px 4px;\n /* bottom border only */\n border-bottom: 3px solid #ddd;\n }\n ${t} .diff-table td {\n padding: 2px 4px;\n border-bottom: 1px solid #ddd;\n }\n ${t} .diff-table .diff-info {\n display: flex;\n align-items: center;\n gap: 4px;\n }\n ${t} .diff-value button {\n height: 20px;\n width: 20px;\n padding: 1px;\n }\n ${t} .diff-value span {\n margin-left: 4px;\n margin-top: 2px;\n }\n ${t} .diff-type {\n height: 14px;\n width: 14px;\n margin: 2px;\n }\n ${t} .diff-type-text {\n flex-grow: 1;\n }\n ${t} .diff-type-moved {\n background-color: var(--red-ui-diff-state-moved);\n }\n ${t} .diff-type-added {\n background-color: var(--red-ui-diff-state-added);\n }\n ${t} .diff-type-deleted {\n background-color: var(--red-ui-diff-state-deleted);\n }\n ${t} .diff-type-changed {\n background-color: var(--red-ui-diff-state-changed);\n }\n ${t} .diff-type-positionChanged {\n background-color: var(--red-ui-diff-state-changed);\n }\n\n .red-ui-editor {\n font-size: var(--red-ui-primary-font-size);\n font-family: var(--red-ui-primary-font);\n padding: 0;\n margin: 0;\n background: var(--red-ui-primary-background);\n color: var(--red-ui-primary-text-color);\n line-height: 20px\n }\n ${t} {\n position: relative;\n }\n /* Source view */\n ${t} pre.red-ui-workspace-source {\n height: 100%;\n overflow: auto;\n width: 100%;\n font-family: var(--red-ui-monospace-font);\n background-color: #f7f7f7;\n }\n /* Chart view */\n ${t} .red-ui-workspace-chart {\n box-sizing: border-box;\n border: var(--red-ui-view-border);\n border-radius: 0 4px 4px 4px;\n overflow: scroll;\n height: 100%;\n width: 100%;\n }\n ${t} div.red-ui-footer {\n height: 20px\n }\n ${t}.has-tabs div.red-ui-workspace-chart {\n height: calc(100% - 34px);\n }\n ${t} svg {\n position: relative;\n width: 100%;\n height: 100%;\n min-height: 250px;\n margin: auto;\n display: block;\n border-radius: 2px;\n }\n ${t} svg {\n cursor: default;\n }\n ${t} svg .group-text-label {\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 14px;\n }\n ${t} svg .node-text-label {\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 14px;\n dominant-baseline: middle;\n }\n ${t} svg .subflow-node-text-label {\n color: rgb(85, 85, 85);\n dominant-baseline: middle;\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 10px;\n line-height: 20px;\n pointer-events: none;\n text-anchor: middle;\n user-select: none\n }\n ${t} svg .subflow-node-text-label-number {\n color: rgb(85, 85, 85);\n dominant-baseline: middle;\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n font-size: 16px;\n line-height: 20px;\n pointer-events: none;\n text-anchor: middle;\n user-select: none\n }\n\n ${t} svg .node {\n fill-opacity: 1;\n stroke-width: 1px;\n }\n ${t} svg .link {\n stroke: #999;\n stroke-width: 3;\n fill: none;\n }\n ${t} svg .link-highlight, .node-highlight {\n stroke: rgb(255, 127, 14);\n }\n ${t} svg .node-highlight {\n stroke-width: 3px;\n }\n ${t} .tab-glow {\n border-radius: 2px;\n animation: tab-glow-animation 1s infinite;\n }\n @keyframes tab-glow-animation {\n 0% {\n box-shadow: 0 0 0px 0px #7d26cddd;\n }\n 50% {\n box-shadow: 0 0 10px 5px #7d26cddd;\n }\n 100% {\n box-shadow: 0 0 0px 0px #7d26cddd;\n }\n }\n\n ${t} svg .node-disabled {\n stroke-dasharray: 8,3;\n fill-opacity: 0.5;\n }\n ${t} svg .group-highlight {\n stroke: rgb(255, 127, 14);\n stroke-width: 4px;\n fill: rgb(255, 127, 14);\n fill-opacity: 0.2;\n }\n ${t} svg .link-disabled {\n stroke-dasharray: 10,8 !important;\n stroke-width: 2 !important;\n stroke: rgb(204, 204, 204);\n }\n ${t} svg .grid-line {\n shape-rendering: geometricprecision;\n stroke: rgb(238, 238, 238);\n stroke-width: 1px;\n fill: none;\n }\n ${t} svg .red-ui-flow-port {\n stroke-width: 1px;\n stroke-miterlimit: 4;\n fill: var(--red-ui-node-port-background);\n }\n ${t} svg .red-ui-flow-port-input {\n stroke-width: 1px;\n stroke-miterlimit: 4;\n fill: var(--red-ui-node-port-background);\n }\n ${t} svg .flow-render-error {\n background-color: rgb(54, 52, 52); \n color: rgb(196, 59, 59); \n width: 100%;\n }\n ${t} svg text {\n user-select: none;\n }\n ${t} .red-ui-tabs {\n display: flex;\n }\n ${t} .red-ui-tab {\n padding: 6px 12px;\n box-sizing: border-box;\n display: block;\n border: 1px solid #bbbbbb;\n border-right: none;\n background-color: #f0f0f0;\n max-width: 200px;\n max-height: 34px; /* for calculating svg height */\n height: 34px; /* for calculating svg height */\n width: 14%;\n overflow: hidden;\n white-space: nowrap;\n position: relative;\n margin-top: -1px;\n transition: 0.2s background-color;\n user-select: none;\n position: relative;\n z-index: 1;\n top: 1px;\n }\n ${t} .red-ui-tab div.red-ui-tab-label {\n position: absolute;\n top: 7px;\n left: 10px;\n }\n ${t} .red-ui-tab-subflow-icon {\n mask-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNjAiIHZpZXdCb3g9IjAsIDAsIDQwLCA2MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNMjUgMjUuOTRoN2MuNTggMCAxLS40MiAxLTF2LTJjMC0uNTgtLjQyLTEtMS0xaC03Yy0uNTggMC0xIC40Mi0xIDF2MmMwIC41OC40MiAxIDEgMXptLTE3IDEyaDdjLjU4IDAgMS0uNDIgMS0xdi0yYzAtLjU4LS40Mi0xLTEtMUg4Yy0uNTggMC0xIC40Mi0xIDF2MmMwIC41OC40MiAxIDEgMXptLS40MTYgMTFDNS42MjQgNDguOTQgNCA0Ny4zMTUgNCA0NS4zNTZWMTQuNTIyYzAtMS45NiAxLjYyNS0zLjU4MiAzLjU4NC0zLjU4MmgyNC44MzJjMS45NiAwIDMuNTg0IDEuNjIzIDMuNTg0IDMuNTgydjMwLjgzNGMwIDEuOTYtMS42MjUgMy41ODQtMy41ODQgMy41ODR6TTMyIDM2Ljk0SDE5YzAgMi4xOS0xLjgxIDQtNCA0SDd2NC40MTZjMCAuMzUuMjM1LjU4NC41ODQuNTg0aDI0LjgzMmMuMzUgMCAuNTg0LS4yMzUuNTg0LS41ODR2LTguNDE3em0xLTJ2LTZoLThjLTIuMTkgMC00LTEuODEtNC00aC0xYy00LjMzMy0uMDAyLTguNjY3LjAwNC0xMyAwdjZoOGMyLjE5IDAgNCAxLjgxIDQgNGgxM3ptMC0xNnYtNC40MThjMC0uMzUtLjIzNS0uNTgyLS41ODQtLjU4Mkg3LjU4NGMtLjM1IDAtLjU4NC4yMzMtLjU4NC41ODJ2OC40MTdjNC4zMzMuMDAyIDguNjY3LjAwMSAxMyAuMDAxaDFjMC0yLjE5IDEuODEtNCA0LTRoOHoiIGNvbG9yPSIjMDAwIiBmaWxsPSIjZmZmIi8+PC9zdmc+Cg==);\n display: inline-block;\n background-color: grey;\n margin-left: -8px;\n margin-right: 3px;\n margin-top: -1px;\n margin-bottom: 1px;\n opacity: 1;\n width: 16px;\n height: 18px;\n vertical-align: middle;\n mask-size: contain;\n mask-position: center;\n mask-repeat: no-repeat;\n }\n ${t} .red-ui-tab-disabled-icon {\n mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25' viewBox='0 0 1536 1792' style='&%2310;'%3E%3Cscript xmlns=''/%3E%3Cpath d='M1312 893q0-161-87-295l-754 753q137 89 297 89 111 0 211.5-43.5t173.5-116.5 116-174.5 43-212.5zM313 1192l755-754q-135-91-300-91-148 0-273 73t-198 199-73 274q0 162 89 299zM1536 893q0 157-61 300t-163.5 246-245 164-298.5 61-298.5-61-245-164-163.5-246-61-300 61-299.5 163.5-245.5 245-164 298.5-61 298.5 61 245 164 163.5 245.5 61 299.5z' fill='currentColor'/%3E%3Cscript xmlns=''/%3E%3C/svg%3E");\n display: inline-block;\n background-color: grey;\n margin-left: -8px;\n margin-right: 3px;\n margin-top: 0px;\n margin-bottom: 0px;\n opacity: 1;\n width: 16px;\n height: 16px;\n vertical-align: middle;\n mask-size: contain;\n mask-position: center;\n mask-repeat: no-repeat;\n transform: translateY(-2px);\n }\n ${t} .red-ui-tab span {\n font-size: 0.875rem;\n font-family: Helvetica Neue, Arial, Helvetica, sans-serif;\n }\n ${t} .red-ui-tab.active {\n background-color: white;\n border-bottom-color: white;\n font-weight: bold;\n }\n ${t} .red-ui-tab.disabled {\n border-top-style: dashed;\n border-left-style: dashed;\n font-style: italic;\n }\n ${t} .red-ui-tab:first-child {\n border-radius: 4px 0 0 0;\n }\n ${t} .red-ui-tab:last-child {\n border-right: 1px solid #bbbbbb;\n border-radius: 0 4px 0 0;\n }\n ${t} .red-ui-tab:first-child:last-child {\n border-radius: 4px 4px 0 0;\n }\n ${t} .red-ui-tab:last-child.disabled {\n border-right-style: dashed;\n }\n ${t} .red-ui-tab:hover {\n cursor: pointer;\n background-color: white;\n }\n /* positioning of toolbar */\n ${t} .toolbar {\n display: flex;\n flex-direction: row;\n position: absolute;\n bottom: 5px;\n right: 5px;\n opacity: 0.6;\n }\n ${t} .toolbar:hover {\n opacity: 1;\n }\n ${t}.has-scrollbars .toolbar {\n bottom: 24px;\n right: 24px;\n }\n\n ${t} .hidden {\n display: none !important;\n }\n ${t} .toolbar .button-group.hidden {\n display: none !important;\n }\n ${t} .toolbar .icon-button-bg.view-source {\n background-image: url("${I}");\n }\n ${t} .toolbar .icon-button-bg.download-flow {\n background-image: url("${l}");\n }\n ${t} .toolbar .icon-button-bg.copy-flow {\n background-image: url("${d}");\n }\n ${t} .toolbar .icon-button-bg.zoom-reset {\n background-image: url("${c}");\n }\n ${t} .toolbar .icon-button-bg {\n background-repeat: no-repeat;\n background-position: center;\n background-size: 16px 16px; /* Size of the background SVG */\n background-color: transparent;\n padding: 4px;\n cursor: pointer;\n width: 24px;\n height: 24px;\n font-size: 0; /* Hide any default button text if present */\n line-height: 0; /* Hide any default button text if present */\n }\n\n ${t} .toolbar .icon-button-bg:hover {\n background-color: #f0f0f0;\n }\n\n /* styles for button groups and buttons */\n ${t} .button-group {\n display: flex;\n flex-direction: row;\n }\n ${t} .button-group button {\n user-select: none;\n box-sizing: border-box;\n display: inline-block;\n text-align: center;\n cursor: pointer;\n line-height: 22px;\n height: 24px;\n color: var(--red-ui-workspace-button-color) !important;\n background: var(--red-ui-workspace-button-background);\n text-decoration: none;\n border: 1px solid var(--red-ui-form-input-border-color);\n margin: 0px;\n padding: 0px;\n }\n ${t} .button-group button:not(:first-child) {\n border-top-left-radius: 0px;\n border-bottom-left-radius: 0px;\n border-left: none;\n }\n\n /* zoom controls */\n ${t} .zoom-controls.button-group button {\n font-size: 22px;\n width: 24px;\n }\n\n /* copy controls */\n ${t} .copy-controls.button-group {\n margin-right: 8px;\n }\n ${t} .copy-controls.button-group button {\n padding: 0px 4px;\n }\n\n /* source controls */\n ${t} .source-controls.button-group {\n margin-right: 8px;\n }\n ${t} .source-controls.button-group button {\n padding: 0px 4px;\n }\n\n /* compare controls */\n ${t} .compare-controls.button-group {\n margin-right: 24px;\n }\n ${t} .compare-controls input[type='range'].flow-compare-slider {\n width: 100%;\n -webkit-appearance: none;\n }\n ${t} input[type='range'].flow-compare-slider::-webkit-slider-runnable-track {\n height: 16px;\n background: var(--red-ui-workspace-button-background);\n border-radius: 16px;\n }\n /* Track: Mozilla Firefox */\n ${t} input[type='range'].flow-compare-slider::-moz-range-track {\n height: 16px;\n background: var(--red-ui-workspace-button-background);\n border-radius: 16px;\n }\n `}function G(t,e){const i="flow-renderer-css"+(e?"--"+e.toString():"").replace(/[^a-z0-9]/gi,"-").toLowerCase();let n=t.getElementById(i);n||(n=t.createElement("style"),n.id=i,n.innerHTML=U(e),t.head.appendChild(n))}function H(t,e){if(t){const i=t.querySelector(`.flow-layer-${e||0}`);["flow_group_elements","flow_group_select","flow_wires","flow_nodes"].forEach(t=>{const e=i.querySelector(`.${t}`)||k("g",{class:t},i);for(;e.firstChild;)e.removeChild(e.firstChild)})}}function P(t){const e=[],i={},n={},o=[],M={};return t.forEach(function(t){M[t.id]=t,"tab"===t.type?(e.push(t.id),i[t.id]={n:t,nodes:[]}):"subflow"===t.type&&(n[t.id]={n:t,nodes:[]})}),t.forEach(function(t){"tab"!==t.type&&"subflow"!==t.type&&(i[t.z]?i[t.z].nodes.push(t):n[t.z]?n[t.z].nodes.push(t):o.push(t))}),{all:M,tabOrder:e,tabs:i,subflows:n,globals:o}}function W(t,i,n,o,M,r=!1){const u=o-i,a=n-t,A=Math.sqrt(u*u+a*a);let g=.75;if(a*M>0?A0){const r=[[t+M*(e*g),i+0],[n-M*g*e,o-0]];return`M ${t} ${i} C ${r[0][0]} ${r[0][1]} ${r[1][0]} ${r[1][1]} ${n} ${o}`}{let A,s,c,d,l;const I=Math.floor(n-a/2),L=Math.floor(o-u/2);if(Math.abs(u)<10){d=Math.max(i,o)+(r?35:25);const e=d-i;return l=[[t+15*M,i],[t+25*M,i+5],[t+25*M,i+e/2],[t+25*M,i+e-5],[t+15*M,i+e],[t,i+e],[n-15*M,i+e],[n-25*M,i+e-5],[n-25*M,o+(d-o)/2],[n-25*M,o+5],[n-15*M,o],[n,o]],"M "+t+" "+i+" C "+l[0][0]+" "+l[0][1]+" "+l[1][0]+" "+l[1][1]+" "+l[2][0]+" "+l[2][1]+" C "+l[3][0]+" "+l[3][1]+" "+l[4][0]+" "+l[4][1]+" "+l[5][0]+" "+l[5][1]+" h "+a+" C "+l[6][0]+" "+l[6][1]+" "+l[7][0]+" "+l[7][1]+" "+l[8][0]+" "+l[8][1]+" C "+l[9][0]+" "+l[9][1]+" "+l[10][0]+" "+l[10][1]+" "+l[11][0]+" "+l[11][1]+" "}{const r=15,a=(o+L)/2;A=t+M*e*g,s=u>0?Math.min(a-u/2,i+r):Math.max(a-u/2,i-r),c=n-M*e*g,d=u>0?Math.max(a,o-r):Math.min(a,o+r);const N=(t+A)/2,j=u>0?1:-1;return l=[[N,i],[A,u>0?Math.max(i,s-r):Math.min(i,s+r)],[N,u>0?Math.min(L,s+r):Math.max(L,s-r)],[c,u>0?Math.max(L,d-r):Math.min(L,d+r)],[(n+c)/2,o]],l[2][1]===s+j*r&&(Math.abs(u)<10*r&&(l[1][1]=s-j*r/2,l[3][1]=d-j*r/2),l[2][0]=A),"M "+t+" "+i+" C "+l[0][0]+" "+l[0][1]+" "+l[1][0]+" "+l[1][1]+" "+A+" "+s+" S "+l[2][0]+" "+l[2][1]+" "+I+" "+L+" S "+l[3][0]+" "+l[3][1]+" "+c+" "+d+" S "+l[4][0]+" "+l[4][1]+" "+n+" "+o}}}function J(t,e){const i=function(t){let e=[];const i=t.split(/\\n /);if(i.length>1){let t=0;for(t=0;t{switch(t){case"str":return"string";case"num":return"number";case"bool":return"boolean";case"json":return"json";case"date":return"timestamp";case"bin":return"binary";case"env":return"environment";case"flow":return"flow";case"global":return"global";default:return t}},q=["inject","change","switch","function","template","delay","trigger","link in","link out","link call","watch","complete","catch","status","comment","debug","subflow","range","filter","rbe","mqtt in","mqtt out","http in","http response","http request","websocket in","websocket out","tcp in","tcp out","udp in","udp out","tcp request","split","join","sort","batch","csv","json","xml","yaml","html","file in","file","exec"],K=(t,e,i)=>{const n=t.name||e.name;if(n)return n;const o=t.label||t.info||t.text||"";let M="",r="",u="",a="";switch(t.type){case"file":u="write file";case"file in":return u=u||"read file",r=t.filename,"str"!==t.filenameType&&"env"!==t.filenameType&&(r=""),"env"===t.filenameType&&(r="env."+r),"write file"===u&&"delete"===t.overwriteFile?t.name||"delete "+r:t.name||r||u;case"html":M=t.tag;break;case"tcp in":case"tcp out":case"tcp request":u="tcp:";case"udp in":case"udp out":return u=u||"udp:",r=t.host||t.addr||t.server||"",u+(r?r+":":"")+(t.port||"");case"debug":return!0!==t.console&&"true"!==t.console||(a="\t⇲"),"jsonata"===t.targetType?(t.name||"JSONata")+a:!0===t.complete||"true"===t.complete?(t.name||"msg")+a:(t.name||"msg."+(t.complete&&"false"!==t.complete?this.complete:"payload"))+a}return t.type&&t.type.startsWith("ui-")?M=t.type.replace(/^ui-/,""):t.type&&t.type.startsWith("ui_")&&(M=t.type.replace(/^ui_/,"")),M&&M.length<=32?M:o||(t.topic&&t.topic.length<=32&&q.includes(t.type)?t.topic:t.type)},_=(t,e,i)=>(t.name||t.label||t.info||t.text||"").replace(/(.{40,60})([ \n\t])/g,"$1\\n$2")+(t.sumPass?" ⭄":"")+(t.sumPassPrio&&0!=parseInt(t.sumPassPrio)?" ("+t.sumPassPrio+")":""),$={"victron-virtual-switch":"Virtual Switch","victron-virtual":"Virtual Device","victron-inject":"Inject Notification","vrm-api":"VRM API","victron-input-accharger":"AC Charger","victron-input-acload":"AC Load","victron-input-acsystem":"AC System","victron-input-alternator":"Alternator","victron-input-battery":"Battery Monitor","victron-input-dcdc":"DC-DC","victron-input-dcload":"DC Load","victron-input-dcsource":"DC Source","victron-input-dcsystem":"DC System","victron-input-dess":"Dynamic ESS","victron-input-digitalinput":"Digital Input","victron-input-ess":"ESS","victron-input-evcharger":"EV Charger","victron-input-fuelcell":"Fuel cell","victron-input-generator":"Generator","victron-input-gps":"GPS","victron-input-gridmeter":"Grid Meter","victron-input-inverter":"Inverter","victron-input-meteo":"Meteo","victron-input-motordrive":"E-drive","victron-input-multi":"Multi RS","victron-input-pulsemeter":"Pulsemeter","victron-input-pump":"Pump","victron-input-pvinverter":"PV Inverter","victron-input-relay":"Relay","victron-input-settings":"Settings","victron-input-solarcharger":"Solar Charger","victron-input-switch":"Switch","victron-input-system":"System","victron-input-tank":"Tank Sensor","victron-input-temperature":"Temperature Sensor","victron-input-vebus":"VE.Bus System","victron-output-accharger":"AC Charger Control","victron-output-acsystem":"AC System Control","victron-output-battery":"Battery Monitor Control","victron-output-charger":"Charger Control","victron-output-dcdc":"DC-DC Control","victron-output-dess":"Dynamic ESS Control","victron-output-ess":"ESS Control","victron-output-evcharger":"EV Charger Control","victron-output-generator":"GX Generator Control","victron-output-inverter":"Inverter Control","victron-output-multi":"Multi RS Control","victron-output-pump":"Pump Control","victron-output-pvinverter":"PV Inverter Control","victron-output-relay":"Relay Control","victron-output-settings":"Settings Control","victron-output-solarcharger":"Solar Charger Control","victron-output-switch":"Switch Control","victron-output-vebus":"VE.Bus System Control","victron-input-custom":"Custom Input","victron-output-custom":"Custom Control"},tt=(t,e,i)=>{let n="";if(t.serviceObj&&t.path){var o=t.serviceObj.name,M=t.pathObj.name;n="".concat(o," | ").concat(M)}if(t.device&&(n="Virtual "+t.device),"vrm-api"==t.type)switch(n=t.api_type,t.api_type){case"users":n+=" - "+(t.usersQuery||"me");break;case"installations":"stats"===t.installations?n+=" - Stats: "+t.attribute:n+=" - "+t.installations;break;case"widgets":n+=" - "+t.widgets}return t.name||n||$[t.type]||t.type},et={base64:void 0,batch:void 0,catch:(t,e,i)=>{let n="";return t.uncaught&&(n=": uncaught"),t.scope&&(n=": "+t.scope.length),t.scope||t.uncaught||(n=": all"),t.name||t.type+n},change:t=>{function e(t,e){return t+"."+M.utils.parseContextKey(e).key}return t.name?t.name:(t._=t._||function(t,e){let i=t;switch(t){case"change.label.set":i="set {{property}}";break;case"change.label.change":i="change {{property}}";break;case"change.label.move":i="move {{property}}";break;case"change.label.delete":i="delete {{property}}";break;case"change.label.changeCount":i="change {{count}} properties"}for(const n in e)t=i.replace(new RegExp("\\{\\{"+n+"\\}\\}","g"),e[n]);return t},t.rules?1===t.rules.length?"set"===t.rules[0].t?t._("change.label.set",{property:e(t.rules[0].pt||"msg",t.rules[0].p)}):"change"===t.rules[0].t?t._("change.label.change",{property:e(t.rules[0].pt||"msg",t.rules[0].p)}):"move"===t.rules[0].t?t._("change.label.move",{property:e(t.rules[0].pt||"msg",t.rules[0].p)}):t._("change.label.delete",{property:e(t.rules[0].pt||"msg",t.rules[0].p)}):t._("change.label.changeCount",{count:t.rules.length}):"replace"===t.action?t._("change.label.set",{property:"msg."+t.property}):"change"===t.action?t._("change.label.change",{property:"msg."+t.property}):"move"===t.action?t._("change.label.move",{property:"msg."+t.property}):t._("change.label.delete",{property:"msg."+t.property}))},comment:void 0,csv:void 0,debug:void 0,exec:void 0,file:void 0,"file in":void 0,function:void 0,html:void 0,"http response":(t,e,i)=>t.name||"http"+(t.statusCode?" ("+t.statusCode+")":""),"http in":(t,e,i)=>t.name||"["+t.method+"] "+t.url,"http request":void 0,inject:t=>{let e="";if(t.once&&(e=" ¹"),(t.repeat&&0!=t.repeat||t.crontab)&&(e="\t↻"),t.name)return t.name+e;let i="",n="str",o="";const r=t.props;if(r)for(let e=0;e0&&i.length<24?i+e:"inject"+e;if("date"===n||"bin"===n||"env"===n)return""!==o&&o.length<=16?o+":"+X(n)+e:X(n)+e;if("flow"===n||"global"===n){return n+"."+M.utils.parseContextKey(i).key+e}return"inject"+e},join:void 0,json:void 0,junction:void 0,"link in":void 0,"link out":void 0,"link call":(t,e,i)=>{if(!t.links||0===t.links.length)return t.name||t.type;let n;return i.forEach(function(o){n||o.id===t.links[0]&&(n=(et[o.type]||K)(o,e,i))}),t.name||n||t.type},markdown:void 0,postgresql:void 0,range:void 0,sort:void 0,split:void 0,switch:void 0,yaml:void 0,xml:void 0,BlogPages:void 0,BlogDetails:void 0,BlogPageInfo:(t,e,i)=>{if(t.name)return t.name;let n;return i.forEach(function(e){n||"link in"===e.type&&e.name.startsWith("[blog] ")&&(e.wires[0]||[]).indexOf(t.id)>-1&&(n=e.name.substring(7))}),n||t.type},PubMedium:void 0,Topic:_,Observation:_,Question:_,Thought:_,Idea:_,Analogy:_,Aphorism:_,Poesie:_,Humour:_,Treasure:_,Consequence:_,Advantage:_,Disadvantage:_,Text:_,"Blog-Post":_,Comment:_,Codebase:_,Sketch:_,Inspiration:_,Quote:_,Definition:_,Book:_,Author:_,"nnb-input-node":void 0,"nnb-layer-node":(t,e,i)=>t.name||t.actfunct+": "+t.bias+", "+t.threshold,"nnb-output-node":void 0,"nnb-backprop":void 0,"nnb-trainer":void 0,Seeker:void 0,Sink:void 0,Screenshot:void 0,Orphans:void 0,IsMobile:void 0,Navigator:void 0,DrawSVG:void 0,GetFlows:void 0,"victron-virtual-switch":tt,"victron-virtual":tt,"victron-inject":tt,"vrm-api":tt,"victron-input-accharger":tt,"victron-input-acload":tt,"victron-input-acsystem":tt,"victron-input-alternator":tt,"victron-input-battery":tt,"victron-input-dcdc":tt,"victron-input-dcload":tt,"victron-input-dcsource":tt,"victron-input-dcsystem":tt,"victron-input-dess":tt,"victron-input-digitalinput":tt,"victron-input-ess":tt,"victron-input-evcharger":tt,"victron-input-fuelcell":tt,"victron-input-generator":tt,"victron-input-gps":tt,"victron-input-gridmeter":tt,"victron-input-inverter":tt,"victron-input-meteo":tt,"victron-input-motordrive":tt,"victron-input-multi":tt,"victron-input-pulsemeter":tt,"victron-input-pump":tt,"victron-input-pvinverter":tt,"victron-input-relay":tt,"victron-input-settings":tt,"victron-input-solarcharger":tt,"victron-input-switch":tt,"victron-input-system":tt,"victron-input-tank":tt,"victron-input-temperature":tt,"victron-input-vebus":tt,"victron-output-accharger":tt,"victron-output-acsystem":tt,"victron-output-battery":tt,"victron-output-charger":tt,"victron-output-dcdc":tt,"victron-output-dess":tt,"victron-output-ess":tt,"victron-output-evcharger":tt,"victron-output-generator":tt,"victron-output-inverter":tt,"victron-output-multi":tt,"victron-output-pump":tt,"victron-output-pvinverter":tt,"victron-output-relay":tt,"victron-output-settings":tt,"victron-output-solarcharger":tt,"victron-output-switch":tt,"victron-output-vebus":tt,"victron-input-custom":tt,"victron-output-custom":tt,_default:K};function it(t){const e={};let i=1e4,n=0;for(const o of t)"subflow"===o.type?e[o.id]={id:o.id,label:o.name,type:"subflow",disabled:o.disabled,order:i++}:"tab"!==o.type&&o.z&&(e[o.z]||(e[o.z]={id:o.z,label:"Flow "+(n+1),type:"tab",disabled:!1,order:n++}));const o=t.filter(t=>"tab"===t.type);let M=0;for(const t of o)e[t.id]&&(e[t.id].label=t.label||e[t.id].label,e[t.id].disabled=!!t.disabled,e[t.id].order=M++);const r=Object.keys(e).map(t=>e[t]);return r.sort((t,e)=>t.order-e.order),r}function nt(t){Array.isArray(t)||(t=[]);const e=[...t];for(let t=0;t0?i.add(...n):e?.classList?.length&&i.add(...e.classList),0===i.size&&i.add("flow-renderer"),[...i]}(t)),t.container){const i={};["scope","gridLines","arrows","zoom","images","linkLines","labels","autoZoom","autoScroll","flowId"].forEach(function(e){if("string"==typeof t.container.dataset[e]){const n=t.container.dataset[e]||"true";i[e.replace(/-/g,"")]="true"===n}}),e.push(i)}e.push(t)}return Object.assign({},...e)}function Mt(e,i){e=nt(e);const n=p((i=ot(i)).document,t.document,i.container,this),o=i.container;for(;o.firstChild;)o.removeChild(o.firstChild);const M=n.createElement("div");M.classList.add("red-ui-tabs"),o.appendChild(M);const r=f(o);!function(t,e,i=!0){const n=p(t,this),o=n.createElement("pre");o.classList.add("red-ui-workspace-source"),i&&o.classList.add("hidden"),o.setAttribute("data-code-wrap","json");const M=n.createElement("code");M.classList.add("lang-json","hljs","language-json"),M.textContent="object"==typeof e?JSON.stringify(e,null,2):"string"==typeof e?e:"// No content available",o.appendChild(M),t&&t.appendChild(o)}(o,e);const u=function(t){const e=p(t,this);if(!e)return null;let i=t.querySelector(".toolbar");i||(i=E(t));let n=i.querySelector(".source-controls");if(n)return{viewSource:i.querySelector(".view-source")};n=e.createElement("div"),n.classList.add("source-controls"),n.classList.add("button-group");const o=e.createElement("button");return o.classList.add("red-ui-footer-button","icon-button-bg","view-source"),o.title="Toggle Flows / Source",n.appendChild(o),i.appendChild(n),{viewSource:o}}(o);u.viewSource.onclick=function(t){!function(t){t.preventDefault(),t.stopPropagation();const e=t.target.parentElement.parentElement.parentElement.querySelector(".red-ui-workspace-chart");if(!e)return void console.warn("No container found for source view toggle");const i=e.parentElement,n=i.querySelector(".red-ui-tabs"),o=i.querySelector(".red-ui-workspace-source"),M=i.querySelector(".zoom-controls");o&&o.classList.contains("hidden")?(o.classList.remove("hidden"),e.classList.add("hidden"),n.classList.add("hidden"),M?.classList.add("hidden")):(o.classList.add("hidden"),e.classList.remove("hidden"),n.classList.remove("hidden"),M?.classList.remove("hidden"))}(t)};const a=function(t){const e=p(t,this);if(!e)return null;let i=t.querySelector(".toolbar");i||(i=E(t));let n=i.querySelector(".copy-controls");if(n)return{copy:i.querySelector(".copy-flow"),download:i.querySelector(".download-flow")};n=e.createElement("div"),n.classList.add("copy-controls"),n.classList.add("button-group");const o=e.createElement("button");o.classList.add("red-ui-footer-button","icon-button-bg","copy-flow"),o.title="Copy Flow to Clipboard";const M=e.createElement("button");return M.classList.add("red-ui-footer-button","icon-button-bg","download-flow"),M.title="Download Flows",n.appendChild(o),n.appendChild(M),i&&i.appendChild(n),{copy:o,download:M}}(o);a.copy.onclick=function(t){!function(t,e,i){i=i||function(){};let n=e||[];"object"==typeof n?n=JSON.stringify(n,null,0):"string"!=typeof n&&(n=n.toString());const o=p(t&&t.target&&t.target.ownerDocument,this);if("undefined"!=typeof navigator&&navigator.clipboard)return void navigator.clipboard.writeText(n).then(function(){i(null,!0)}).catch(function(t){i(t,!1)});const M=o.createElement("textarea");M.value=n,M.style.position="fixed",M.style.top="0",M.style.left="0";try{o.body.appendChild(M),M.focus(),M.select();const t=o.execCommand("copy");i(null,t),console.info("failed to copy",t)}catch(t){console.error("failed to copy",t)}finally{o.body.removeChild(M)}}(t,e)},a.download.onclick=function(t){!function(t,e,i,n,o){o=o||function(){};let M=e||[];"object"==typeof M?M=JSON.stringify(M,null,2):"string"!=typeof M&&(M=M.toString());const r=p(t&&t.target&&t.target.ownerDocument,this),u=new Blob([M],{type:i}),a=URL.createObjectURL(u),A=r.createElement("a");A.style.display="none",A.href=a,A.download=n,A.style.position="fixed",A.style.top="0",A.style.left="0";try{r.body.appendChild(A),A.focus(),A.click(t),URL.revokeObjectURL(a),o(null,!0)}catch(t){o(t,!1),console.error("failed to download",t)}finally{r.body.removeChild(A)}}(t,e,"application/json","flows.json")};const A=O(r);H(A),v(A),o.classList.add(i.scope);const g=function(t){M.querySelectorAll(".red-ui-tab").forEach(t=>t.classList.remove("active"));return M.querySelector(`[data-flow-id="${t}"]`).classList.add("active"),i.flowId=t,rt(e,i)};G(n,i.scope);const s=o.querySelectorAll(".red-ui-tab");s&&s.forEach(t=>t.remove());const c=it(e);if(c.forEach((e,n)=>{!function(e,i,n,o,M){const r=`red-ui-tab-${n}`,u=o.container,a=o.svg||u.querySelector("svg"),A=p(o.document,t.document,u,this),g=i.label;let s=u.querySelector(`.${r}`);if(s||(s=A.createElement("div"),e.appendChild(s),s.classList.add("red-ui-tab"),s.classList.add("red-ui-tab-"+i.type),s.setAttribute("data-flow-id",i.id)),i.disabled){s.classList.add("disabled");const t=A.createElement("i");t.classList.add("red-ui-tab-disabled-icon"),s.appendChild(t)}else if("subflow"===i.type){const t=A.createElement("i");t.classList.add("red-ui-tab-subflow-icon"),s.appendChild(t)}s.title=g;const c=A.createElement("span");c.textContent=g,s.appendChild(c),s.onclick=function(t){z(a,o,o.flowId),M(i.id),h(a,o,i.id)}}(M,e,n,i,g)}),c.length?o.classList.add("has-tabs"):o.classList.remove("has-tabs"),!i.flowId){const t=c.find(t=>"tab"===t.type),e=c.find(t=>"subflow"===t.type);i.flowId=t?t.id:e?e.id:null}let d=null;return d=c.length?g(i.flowId):rt(e,i),z(A,i,i.flowId),d=d||{},d.tabs=c,d.flowId=i.flowId,d.css=d.css||U(i.scope),d}function rt(t,i){t=nt(t);const n=(i=ot(i)).container,r={},A={},c={},d={},l={},I=(i=i||{}).flowId,L=j("junction");let N=!1;const y=it(t).find(t=>t.id===I);y&&"tab"===y.type&&(N=y.disabled);let p=n&&n.querySelector("svg");p=p||O(n),H(p,i.layer);const w=(i.svgLayer||p).querySelector(".flow_grid");i.gridLines&&w&&B(w),t.forEach(function(t){if("subflow"===t.type){A["subflow:"+t.id]=t;for(let e=0;e0&&t.wires.forEach(function(t){t.forEach(function(t){l[t]=!0})})});const m=(i.svgLayer||p).querySelector(".flow_nodes");t.forEach(function(n){if(n.z===I||n.id===I){const I=D(n),y=function(t){let e=!0;return"link out"!==t.type&&"link in"!==t.type||(e=!1),"junction"===t.type||"tab"===t.type||"subflow"===t.type||(!1===t.l?e=!1:!0===t.l&&(e=!0)),e}(n),p=!i.labels,w=j(n.type);switch(n.type){case"tab":case"ui_spacer":case"ui-spacer":break;case"group":c[n.id]=n;break;case"subflow":d[n.id]={...n};for(let t=0;t1?18:16)+")"});let t=0;d.lines.forEach(function(e){const i=k("text",{y:t,class:"node-text-label"});i.textContent=e,j.appendChild(i),t+=20})}const D=k("g",{"data-node-id":n.id,class:"node"});m.appendChild(D),y&&j&&D.appendChild(j);const b=y?j?.getBBox():{width:0,height:0},C=b.width,x=b.height+13.5,S=y?I.width>C?I.width:C:I.width,T=y?I.height>x?I.height:x:I.height,z={x:n.x,y:n.y,w:S,h:T,outputs:(n.wires||[]).length},h=!!l[n.id];try{y?(z.w=Math.max(e,20*Math.ceil((d.width+48+(h?7:0))/20)),z.h=Math.max(6+24*d.lines.length,15*(z.outputs||0),30)):(z.w=30,z.h=Math.max(30,15*(z.outputs||0)))}catch(t){}if(z.outputs>2&&y&&j&&z.h>x){const t=(z.h-x)/2;j.setAttributeNS(null,"transform","translate(38,"+((d.lines.length>1?16:14)+t)+")")}p&&j&&(j.style.display="none"),D.prepend(k("rect",{...w,rx:5,ry:5,fill:c.color||w.fill,width:z.w,height:z.h,class:"node node-"+n.id})),D.appendChild(k("path",{d:"M5 0 h25 v"+z.h+" h-25 a 5 5 0 0 1 -5 -5 v-"+(z.h-10)+" a 5 5 0 0 1 5 -5",fill:"rgb(0,0,0)","fill-opacity":.05,stroke:"none"})),y&&D.appendChild(k("path",{d:"M 29.5 0.5 l 0 "+(z.h-1),fill:"none",stroke:"rgb(0,0,0)","stroke-opacity":.1,"stroke-width":"1px"}));const v=M.view.tools.calculateGridSnapOffsets(z),f=n.x-z.w/2-v.x,E=n.y-z.h/2-v.y;if(D.setAttribute("transform",`translate(${f}, ${E})`),n.bbox=D.getBBox(),n.bbox.x=f,n.bbox.y=E,i.images){const t={x:0,y:Math.max(z.h/2-15,0),width:30,height:30},e=function(t){let e=g[t];return e||(t.startsWith("subflow:")?e=g.subflow:t.startsWith("ui-")?e=g["ui-template"]:t.startsWith("ui_")&&(e=g.ui_template)),e&&s[e]||""}(n.type);if(e)D.appendChild(k("image",{href:e,...t}));else if(n.type.startsWith("subflow:")){const e=c.icon&&s[c.icon]||s["subflow.svg"];D.appendChild(k("image",{href:e,...t}))}}(c.in&&c.in.length>0||l[n.id])&&(i.arrows?D.appendChild(k("path",{...L,transform:"translate(-3,"+(n.bbox.height/2-5)+")",d:i.arrows?"M 0,10 9,5 0,0 Z":"M -1,9.5 8,9.5 8,0.5 -1,0.5 Z",class:"red-ui-flow-port-input input-arrows","stroke-linecap":"round","stroke-linejoin":"round"})):D.appendChild(k("rect",{...L,transform:"translate(-5,"+(n.bbox.height/2-5)+")",...u,...a,class:"red-ui-flow-port-input"})));const O={...L,...u,...a,class:"red-ui-flow-port"};if(n.wires&&Array.isArray(n.wires)){const t=1===n.wires.length?n.bbox.height/2-5:n.wires.length%2==0?3.5:4.5;for(let e=0;e0;){h-=1;for(const t in c){if(S.indexOf(t)>-1)continue;const e=c[t];let i=0,n=0,o=!1;if(e.nodes.forEach(function(t){const M=(r[t]||{}).bbox;M?(i=Math.max(i,M.x-e.x+M.width),n=Math.max(n,M.y-e.y+M.height)):o=!0}),o)continue;const M=k("g",{"data-node-id":t});M.setAttribute("transform",`translate(${e.x}, ${e.y})`),M.appendChild(k("rect",{rx:5,ry:5,width:e.w,height:e.h,fill:"none","fill-opacity":0,"stroke-width":2,stroke:"grey",class:"group-"+e.id,...e.style})),x.prepend(M);const u=r[t];u.bbox=M.getBBox(),u.bbox.x=e.x,u.bbox.y=e.y;const a=k("g",{});if(M.appendChild(a),e.style.label&&e.name){const t=e.style["label-position"]||"nw",i=J(e.name,"group-text-label");let n=0,o=0,M="start";if(o="n"===t[0]?15:u.bbox.height-5-16*(i.lines.length-1),"w"===t[1]?(n=5,M="start"):"e"===t[1]?(n=u.bbox.width-5,M="end"):(n=u.bbox.width/2,M="middle"),a.setAttribute("transform",`translate(${n}, ${o})`),a.setAttribute("text-anchor",M),i){let t=0;i.lines.forEach(function(i){const n=k("text",{class:"group-text-label",x:0,y:t,fill:e.style.color||"grey"});n.textContent=i,a.appendChild(n),t+=16})}}S.push(t)}}const v=(i.svgLayer||p).querySelector(".flow_wires"),f=[],E=Object.keys(d);for(let t=0;t2&&e.splice(2);const n=new Map,o=Q(function(t,e){const i=P(t),n=P(e),o={},M={},r={},u={},a={};return Object.keys(i.all).forEach(function(t){if(!N(n.all,t))return void(M[t]=!0);const e=JSON.stringify(i.all[t]),o=JSON.stringify(n.all[t]);if(e!==o)if(r[t]=!0,i.all[t].z!==n.all[t].z)a[t]=!0;else if(i.all[t].x!==n.all[t].x||i.all[t].y!==n.all[t].y||i.all[t].w!==n.all[t].w||i.all[t].h!==n.all[t].h){const i=JSON.parse(e),n=JSON.parse(o);delete i.x,delete i.y,delete i.w,delete i.h,delete n.x,delete n.y,delete n.w,delete n.h,JSON.stringify(i)===JSON.stringify(n)&&(u[t]=!0)}}),Object.keys(n.all).forEach(function(t){N(i.all,t)||(o[t]=!0)}),{currentConfig:i,newConfig:n,added:o,deleted:M,changed:r,positionChanged:u,moved:a}}(e[0],e[1]));o.changes.forEach(t=>{t.highlight=e=>function(t=-1,e){clearTimeout(L),clearTimeout(j);A.querySelectorAll(".red-ui-tab").forEach(t=>t.classList.remove("tab-glow"));s.querySelectorAll("g[data-node-id]").forEach(t=>{t.style.filter=""});const i=A.querySelector(".red-ui-tab.active").getAttribute("data-flow-id");let n=e.tab;"moved"===e.diffType&&(-1===t?t=e.v1:0===t?n=e.value1:1===t&&(n=e.value2));"added"===e.diffType&&-1===t?t=1:("deleted"===e.diffType&&-1===t||-1===t)&&(t=0);const o=A.querySelector(`.red-ui-tab[data-flow-id="${n}"]`);("tab"===e.item&&"changed"===e.diffType||n!==i)&&o&&(o.click(),o.classList.add("tab-glow"),j=setTimeout(()=>{o.classList.remove("tab-glow")},1e4));if(parseInt(d.value)<10||parseInt(d.value)>90){const e=0===t?10:90;!async function(){let t=parseInt(d.value);const i=e>t?1:-1;for(;t!==e;){t+=i,d.value=t;const e=new Event("input",{bubbles:!0});d.dispatchEvent(e),await new Promise(t=>setTimeout(t,10))}}()}const M=[e.item,e.tab][0],r=s.querySelector(`g.flow-layer-0 g[data-node-id="${M}"]`),u=s.querySelector(`g.flow-layer-1 g[data-node-id="${M}"]`);if(!r&&!u)return;(r||u).scrollIntoView({behavior:"smooth",block:"center",inline:"center"}),r&&(r.style.filter="url(#node-glow)");u&&(u.style.filter="url(#node-glow)");L=setTimeout(()=>{try{r&&(r.style.filter=""),u&&(u.style.filter="")}catch(t){}},1e4)}(e,t)}),o.tabMap=n;const M=p((i=ot(i)).document,t.document,i.container,this),r=i.container;G(M,i.scope);const u=i.zoom,a=i.gridLines;for(i.zoom=!1,i.gridLines=!1;r.firstChild;)r.removeChild(r.firstChild);const A=Y("div",null,"red-ui-tabs",null,r),g=f(r),s=O(g,{addDefaultLayer:!1}),c=[...s.childNodes].find(t=>"g"===t.tagName&&t.classList.contains("outerContainer")),d=function(t){if(!p(t,this))return null;let e=t.querySelector(".toolbar");e||(e=E(t));let i=e.querySelector(".compare-controls");if(i)return e.querySelector(".flow-compare-slider");i=Y("div",null,"button-group compare-controls",null,e);const n=Y("input",null,"flow-compare-slider",null,i);return n.type="range",n.min="0",n.max="100",n}(r);d.type="range",d.min=0,d.max=100,d.value=0,d.step=5,d.style.width="100%",d.classList.add("flow-compare-slider");const l=r,I=g;v(s);for(let t=0;t{const o=n[0],M=n[1],g={...i,flowId:o,container:null,layers:M};!function(e,i,n){const o=p(i.document,t.document,r,this),M=i.layers;for(const t of Object.values(M)){const r=t.tab,u=r.label,a=`red-ui-tab-${t.index}`,A=`red-ui-tab-${r.id}`;let g=e.querySelector(`.${A}`);g||(g=o.createElement("div"),e.appendChild(g),g.classList.add("red-ui-tab"),g.classList.add(a),g.classList.add(A),g.classList.add("red-ui-tab-"+M.type),g.setAttribute("data-flow-id",r.id));let c=g.querySelector(`.red-ui-tab-label-${t.index}`);if(c||(c=o.createElement("div"),c.classList.add(`red-ui-tab-label-${t.index}`)),c.classList.add("red-ui-tab-label"),c.setAttribute("data-layer",t.index),c.style.opacity=0,g.appendChild(c),r.disabled){c.classList.add("disabled");const t=o.createElement("i");t.classList.add("red-ui-tab-disabled-icon"),c.appendChild(t)}else if("subflow"===r.type){const t=o.createElement("i");t.classList.add("red-ui-tab-subflow-icon"),c.appendChild(t)}c.title=u;const d=o.createElement("span");d.textContent=u,c.appendChild(d),g.onclick=function(t){z(s,i,i.flowId),n(i),h(s,i,r.id)}}}(A,g,function(t){A.querySelectorAll(".red-ui-tab").forEach(t=>t.classList.remove("active"));A.querySelector(`[data-flow-id="${t.flowId}"]`).classList.add("active");const n=Object.values(t.layers),o={0:!0,1:!0};n.forEach(t=>{t.svgLayer.setAttribute("opacity",0);const i=t.renderOptions;rt(e[i.index]||[],i),o[i.index]=!1});const M=o[0]||o[1],g={...i,flowId:t.flowId,container:M?.container||M?.flowRenderer||r};if(o[0]&&(g.layer=0,g.svgLayer=s.querySelector("g.flow-layer-0"),rt(e[0]||[],g)),o[1]&&(g.layer=1,g.svgLayer=s.querySelector("g.flow-layer-1"),rt(e[1]||[],g)),u&&C(s,r),a){let t=[...c.childNodes].find(t=>"g"===t.tagName&&t.classList.contains("flow_grid"));t||(t=k("g",{class:"flow_grid"}),c.insertBefore(t,s.firstChild)),t&&B(t)}D()})}),d.addEventListener("input",function(t){D()});let L=null,j=null;function D(){const t=parseInt(d.value),i=[1-t/100,t/100];i.forEach((t,e)=>{t=t>.05?w(t+.15,0,1):t;const i=function(t,e){return t.querySelector(`g.flow-layer-${e||0}`)}(s,e);i?.setAttribute("opacity",t)});A.querySelectorAll(".red-ui-tab-label").forEach((t,n)=>{let o=parseInt(t.getAttribute("data-layer"));(isNaN(o)||o<0||o>=e.length)&&(o=0),t.style.opacity=i[o]||0})}const y=A.querySelector(".red-ui-tab");y&&y.click(),n.size>0?r.classList.add("has-tabs"):r.classList.remove("has-tabs");const m=b(s.parentElement);return m.hasHorizontalScrollbar||m.hasVerticalScrollbar?r.classList.add("has-scrollbars"):r.classList.remove("has-scrollbars"),o},renderFlows:Mt,renderFlow:rt,normaliseOptions:ot,getStyles:U}};"object"==typeof module&&module.exports?module.exports=FlowRenderer:"object"==typeof window?window.FlowRenderer=FlowRenderer:global.FlowRenderer=FlowRenderer;export default FlowRenderer; \ No newline at end of file