From c3d44215921aa16c927a044314ae1c97a33fc426 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 9 Oct 2024 16:49:27 +0100 Subject: [PATCH 001/160] Add option to use pfx or p12 for TLS connections --- package.json | 2 +- .../@node-red/nodes/core/network/05-tls.html | 72 +++++++++++++++++-- .../@node-red/nodes/core/network/05-tls.js | 46 +++++++++--- .../nodes/locales/en-US/messages.json | 10 ++- 4 files changed, 110 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index 6015c0c9e8..e948f8cd9b 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "@node-rs/bcrypt": "1.10.4" }, "devDependencies": { - "dompurify": "2.4.1", + "dompurify": "3.1.7", "grunt": "1.6.1", "grunt-chmod": "~1.1.1", "grunt-cli": "~1.4.3", diff --git a/packages/node_modules/@node-red/nodes/core/network/05-tls.html b/packages/node_modules/@node-red/nodes/core/network/05-tls.html index 8414e98cae..1dda38842c 100644 --- a/packages/node_modules/@node-red/nodes/core/network/05-tls.html +++ b/packages/node_modules/@node-red/nodes/core/network/05-tls.html @@ -20,6 +20,13 @@
+ + +
+
@@ -31,7 +38,7 @@
-
+
@@ -43,11 +50,23 @@
+
+ + + + + + + + + + +
- +
-
+
@@ -83,6 +102,7 @@ category: 'config', defaults: { name: {value:""}, + certType: {value:"files"}, cert: {value:"", validate: function(v,opt) { var currentKey = $("#node-config-input-key").val(); if (currentKey === undefined) { @@ -103,6 +123,8 @@ } return RED._("node-red:tls.error.invalid-key"); }}, + p12: {value:""}, + p12name: {value:""}, ca: {value:""}, certname: {value:""}, keyname: {value:""}, @@ -115,6 +137,7 @@ certdata: {type:"text"}, keydata: {type:"text"}, cadata: {type:"text"}, + p12data: {type:"text"}, passphrase: {type:"password"} }, label: function() { @@ -124,6 +147,21 @@ return this.name?"node_label_italic":""; }, oneditprepare: function() { + $("#node-config-input-certType").on('change',function() { + if ($("#node-config-input-certType").val() === "pfx") { + $("#node-tls-conf-cer").hide(); + $("#node-tls-conf-key").hide(); + $("#node-tls-conf-ca").hide(); + $("#node-tls-conf-p12").show(); + } + else { + $("#node-tls-conf-cer").show(); + $("#node-tls-conf-key").show(); + $("#node-tls-conf-ca").show(); + $("#node-tls-conf-p12").hide(); + } + }); + function updateFileUpload() { if ($("#node-config-input-uselocalfiles").is(':checked')) { $(".tls-config-input-path").show(); @@ -145,9 +183,19 @@ reader.onload = function(event) { $("#tls-config-"+property+"name").text(filename); $(filenameInputId).val(filename); - $(dataInputId).val(event.target.result); + if (property === "p12") { + $(dataInputId).val(btoa(String.fromCharCode(...new Uint8Array(event.target.result)))) + } + else { + $(dataInputId).val(event.target.result); + } + } + if (property === "p12") { + reader.readAsArrayBuffer(file); + } + else { + reader.readAsText(file,"UTF-8"); } - reader.readAsText(file,"UTF-8"); } $("#node-config-input-certfile" ).on("change", function() { saveFile("cert", this.files[0]); @@ -158,6 +206,9 @@ $("#node-config-input-cafile" ).on("change", function() { saveFile("ca", this.files[0]); }); + $("#node-config-input-p12file" ).on("change", function() { + saveFile("p12", this.files[0]); + }); function clearNameData(prop) { $("#tls-config-"+prop+"name").text(""); @@ -173,6 +224,9 @@ $("#tls-config-button-ca-clear").on("click", function() { clearNameData("ca"); }); + $("#tls-config-button-p12-clear").on("click", function() { + clearNameData("p12"); + }); if (RED.settings.tlsConfigDisableLocalFiles) { $("#node-config-row-uselocalfiles").hide(); @@ -180,12 +234,13 @@ $("#node-config-row-uselocalfiles").show(); } // in case paths were set from old TLS config - if(this.cert || this.key || this.ca) { + if (this.cert || this.key || this.ca || this.p12) { $("#node-config-input-uselocalfiles").prop('checked',true); } $("#tls-config-certname").text(this.certname); $("#tls-config-keyname").text(this.keyname); $("#tls-config-caname").text(this.caname); + $("#tls-config-p12name").text(this.p12name); updateFileUpload(); }, oneditsave: function() { @@ -193,10 +248,13 @@ clearNameData("ca"); clearNameData("cert"); clearNameData("key"); - } else { + clearNameData("p12"); + } + else { $("#node-config-input-ca").val(""); $("#node-config-input-cert").val(""); $("#node-config-input-key").val(""); + $("#node-config-input-p12").val(""); } } }); diff --git a/packages/node_modules/@node-red/nodes/core/network/05-tls.js b/packages/node_modules/@node-red/nodes/core/network/05-tls.js index 888d749fd8..c1b2c2105c 100644 --- a/packages/node_modules/@node-red/nodes/core/network/05-tls.js +++ b/packages/node_modules/@node-red/nodes/core/network/05-tls.js @@ -25,6 +25,8 @@ module.exports = function(RED) { var certPath = n.cert.trim(); var keyPath = n.key.trim(); var caPath = n.ca.trim(); + var p12Path = n.p12.trim(); + this.certType = n.certType || "files"; this.servername = (n.servername||"").trim(); this.alpnprotocol = (n.alpnprotocol||"").trim(); @@ -46,18 +48,31 @@ module.exports = function(RED) { if (caPath) { this.ca = fs.readFileSync(caPath); } - } catch(err) { + } + catch(err) { + this.valid = false; + this.error(err.toString()); + return; + } + } + else if (p12Path.length > 0) { + try { + this.pfx = fs.readFileSync(p12Path); + } + catch(err) { this.valid = false; this.error(err.toString()); return; } - } else { + } + else { if (this.credentials) { var certData = this.credentials.certdata || ""; var keyData = this.credentials.keydata || ""; var caData = this.credentials.cadata || ""; + var p12Data = this.credentials.p12data || ""; - if ((certData.length > 0) !== (keyData.length > 0)) { + if ((certData.length > 0) !== (keyData.length > 0) && p12Data.length === 0) { this.valid = false; this.error(RED._("tls.error.missing-file")); return; @@ -72,6 +87,9 @@ module.exports = function(RED) { if (caData) { this.ca = caData; } + if (p12Data) { + this.pfx = Buffer.from(p12Data, 'base64'); + } } } } @@ -80,6 +98,7 @@ module.exports = function(RED) { certdata: {type:"text"}, keydata: {type:"text"}, cadata: {type:"text"}, + p12data: {type:"text"}, passphrase: {type:"password"} }, settings: { @@ -92,14 +111,21 @@ module.exports = function(RED) { TLSConfig.prototype.addTLSOptions = function(opts) { if (this.valid) { - if (this.key) { - opts.key = this.key; - } - if (this.cert) { - opts.cert = this.cert; + if (this.certType === "files") { + if (this.key) { + opts.key = this.key; + } + if (this.cert) { + opts.cert = this.cert; + } + if (this.ca) { + opts.ca = this.ca; + } } - if (this.ca) { - opts.ca = this.ca; + else { + if (this.pfx) { + opts.pfx = this.pfx; + } } if (this.credentials && this.credentials.passphrase) { opts.passphrase = this.credentials.passphrase; diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json index bc89992e2f..ae6d760726 100644 --- a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json @@ -204,19 +204,25 @@ "ca": "CA Certificate", "verify-server-cert": "Verify server certificate", "servername": "Server Name", - "alpnprotocol": "ALPN Protocol" + "alpnprotocol": "ALPN Protocol", + "certtype": "Cert Type", + "files": "Individual files", + "p12": "pfx or p12", + "pfx": "pfx or p12 file" }, "placeholder": { "cert": "path to certificate (PEM format)", "key": "path to private key (PEM format)", + "p12": "path to .pfx or .p12 (PKCS12 format)", "ca": "path to CA certificate (PEM format)", - "passphrase": "private key passphrase (optional)", + "passphrase": "password or passphrase (optional)", "servername": "for use with SNI", "alpnprotocol": "for use with ALPN" }, "error": { "missing-file": "No certificate/key file provided", "invalid-cert": "Certificate not specified", + "invalid-p12": "pfx/p12 not specified", "invalid-key": "Private key not specified" } }, From 214fbc0e47cc9688d691a7dcdd3a9e621b4567a0 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 9 Oct 2024 16:56:24 +0100 Subject: [PATCH 002/160] revert dompurify to match dev branch --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e948f8cd9b..6015c0c9e8 100644 --- a/package.json +++ b/package.json @@ -86,7 +86,7 @@ "@node-rs/bcrypt": "1.10.4" }, "devDependencies": { - "dompurify": "3.1.7", + "dompurify": "2.4.1", "grunt": "1.6.1", "grunt-chmod": "~1.1.1", "grunt-cli": "~1.4.3", From 71440be009b11a787f510743f6a5036cb682af7b Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 9 Oct 2024 17:46:07 +0100 Subject: [PATCH 003/160] Fixup tls config for tests --- .../@node-red/nodes/core/network/05-tls.js | 13 +++++++------ test/resources/50-file-test-file.txt | 2 ++ .../lib/nodes/.testUserHome/.config.runtime.json | 4 ++++ 3 files changed, 13 insertions(+), 6 deletions(-) create mode 100644 test/resources/50-file-test-file.txt create mode 100644 test/unit/@node-red/runtime/lib/nodes/.testUserHome/.config.runtime.json diff --git a/packages/node_modules/@node-red/nodes/core/network/05-tls.js b/packages/node_modules/@node-red/nodes/core/network/05-tls.js index c1b2c2105c..5a3147af66 100644 --- a/packages/node_modules/@node-red/nodes/core/network/05-tls.js +++ b/packages/node_modules/@node-red/nodes/core/network/05-tls.js @@ -22,15 +22,16 @@ module.exports = function(RED) { RED.nodes.createNode(this,n); this.valid = true; this.verifyservercert = n.verifyservercert; - var certPath = n.cert.trim(); - var keyPath = n.key.trim(); - var caPath = n.ca.trim(); - var p12Path = n.p12.trim(); + var certPath, keyPath, caPath, p12Path; + if (n.cert) { certPath = n.cert.trim(); } + if (n.key) { keyPath = n.key.trim(); } + if (n.ca) { caPath = n.ca.trim(); } + if (n.p12) { p12Path = n.p12.trim(); } this.certType = n.certType || "files"; this.servername = (n.servername||"").trim(); this.alpnprotocol = (n.alpnprotocol||"").trim(); - if ((certPath.length > 0) || (keyPath.length > 0) || (caPath.length > 0)) { + if ((certPath && certPath.length > 0) || (keyPath && keyPath.length > 0) || (caPath && caPath.length > 0)) { if ( (certPath.length > 0) !== (keyPath.length > 0)) { this.valid = false; @@ -55,7 +56,7 @@ module.exports = function(RED) { return; } } - else if (p12Path.length > 0) { + else if (p12Path && p12Path.length > 0) { try { this.pfx = fs.readFileSync(p12Path); } diff --git a/test/resources/50-file-test-file.txt b/test/resources/50-file-test-file.txt new file mode 100644 index 0000000000..0491f12fe2 --- /dev/null +++ b/test/resources/50-file-test-file.txt @@ -0,0 +1,2 @@ +File message line 1 +File message line 2 diff --git a/test/unit/@node-red/runtime/lib/nodes/.testUserHome/.config.runtime.json b/test/unit/@node-red/runtime/lib/nodes/.testUserHome/.config.runtime.json new file mode 100644 index 0000000000..7bf5a81bda --- /dev/null +++ b/test/unit/@node-red/runtime/lib/nodes/.testUserHome/.config.runtime.json @@ -0,0 +1,4 @@ +{ + "instanceId": "bff8dba3f474d406", + "_credentialSecret": "c9ca84d93a4f6236426cc740b147b50f32b3dd9aab9f4191390a604197722a4d" +} \ No newline at end of file From e4e3e0be7b420e0b389b0690dbbf085e140f85e7 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 9 Oct 2024 21:30:28 +0100 Subject: [PATCH 004/160] Add pfx tls test for tls config node --- .../nodes/core/network/21-httprequest_spec.js | 35 ++++++++++++++++-- test/resources/ssl/test.pfx | Bin 0 -> 2579 bytes 2 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 test/resources/ssl/test.pfx diff --git a/test/nodes/core/network/21-httprequest_spec.js b/test/nodes/core/network/21-httprequest_spec.js index 0df73b970b..703fa15768 100644 --- a/test/nodes/core/network/21-httprequest_spec.js +++ b/test/nodes/core/network/21-httprequest_spec.js @@ -211,7 +211,7 @@ describe('HTTP Request Node', function() { } else { hash = crypto.createHash('md5'); } - + var hex = hash.update(value).digest('hex'); if (algorithm === 'SHA-512-256') { hex = hex.slice(0, 64); @@ -1802,10 +1802,37 @@ describe('HTTP Request Node', function() { }) }); + it('should use pfx tls file', function(done) { + var flow = [ + {id:"n1",type:"http request",wires:[["n2"]],method:"GET",ret:"txt",url:getSslTestURLWithoutProtocol('/text'),tls:"n3"}, + {id:"n2", type:"helper"}, + {id:"n3", type:"tls-config", p12:"test/resources/ssl/test.pfx", verifyservercert:false}]; + var testNodes = [httpRequestNode, tlsNode]; + helper.load(testNodes, flow, function() { + var n3 = helper.getNode("n3"); + var n2 = helper.getNode("n2"); + var n1 = helper.getNode("n1"); + n2.on("input", function(msg) { + try { + msg.should.have.property('payload','hello'); + msg.should.have.property('statusCode',200); + msg.should.have.property('headers'); + msg.headers.should.have.property('content-length',''+('hello'.length)); + msg.headers.should.have.property('content-type').which.startWith('text/html'); + msg.should.have.property('responseUrl').which.startWith('https://'); + done(); + } catch(err) { + done(err); + } + }); + n1.receive({payload:"foo"}); + }); + }); + it('should use env var http_proxy', function(done) { const url = getTestURL('/postInspect') const proxyUrl = "http://localhost:" + testProxyPort - + const flow = [ { id: "n1", type: "http request", wires: [["n2"]], method: "POST", ret: "obj", url: url }, { id: "n2", type: "helper" }, @@ -1830,7 +1857,7 @@ describe('HTTP Request Node', function() { it('should use env var https_proxy', function(done) { const url = getSslTestURL('/postInspect') const proxyUrl = "http://localhost:" + testProxyPort - + const flow = [ { id: "n1", type: "http request", wires: [["n2"]], method: "POST", ret: "obj", url: url }, { id: "n2", type: "helper" }, @@ -1855,7 +1882,7 @@ describe('HTTP Request Node', function() { it('should not use env var http*_proxy when no_proxy is set', function(done) { const url = getSslTestURL('/postInspect') const proxyUrl = "http://localhost:" + testProxyPort - + const flow = [ { id: "n1", type: "http request", wires: [["n2"]], method: "POST", ret: "obj", url: url }, { id: "n2", type: "helper" }, diff --git a/test/resources/ssl/test.pfx b/test/resources/ssl/test.pfx new file mode 100644 index 0000000000000000000000000000000000000000..519d8a3fc8ca753a4de4d85697a8efb939a59471 GIT binary patch literal 2579 zcmai$X*d)L7st(*nP%+UEktA~Ll{fQolJxfGA8@3$%IIRvKvd;cY|!%m8|6=j4;U3 zh%8|Y5zSix8$k;3Al74a0tjF_ZcP6s0EENu0nCmtMJW6`vLPfuTshgwbBV&1 z`Te6>d_2pdoQ83&>b1d{Cq?>%;Kz&P3%mgTF zHPg_=rRwfHpUp$Je#M1Su~3Epp&BAGh5}z1%q)veanmnIX)OFOL#LLR7a6+E8R8lGmlm@~1y%k?0DQNWtu;m$r4X>L$Y_ zwo5+5#cP&dm zwHvJb$gI#nLoeB$$Jh;*0-D+7Kxm6^wWxblIVmz2MlaWJ_uCgO67Sm1e3r3MT9+#Q z+UXA3gDN64Qcuk`?6p{`XUFtF)2SVnwCTjg`f-DPUFW zr(FU0L6Z4mmdtkGb?&UuCBpcD9LmaeD0f8eo?SKMtz*&-?3Zj_nf=km^MX!@zsJEF z16ln)&-ZLDl!91fZlx8J>xG}0RpPKSHZ-?45+M5%8tKeg!Q+}orEB&|cMX5QTSZIo z8^d;w13IXG;It-`$=^`EatF<#gnA>Rh&qDLCSKwV&5IOAaS{i2LW=8hR0bb?$-Rz! zPkOL1e}@d1Qx|(ZHl5zLzuB?Tf`4wn6+P7 zvy><)7`I|fvv$n}evxVlztezzy2)CLo}I@mMD{f&Buw00uXMtyAy4+=?MLwW$;!3% z7mu_iEn~cWEQZyrwD(!Wg4$IkGtB~9jPosZM9a*haBZoVF)}p{`Z~#BMxvd2oHXAjD3&mK7{rE zPGMsK0FT2<$ME8Ri6Voz|E8IZc`u-;KFH);mivE-qGYuq%OpP!V&`P=hbJ`i76=a- zCIz$;(Z#WDorVim7(&SCx@$Q_VK0HB@fDwjzuDaNyTDWanj-+MC!>e^x+A#RTdjTM zqqPVXxJf9J_06%ABv7)b7!JRy8;q7q&|huO|7w`a;ht5e)<%c#H5^{t*v`!=S{dvCtf}>ZbF7J8(rdq0kp{72& zpbR|gy7Rfh+fZCzSd{>cSJKp(^fuQ$X*KtILR0g!fQ{ju^b8PFQN+Az_CV*R`Gni1 zTT09KOFw)ivdo!?xcRZqFCJpN?z^av*qw$ehs1IeuEEKALL#yoPhb@1No*(g*fcF9E*J5xL zW@F4aMuhI5+Q(DA93k0yIu&-Q!ZeP#sB;{3X-Y$4+Gok@98>I*WQ)-=mEMJV7AF^t z3VdCOlix}Pc9xjOWR<8pv5#I{symgvpuUh~M!5a6;!vkPs4(nptsl~4Sw-=Sf{fYX z2vn{w6PQO|DZr+Cv?LM?7Do}a;XBp`XiN=s=} zq%g6*>xq)ujus=~b2>isic#PbS3ADkcN0YkNCPE(Ucnz`jlSUCug;&vwH&^_L+@!W zQP$PA$G8<*ZLqD6;Is8&7}zyRI8>^7onu&CXwl&LpI^qyMmR5cx6)(qod_Qvb9aj=CVF- zzn13U%ca^BV#D|OE2zWOmg;^9mU@Qp#+4A|1#?;FNT!_d6CqR~oUuiuv*gL(hg)0S zaLJgf?oHJ<;SubwxhQt}Hg<~qDcrW8D7JNONiL2w^egRwgBv!)h>@{Vs417Hz1ha! zy+%Brj){#p{Y)fiJPY#{d%RUtX}9Ih($Tl>+r>IKBWJ&cd7V0zXH*QI$i5>UcXf(k zoxjpe35j)}n?S7InqxSrO`#YuOfK9nrD7l5*j^fR@$4>z_Z%Hl8Z`Rxs-_2TlxXQz zO37daf#2&Wtktr~r*uZcqYSe_ux$S3t-IK!QjV&vatYDsyd{T}Ga@GCcr=6pPUZ(r6U*);q<8vRADWom~W@puz+Y=x=+s;_X zDa8j;_5IA^X6a{Fyv>X{hwfr`f38edn@z2Pkng|61`|mdj2mmvIL|Oa8^Cpfu6Uw+Q4d+TGHog8h+JS~WItMNk WG^mZ(Ed@cPXH`#t)5~-JQSIMkamAqk literal 0 HcmV?d00001 From fd4f7477060e62c79cafe45dfbe4f004d1e5aeca Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 11 Nov 2024 16:26:20 +0000 Subject: [PATCH 005/160] If creds dont exist - create in flows dir rather than userdir So they stay alongside flows --- .../runtime/lib/storage/localfilesystem/projects/index.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/index.js b/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/index.js index ca87d76e9b..8d6cea26aa 100644 --- a/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/index.js +++ b/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/index.js @@ -85,7 +85,10 @@ function init(_settings, _runtime) { var ffBase = fspath.basename(flowsFullPath,ffExt); flowsFileBackup = getBackupFilename(flowsFullPath); - credentialsFile = fspath.join(settings.userDir,ffBase+"_cred"+ffExt); + credentialsFile = fspath.join(settings.userDir,ffBase+"_cred"+ffExt); // if creds file exists in "old" location use + if (!fs.existsSync(credentialsFile)) { // if not then locate it next to flows file in user dir + credentialsFile = fspath.join(fspath.dirname(flowsFullPath), ffBase+"_cred"+ffExt); + } credentialsFileBackup = getBackupFilename(credentialsFile) var setupProjectsPromise; From 8aa65e77619bb31128b3fd6cc6f6d6a7e36d69e6 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Mon, 11 Nov 2024 16:28:42 +0000 Subject: [PATCH 006/160] fix comments to be what is happening. --- .../runtime/lib/storage/localfilesystem/projects/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/index.js b/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/index.js index 8d6cea26aa..b19889bcbd 100644 --- a/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/index.js +++ b/packages/node_modules/@node-red/runtime/lib/storage/localfilesystem/projects/index.js @@ -85,8 +85,8 @@ function init(_settings, _runtime) { var ffBase = fspath.basename(flowsFullPath,ffExt); flowsFileBackup = getBackupFilename(flowsFullPath); - credentialsFile = fspath.join(settings.userDir,ffBase+"_cred"+ffExt); // if creds file exists in "old" location use - if (!fs.existsSync(credentialsFile)) { // if not then locate it next to flows file in user dir + credentialsFile = fspath.join(settings.userDir,ffBase+"_cred"+ffExt); // if creds file exists in "old" location userdir then use it + if (!fs.existsSync(credentialsFile)) { // if not then locate it next to flows file in flows dir credentialsFile = fspath.join(fspath.dirname(flowsFullPath), ffBase+"_cred"+ffExt); } credentialsFileBackup = getBackupFilename(credentialsFile) From fbf2c7b570b2824e347bb5060942ee2b780b1d40 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Tue, 3 Dec 2024 14:35:56 +0000 Subject: [PATCH 007/160] Update 05-tls.js --- packages/node_modules/@node-red/nodes/core/network/05-tls.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/05-tls.js b/packages/node_modules/@node-red/nodes/core/network/05-tls.js index 5a3147af66..0c588fc66d 100644 --- a/packages/node_modules/@node-red/nodes/core/network/05-tls.js +++ b/packages/node_modules/@node-red/nodes/core/network/05-tls.js @@ -32,8 +32,7 @@ module.exports = function(RED) { this.alpnprotocol = (n.alpnprotocol||"").trim(); if ((certPath && certPath.length > 0) || (keyPath && keyPath.length > 0) || (caPath && caPath.length > 0)) { - - if ( (certPath.length > 0) !== (keyPath.length > 0)) { + if ( (certPath && certPath.length > 0) !== (keyPath && keyPath.length > 0)) { this.valid = false; this.error(RED._("tls.error.missing-file")); return; From 936f024e33f08ddf58dae4291ad5a6b8f6d3cd65 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 4 Dec 2024 12:54:06 +0000 Subject: [PATCH 008/160] reverse test logic of existence of pfx --- .../@node-red/nodes/core/network/05-tls.js | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/05-tls.js b/packages/node_modules/@node-red/nodes/core/network/05-tls.js index 0c588fc66d..3dd3ba8b56 100644 --- a/packages/node_modules/@node-red/nodes/core/network/05-tls.js +++ b/packages/node_modules/@node-red/nodes/core/network/05-tls.js @@ -31,7 +31,17 @@ module.exports = function(RED) { this.servername = (n.servername||"").trim(); this.alpnprotocol = (n.alpnprotocol||"").trim(); - if ((certPath && certPath.length > 0) || (keyPath && keyPath.length > 0) || (caPath && caPath.length > 0)) { + if (this.certType === "pfx" && p12Path && p12Path.length > 0) { + try { + this.pfx = fs.readFileSync(p12Path); + } + catch(err) { + this.valid = false; + this.error(err.toString()); + return; + } + } + else if ((certPath && certPath.length > 0) || (keyPath && keyPath.length > 0) || (caPath && caPath.length > 0)) { if ( (certPath && certPath.length > 0) !== (keyPath && keyPath.length > 0)) { this.valid = false; this.error(RED._("tls.error.missing-file")); @@ -55,16 +65,6 @@ module.exports = function(RED) { return; } } - else if (p12Path && p12Path.length > 0) { - try { - this.pfx = fs.readFileSync(p12Path); - } - catch(err) { - this.valid = false; - this.error(err.toString()); - return; - } - } else { if (this.credentials) { var certData = this.credentials.certdata || ""; From 6bac244c287a9f891c5b36f1cfc004bb29965eb1 Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 4 Dec 2024 21:34:41 +0000 Subject: [PATCH 009/160] Delete 50-file-test-file.txt --- test/resources/50-file-test-file.txt | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 test/resources/50-file-test-file.txt diff --git a/test/resources/50-file-test-file.txt b/test/resources/50-file-test-file.txt deleted file mode 100644 index 0491f12fe2..0000000000 --- a/test/resources/50-file-test-file.txt +++ /dev/null @@ -1,2 +0,0 @@ -File message line 1 -File message line 2 From 8272d4e1e4150b71a7381eda6d868f1dceb03bdd Mon Sep 17 00:00:00 2001 From: Dave Conway-Jones Date: Wed, 4 Dec 2024 21:42:19 +0000 Subject: [PATCH 010/160] Delete .config.runtime.json --- .../runtime/lib/nodes/.testUserHome/.config.runtime.json | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 test/unit/@node-red/runtime/lib/nodes/.testUserHome/.config.runtime.json diff --git a/test/unit/@node-red/runtime/lib/nodes/.testUserHome/.config.runtime.json b/test/unit/@node-red/runtime/lib/nodes/.testUserHome/.config.runtime.json deleted file mode 100644 index 7bf5a81bda..0000000000 --- a/test/unit/@node-red/runtime/lib/nodes/.testUserHome/.config.runtime.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "instanceId": "bff8dba3f474d406", - "_credentialSecret": "c9ca84d93a4f6236426cc740b147b50f32b3dd9aab9f4191390a604197722a4d" -} \ No newline at end of file From bd51b0c153277601a522315b5a59ce966d8e5b0c Mon Sep 17 00:00:00 2001 From: "claude[bot]" <41898282+claude[bot]@users.noreply.github.com> Date: Thu, 25 Sep 2025 08:03:37 +0000 Subject: [PATCH 011/160] feat: Add enhanced zoom and scroll features - Added space+scroll zoom functionality - Implemented cursor-centered zoom (focuses on cursor position) - Enhanced pinch-to-zoom with trackpad support (Ctrl+wheel) - Added momentum scrolling with edge bounce animation - Improved touch pinch gesture handling with proper center tracking Co-authored-by: Dimitrie Hoekstra --- .../@node-red/editor-client/src/js/ui/view.js | 210 ++++++++++++++++-- 1 file changed, 192 insertions(+), 18 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 89019005fe..cd2df75d74 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -44,6 +44,21 @@ RED.view = (function() { moveTouchCenter = [], touchStartTime = 0; + var spacebarPressed = false; + + // Momentum scrolling state + var scrollVelocity = { x: 0, y: 0 }; + var lastScrollTime = 0; + var lastScrollPos = { x: 0, y: 0 }; + var scrollAnimationId = null; + var momentumActive = false; + + // Bounce effect parameters + var BOUNCE_DAMPING = 0.6; + var BOUNCE_TENSION = 0.3; + var MIN_VELOCITY = 0.5; + var FRICTION = 0.95; + var workspaceScrollPositions = {}; var gridSize = 20; @@ -466,19 +481,19 @@ RED.view = (function() { if (!isNaN(moveTouchDistance)) { oldScaleFactor = scaleFactor; - scaleFactor = Math.min(2,Math.max(0.3, scaleFactor + (Math.floor(((moveTouchDistance*100)-(startTouchDistance*100)))/10000))); + var newScaleFactor = Math.min(2,Math.max(0.3, scaleFactor + (Math.floor(((moveTouchDistance*100)-(startTouchDistance*100)))/10000))); - var deltaTouchCenter = [ // Try to pan whilst zooming - not 100% - startTouchCenter[0]*(scaleFactor-oldScaleFactor),//-(touchCenter[0]-moveTouchCenter[0]), - startTouchCenter[1]*(scaleFactor-oldScaleFactor) //-(touchCenter[1]-moveTouchCenter[1]) + // Calculate pinch center relative to chart + var pinchCenter = [ + touchCenter[0] - offset.left, + touchCenter[1] - offset.top ]; + // Use zoomView with pinch center as focal point + zoomView(newScaleFactor, pinchCenter); + startTouchDistance = moveTouchDistance; moveTouchCenter = touchCenter; - - chart.scrollLeft(scrollPos[0]+deltaTouchCenter[0]); - chart.scrollTop(scrollPos[1]+deltaTouchCenter[1]); - redraw(); } } d3.event.preventDefault(); @@ -509,6 +524,22 @@ RED.view = (function() { document.addEventListener("keyup", handleAltToggle) document.addEventListener("keydown", handleAltToggle) + // Handle spacebar for zoom mode + function handleSpacebarToggle(e) { + if (e.keyCode === 32 || e.key === ' ') { + if (e.type === "keydown" && !spacebarPressed) { + spacebarPressed = true; + // Prevent default space scrolling behavior + e.preventDefault(); + } else if (e.type === "keyup" && spacebarPressed) { + spacebarPressed = false; + e.preventDefault(); + } + } + } + document.addEventListener("keyup", handleSpacebarToggle) + document.addEventListener("keydown", handleSpacebarToggle) + // Workspace Background eventLayer.append("svg:rect") .attr("class","red-ui-workspace-chart-background") @@ -609,12 +640,52 @@ RED.view = (function() { $("#red-ui-view-zoom-in").on("click", zoomIn); RED.popover.tooltip($("#red-ui-view-zoom-in"),RED._('actions.zoom-in'),'core:zoom-in'); chart.on("DOMMouseScroll mousewheel", function (evt) { - if ( evt.altKey ) { + if ( evt.altKey || spacebarPressed ) { evt.preventDefault(); evt.stopPropagation(); + // Get cursor position relative to the chart + var offset = chart.offset(); + var cursorPos = [ + evt.originalEvent.pageX - offset.left, + evt.originalEvent.pageY - offset.top + ]; var move = -(evt.originalEvent.detail) || evt.originalEvent.wheelDelta; - if (move <= 0) { zoomOut(); } - else { zoomIn(); } + if (move <= 0) { zoomOut(cursorPos); } + else { zoomIn(cursorPos); } + } + }); + + // Modern wheel event handler for better trackpad support (pinch-to-zoom) and momentum + var momentumTimer = null; + chart.on("wheel", function(evt) { + // ctrlKey is set during pinch gestures on trackpads + if (evt.ctrlKey || evt.altKey || spacebarPressed) { + evt.preventDefault(); + evt.stopPropagation(); + // Get cursor position relative to the chart + var offset = chart.offset(); + var cursorPos = [ + evt.originalEvent.pageX - offset.left, + evt.originalEvent.pageY - offset.top + ]; + var delta = evt.originalEvent.deltaY; + if (delta > 0) { zoomOut(cursorPos); } + else if (delta < 0) { zoomIn(cursorPos); } + } else { + // Regular scroll - track velocity and apply momentum + handleScroll(); + + // Cancel previous momentum timer + if (momentumTimer) { + clearTimeout(momentumTimer); + } + + // Start momentum after scroll stops + momentumTimer = setTimeout(function() { + if (Math.abs(scrollVelocity.x) > MIN_VELOCITY || Math.abs(scrollVelocity.y) > MIN_VELOCITY) { + startMomentumScroll(); + } + }, 100); } }); @@ -964,6 +1035,9 @@ RED.view = (function() { RED.settings.setLocal('scroll-positions', JSON.stringify(workspaceScrollPositions) ) } chart.on("scroll", function() { + // Track scroll velocity for momentum + handleScroll(); + if (RED.settings.get("editor.view.view-store-position")) { if (onScrollTimer) { clearTimeout(onScrollTimer) @@ -2478,14 +2552,14 @@ RED.view = (function() { } - function zoomIn() { + function zoomIn(focalPoint) { if (scaleFactor < 2) { - zoomView(scaleFactor+0.1); + zoomView(scaleFactor+0.1, focalPoint); } } - function zoomOut() { + function zoomOut(focalPoint) { if (scaleFactor > 0.3) { - zoomView(scaleFactor-0.1); + zoomView(scaleFactor-0.1, focalPoint); } } function zoomZero() { zoomView(1); } @@ -2494,12 +2568,32 @@ RED.view = (function() { function searchNext() { RED.actions.invoke("core:search-next"); } - function zoomView(factor) { + function zoomView(factor, focalPoint) { var screenSize = [chart.width(),chart.height()]; var scrollPos = [chart.scrollLeft(),chart.scrollTop()]; - var center = [(scrollPos[0] + screenSize[0]/2)/scaleFactor,(scrollPos[1] + screenSize[1]/2)/scaleFactor]; + + // Use focal point if provided (e.g., cursor position), otherwise use viewport center + var center; + if (focalPoint) { + // focalPoint is in screen coordinates, convert to workspace coordinates + center = [(scrollPos[0] + focalPoint[0])/scaleFactor, (scrollPos[1] + focalPoint[1])/scaleFactor]; + } else { + // Default to viewport center + center = [(scrollPos[0] + screenSize[0]/2)/scaleFactor,(scrollPos[1] + screenSize[1]/2)/scaleFactor]; + } + + var oldScaleFactor = scaleFactor; scaleFactor = factor; - var newCenter = [(scrollPos[0] + screenSize[0]/2)/scaleFactor,(scrollPos[1] + screenSize[1]/2)/scaleFactor]; + + // Calculate where the focal point will be after zoom + var newCenter; + if (focalPoint) { + // Keep the focal point at the same screen position + newCenter = [(scrollPos[0] + focalPoint[0])/scaleFactor, (scrollPos[1] + focalPoint[1])/scaleFactor]; + } else { + newCenter = [(scrollPos[0] + screenSize[0]/2)/scaleFactor,(scrollPos[1] + screenSize[1]/2)/scaleFactor]; + } + var delta = [(newCenter[0]-center[0])*scaleFactor,(newCenter[1]-center[1])*scaleFactor] chart.scrollLeft(scrollPos[0]-delta[0]); chart.scrollTop(scrollPos[1]-delta[1]); @@ -2511,6 +2605,86 @@ RED.view = (function() { } } + // Momentum scrolling functions + function startMomentumScroll() { + if (scrollAnimationId) { + cancelAnimationFrame(scrollAnimationId); + } + momentumActive = true; + animateMomentumScroll(); + } + + function animateMomentumScroll() { + if (!momentumActive) return; + + var scrollX = chart.scrollLeft(); + var scrollY = chart.scrollTop(); + var maxScrollX = chart[0].scrollWidth - chart.width(); + var maxScrollY = chart[0].scrollHeight - chart.height(); + + // Apply friction + scrollVelocity.x *= FRICTION; + scrollVelocity.y *= FRICTION; + + // Check for edges and apply bounce + var newScrollX = scrollX + scrollVelocity.x; + var newScrollY = scrollY + scrollVelocity.y; + + // Bounce effect at edges + if (newScrollX < 0) { + newScrollX = 0; + scrollVelocity.x = -scrollVelocity.x * BOUNCE_DAMPING; + } else if (newScrollX > maxScrollX) { + newScrollX = maxScrollX; + scrollVelocity.x = -scrollVelocity.x * BOUNCE_DAMPING; + } + + if (newScrollY < 0) { + newScrollY = 0; + scrollVelocity.y = -scrollVelocity.y * BOUNCE_DAMPING; + } else if (newScrollY > maxScrollY) { + newScrollY = maxScrollY; + scrollVelocity.y = -scrollVelocity.y * BOUNCE_DAMPING; + } + + // Apply new scroll position + chart.scrollLeft(newScrollX); + chart.scrollTop(newScrollY); + + // Stop if velocity is too small + if (Math.abs(scrollVelocity.x) < MIN_VELOCITY && Math.abs(scrollVelocity.y) < MIN_VELOCITY) { + momentumActive = false; + scrollVelocity.x = 0; + scrollVelocity.y = 0; + } else { + scrollAnimationId = requestAnimationFrame(animateMomentumScroll); + } + } + + function handleScroll() { + var now = Date.now(); + var scrollX = chart.scrollLeft(); + var scrollY = chart.scrollTop(); + + if (lastScrollTime) { + var dt = now - lastScrollTime; + if (dt > 0 && dt < 100) { // Only calculate velocity for recent scrolls + scrollVelocity.x = (scrollX - lastScrollPos.x) / dt * 16; // Normalize to 60fps + scrollVelocity.y = (scrollY - lastScrollPos.y) / dt * 16; + } + } + + lastScrollTime = now; + lastScrollPos.x = scrollX; + lastScrollPos.y = scrollY; + + // Cancel any ongoing momentum animation + if (scrollAnimationId) { + cancelAnimationFrame(scrollAnimationId); + scrollAnimationId = null; + } + } + function selectNone() { if (mouse_mode === RED.state.MOVING || mouse_mode === RED.state.MOVING_ACTIVE) { return; From eaf68815fd6199da165c36f6b362eaa3f647f409 Mon Sep 17 00:00:00 2001 From: Dimitrie Hoekstra Date: Mon, 29 Sep 2025 17:29:23 +0200 Subject: [PATCH 012/160] Implement smooth zoom functionality with pinch-to-zoom support - Add smooth zoom animation with 125ms duration and easing curves - Implement space+scroll zoom mode alongside existing Alt+scroll - Fix pinch-to-zoom with proper ratio-based scaling and fixed focal point - Add gesture state management for consistent zoom behavior - Enhance spacebar handling to prevent scroll artifacts - Fix zoom button layout (correct zoom in/out direction) - Add zoom animation utilities (view-zoom-animator.js) - Add zoom configuration constants (view-zoom-constants.js) - Fix scale lock issues with improved tolerance handling - Update Gruntfile to include new zoom modules in build Features implemented: - Smooth animated zoom transitions (125ms with ease-out) - Space+scroll for zoom mode - Fixed focal point during pinch gestures - No scroll artifacts when pressing space - Proper state management when cursor leaves canvas - Natural acceleration/deceleration curves Known issue: Trackpad pinch-to-zoom needs additional work on macOS --- Gruntfile.js | 2 + .../src/js/ui/view-zoom-animator.js | 223 ++++++++++++++++++ .../src/js/ui/view-zoom-constants.js | 21 ++ .../@node-red/editor-client/src/js/ui/view.js | 190 +++++++++++++-- 4 files changed, 412 insertions(+), 24 deletions(-) create mode 100644 packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-animator.js create mode 100644 packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js diff --git a/Gruntfile.js b/Gruntfile.js index 73b03f6ea3..701686c35c 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -173,6 +173,8 @@ module.exports = function(grunt) { "packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js", "packages/node_modules/@node-red/editor-client/src/js/ui/statusBar.js", "packages/node_modules/@node-red/editor-client/src/js/ui/view.js", + "packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js", + "packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-animator.js", "packages/node_modules/@node-red/editor-client/src/js/ui/view-annotations.js", "packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js", "packages/node_modules/@node-red/editor-client/src/js/ui/view-tools.js", diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-animator.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-animator.js new file mode 100644 index 0000000000..1a3238a625 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-animator.js @@ -0,0 +1,223 @@ +/** + * Copyright JS Foundation and other contributors, http://js.foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +RED.view.zoomAnimator = (function() { + + /** + * Easing function for smooth deceleration + * Creates natural-feeling animation curves + * @param {number} t - Progress from 0 to 1 + * @returns {number} - Eased value from 0 to 1 + */ + function easeOut(t) { + // Cubic ease-out for smooth deceleration + return 1 - Math.pow(1 - t, 3); + } + + /** + * Animate values using requestAnimationFrame with easing + * Based on Excalidraw's implementation for smooth zoom transitions + * + * @param {Object} options - Animation options + * @param {Object} options.fromValues - Starting values object + * @param {Object} options.toValues - Target values object + * @param {Function} options.onStep - Callback for each animation frame + * @param {number} [options.duration=250] - Animation duration in ms + * @param {Function} [options.interpolateValue] - Custom interpolation function + * @param {Function} [options.onStart] - Animation start callback + * @param {Function} [options.onEnd] - Animation end callback + * @param {Function} [options.onCancel] - Animation cancel callback + * @returns {Function} - Cancel function to stop animation + */ + function easeToValuesRAF(options) { + const { + fromValues, + toValues, + onStep, + duration = 250, + interpolateValue, + onStart, + onEnd, + onCancel + } = options; + + let startTime = null; + let animationId = null; + let cancelled = false; + + function step(timestamp) { + if (cancelled) { + return; + } + + if (!startTime) { + startTime = timestamp; + if (onStart) { + onStart(); + } + } + + const elapsed = timestamp - startTime; + const progress = Math.min(elapsed / duration, 1); + const easedProgress = easeOut(progress); + + const interpolatedValues = {}; + + for (const key in fromValues) { + const from = fromValues[key]; + const to = toValues[key]; + + if (interpolateValue && key === 'zoom') { + // Special interpolation for zoom to feel more natural + // Exponential interpolation preserves relative zoom feel + interpolatedValues[key] = from * Math.pow(to / from, easedProgress); + } else { + // Linear interpolation for other values + interpolatedValues[key] = from + (to - from) * easedProgress; + } + } + + onStep(interpolatedValues); + + if (progress < 1) { + animationId = requestAnimationFrame(step); + } else { + if (onEnd) { + onEnd(); + } + } + } + + animationId = requestAnimationFrame(step); + + // Return cancel function + return function cancel() { + cancelled = true; + if (animationId) { + cancelAnimationFrame(animationId); + } + if (onCancel) { + onCancel(); + } + }; + } + + /** + * Calculate smooth zoom delta with acceleration + * Provides consistent zoom speed regardless of input device + * + * @param {number} currentScale - Current zoom scale + * @param {number} delta - Input delta (wheel, gesture, etc) + * @param {boolean} isTrackpad - Whether input is from trackpad + * @returns {number} - Calculated zoom delta + */ + function calculateZoomDelta(currentScale, delta, isTrackpad) { + // Normalize delta across different input devices + let normalizedDelta = delta; + + if (isTrackpad) { + // Trackpad deltas are typically smaller and more frequent + normalizedDelta = delta * 0.01; + } else { + // Mouse wheel deltas are larger and less frequent + normalizedDelta = delta > 0 ? 0.1 : -0.1; + } + + // Apply acceleration based on current zoom level + // Zoom faster when zoomed out, slower when zoomed in + const acceleration = Math.max(0.5, Math.min(2, 1 / currentScale)); + + return normalizedDelta * acceleration; + } + + /** + * Gesture state management for consistent focal points + */ + const gestureState = { + active: false, + initialFocalPoint: null, + initialScale: 1, + currentScale: 1, + lastDistance: 0 + }; + + /** + * Start a zoom gesture with fixed focal point + * @param {Array} focalPoint - [x, y] coordinates of focal point + * @param {number} scale - Initial scale value + */ + function startGesture(focalPoint, scale) { + gestureState.active = true; + gestureState.initialFocalPoint = focalPoint ? [...focalPoint] : null; + gestureState.initialScale = scale; + gestureState.currentScale = scale; + return gestureState; + } + + /** + * Update gesture maintaining fixed focal point + * @param {number} newScale - New scale value + * @returns {Object} - Gesture state with fixed focal point + */ + function updateGesture(newScale) { + if (!gestureState.active) { + return null; + } + + gestureState.currentScale = newScale; + + return { + scale: newScale, + focalPoint: gestureState.initialFocalPoint, + active: gestureState.active + }; + } + + /** + * End the current gesture + */ + function endGesture() { + gestureState.active = false; + gestureState.initialFocalPoint = null; + gestureState.lastDistance = 0; + } + + /** + * Check if a gesture is currently active + */ + function isGestureActive() { + return gestureState.active; + } + + /** + * Get the fixed focal point for the current gesture + */ + function getGestureFocalPoint() { + return gestureState.initialFocalPoint; + } + + return { + easeOut: easeOut, + easeToValuesRAF: easeToValuesRAF, + calculateZoomDelta: calculateZoomDelta, + gestureState: gestureState, + startGesture: startGesture, + updateGesture: updateGesture, + endGesture: endGesture, + isGestureActive: isGestureActive, + getGestureFocalPoint: getGestureFocalPoint + }; +})(); \ No newline at end of file diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js new file mode 100644 index 0000000000..e983b473e7 --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js @@ -0,0 +1,21 @@ +/** + * Zoom configuration constants + */ +RED.view.zoomConstants = { + // Zoom limits + MIN_ZOOM: 0.3, + MAX_ZOOM: 2.0, + + // Zoom step for keyboard/button controls + ZOOM_STEP: 0.1, + + // Animation settings + DEFAULT_ZOOM_DURATION: 125, // ms, faster animation + + // Gesture thresholds + PINCH_THRESHOLD: 10, // minimum pixel movement to trigger zoom + + // Momentum and friction for smooth scrolling + FRICTION: 0.92, + BOUNCE_DAMPING: 0.6 +}; \ No newline at end of file diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index cd2df75d74..b22a871eb2 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -38,11 +38,14 @@ RED.view = (function() { node_height = 30, dblClickInterval = 650; + var cancelInProgressAnimation = null; // For smooth zoom animation + var touchLongPressTimeout = 1000, startTouchDistance = 0, startTouchCenter = [], moveTouchCenter = [], - touchStartTime = 0; + touchStartTime = 0, + gesture = {}; var spacebarPressed = false; @@ -395,11 +398,15 @@ RED.view = (function() { if (RED.touch.radialMenu.active()) { return; } + // End gesture when touches end + RED.view.zoomAnimator.endGesture(); canvasMouseUp.call(this); }) .on("touchcancel", function() { if (RED.view.DEBUG) { console.warn("eventLayer.touchcancel", mouse_mode); } d3.event.preventDefault(); + // End gesture when touches are cancelled + RED.view.zoomAnimator.endGesture(); canvasMouseUp.call(this); }) .on("touchstart", function() { @@ -425,6 +432,19 @@ RED.view = (function() { touch1["pageY"]+(a/2) ] startTouchDistance = Math.sqrt((a*a)+(b*b)); + + // Store initial scale for ratio-based zoom calculation + gesture = { + initialScale: scaleFactor, + initialDistance: startTouchDistance + }; + + // Start gesture with fixed focal point (screen coordinates) + var focalPoint = [ + (touch0["pageX"] + touch1["pageX"]) / 2 - offset.left, + (touch0["pageY"] + touch1["pageY"]) / 2 - offset.top + ]; + RED.view.zoomAnimator.startGesture(focalPoint, scaleFactor); } else { var obj = d3.select(document.body); touch0 = d3.event.touches.item(0); @@ -474,26 +494,33 @@ RED.view = (function() { var offset = chart.offset(); var scrollPos = [chart.scrollLeft(),chart.scrollTop()]; var moveTouchDistance = Math.sqrt((a*a)+(b*b)); - var touchCenter = [ - touch1["pageX"]+(b/2), - touch1["pageY"]+(a/2) - ]; if (!isNaN(moveTouchDistance)) { oldScaleFactor = scaleFactor; - var newScaleFactor = Math.min(2,Math.max(0.3, scaleFactor + (Math.floor(((moveTouchDistance*100)-(startTouchDistance*100)))/10000))); - - // Calculate pinch center relative to chart - var pinchCenter = [ - touchCenter[0] - offset.left, - touchCenter[1] - offset.top - ]; - - // Use zoomView with pinch center as focal point - zoomView(newScaleFactor, pinchCenter); + // Use smooth ratio-based scaling for natural pinch-to-zoom + var zoomRatio = moveTouchDistance / startTouchDistance; + var newScaleFactor = Math.min(2, Math.max(0.3, gesture.initialScale * zoomRatio)); + + // Use gesture state management to maintain fixed focal point + var gestureState = RED.view.zoomAnimator.updateGesture(newScaleFactor); + + if (gestureState && gestureState.focalPoint) { + // Use the fixed focal point from gesture start + zoomView(newScaleFactor, gestureState.focalPoint); + } else { + // Fallback to current behavior if gesture not active + var touchCenter = [ + touch1["pageX"]+(b/2), + touch1["pageY"]+(a/2) + ]; + var pinchCenter = [ + touchCenter[0] - offset.left, + touchCenter[1] - offset.top + ]; + zoomView(newScaleFactor, pinchCenter); + } - startTouchDistance = moveTouchDistance; - moveTouchCenter = touchCenter; + // Don't update startTouchDistance - keep initial distance for ratio calculation } } d3.event.preventDefault(); @@ -531,14 +558,35 @@ RED.view = (function() { spacebarPressed = true; // Prevent default space scrolling behavior e.preventDefault(); + e.stopPropagation(); } else if (e.type === "keyup" && spacebarPressed) { spacebarPressed = false; e.preventDefault(); + e.stopPropagation(); } } } + + // Window-level keyup listener to catch spacebar release when cursor is outside canvas + function handleWindowSpacebarUp(e) { + if ((e.keyCode === 32 || e.key === ' ') && spacebarPressed) { + spacebarPressed = false; + e.preventDefault(); + e.stopPropagation(); + } + } document.addEventListener("keyup", handleSpacebarToggle) document.addEventListener("keydown", handleSpacebarToggle) + // Additional window-level keyup listener to ensure spacebar state is cleared + // when cursor leaves canvas area while spacebar is held + window.addEventListener("keyup", handleWindowSpacebarUp) + + // Reset spacebar state when window loses focus to prevent stuck state + window.addEventListener("blur", function() { + if (spacebarPressed) { + spacebarPressed = false; + } + }) // Workspace Background eventLayer.append("svg:rect") @@ -633,11 +681,11 @@ RED.view = (function() { '') }) - $("#red-ui-view-zoom-out").on("click", zoomOut); + $("#red-ui-view-zoom-out").on("click", zoomIn); RED.popover.tooltip($("#red-ui-view-zoom-out"),RED._('actions.zoom-out'),'core:zoom-out'); $("#red-ui-view-zoom-zero").on("click", zoomZero); RED.popover.tooltip($("#red-ui-view-zoom-zero"),RED._('actions.zoom-reset'),'core:zoom-reset'); - $("#red-ui-view-zoom-in").on("click", zoomIn); + $("#red-ui-view-zoom-in").on("click", zoomOut); RED.popover.tooltip($("#red-ui-view-zoom-in"),RED._('actions.zoom-in'),'core:zoom-in'); chart.on("DOMMouseScroll mousewheel", function (evt) { if ( evt.altKey || spacebarPressed ) { @@ -856,6 +904,10 @@ RED.view = (function() { }); chart.on("blur", function() { $("#red-ui-workspace-tabs").removeClass("red-ui-workspace-focussed"); + // Reset spacebar state when chart loses focus to prevent stuck state + if (spacebarPressed) { + spacebarPressed = false; + } }); RED.actions.add("core:copy-selection-to-internal-clipboard",copySelection); @@ -2208,6 +2260,11 @@ RED.view = (function() { canvasMouseUp.call(this) }) } + // Reset spacebar state when mouse leaves canvas to prevent interaction artifacts + if (spacebarPressed) { + // Note: We don't reset spacebarPressed here as user may still be holding spacebar + // The window-level keyup listener will handle the actual release + } } function canvasMouseUp() { lastClickPosition = [d3.event.offsetX/scaleFactor,d3.event.offsetY/scaleFactor]; @@ -2553,16 +2610,16 @@ RED.view = (function() { } function zoomIn(focalPoint) { - if (scaleFactor < 2) { - zoomView(scaleFactor+0.1, focalPoint); + if (scaleFactor < RED.view.zoomConstants.MAX_ZOOM) { + animatedZoomView(scaleFactor + RED.view.zoomConstants.ZOOM_STEP, focalPoint); } } function zoomOut(focalPoint) { - if (scaleFactor > 0.3) { - zoomView(scaleFactor-0.1, focalPoint); + if (scaleFactor > RED.view.zoomConstants.MIN_ZOOM) { + animatedZoomView(scaleFactor - RED.view.zoomConstants.ZOOM_STEP, focalPoint); } } - function zoomZero() { zoomView(1); } + function zoomZero() { animatedZoomView(1); } function searchFlows() { RED.actions.invoke("core:search", $(this).data("term")); } function searchPrev() { RED.actions.invoke("core:search-previous"); } function searchNext() { RED.actions.invoke("core:search-next"); } @@ -2605,6 +2662,91 @@ RED.view = (function() { } } + function animatedZoomView(targetFactor, focalPoint) { + // Cancel any in-progress animation + if (cancelInProgressAnimation) { + cancelInProgressAnimation(); + cancelInProgressAnimation = null; + } + + // Clamp target factor to valid range + targetFactor = Math.max(RED.view.zoomConstants.MIN_ZOOM, + Math.min(RED.view.zoomConstants.MAX_ZOOM, targetFactor)); + + // If we're already at the target, no need to animate + // Use a more tolerant threshold to account for floating-point precision + if (Math.abs(scaleFactor - targetFactor) < 0.01) { + return; + } + + var startFactor = scaleFactor; + var screenSize = [chart.width(), chart.height()]; + var scrollPos = [chart.scrollLeft(), chart.scrollTop()]; + + // Calculate the focal point in workspace coordinates (will remain constant) + var center; + if (focalPoint) { + // focalPoint is in screen coordinates, convert to workspace coordinates + center = [(scrollPos[0] + focalPoint[0])/scaleFactor, (scrollPos[1] + focalPoint[1])/scaleFactor]; + } else { + // Default to viewport center + center = [(scrollPos[0] + screenSize[0]/2)/scaleFactor, (scrollPos[1] + screenSize[1]/2)/scaleFactor]; + } + + // Start the animation + cancelInProgressAnimation = RED.view.zoomAnimator.easeToValuesRAF({ + fromValues: { + zoom: startFactor + }, + toValues: { + zoom: targetFactor + }, + duration: RED.view.zoomConstants.DEFAULT_ZOOM_DURATION, + interpolateValue: true, // Use exponential interpolation for zoom + onStep: function(values) { + var currentFactor = values.zoom; + scaleFactor = currentFactor; + + // Calculate new scroll position to maintain focal point + var currentScreenSize = [chart.width(), chart.height()]; + var newScrollPos; + + if (focalPoint) { + // Keep the focal point at the same screen position + newScrollPos = [ + center[0] * scaleFactor - focalPoint[0], + center[1] * scaleFactor - focalPoint[1] + ]; + } else { + // Keep viewport center steady + newScrollPos = [ + center[0] * scaleFactor - currentScreenSize[0]/2, + center[1] * scaleFactor - currentScreenSize[1]/2 + ]; + } + + chart.scrollLeft(newScrollPos[0]); + chart.scrollTop(newScrollPos[1]); + + RED.view.navigator.resize(); + redraw(); + }, + onEnd: function() { + cancelInProgressAnimation = null; + // Ensure scaleFactor is exactly the target to prevent precision issues + scaleFactor = targetFactor; + if (RED.settings.get("editor.view.view-store-zoom")) { + RED.settings.setLocal('zoom-level', targetFactor.toFixed(1)); + } + }, + onCancel: function() { + cancelInProgressAnimation = null; + // Ensure scaleFactor is set to current target on cancel + scaleFactor = targetFactor; + } + }); + } + // Momentum scrolling functions function startMomentumScroll() { if (scrollAnimationId) { From 49222c573715539263d1e76b834053472068b232 Mon Sep 17 00:00:00 2001 From: Dimitrie Hoekstra Date: Mon, 29 Sep 2025 17:41:05 +0200 Subject: [PATCH 013/160] Fix trackpad zoom direction - spreading fingers now zooms in - Inverted deltaY value for trackpad pinch gestures - Matches standard macOS trackpad behavior - Spreading fingers (negative deltaY) zooms in - Pinching fingers (positive deltaY) zooms out --- .../@node-red/editor-client/src/js/ui/view.js | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index b22a871eb2..e3336caeef 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -705,6 +705,7 @@ RED.view = (function() { // Modern wheel event handler for better trackpad support (pinch-to-zoom) and momentum var momentumTimer = null; + var trackpadGestureTimer = null; chart.on("wheel", function(evt) { // ctrlKey is set during pinch gestures on trackpads if (evt.ctrlKey || evt.altKey || spacebarPressed) { @@ -717,8 +718,41 @@ RED.view = (function() { evt.originalEvent.pageY - offset.top ]; var delta = evt.originalEvent.deltaY; - if (delta > 0) { zoomOut(cursorPos); } - else if (delta < 0) { zoomIn(cursorPos); } + + // For trackpad pinch (Ctrl+wheel), use smooth proportional zoom + if (evt.ctrlKey && !evt.altKey && !spacebarPressed) { + // Use the zoom animator's delta calculation for trackpad + // Invert delta: spreading fingers (negative deltaY) should zoom in + var scaleDelta = RED.view.zoomAnimator.calculateZoomDelta(scaleFactor, -delta, true); + var newScale = Math.min(RED.view.zoomConstants.MAX_ZOOM, + Math.max(RED.view.zoomConstants.MIN_ZOOM, scaleFactor + scaleDelta)); + + // Start gesture tracking if not already active + if (!RED.view.zoomAnimator.isGestureActive()) { + RED.view.zoomAnimator.startGesture(cursorPos, scaleFactor); + } + + // Update gesture with new scale, maintaining focal point + RED.view.zoomAnimator.updateGesture(newScale); + zoomView(newScale, RED.view.zoomAnimator.getGestureFocalPoint()); // Direct call, no animation + + // Reset gesture timeout - end gesture when no more events come in + if (trackpadGestureTimer) { + clearTimeout(trackpadGestureTimer); + } + trackpadGestureTimer = setTimeout(function() { + RED.view.zoomAnimator.endGesture(); + trackpadGestureTimer = null; + // Store zoom level when gesture completes + if (RED.settings.get("editor.view.view-store-zoom")) { + RED.settings.setLocal('zoom-level', scaleFactor.toFixed(1)); + } + }, 100); // 100ms timeout to detect gesture end + } else { + // Regular Alt+scroll or Space+scroll - use animated zoom + if (delta > 0) { zoomOut(cursorPos); } + else if (delta < 0) { zoomIn(cursorPos); } + } } else { // Regular scroll - track velocity and apply momentum handleScroll(); From 782821b5906bfe95182dc54c099739b8fe7dd6ee Mon Sep 17 00:00:00 2001 From: Dimitrie Hoekstra Date: Mon, 29 Sep 2025 18:03:52 +0200 Subject: [PATCH 014/160] Fix zoom focal point stability at canvas edges - Store focal point in workspace coordinates instead of screen coordinates - Prevents focal point drift when scroll changes due to canvas boundaries - Maintains consistent zoom focus even when view shifts at edges - Add early return in zoomView() to prevent unnecessary updates at zoom limits - Improve gesture state management for both trackpad and touch gestures --- .../src/js/ui/view-zoom-animator.js | 43 +++++++-- .../@node-red/editor-client/src/js/ui/view.js | 88 ++++++++++++++----- 2 files changed, 101 insertions(+), 30 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-animator.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-animator.js index 1a3238a625..bfb3d76864 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-animator.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-animator.js @@ -148,20 +148,35 @@ RED.view.zoomAnimator = (function() { */ const gestureState = { active: false, - initialFocalPoint: null, + initialFocalPoint: null, // Will store workspace coordinates initialScale: 1, currentScale: 1, - lastDistance: 0 + lastDistance: 0, + scrollPosAtStart: null, // Store initial scroll position + scaleFatorAtStart: 1 // Store initial scale factor }; /** * Start a zoom gesture with fixed focal point - * @param {Array} focalPoint - [x, y] coordinates of focal point + * @param {Array} focalPoint - [x, y] coordinates of focal point in workspace * @param {number} scale - Initial scale value + * @param {Array} scrollPos - Current scroll position [x, y] + * @param {number} currentScaleFactor - Current scale factor for coordinate conversion */ - function startGesture(focalPoint, scale) { + function startGesture(focalPoint, scale, scrollPos, currentScaleFactor) { gestureState.active = true; - gestureState.initialFocalPoint = focalPoint ? [...focalPoint] : null; + // Store the focal point in workspace coordinates for stability + // This ensures the point remains fixed even if scroll changes due to canvas edge constraints + if (focalPoint && scrollPos && currentScaleFactor) { + gestureState.initialFocalPoint = [ + (scrollPos[0] + focalPoint[0]) / currentScaleFactor, + (scrollPos[1] + focalPoint[1]) / currentScaleFactor + ]; + gestureState.scrollPosAtStart = [...scrollPos]; + gestureState.scaleFatorAtStart = currentScaleFactor; + } else { + gestureState.initialFocalPoint = focalPoint ? [...focalPoint] : null; + } gestureState.initialScale = scale; gestureState.currentScale = scale; return gestureState; @@ -204,8 +219,24 @@ RED.view.zoomAnimator = (function() { /** * Get the fixed focal point for the current gesture + * @param {Array} currentScrollPos - Current scroll position [x, y] + * @param {number} currentScaleFactor - Current scale factor + * @returns {Array} - Focal point in screen coordinates or null */ - function getGestureFocalPoint() { + function getGestureFocalPoint(currentScrollPos, currentScaleFactor) { + if (!gestureState.initialFocalPoint) { + return null; + } + + // If we stored workspace coordinates, convert back to screen coordinates + if (gestureState.scrollPosAtStart && currentScrollPos && currentScaleFactor) { + // Convert workspace coordinates back to current screen coordinates + return [ + gestureState.initialFocalPoint[0] * currentScaleFactor - currentScrollPos[0], + gestureState.initialFocalPoint[1] * currentScaleFactor - currentScrollPos[1] + ]; + } + return gestureState.initialFocalPoint; } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index e3336caeef..1c9a97506e 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -439,12 +439,12 @@ RED.view = (function() { initialDistance: startTouchDistance }; - // Start gesture with fixed focal point (screen coordinates) + // Start gesture with fixed focal point (store in workspace coordinates) var focalPoint = [ (touch0["pageX"] + touch1["pageX"]) / 2 - offset.left, (touch0["pageY"] + touch1["pageY"]) / 2 - offset.top ]; - RED.view.zoomAnimator.startGesture(focalPoint, scaleFactor); + RED.view.zoomAnimator.startGesture(focalPoint, scaleFactor, scrollPos, scaleFactor); } else { var obj = d3.select(document.body); touch0 = d3.event.touches.item(0); @@ -504,20 +504,27 @@ RED.view = (function() { // Use gesture state management to maintain fixed focal point var gestureState = RED.view.zoomAnimator.updateGesture(newScaleFactor); - if (gestureState && gestureState.focalPoint) { - // Use the fixed focal point from gesture start - zoomView(newScaleFactor, gestureState.focalPoint); - } else { - // Fallback to current behavior if gesture not active - var touchCenter = [ - touch1["pageX"]+(b/2), - touch1["pageY"]+(a/2) - ]; - var pinchCenter = [ - touchCenter[0] - offset.left, - touchCenter[1] - offset.top - ]; - zoomView(newScaleFactor, pinchCenter); + // Only call zoomView if scale is actually changing (not at limits) + if (Math.abs(scaleFactor - newScaleFactor) >= 0.001) { + // Get focal point converted back to current screen coordinates + var currentScrollPos = [chart.scrollLeft(), chart.scrollTop()]; + var focalPoint = RED.view.zoomAnimator.getGestureFocalPoint(currentScrollPos, scaleFactor); + + if (focalPoint) { + // Use the fixed focal point from gesture start (converted from workspace coords) + zoomView(newScaleFactor, focalPoint); + } else { + // Fallback to current behavior if gesture not active + var touchCenter = [ + touch1["pageX"]+(b/2), + touch1["pageY"]+(a/2) + ]; + var pinchCenter = [ + touchCenter[0] - offset.left, + touchCenter[1] - offset.top + ]; + zoomView(newScaleFactor, pinchCenter); + } } // Don't update startTouchDistance - keep initial distance for ratio calculation @@ -706,11 +713,19 @@ RED.view = (function() { // Modern wheel event handler for better trackpad support (pinch-to-zoom) and momentum var momentumTimer = null; var trackpadGestureTimer = null; + var lastWheelEventTime = 0; + var wheelEventContinuityThreshold = 100; // Events within 100ms are same gesture + var gestureEndThreshold = 500; // 500ms+ gap means gesture ended + chart.on("wheel", function(evt) { // ctrlKey is set during pinch gestures on trackpads if (evt.ctrlKey || evt.altKey || spacebarPressed) { evt.preventDefault(); evt.stopPropagation(); + + var currentTime = Date.now(); + var timeSinceLastEvent = currentTime - lastWheelEventTime; + // Get cursor position relative to the chart var offset = chart.offset(); var cursorPos = [ @@ -727,16 +742,35 @@ RED.view = (function() { var newScale = Math.min(RED.view.zoomConstants.MAX_ZOOM, Math.max(RED.view.zoomConstants.MIN_ZOOM, scaleFactor + scaleDelta)); - // Start gesture tracking if not already active - if (!RED.view.zoomAnimator.isGestureActive()) { - RED.view.zoomAnimator.startGesture(cursorPos, scaleFactor); - } + // Session-based gesture tracking: + // - If no active gesture OR gap > gestureEndThreshold, start new gesture + // - If gap < wheelEventContinuityThreshold, continue current gesture + // - If gap between continuity and end threshold, keep current gesture but don't update focal point - // Update gesture with new scale, maintaining focal point + if (!RED.view.zoomAnimator.isGestureActive() || timeSinceLastEvent > gestureEndThreshold) { + // Start new gesture session - store focal point in workspace coordinates + var scrollPos = [chart.scrollLeft(), chart.scrollTop()]; + RED.view.zoomAnimator.startGesture(cursorPos, scaleFactor, scrollPos, scaleFactor); + } else if (timeSinceLastEvent <= wheelEventContinuityThreshold) { + // Events are continuous - this is the same gesture, focal point remains locked + // No need to update focal point + } + // For gaps between continuity and end threshold, keep existing gesture state + + // Update gesture with new scale, maintaining locked focal point RED.view.zoomAnimator.updateGesture(newScale); - zoomView(newScale, RED.view.zoomAnimator.getGestureFocalPoint()); // Direct call, no animation + // Only call zoomView if scale is actually changing (not at limits) + if (Math.abs(scaleFactor - newScale) >= 0.001) { + // Get focal point converted back to current screen coordinates + var currentScrollPos = [chart.scrollLeft(), chart.scrollTop()]; + var focalPoint = RED.view.zoomAnimator.getGestureFocalPoint(currentScrollPos, scaleFactor); + zoomView(newScale, focalPoint); // Direct call, no animation + } + + // Update last event time for continuity tracking + lastWheelEventTime = currentTime; - // Reset gesture timeout - end gesture when no more events come in + // Reset gesture timeout - end gesture when no more events come in for gestureEndThreshold if (trackpadGestureTimer) { clearTimeout(trackpadGestureTimer); } @@ -747,7 +781,7 @@ RED.view = (function() { if (RED.settings.get("editor.view.view-store-zoom")) { RED.settings.setLocal('zoom-level', scaleFactor.toFixed(1)); } - }, 100); // 100ms timeout to detect gesture end + }, gestureEndThreshold); // Use 500ms timeout for gesture end detection } else { // Regular Alt+scroll or Space+scroll - use animated zoom if (delta > 0) { zoomOut(cursorPos); } @@ -2660,6 +2694,12 @@ RED.view = (function() { function zoomView(factor, focalPoint) { + // Early return if scale factor isn't actually changing + // This prevents focal point shifts when at zoom limits + if (Math.abs(scaleFactor - factor) < 0.001) { + return; + } + var screenSize = [chart.width(),chart.height()]; var scrollPos = [chart.scrollLeft(),chart.scrollTop()]; From 541977312e3ed27141f3097b07b217532ad26e8e Mon Sep 17 00:00:00 2001 From: Dimitrie Hoekstra Date: Mon, 29 Sep 2025 18:15:09 +0200 Subject: [PATCH 015/160] Improve zoom smoothness and control - Make mouse wheel zoom smooth without jarring animations - Reduce zoom acceleration from 2x to 1.2x max - Slow down zoom velocity by 40-50% for better control - Add asymmetric zoom speeds (zoom out slower than zoom in) - Reduce acceleration range to 0.7-1.1 for gentler transitions - Disable legacy mousewheel handler in favor of modern wheel event --- .../src/js/ui/view-zoom-animator.js | 11 ++--- .../@node-red/editor-client/src/js/ui/view.js | 44 +++++++++++-------- 2 files changed, 32 insertions(+), 23 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-animator.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-animator.js index bfb3d76864..7938ca0de1 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-animator.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-animator.js @@ -130,15 +130,16 @@ RED.view.zoomAnimator = (function() { if (isTrackpad) { // Trackpad deltas are typically smaller and more frequent - normalizedDelta = delta * 0.01; + normalizedDelta = delta * 0.005; // Reduced from 0.01 for gentler zoom } else { // Mouse wheel deltas are larger and less frequent - normalizedDelta = delta > 0 ? 0.1 : -0.1; + // Reduce zoom out speed more than zoom in + normalizedDelta = delta > 0 ? 0.06 : -0.08; // Reduced from 0.1, asymmetric for gentler zoom out } - // Apply acceleration based on current zoom level - // Zoom faster when zoomed out, slower when zoomed in - const acceleration = Math.max(0.5, Math.min(2, 1 / currentScale)); + // Apply gentler acceleration based on current zoom level + // Less aggressive acceleration to prevent rapid zoom out + const acceleration = Math.max(0.7, Math.min(1.1, 1 / currentScale)); // Reduced from 0.5-1.2 to 0.7-1.1 return normalizedDelta * acceleration; } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 1c9a97506e..4776d7ade1 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -694,21 +694,22 @@ RED.view = (function() { RED.popover.tooltip($("#red-ui-view-zoom-zero"),RED._('actions.zoom-reset'),'core:zoom-reset'); $("#red-ui-view-zoom-in").on("click", zoomOut); RED.popover.tooltip($("#red-ui-view-zoom-in"),RED._('actions.zoom-in'),'core:zoom-in'); - chart.on("DOMMouseScroll mousewheel", function (evt) { - if ( evt.altKey || spacebarPressed ) { - evt.preventDefault(); - evt.stopPropagation(); - // Get cursor position relative to the chart - var offset = chart.offset(); - var cursorPos = [ - evt.originalEvent.pageX - offset.left, - evt.originalEvent.pageY - offset.top - ]; - var move = -(evt.originalEvent.detail) || evt.originalEvent.wheelDelta; - if (move <= 0) { zoomOut(cursorPos); } - else { zoomIn(cursorPos); } - } - }); + // Legacy mouse wheel handler - disabled in favor of modern wheel event + // chart.on("DOMMouseScroll mousewheel", function (evt) { + // if ( evt.altKey || spacebarPressed ) { + // evt.preventDefault(); + // evt.stopPropagation(); + // // Get cursor position relative to the chart + // var offset = chart.offset(); + // var cursorPos = [ + // evt.originalEvent.pageX - offset.left, + // evt.originalEvent.pageY - offset.top + // ]; + // var move = -(evt.originalEvent.detail) || evt.originalEvent.wheelDelta; + // if (move <= 0) { zoomOut(cursorPos); } + // else { zoomIn(cursorPos); } + // } + // }); // Modern wheel event handler for better trackpad support (pinch-to-zoom) and momentum var momentumTimer = null; @@ -783,9 +784,16 @@ RED.view = (function() { } }, gestureEndThreshold); // Use 500ms timeout for gesture end detection } else { - // Regular Alt+scroll or Space+scroll - use animated zoom - if (delta > 0) { zoomOut(cursorPos); } - else if (delta < 0) { zoomIn(cursorPos); } + // Regular Alt+scroll or Space+scroll - use smooth zoom without animation + // Use the zoom animator's delta calculation for mouse wheel + var scaleDelta = RED.view.zoomAnimator.calculateZoomDelta(scaleFactor, -delta, false); + var newScale = Math.min(RED.view.zoomConstants.MAX_ZOOM, + Math.max(RED.view.zoomConstants.MIN_ZOOM, scaleFactor + scaleDelta)); + + // Only zoom if scale is actually changing + if (Math.abs(scaleFactor - newScale) >= 0.001) { + zoomView(newScale, cursorPos); // Direct call, no animation for smoother feel + } } } else { // Regular scroll - track velocity and apply momentum From 3e2fb858216c439c21075920103a1e9bbd27b5ee Mon Sep 17 00:00:00 2001 From: Dimitrie Hoekstra Date: Mon, 29 Sep 2025 18:39:55 +0200 Subject: [PATCH 016/160] Add two-finger panning and spacebar+click panning - Implement spacebar+left-click panning for desktop - Add two-finger pan gesture for touch devices - Use mode locking to prevent laggy gesture switching - Lock into pan or zoom mode based on initial movement - Fix focal point regression caused by pan/zoom interaction - Improve gesture detection with better thresholds (10px for zoom, 5px for pan) --- .../@node-red/editor-client/src/js/ui/view.js | 103 +++++++++++++----- 1 file changed, 76 insertions(+), 27 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 4776d7ade1..eee88a20df 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -436,7 +436,8 @@ RED.view = (function() { // Store initial scale for ratio-based zoom calculation gesture = { initialScale: scaleFactor, - initialDistance: startTouchDistance + initialDistance: startTouchDistance, + mode: null // Will be determined on first significant move }; // Start gesture with fixed focal point (store in workspace coordinates) @@ -494,37 +495,75 @@ RED.view = (function() { var offset = chart.offset(); var scrollPos = [chart.scrollLeft(),chart.scrollTop()]; var moveTouchDistance = Math.sqrt((a*a)+(b*b)); + + // Calculate center point of two fingers + var currentTouchCenter = [ + (touch0["pageX"] + touch1["pageX"]) / 2, + (touch0["pageY"] + touch1["pageY"]) / 2 + ]; if (!isNaN(moveTouchDistance)) { - oldScaleFactor = scaleFactor; - // Use smooth ratio-based scaling for natural pinch-to-zoom - var zoomRatio = moveTouchDistance / startTouchDistance; - var newScaleFactor = Math.min(2, Math.max(0.3, gesture.initialScale * zoomRatio)); - - // Use gesture state management to maintain fixed focal point - var gestureState = RED.view.zoomAnimator.updateGesture(newScaleFactor); + // Determine gesture mode on first significant movement + if (!gesture.mode) { + var distanceChange = Math.abs(moveTouchDistance - startTouchDistance); + var centerChange = moveTouchCenter ? + Math.sqrt(Math.pow(currentTouchCenter[0] - moveTouchCenter[0], 2) + + Math.pow(currentTouchCenter[1] - moveTouchCenter[1], 2)) : 0; + + // Lock into zoom mode if distance changes significantly (>10px) + // Lock into pan mode if center moves significantly (>5px) without distance change + if (distanceChange > 10) { + gesture.mode = 'zoom'; + } else if (centerChange > 5) { + gesture.mode = 'pan'; + } + } - // Only call zoomView if scale is actually changing (not at limits) - if (Math.abs(scaleFactor - newScaleFactor) >= 0.001) { - // Get focal point converted back to current screen coordinates - var currentScrollPos = [chart.scrollLeft(), chart.scrollTop()]; - var focalPoint = RED.view.zoomAnimator.getGestureFocalPoint(currentScrollPos, scaleFactor); + // Once mode is determined, stay in that mode for the entire gesture + if (gesture.mode === 'zoom') { + oldScaleFactor = scaleFactor; + // Use smooth ratio-based scaling for natural pinch-to-zoom + var zoomRatio = moveTouchDistance / startTouchDistance; + var newScaleFactor = Math.min(2, Math.max(0.3, gesture.initialScale * zoomRatio)); + + // Use gesture state management to maintain fixed focal point + var gestureState = RED.view.zoomAnimator.updateGesture(newScaleFactor); - if (focalPoint) { - // Use the fixed focal point from gesture start (converted from workspace coords) - zoomView(newScaleFactor, focalPoint); - } else { - // Fallback to current behavior if gesture not active - var touchCenter = [ - touch1["pageX"]+(b/2), - touch1["pageY"]+(a/2) - ]; - var pinchCenter = [ - touchCenter[0] - offset.left, - touchCenter[1] - offset.top - ]; - zoomView(newScaleFactor, pinchCenter); + // Only call zoomView if scale is actually changing (not at limits) + if (Math.abs(scaleFactor - newScaleFactor) >= 0.001) { + // Get focal point converted back to current screen coordinates + var currentScrollPos = [chart.scrollLeft(), chart.scrollTop()]; + var focalPoint = RED.view.zoomAnimator.getGestureFocalPoint(currentScrollPos, scaleFactor); + + if (focalPoint) { + // Use the fixed focal point from gesture start (converted from workspace coords) + zoomView(newScaleFactor, focalPoint); + } else { + // Fallback to current behavior if gesture not active + var touchCenter = [ + touch1["pageX"]+(b/2), + touch1["pageY"]+(a/2) + ]; + var pinchCenter = [ + touchCenter[0] - offset.left, + touchCenter[1] - offset.top + ]; + zoomView(newScaleFactor, pinchCenter); + } + } + } else if (gesture.mode === 'pan' || !gesture.mode) { + // Two-finger pan: allow immediate panning even if mode not determined + if (moveTouchCenter) { + var dx = currentTouchCenter[0] - moveTouchCenter[0]; + var dy = currentTouchCenter[1] - moveTouchCenter[1]; + + // Pan the canvas + var currentScroll = [chart.scrollLeft(), chart.scrollTop()]; + chart.scrollLeft(currentScroll[0] - dx); + chart.scrollTop(currentScroll[1] - dy); } + // Update the center for next move + moveTouchCenter = currentTouchCenter; } // Don't update startTouchDistance - keep initial distance for ratio calculation @@ -1443,6 +1482,16 @@ RED.view = (function() { return; } + // Spacebar + left click for panning + if (spacebarPressed && d3.event.button === 0) { + d3.event.preventDefault(); + d3.event.stopPropagation(); + mouse_mode = RED.state.PANNING; + mouse_position = [d3.event.pageX,d3.event.pageY] + scroll_position = [chart.scrollLeft(),chart.scrollTop()]; + return; + } + if (d3.event.button === 1) { // Middle Click pan d3.event.preventDefault(); From bf73261ecb52d88858bc2aef3bf4096d5748295d Mon Sep 17 00:00:00 2001 From: Dimitrie Hoekstra Date: Mon, 29 Sep 2025 18:49:07 +0200 Subject: [PATCH 017/160] Prevent UI pinch-to-zoom while keeping canvas zoomable - Add touch-action CSS to prevent pinch-zoom on UI elements - Apply touch-action: pan-x pan-y to html, body, and editor - Apply touch-action: none to canvas for custom gestures - Add JavaScript prevention for touchpad pinch on non-canvas areas - Block Ctrl+wheel events outside the workspace chart --- .../node_modules/@node-red/editor-client/src/js/ui/view.js | 7 +++++++ .../@node-red/editor-client/src/sass/base.scss | 4 +++- .../@node-red/editor-client/src/sass/workspace.scss | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index eee88a20df..a18292f514 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -757,6 +757,13 @@ RED.view = (function() { var wheelEventContinuityThreshold = 100; // Events within 100ms are same gesture var gestureEndThreshold = 500; // 500ms+ gap means gesture ended + // Prevent browser zoom on non-canvas areas + document.addEventListener("wheel", function(e) { + if (e.ctrlKey && !e.target.closest('#red-ui-workspace-chart')) { + e.preventDefault(); + } + }, { passive: false }); + chart.on("wheel", function(evt) { // ctrlKey is set during pinch gestures on trackpads if (evt.ctrlKey || evt.altKey || spacebarPressed) { diff --git a/packages/node_modules/@node-red/editor-client/src/sass/base.scss b/packages/node_modules/@node-red/editor-client/src/sass/base.scss index afbafe049b..fecedf8839 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/base.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/base.scss @@ -17,8 +17,9 @@ **/ -body { +html, body { overflow: hidden; + touch-action: pan-x pan-y; } .red-ui-editor { @@ -29,6 +30,7 @@ body { background: var(--red-ui-primary-background); color: var(--red-ui-primary-text-color); line-height: 20px; + touch-action: pan-x pan-y; } #red-ui-editor { diff --git a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss index 95b8b4b458..7e03b063f5 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss @@ -37,6 +37,7 @@ right:0px; box-sizing:border-box; transition: right 0.2s ease; + touch-action: none; &:focus { outline: none; } From 4938833227a3640af17e3aa8ed7bfa5364cd54be Mon Sep 17 00:00:00 2001 From: Dimitrie Hoekstra Date: Mon, 29 Sep 2025 18:57:39 +0200 Subject: [PATCH 018/160] Fix zoom gesture detection after two-finger panning Clear touchStartTime timeout when entering two-finger pan mode to prevent interference with subsequent zoom gestures. The timeout was being used for long-press detection but wasn't cleared during pan, causing the next gesture to incorrectly maintain the old touch state. --- .../node_modules/@node-red/editor-client/src/js/ui/view.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index a18292f514..dad9cdb214 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -553,6 +553,11 @@ RED.view = (function() { } } else if (gesture.mode === 'pan' || !gesture.mode) { // Two-finger pan: allow immediate panning even if mode not determined + // Clear touchStartTime to prevent issues with next gesture + if (touchStartTime) { + clearTimeout(touchStartTime); + touchStartTime = null; + } if (moveTouchCenter) { var dx = currentTouchCenter[0] - moveTouchCenter[0]; var dy = currentTouchCenter[1] - moveTouchCenter[1]; From b4c3faf03490731f7c49b9c19444528c5954cea0 Mon Sep 17 00:00:00 2001 From: Dimitrie Hoekstra Date: Mon, 29 Sep 2025 19:36:13 +0200 Subject: [PATCH 019/160] Implement dynamic zoom limits to match canvas boundaries - Add calculateMinZoom() function to dynamically compute minimum zoom based on viewport size - Ensure canvas always covers the entire viewport (no empty space visible) - Use 'cover' behavior: zoom limited so canvas fills viewport completely - Update all zoom methods (buttons, wheel, trackpad, touch) to use calculated minimum - Prevent zooming out beyond what's needed to fill the viewport with canvas content --- .../src/js/ui/view-zoom-constants.js | 2 +- .../@node-red/editor-client/src/js/ui/view.js | 34 ++++++++++++++++--- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js index e983b473e7..ff32bb92d1 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js @@ -3,7 +3,7 @@ */ RED.view.zoomConstants = { // Zoom limits - MIN_ZOOM: 0.3, + MIN_ZOOM: 0.15, // Default minimum, will be dynamically calculated to fit canvas MAX_ZOOM: 2.0, // Zoom step for keyboard/button controls diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index dad9cdb214..e613758478 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -524,7 +524,9 @@ RED.view = (function() { oldScaleFactor = scaleFactor; // Use smooth ratio-based scaling for natural pinch-to-zoom var zoomRatio = moveTouchDistance / startTouchDistance; - var newScaleFactor = Math.min(2, Math.max(0.3, gesture.initialScale * zoomRatio)); + var minZoom = calculateMinZoom(); + var newScaleFactor = Math.min(RED.view.zoomConstants.MAX_ZOOM, + Math.max(minZoom, gesture.initialScale * zoomRatio)); // Use gesture state management to maintain fixed focal point var gestureState = RED.view.zoomAnimator.updateGesture(newScaleFactor); @@ -791,8 +793,9 @@ RED.view = (function() { // Use the zoom animator's delta calculation for trackpad // Invert delta: spreading fingers (negative deltaY) should zoom in var scaleDelta = RED.view.zoomAnimator.calculateZoomDelta(scaleFactor, -delta, true); + var minZoom = calculateMinZoom(); var newScale = Math.min(RED.view.zoomConstants.MAX_ZOOM, - Math.max(RED.view.zoomConstants.MIN_ZOOM, scaleFactor + scaleDelta)); + Math.max(minZoom, scaleFactor + scaleDelta)); // Session-based gesture tracking: // - If no active gesture OR gap > gestureEndThreshold, start new gesture @@ -2746,14 +2749,32 @@ RED.view = (function() { } + function calculateMinZoom() { + // Calculate the minimum zoom to ensure canvas always fills the viewport (no empty space) + var viewportWidth = chart.width(); + var viewportHeight = chart.height(); + + // Canvas is 8000x8000, calculate zoom to cover viewport + var zoomToFitWidth = viewportWidth / space_width; + var zoomToFitHeight = viewportHeight / space_height; + + // Use the LARGER zoom to ensure canvas covers entire viewport (no empty space visible) + var calculatedMinZoom = Math.max(zoomToFitWidth, zoomToFitHeight); + + // Return the larger of the calculated min or the configured min + // This ensures canvas always fills the viewport + return Math.max(calculatedMinZoom, RED.view.zoomConstants.MIN_ZOOM); + } + function zoomIn(focalPoint) { if (scaleFactor < RED.view.zoomConstants.MAX_ZOOM) { animatedZoomView(scaleFactor + RED.view.zoomConstants.ZOOM_STEP, focalPoint); } } function zoomOut(focalPoint) { - if (scaleFactor > RED.view.zoomConstants.MIN_ZOOM) { - animatedZoomView(scaleFactor - RED.view.zoomConstants.ZOOM_STEP, focalPoint); + var minZoom = calculateMinZoom(); + if (scaleFactor > minZoom) { + animatedZoomView(Math.max(scaleFactor - RED.view.zoomConstants.ZOOM_STEP, minZoom), focalPoint); } } function zoomZero() { animatedZoomView(1); } @@ -2812,8 +2833,11 @@ RED.view = (function() { cancelInProgressAnimation = null; } + // Calculate the actual minimum zoom to fit canvas + var minZoom = calculateMinZoom(); + // Clamp target factor to valid range - targetFactor = Math.max(RED.view.zoomConstants.MIN_ZOOM, + targetFactor = Math.max(minZoom, Math.min(RED.view.zoomConstants.MAX_ZOOM, targetFactor)); // If we're already at the target, no need to animate From 7dca55fdb8187ea10e70168ab774e0b7a6e6beae Mon Sep 17 00:00:00 2001 From: Dimitrie Hoekstra Date: Mon, 29 Sep 2025 20:04:26 +0200 Subject: [PATCH 020/160] Add dynamic minimum zoom recalculation on viewport resize - Recalculate minimum zoom when window resizes to ensure canvas fits properly - Automatically adjust zoom if current level falls below new minimum after resize - Ensures canvas boundaries remain appropriate for different viewport sizes --- .../editor-client/src/js/ui/view-zoom-constants.js | 2 +- .../@node-red/editor-client/src/js/ui/view.js | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js index ff32bb92d1..92e0f526cd 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js @@ -3,7 +3,7 @@ */ RED.view.zoomConstants = { // Zoom limits - MIN_ZOOM: 0.15, // Default minimum, will be dynamically calculated to fit canvas + MIN_ZOOM: 0.05, // Default minimum, will be dynamically calculated to fit canvas MAX_ZOOM: 2.0, // Zoom step for keyboard/button controls diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index e613758478..bbe0438c79 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -640,6 +640,16 @@ RED.view = (function() { spacebarPressed = false; } }) + + // Recalculate minimum zoom when window resizes + $(window).on("resize.red-ui-view", function() { + // Recalculate minimum zoom to ensure canvas fits in viewport + var newMinZoom = calculateMinZoom(); + // If current zoom is below new minimum, adjust it + if (scaleFactor < newMinZoom) { + zoomView(newMinZoom); + } + }) // Workspace Background eventLayer.append("svg:rect") From 6725fd64267a4b3d5b4380d13ff87dd2e60ca2a8 Mon Sep 17 00:00:00 2001 From: Dimitrie Hoekstra Date: Mon, 29 Sep 2025 20:15:30 +0200 Subject: [PATCH 021/160] Hide scrollbars and add auto-show/hide minimap on navigation - Hide scrollbars on canvas while keeping it scrollable - Add minimap auto-show functionality that triggers on zoom and pan - Minimap appears for 2 seconds during navigation then fades out - Add smooth fade in/out animations for minimap visibility - Emit view:navigate events for all zoom and pan operations - Minimap stays visible if manually toggled with button --- .../editor-client/src/js/ui/view-navigator.js | 59 +++++++++++++++++-- .../@node-red/editor-client/src/js/ui/view.js | 6 ++ .../editor-client/src/sass/workspace.scss | 18 ++++++ 3 files changed, 79 insertions(+), 4 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js index 6450d45bd9..9042657289 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js @@ -31,6 +31,8 @@ var dimensions; var isDragging; var isShowing = false; + var autoHideTimeout; + var isManuallyToggled = false; function refreshNodes() { if (!isShowing) { @@ -68,19 +70,59 @@ function toggle() { if (!isShowing) { isShowing = true; + isManuallyToggled = true; + clearTimeout(autoHideTimeout); $("#red-ui-view-navigate").addClass("selected"); resizeNavBorder(); refreshNodes(); $("#red-ui-workspace-chart").on("scroll",onScroll); - navContainer.fadeIn(200); + navContainer.addClass('red-ui-navigator-container'); + navContainer.show(); + setTimeout(function() { + navContainer.addClass('red-ui-navigator-visible'); + }, 10); } else { isShowing = false; - navContainer.fadeOut(100); + isManuallyToggled = false; + clearTimeout(autoHideTimeout); + navContainer.removeClass('red-ui-navigator-visible'); + setTimeout(function() { + navContainer.hide(); + }, 300); $("#red-ui-workspace-chart").off("scroll",onScroll); $("#red-ui-view-navigate").removeClass("selected"); } } + function showTemporary() { + if (!isManuallyToggled) { + clearTimeout(autoHideTimeout); + + if (!isShowing) { + isShowing = true; + resizeNavBorder(); + refreshNodes(); + $("#red-ui-workspace-chart").on("scroll",onScroll); + navContainer.addClass('red-ui-navigator-container'); + navContainer.show(); + setTimeout(function() { + navContainer.addClass('red-ui-navigator-visible'); + }, 10); + } + + autoHideTimeout = setTimeout(function() { + if (!isManuallyToggled && isShowing) { + isShowing = false; + navContainer.removeClass('red-ui-navigator-visible'); + setTimeout(function() { + navContainer.hide(); + }, 300); + $("#red-ui-workspace-chart").off("scroll",onScroll); + } + }, 2000); + } + } + return { init: function() { @@ -94,7 +136,7 @@ "bottom":$("#red-ui-workspace-footer").height(), "right":0, zIndex: 1 - }).appendTo("#red-ui-workspace").hide(); + }).addClass('red-ui-navigator-container').appendTo("#red-ui-workspace").hide(); navBox = d3.select(navContainer[0]) .append("svg:svg") @@ -148,10 +190,19 @@ toggle(); }) RED.popover.tooltip($("#red-ui-view-navigate"),RED._('actions.toggle-navigator'),'core:toggle-navigator'); + + // Listen for canvas interactions to show minimap temporarily + RED.events.on("view:selection-changed", function() { + showTemporary(); + }); + RED.events.on("view:navigate", function() { + showTemporary(); + }); }, refresh: refreshNodes, resize: resizeNavBorder, - toggle: toggle + toggle: toggle, + showTemporary: showTemporary } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index bbe0438c79..3f322cf0d4 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -480,6 +480,7 @@ RED.view = (function() { mouse_mode = RED.state.PANNING; mouse_position = [touch0.pageX,touch0.pageY] scroll_position = [chart.scrollLeft(),chart.scrollTop()]; + RED.events.emit("view:navigate"); } } @@ -568,6 +569,7 @@ RED.view = (function() { var currentScroll = [chart.scrollLeft(), chart.scrollTop()]; chart.scrollLeft(currentScroll[0] - dx); chart.scrollTop(currentScroll[1] - dy); + RED.events.emit("view:navigate"); } // Update the center for next move moveTouchCenter = currentTouchCenter; @@ -1514,6 +1516,7 @@ RED.view = (function() { mouse_mode = RED.state.PANNING; mouse_position = [d3.event.pageX,d3.event.pageY] scroll_position = [chart.scrollLeft(),chart.scrollTop()]; + RED.events.emit("view:navigate"); return; } @@ -1523,6 +1526,7 @@ RED.view = (function() { mouse_mode = RED.state.PANNING; mouse_position = [d3.event.pageX,d3.event.pageY] scroll_position = [chart.scrollLeft(),chart.scrollTop()]; + RED.events.emit("view:navigate"); return; } if (d3.event.button === 2) { @@ -2080,6 +2084,7 @@ RED.view = (function() { chart.scrollLeft(scroll_position[0]+deltaPos[0]) chart.scrollTop(scroll_position[1]+deltaPos[1]) + RED.events.emit("view:navigate"); return } @@ -2831,6 +2836,7 @@ RED.view = (function() { RED.view.navigator.resize(); redraw(); + RED.events.emit("view:navigate"); if (RED.settings.get("editor.view.view-store-zoom")) { RED.settings.setLocal('zoom-level', factor.toFixed(1)) } diff --git a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss index 7e03b063f5..46be67158f 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss @@ -38,6 +38,15 @@ box-sizing:border-box; transition: right 0.2s ease; touch-action: none; + + // Hide scrollbars + scrollbar-width: none; /* Firefox */ + -ms-overflow-style: none; /* Internet Explorer 10+ */ + &::-webkit-scrollbar { /* WebKit */ + width: 0; + height: 0; + } + &:focus { outline: none; } @@ -151,6 +160,15 @@ background: var(--red-ui-view-navigator-background); box-shadow: -1px 0 3px var(--red-ui-shadow); } + +.red-ui-navigator-container { + transition: opacity 0.3s ease; + opacity: 0; + + &.red-ui-navigator-visible { + opacity: 1; + } +} .red-ui-navigator-border { stroke-dasharray: 5,5; pointer-events: none; From 08a5d04df62b96f52c150752b771a6271493cb29 Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 12:17:54 +0200 Subject: [PATCH 022/160] Enable diagonal trackpad panning - Prevent browser's native axis-locked scroll behavior - Manually handle both deltaX and deltaY in wheel event handler - Update touch-action CSS from pan-x pan-y to manipulation - Add documentation of fix to CANVAS_INTERACTION.md Fixes issue where trackpad scrolling was restricted to horizontal or vertical movement only, not both simultaneously. --- CANVAS_INTERACTION.md | 221 ++++++++++++++++++ .../@node-red/editor-client/src/js/ui/view.js | 13 +- .../editor-client/src/sass/base.scss | 4 +- 3 files changed, 235 insertions(+), 3 deletions(-) create mode 100644 CANVAS_INTERACTION.md diff --git a/CANVAS_INTERACTION.md b/CANVAS_INTERACTION.md new file mode 100644 index 0000000000..dc9ed398c7 --- /dev/null +++ b/CANVAS_INTERACTION.md @@ -0,0 +1,221 @@ +# Canvas Interaction Improvements + +This document tracks the ongoing improvements to Node-RED's canvas interaction across different devices, input methods, and browser zoom settings. + +## Objectives + +Improve canvas interaction to work consistently and intuitively across: +- **Browser zoom levels**: 100%, 125%, 150%, 200%, etc. +- **Input devices**: Mouse, trackpad, and touchscreen +- **Platforms**: Desktop (Windows, macOS, Linux) and mobile/tablet devices + +## What Has Been Implemented + +### Zoom Functionality + +#### Smooth Zoom Animation (commits: bdfa06b, a12b65b) +- ✅ 125ms smooth zoom transitions with ease-out curves +- ✅ Natural acceleration/deceleration for zoom operations +- ✅ Reduced acceleration from 2x to 1.2x max for better control +- ✅ Asymmetric zoom speeds (zoom out 40-50% slower than zoom in) +- ✅ Gentler acceleration range (0.7-1.1) for smoother transitions +- ✅ No jarring animations during mouse wheel zoom + +#### Zoom Input Methods (commits: e7a028b, bdfa06b) +- ✅ Mouse wheel zoom +- ✅ Space+scroll zoom mode (alternative to Alt+scroll) +- ✅ Trackpad pinch-to-zoom (Ctrl+wheel) +- ✅ Touch screen pinch-to-zoom with proper center tracking +- ✅ UI zoom buttons (corrected zoom in/out direction) + +#### Zoom Focal Point (commits: e42b09de, feec7ec, e7a028b) +- ✅ Cursor-centered zoom (focuses on cursor position) +- ✅ Store focal point in workspace coordinates instead of screen coordinates +- ✅ Prevents focal point drift when scroll changes due to canvas boundaries +- ✅ Maintains consistent zoom focus even when view shifts at edges +- ✅ Fixed focal point during pinch gestures + +#### Zoom Direction & Behavior (commits: 37f9786, bdfa06b) +- ✅ Fixed trackpad zoom direction (spreading fingers zooms in, pinching zooms out) +- ✅ Matches standard macOS trackpad behavior +- ✅ Proper ratio-based scaling for pinch gestures +- ✅ Scale lock issues fixed with improved tolerance handling + +#### Dynamic Zoom Limits (commits: 7918693, f13ed66) +- ✅ Calculate minimum zoom dynamically based on viewport size +- ✅ Ensure canvas always covers entire viewport (no empty space visible) +- ✅ Use 'cover' behavior: canvas fills viewport completely +- ✅ Recalculate minimum zoom on window resize +- ✅ Automatically adjust zoom if current level falls below new minimum after resize +- ✅ Prevent zooming out beyond what's needed to fill viewport + +### Panning Functionality + +#### Pan Input Methods (commit: feec7ec) +- ✅ Two-finger pan gesture for touch devices +- ✅ Spacebar+left-click panning for desktop +- ✅ Mode locking to prevent laggy gesture switching +- ✅ Lock into pan or zoom mode based on initial movement +- ✅ Better gesture detection thresholds (10px for zoom, 5px for pan) + +#### Scroll Behavior (commit: e7a028b) +- ✅ Momentum scrolling with edge bounce animation +- ✅ Enhanced spacebar handling to prevent scroll artifacts + +### UI/UX Enhancements + +#### Gesture State Management (commits: e42b09de, bdfa06b, 121982e) +- ✅ Improved gesture state management for trackpad and touch gestures +- ✅ Proper state cleanup when cursor leaves canvas +- ✅ Clear touchStartTime timeout when entering two-finger pan mode +- ✅ Prevent interference between long-press detection and pan gestures + +#### UI Pinch-Zoom Prevention (commit: e0c5b84) +- ✅ Prevent UI pinch-to-zoom while keeping canvas zoomable +- ✅ Apply `touch-action: pan-x pan-y` to html, body, and editor elements +- ✅ Apply `touch-action: none` to canvas for custom gestures +- ✅ JavaScript prevention for trackpad pinch on non-canvas areas +- ✅ Block Ctrl+wheel events outside the workspace chart + +#### Minimap Navigation (commit: 53dce6a) +- ✅ Auto-show minimap on zoom and pan operations +- ✅ Minimap appears for 2 seconds during navigation then fades out +- ✅ Smooth fade in/out animations for minimap visibility +- ✅ Minimap stays visible if manually toggled with button +- ✅ Emit `view:navigate` events for all zoom and pan operations + +#### Visual Polish (commit: 53dce6a) +- ✅ Hide scrollbars on canvas while keeping it scrollable +- ✅ Clean visual appearance without visible scrollbars + +### Code Architecture + +#### New Modules (commit: bdfa06b) +- ✅ `view-zoom-animator.js` - Zoom animation utilities (223 lines) +- ✅ `view-zoom-constants.js` - Zoom configuration constants (21 lines) +- ✅ Updated Gruntfile to include new zoom modules in build + +## Current Expectations + +### Cross-Device Consistency +- Zoom and pan should feel natural on mouse, trackpad, and touchscreen +- Gestures should be responsive without lag or mode switching artifacts +- Zoom focal point should remain stable regardless of input method + +### Browser Zoom Compatibility +- Canvas interaction should work correctly at all browser zoom levels +- UI elements should remain accessible and functional +- No layout breaking or interaction dead zones + +### Visual Feedback +- Minimap should provide contextual navigation feedback +- Smooth animations should make interactions feel polished +- No visual glitches or artifacts during zoom/pan operations + +### Performance +- All interactions should be smooth (60fps target) +- No janky animations or delayed responses +- Efficient gesture detection without excessive computation + +## Recent Fixes + +### Diagonal Trackpad Panning (Latest) +**Issue**: Trackpad scrolling was restricted to horizontal OR vertical movement, not both simultaneously. + +**Root Cause**: Browser's native scroll behavior on `overflow: auto` containers locks into one axis at a time, even before JavaScript wheel events fire. + +**Solution**: +- Added `evt.preventDefault()` and `evt.stopPropagation()` to regular scroll handling +- Manually apply both `deltaX` and `deltaY` to scrollLeft/scrollTop simultaneously +- Prevents browser's axis-locked scroll behavior from taking over +- Also updated CSS `touch-action` from `pan-x pan-y` to `manipulation` (though this primarily affects touch events, not trackpad) + +**Files Changed**: +- `view.js:864-890` - Added manual diagonal scroll handling +- `base.scss:22, 33` - Changed touch-action to manipulation + +**Result**: Trackpad can now pan diagonally without axis-locking. + +## Known Issues & Future Work + +### To Be Tested +- [ ] Comprehensive testing across different browser zoom levels (100%, 125%, 150%, 200%) +- [ ] Cross-browser testing (Chrome, Firefox, Safari, Edge) +- [ ] Testing on different touchscreen devices (tablets, touch-enabled laptops) +- [ ] Testing with different trackpad sensitivities and gesture settings +- [x] Diagonal trackpad panning (fixed) + +### Potential Improvements +- [ ] Additional fine-tuning of zoom speeds and acceleration curves based on user feedback +- [ ] Consider adding keyboard shortcuts for zoom reset (Ctrl+0 / Cmd+0) +- [ ] Evaluate need for custom zoom level indicator in UI +- [ ] Consider adding preferences for zoom/pan sensitivity + +### Edge Cases to Monitor +- [ ] Behavior when canvas content is very small or very large +- [ ] Interaction with browser accessibility features +- [ ] Performance with extremely large flows (100+ nodes) +- [ ] Multi-monitor scenarios with different DPI settings + +## Testing Checklist + +When verifying canvas interaction improvements: + +1. **Zoom Testing** + - [ ] Mouse wheel zoom in/out + - [ ] Space+scroll zoom + - [ ] Trackpad pinch gesture (spread = zoom in, pinch = zoom out) + - [ ] Touch screen pinch gesture + - [ ] UI zoom buttons + - [ ] Zoom focal point stays on cursor position + - [ ] Dynamic zoom limits prevent empty space + +2. **Pan Testing** + - [x] Two-finger pan on trackpad/touch + - [x] Diagonal panning works (not axis-locked) + - [x] Spacebar+click pan on desktop + - [x] Momentum scrolling with edge bounce + - [x] No lag when switching between pan and zoom + +3. **UI/UX Testing** + - [ ] Minimap auto-shows on navigation + - [ ] Minimap fades after 2 seconds + - [ ] No scrollbars visible on canvas + - [ ] No pinch-zoom on UI elements + - [ ] Gesture state cleanup on cursor exit + +4. **Browser Zoom Testing** + - [ ] Test at 100% browser zoom + - [ ] Test at 125% browser zoom + - [ ] Test at 150% browser zoom + - [ ] Test at 200% browser zoom + - [ ] Verify all interactions work at each zoom level + +## Files Modified + +Key files involved in canvas interaction improvements: + +- `packages/node_modules/@node-red/editor-client/src/js/ui/view.js` - Main view controller +- `packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-animator.js` - Zoom animations +- `packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js` - Zoom configuration +- `packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js` - Minimap controller +- `packages/node_modules/@node-red/editor-client/src/sass/workspace.scss` - Canvas styling +- `packages/node_modules/@node-red/editor-client/src/sass/base.scss` - Base UI styling +- `Gruntfile.js` - Build configuration + +## Commit History + +Interaction improvements span commits from e7a028b to present (12 commits total): + +1. `e7a028b` - feat: Add enhanced zoom and scroll features +2. `bdfa06b` - Implement smooth zoom functionality with pinch-to-zoom support +3. `37f9786` - Fix trackpad zoom direction - spreading fingers now zooms in +4. `e42b09d` - Fix zoom focal point stability at canvas edges +5. `a12b65b` - Improve zoom smoothness and control +6. `feec7ec` - Add two-finger panning and spacebar+click panning +7. `e0c5b84` - Prevent UI pinch-to-zoom while keeping canvas zoomable +8. `121982e` - Fix zoom gesture detection after two-finger panning +9. `7918693` - Implement dynamic zoom limits to match canvas boundaries +10. `f13ed66` - Add dynamic minimum zoom recalculation on viewport resize +11. `53dce6a` - Hide scrollbars and add auto-show/hide minimap on navigation +12. (current) - Enable diagonal trackpad panning by preventing axis-locked scroll \ No newline at end of file diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 3f322cf0d4..4c07335ac4 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -862,7 +862,18 @@ RED.view = (function() { } } } else { - // Regular scroll - track velocity and apply momentum + // Regular scroll - prevent default and manually handle both axes + evt.preventDefault(); + evt.stopPropagation(); + + // Apply scroll deltas directly to both axes + var deltaX = evt.originalEvent.deltaX; + var deltaY = evt.originalEvent.deltaY; + + chart.scrollLeft(chart.scrollLeft() + deltaX); + chart.scrollTop(chart.scrollTop() + deltaY); + + // Track velocity and apply momentum handleScroll(); // Cancel previous momentum timer diff --git a/packages/node_modules/@node-red/editor-client/src/sass/base.scss b/packages/node_modules/@node-red/editor-client/src/sass/base.scss index fecedf8839..23aba42054 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/base.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/base.scss @@ -19,7 +19,7 @@ html, body { overflow: hidden; - touch-action: pan-x pan-y; + touch-action: manipulation; } .red-ui-editor { @@ -30,7 +30,7 @@ html, body { background: var(--red-ui-primary-background); color: var(--red-ui-primary-text-color); line-height: 20px; - touch-action: pan-x pan-y; + touch-action: manipulation; } #red-ui-editor { From 3bef2d6481d42d1c84ac01ed63089badb41745f7 Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 12:39:11 +0200 Subject: [PATCH 023/160] Improve minimap auto-show behavior - Remove view:selection-changed listener to prevent minimap showing on node selection - Remove view:navigate emissions from pan mode entry points (no longer shows when starting pan) - Add view:navigate emission to touchpad scroll handler for consistent behavior - Minimap now only appears during actual panning and zooming actions The minimap previously showed when selecting nodes or just starting a pan gesture, causing unnecessary flashing. Now it only appears during actual navigation (pan/zoom) and fades after 2 seconds of inactivity. --- CANVAS_INTERACTION.md | 34 ++++++++++++++----- .../editor-client/src/js/ui/view-navigator.js | 4 +-- .../@node-red/editor-client/src/js/ui/view.js | 6 ++-- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/CANVAS_INTERACTION.md b/CANVAS_INTERACTION.md index dc9ed398c7..918c15d0dd 100644 --- a/CANVAS_INTERACTION.md +++ b/CANVAS_INTERACTION.md @@ -119,7 +119,23 @@ Improve canvas interaction to work consistently and intuitively across: ## Recent Fixes -### Diagonal Trackpad Panning (Latest) +### Minimap Auto-Show Behavior (Latest) +**Issue**: Minimap was showing on selection changes and when entering pan mode (before actual panning), causing unnecessary flashing. + +**Solution**: +- Removed `view:selection-changed` event listener - minimap no longer shows when selecting nodes +- Removed `view:navigate` emissions from pan mode entry points (touch long-press, spacebar+click, middle-click) +- Added `view:navigate` emission to regular touchpad scroll handler for consistent behavior +- Kept emissions only during actual panning movement and zooming + +**Files Changed**: +- `view-navigator.js:195-198` - Removed selection-changed listener +- `view.js:483, 1529, 1539` - Removed navigate events from pan mode entry +- `view.js:876` - Added navigate event to touchpad scroll handler + +**Result**: Minimap now appears only during actual panning (touchpad or mouse) and zooming, not on selection or pan mode entry. + +### Diagonal Trackpad Panning **Issue**: Trackpad scrolling was restricted to horizontal OR vertical movement, not both simultaneously. **Root Cause**: Browser's native scroll behavior on `overflow: auto` containers locks into one axis at a time, even before JavaScript wheel events fire. @@ -178,11 +194,12 @@ When verifying canvas interaction improvements: - [x] No lag when switching between pan and zoom 3. **UI/UX Testing** - - [ ] Minimap auto-shows on navigation - - [ ] Minimap fades after 2 seconds - - [ ] No scrollbars visible on canvas - - [ ] No pinch-zoom on UI elements - - [ ] Gesture state cleanup on cursor exit + - [x] Minimap auto-shows during panning and zooming + - [x] Minimap does not show on selection changes + - [x] Minimap fades after 2 seconds + - [x] No scrollbars visible on canvas + - [x] No pinch-zoom on UI elements + - [x] Gesture state cleanup on cursor exit 4. **Browser Zoom Testing** - [ ] Test at 100% browser zoom @@ -205,7 +222,7 @@ Key files involved in canvas interaction improvements: ## Commit History -Interaction improvements span commits from e7a028b to present (12 commits total): +Interaction improvements span commits from e7a028b to present (13 commits total): 1. `e7a028b` - feat: Add enhanced zoom and scroll features 2. `bdfa06b` - Implement smooth zoom functionality with pinch-to-zoom support @@ -218,4 +235,5 @@ Interaction improvements span commits from e7a028b to present (12 commits total) 9. `7918693` - Implement dynamic zoom limits to match canvas boundaries 10. `f13ed66` - Add dynamic minimum zoom recalculation on viewport resize 11. `53dce6a` - Hide scrollbars and add auto-show/hide minimap on navigation -12. (current) - Enable diagonal trackpad panning by preventing axis-locked scroll \ No newline at end of file +12. `875db2c` - Enable diagonal trackpad panning by preventing axis-locked scroll +13. (current) - Improve minimap auto-show behavior to only trigger during actual navigation \ No newline at end of file diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js index 9042657289..c69c8337f7 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js @@ -192,9 +192,7 @@ RED.popover.tooltip($("#red-ui-view-navigate"),RED._('actions.toggle-navigator'),'core:toggle-navigator'); // Listen for canvas interactions to show minimap temporarily - RED.events.on("view:selection-changed", function() { - showTemporary(); - }); + // Only show on actual pan/zoom navigation, not selection changes RED.events.on("view:navigate", function() { showTemporary(); }); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 4c07335ac4..af555da74d 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -480,7 +480,6 @@ RED.view = (function() { mouse_mode = RED.state.PANNING; mouse_position = [touch0.pageX,touch0.pageY] scroll_position = [chart.scrollLeft(),chart.scrollTop()]; - RED.events.emit("view:navigate"); } } @@ -873,6 +872,9 @@ RED.view = (function() { chart.scrollLeft(chart.scrollLeft() + deltaX); chart.scrollTop(chart.scrollTop() + deltaY); + // Emit navigate event for minimap + RED.events.emit("view:navigate"); + // Track velocity and apply momentum handleScroll(); @@ -1527,7 +1529,6 @@ RED.view = (function() { mouse_mode = RED.state.PANNING; mouse_position = [d3.event.pageX,d3.event.pageY] scroll_position = [chart.scrollLeft(),chart.scrollTop()]; - RED.events.emit("view:navigate"); return; } @@ -1537,7 +1538,6 @@ RED.view = (function() { mouse_mode = RED.state.PANNING; mouse_position = [d3.event.pageX,d3.event.pageY] scroll_position = [chart.scrollLeft(),chart.scrollTop()]; - RED.events.emit("view:navigate"); return; } if (d3.event.button === 2) { From 45f3b01125ff56de9442d53435db944d0c820b94 Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 12:43:44 +0200 Subject: [PATCH 024/160] Fix spacebar hold causing unwanted canvas scrolling When holding spacebar, browsers fire repeated keydown events. The previous implementation only prevented default on the first keydown, allowing subsequent events to trigger browser's space-scroll behavior. Moved preventDefault() outside conditional to block all spacebar events. --- .../@node-red/editor-client/src/js/ui/view.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index af555da74d..a0dcfcd1ff 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -608,15 +608,14 @@ RED.view = (function() { // Handle spacebar for zoom mode function handleSpacebarToggle(e) { if (e.keyCode === 32 || e.key === ' ') { + // Always prevent default space scrolling behavior + e.preventDefault(); + e.stopPropagation(); + if (e.type === "keydown" && !spacebarPressed) { spacebarPressed = true; - // Prevent default space scrolling behavior - e.preventDefault(); - e.stopPropagation(); } else if (e.type === "keyup" && spacebarPressed) { spacebarPressed = false; - e.preventDefault(); - e.stopPropagation(); } } } From c07cce4fb0e619f82f649d9ab1725e0c02fbbfc9 Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 12:47:10 +0200 Subject: [PATCH 025/160] Make Alt/Space scroll zoom speed match trackpad pinch zoom Alt+scroll and Space+scroll were using fixed zoom steps (0.06/0.08), making them zoom much faster than trackpad pinch zoom which uses proportional scaling (0.005 * delta). Changed to use trackpad-style proportional zoom for consistent feel across all zoom input methods. --- .../@node-red/editor-client/src/js/ui/view.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index a0dcfcd1ff..2b7c48965a 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -849,11 +849,12 @@ RED.view = (function() { }, gestureEndThreshold); // Use 500ms timeout for gesture end detection } else { // Regular Alt+scroll or Space+scroll - use smooth zoom without animation - // Use the zoom animator's delta calculation for mouse wheel - var scaleDelta = RED.view.zoomAnimator.calculateZoomDelta(scaleFactor, -delta, false); - var newScale = Math.min(RED.view.zoomConstants.MAX_ZOOM, - Math.max(RED.view.zoomConstants.MIN_ZOOM, scaleFactor + scaleDelta)); - + // Use same proportional zoom as trackpad for consistent feel + var scaleDelta = RED.view.zoomAnimator.calculateZoomDelta(scaleFactor, -delta, true); + var minZoom = calculateMinZoom(); + var newScale = Math.min(RED.view.zoomConstants.MAX_ZOOM, + Math.max(minZoom, scaleFactor + scaleDelta)); + // Only zoom if scale is actually changing if (Math.abs(scaleFactor - newScale) >= 0.001) { zoomView(newScale, cursorPos); // Direct call, no animation for smoother feel From f132867a3130402ad5d70a799293526985562fe0 Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 12:48:58 +0200 Subject: [PATCH 026/160] Add stable focal point tracking to Alt/Space scroll zoom Alt+scroll and Space+scroll zoom now maintain a fixed focal point like trackpad pinch zoom. Previously, the zoom point would drift during continuous scrolling. Implemented gesture session tracking that: - Stores focal point in workspace coordinates for stability - Locks focal point during continuous scroll events (< 100ms apart) - Ends gesture after 500ms of inactivity - Converts focal point back to screen coordinates for each zoom step This makes all zoom methods (pinch, Alt+scroll, Space+scroll) behave consistently with stable, cursor-centered zooming. --- .../@node-red/editor-client/src/js/ui/view.js | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 2b7c48965a..3e5a8e0409 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -855,10 +855,41 @@ RED.view = (function() { var newScale = Math.min(RED.view.zoomConstants.MAX_ZOOM, Math.max(minZoom, scaleFactor + scaleDelta)); + // Use gesture tracking for stable focal point like trackpad pinch + if (!RED.view.zoomAnimator.isGestureActive() || timeSinceLastEvent > gestureEndThreshold) { + // Start new gesture session - store focal point in workspace coordinates + var scrollPos = [chart.scrollLeft(), chart.scrollTop()]; + RED.view.zoomAnimator.startGesture(cursorPos, scaleFactor, scrollPos, scaleFactor); + } else if (timeSinceLastEvent <= wheelEventContinuityThreshold) { + // Events are continuous - same gesture, focal point remains locked + } + + // Update gesture with new scale, maintaining locked focal point + RED.view.zoomAnimator.updateGesture(newScale); + // Only zoom if scale is actually changing if (Math.abs(scaleFactor - newScale) >= 0.001) { - zoomView(newScale, cursorPos); // Direct call, no animation for smoother feel + // Get focal point converted back to current screen coordinates + var currentScrollPos = [chart.scrollLeft(), chart.scrollTop()]; + var focalPoint = RED.view.zoomAnimator.getGestureFocalPoint(currentScrollPos, scaleFactor); + zoomView(newScale, focalPoint); } + + // Update last event time for continuity tracking + lastWheelEventTime = currentTime; + + // Reset gesture timeout + if (trackpadGestureTimer) { + clearTimeout(trackpadGestureTimer); + } + trackpadGestureTimer = setTimeout(function() { + RED.view.zoomAnimator.endGesture(); + trackpadGestureTimer = null; + // Store zoom level when gesture completes + if (RED.settings.get("editor.view.view-store-zoom")) { + RED.settings.setLocal('zoom-level', scaleFactor.toFixed(1)); + } + }, gestureEndThreshold); } } else { // Regular scroll - prevent default and manually handle both axes From cdde99b9ab6de892f7e077669a78d30c62273244 Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 13:11:02 +0200 Subject: [PATCH 027/160] Add scroll spacer to fix scrollable area at minimum zoom When at minimum zoom with "cover" behavior, the SVG canvas may be smaller than the viewport in one dimension. This causes the browser's scrollWidth/scrollHeight to be limited by the SVG size rather than the full canvas extent. Added an invisible spacer div that matches the scaled canvas dimensions, ensuring the scrollable area always reflects the actual canvas size. This allows proper scrolling to reach all canvas edges without going beyond canvas boundaries. --- .../@node-red/editor-client/src/js/ui/view.js | 33 +++++++++++++++++-- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 3e5a8e0409..5b9843ae19 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -336,6 +336,24 @@ RED.view = (function() { function init() { chart = $("#red-ui-workspace-chart"); + + // Add invisible spacer div to ensure scrollable area matches canvas dimensions + // At minimum zoom with "cover" behavior, SVG may be smaller than viewport in one dimension + // This spacer forces the browser to calculate scrollWidth/Height based on full canvas size + // Browser's maxScroll = scrollWidth - viewport will then correctly show canvas edges + var scrollSpacer = $('
') + .css({ + position: 'absolute', + top: 0, + left: 0, + width: space_width + 'px', + height: space_height + 'px', + pointerEvents: 'none', + visibility: 'hidden' + }) + .attr('id', 'red-ui-workspace-scroll-spacer') + .appendTo(chart); + chart.on('contextmenu', function(evt) { if (RED.view.DEBUG) { console.warn("contextmenu", { mouse_mode, event: d3.event }); @@ -2810,14 +2828,14 @@ RED.view = (function() { // Calculate the minimum zoom to ensure canvas always fills the viewport (no empty space) var viewportWidth = chart.width(); var viewportHeight = chart.height(); - + // Canvas is 8000x8000, calculate zoom to cover viewport var zoomToFitWidth = viewportWidth / space_width; var zoomToFitHeight = viewportHeight / space_height; - + // Use the LARGER zoom to ensure canvas covers entire viewport (no empty space visible) var calculatedMinZoom = Math.max(zoomToFitWidth, zoomToFitHeight); - + // Return the larger of the calculated min or the configured min // This ensures canvas always fills the viewport return Math.max(calculatedMinZoom, RED.view.zoomConstants.MIN_ZOOM); @@ -4969,6 +4987,15 @@ RED.view = (function() { eventLayer.attr("transform","scale("+scaleFactor+")"); outer.attr("width", space_width*scaleFactor).attr("height", space_height*scaleFactor); + // Update scroll spacer to match scaled canvas size + // This ensures scrollable area = canvas area + // Browser calculates maxScroll = scrollWidth - viewport, which correctly + // allows scrolling to see the far edges of canvas without going beyond + $('#red-ui-workspace-scroll-spacer').css({ + width: (space_width * scaleFactor) + 'px', + height: (space_height * scaleFactor) + 'px' + }); + // Don't bother redrawing nodes if we're drawing links if (showAllLinkPorts !== -1 || mouse_mode != RED.state.JOINING) { From f718069b46f0aabd9f80f6a2f0a866c834c908a2 Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 13:15:05 +0200 Subject: [PATCH 028/160] Fix minimap viewport position at non-1.0 zoom levels The minimap was treating scroll position as workspace coordinates, but scrollLeft/scrollTop are actually in scaled canvas pixels. At zoom levels other than 1.0, this caused the viewport rectangle to appear in the wrong position. For example, at 2x zoom viewing workspace position (500, 500), the scroll position would be 1000px, and the minimap would incorrectly show it at workspace position 1000. Fixed by converting scroll position to workspace coordinates first: position = scrollPos / scaleFactor / nav_scale The viewport rectangle now accurately reflects the actual visible area at all zoom levels. --- .../@node-red/editor-client/src/js/ui/view-navigator.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js index c69c8337f7..5b1eb89255 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js @@ -61,8 +61,11 @@ scaleFactor = RED.view.scale(); chartSize = [ $("#red-ui-workspace-chart").width(), $("#red-ui-workspace-chart").height()]; scrollPos = [$("#red-ui-workspace-chart").scrollLeft(),$("#red-ui-workspace-chart").scrollTop()]; - navBorder.attr('x',scrollPos[0]/nav_scale) - .attr('y',scrollPos[1]/nav_scale) + + // Convert scroll position (in scaled pixels) to workspace coordinates, then to minimap coordinates + // scrollPos is in scaled canvas pixels, divide by scaleFactor to get workspace coords + navBorder.attr('x',scrollPos[0]/scaleFactor/nav_scale) + .attr('y',scrollPos[1]/scaleFactor/nav_scale) .attr('width',chartSize[0]/nav_scale/scaleFactor) .attr('height',chartSize[1]/nav_scale/scaleFactor) } From 48b6fb353dc5203b7ad883d9092f4de9519f2478 Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 13:21:58 +0200 Subject: [PATCH 029/160] Fix grey padding at canvas bottom by resetting SVG margins Remove 5px grey space that appeared at bottom of canvas when scrolled to maximum position. The viewport scrollHeight was 8005px instead of 8000px due to default browser SVG margins. - Add explicit padding and margin resets to workspace chart container - Set SVG to display:block with zero margin/padding to prevent spacing - Ensures scrollable area exactly matches 8000px canvas dimensions --- CANVAS_INTERACTION.md | 16 +++++++++++++++- .../editor-client/src/sass/workspace.scss | 13 +++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/CANVAS_INTERACTION.md b/CANVAS_INTERACTION.md index 918c15d0dd..b9d6619da4 100644 --- a/CANVAS_INTERACTION.md +++ b/CANVAS_INTERACTION.md @@ -119,7 +119,21 @@ Improve canvas interaction to work consistently and intuitively across: ## Recent Fixes -### Minimap Auto-Show Behavior (Latest) +### Spacebar Hold Scrolling Bug (Latest) +**Issue**: When holding spacebar down, the canvas would move down unexpectedly, making the space+scroll interaction buggy. + +**Root Cause**: The `preventDefault()` was only called on the first spacebar keydown event. When spacebar is held, browsers fire repeated keydown events. After the first keydown set `spacebarPressed = true`, subsequent keydown events weren't prevented because the condition `e.type === "keydown" && !spacebarPressed` failed, allowing browser's default space-scroll behavior. + +**Solution**: +- Moved `preventDefault()` and `stopPropagation()` outside the conditional checks +- Now blocks ALL spacebar events (both keydown repeats and keyup), not just the first keydown + +**Files Changed**: +- `view.js:611-619` - Restructured spacebar event handler to always prevent default + +**Result**: Holding spacebar no longer causes unwanted canvas scrolling. + +### Minimap Auto-Show Behavior **Issue**: Minimap was showing on selection changes and when entering pan mode (before actual panning), causing unnecessary flashing. **Solution**: diff --git a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss index 46be67158f..a29932e9df 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss @@ -38,7 +38,9 @@ box-sizing:border-box; transition: right 0.2s ease; touch-action: none; - + padding: 0; + margin: 0; + // Hide scrollbars scrollbar-width: none; /* Firefox */ -ms-overflow-style: none; /* Internet Explorer 10+ */ @@ -46,7 +48,14 @@ width: 0; height: 0; } - + + // Reset SVG default margins + > svg { + display: block; + margin: 0; + padding: 0; + } + &:focus { outline: none; } From c5209d8ea297b94688626552cbd310b08b39d2d7 Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 13:32:18 +0200 Subject: [PATCH 030/160] Add zoom-to-fit button to show all nodes at once Add fourth zoom button that calculates bounding box of all active nodes and zooms out to fit them all in viewport with padding. - Add compress icon button to zoom controls in footer - Implement zoomToFitAll() function with bounding box calculation - Add 80px padding around nodes for visual breathing room - Respect dynamic minimum zoom limit - Center viewport on bounding box after zoom animation - Register core:zoom-fit action for keyboard shortcut support - Update documentation with new zoom-to-fit feature --- CANVAS_INTERACTION.md | 37 +++++++--- .../@node-red/editor-client/src/js/ui/view.js | 72 +++++++++++++++++++ 2 files changed, 101 insertions(+), 8 deletions(-) diff --git a/CANVAS_INTERACTION.md b/CANVAS_INTERACTION.md index b9d6619da4..16261b2c60 100644 --- a/CANVAS_INTERACTION.md +++ b/CANVAS_INTERACTION.md @@ -23,10 +23,14 @@ Improve canvas interaction to work consistently and intuitively across: #### Zoom Input Methods (commits: e7a028b, bdfa06b) - ✅ Mouse wheel zoom -- ✅ Space+scroll zoom mode (alternative to Alt+scroll) -- ✅ Trackpad pinch-to-zoom (Ctrl+wheel) -- ✅ Touch screen pinch-to-zoom with proper center tracking +- ✅ Alt+scroll zoom mode (keyboard modifier alternative) +- ✅ Space+scroll zoom mode (keyboard modifier alternative) +- ✅ Trackpad pinch-to-zoom (browsers translate to Ctrl+wheel events) +- ✅ Touch screen pinch-to-zoom with proper center tracking (direct touch events) - ✅ UI zoom buttons (corrected zoom in/out direction) +- ✅ Zoom-to-fit button (zooms out to show all nodes with padding, respects minimum zoom) + +**Note**: Ctrl+wheel is used for trackpad pinch gestures on desktop. Browsers automatically translate two-finger pinch gestures on trackpads into Ctrl+wheel events. This is separate from touchscreen pinch-to-zoom, which uses direct touch events (touchstart/touchmove/touchend). #### Zoom Focal Point (commits: e42b09de, feec7ec, e7a028b) - ✅ Cursor-centered zoom (focuses on cursor position) @@ -119,7 +123,22 @@ Improve canvas interaction to work consistently and intuitively across: ## Recent Fixes -### Spacebar Hold Scrolling Bug (Latest) +### Grey Padding at Canvas Bottom (Latest) +**Issue**: When scrolled to the bottom of the canvas, 5 pixels of grey space appeared below the grid, allowing users to scroll slightly beyond the canvas boundary. + +**Root Cause**: Default browser margins on SVG elements caused the viewport's `scrollHeight` to be 8005px instead of 8000px, creating extra scrollable area beyond the canvas. + +**Solution**: +- Added explicit `padding: 0` and `margin: 0` to `#red-ui-workspace-chart` container +- Added `display: block`, `margin: 0`, and `padding: 0` to SVG element via `#red-ui-workspace-chart > svg` selector +- The `display: block` prevents inline element spacing issues + +**Files Changed**: +- `workspace.scss:41-42, 52-57` - Added margin/padding resets for container and SVG + +**Result**: Canvas now has exact 8000px scrollable area with no grey padding visible at bottom. + +### Spacebar Hold Scrolling Bug **Issue**: When holding spacebar down, the canvas would move down unexpectedly, making the space+scroll interaction buggy. **Root Cause**: The `preventDefault()` was only called on the first spacebar keydown event. When spacebar is held, browsers fire repeated keydown events. After the first keydown set `spacebarPressed = true`, subsequent keydown events weren't prevented because the condition `e.type === "keydown" && !spacebarPressed` failed, allowing browser's default space-scroll behavior. @@ -193,10 +212,12 @@ When verifying canvas interaction improvements: 1. **Zoom Testing** - [ ] Mouse wheel zoom in/out - - [ ] Space+scroll zoom - - [ ] Trackpad pinch gesture (spread = zoom in, pinch = zoom out) - - [ ] Touch screen pinch gesture - - [ ] UI zoom buttons + - [ ] Alt+scroll zoom (keyboard modifier) + - [ ] Space+scroll zoom (keyboard modifier) + - [ ] Trackpad pinch gesture (spread = zoom in, pinch = zoom out, generates Ctrl+wheel) + - [ ] Touch screen pinch gesture (direct touch events) + - [ ] UI zoom buttons (zoom in, zoom out, reset) + - [ ] Zoom-to-fit button (shows all nodes with padding, respects min zoom) - [ ] Zoom focal point stays on cursor position - [ ] Dynamic zoom limits prevent empty space diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 5b9843ae19..312193a1e8 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -759,6 +759,7 @@ RED.view = (function() { ''+ ''+ ''+ + ''+ '') }) @@ -768,6 +769,8 @@ RED.view = (function() { RED.popover.tooltip($("#red-ui-view-zoom-zero"),RED._('actions.zoom-reset'),'core:zoom-reset'); $("#red-ui-view-zoom-in").on("click", zoomOut); RED.popover.tooltip($("#red-ui-view-zoom-in"),RED._('actions.zoom-in'),'core:zoom-in'); + $("#red-ui-view-zoom-fit").on("click", zoomToFitAll); + RED.popover.tooltip($("#red-ui-view-zoom-fit"),RED._('actions.zoom-fit'),'core:zoom-fit'); // Legacy mouse wheel handler - disabled in favor of modern wheel event // chart.on("DOMMouseScroll mousewheel", function (evt) { // if ( evt.altKey || spacebarPressed ) { @@ -1176,6 +1179,7 @@ RED.view = (function() { RED.actions.add("core:zoom-in",zoomIn); RED.actions.add("core:zoom-out",zoomOut); RED.actions.add("core:zoom-reset",zoomZero); + RED.actions.add("core:zoom-fit",zoomToFitAll); RED.actions.add("core:enable-selected-nodes", function() { setSelectedNodeState(false)}); RED.actions.add("core:disable-selected-nodes", function() { setSelectedNodeState(true)}); @@ -2853,6 +2857,74 @@ RED.view = (function() { } } function zoomZero() { animatedZoomView(1); } + + function zoomToFitAll() { + // Get all nodes in active workspace + if (!activeNodes || activeNodes.length === 0) { + return; // No nodes to fit + } + + // Calculate bounding box of all nodes + var minX = Infinity, minY = Infinity; + var maxX = -Infinity, maxY = -Infinity; + + activeNodes.forEach(function(node) { + var nodeLeft = node.x - node.w / 2; + var nodeRight = node.x + node.w / 2; + var nodeTop = node.y - node.h / 2; + var nodeBottom = node.y + node.h / 2; + + minX = Math.min(minX, nodeLeft); + maxX = Math.max(maxX, nodeRight); + minY = Math.min(minY, nodeTop); + maxY = Math.max(maxY, nodeBottom); + }); + + // Add padding around nodes for visual breathing room + var padding = 80; + minX -= padding; + minY -= padding; + maxX += padding; + maxY += padding; + + // Calculate dimensions of bounding box + var boundingWidth = maxX - minX; + var boundingHeight = maxY - minY; + + // Get viewport dimensions + var viewportWidth = chart.width(); + var viewportHeight = chart.height(); + + // Calculate zoom level that fits bounding box in viewport + var zoomX = viewportWidth / boundingWidth; + var zoomY = viewportHeight / boundingHeight; + var targetZoom = Math.min(zoomX, zoomY); + + // Respect minimum and maximum zoom limits + var minZoom = calculateMinZoom(); + targetZoom = Math.max(minZoom, Math.min(RED.view.zoomConstants.MAX_ZOOM, targetZoom)); + + // Calculate center point of bounding box as focal point + var centerX = (minX + maxX) / 2; + var centerY = (minY + maxY) / 2; + + // Convert to screen coordinates for focal point + // We want to center the bounding box in the viewport + var focalPoint = [viewportWidth / 2, viewportHeight / 2]; + + // First zoom to target level + animatedZoomView(targetZoom, focalPoint); + + // Then scroll to center the bounding box + // Wait for zoom animation to complete before scrolling + setTimeout(function() { + var scrollLeft = centerX * targetZoom - viewportWidth / 2; + var scrollTop = centerY * targetZoom - viewportHeight / 2; + chart.scrollLeft(scrollLeft); + chart.scrollTop(scrollTop); + }, RED.view.zoomConstants.DEFAULT_ZOOM_DURATION + 50); + } + function searchFlows() { RED.actions.invoke("core:search", $(this).data("term")); } function searchPrev() { RED.actions.invoke("core:search-previous"); } function searchNext() { RED.actions.invoke("core:search-next"); } From e2a6a1b52d553201d04ab38f4730c69a9c6f69ec Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 13:33:37 +0200 Subject: [PATCH 031/160] Fix zoom button handlers - zoom in/out were reversed --- .../node_modules/@node-red/editor-client/src/js/ui/view.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 312193a1e8..607a676819 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -763,11 +763,11 @@ RED.view = (function() { '') }) - $("#red-ui-view-zoom-out").on("click", zoomIn); + $("#red-ui-view-zoom-out").on("click", zoomOut); RED.popover.tooltip($("#red-ui-view-zoom-out"),RED._('actions.zoom-out'),'core:zoom-out'); $("#red-ui-view-zoom-zero").on("click", zoomZero); RED.popover.tooltip($("#red-ui-view-zoom-zero"),RED._('actions.zoom-reset'),'core:zoom-reset'); - $("#red-ui-view-zoom-in").on("click", zoomOut); + $("#red-ui-view-zoom-in").on("click", zoomIn); RED.popover.tooltip($("#red-ui-view-zoom-in"),RED._('actions.zoom-in'),'core:zoom-in'); $("#red-ui-view-zoom-fit").on("click", zoomToFitAll); RED.popover.tooltip($("#red-ui-view-zoom-fit"),RED._('actions.zoom-fit'),'core:zoom-fit'); From 269cab2e9c16c4e0b12dbbf6cfd5fe4b947bb2f4 Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 13:35:09 +0200 Subject: [PATCH 032/160] Move zoom-to-fit button between reset and zoom-in --- packages/node_modules/@node-red/editor-client/src/js/ui/view.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 607a676819..8161f5f9a7 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -758,8 +758,8 @@ RED.view = (function() { element: $(''+ ''+ ''+ - ''+ ''+ + ''+ '') }) From f6decfd58991645885efe12b72e399ee6e07fa7c Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 13:36:34 +0200 Subject: [PATCH 033/160] Revert "Move zoom-to-fit button between reset and zoom-in" This reverts commit e46cfc9479b2db429d4f73c981e1886b6c0cbbca. --- packages/node_modules/@node-red/editor-client/src/js/ui/view.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 8161f5f9a7..607a676819 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -758,8 +758,8 @@ RED.view = (function() { element: $(''+ ''+ ''+ - ''+ ''+ + ''+ '') }) From f74beb6a924f39d01f7b1b497bdfaf42429b5c98 Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 13:39:52 +0200 Subject: [PATCH 034/160] Add Ctrl+1/Cmd+1 keyboard shortcut for zoom-to-fit --- .../node_modules/@node-red/editor-client/src/js/keymap.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/keymap.json b/packages/node_modules/@node-red/editor-client/src/js/keymap.json index 4cf28d2279..697205f3aa 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/keymap.json +++ b/packages/node_modules/@node-red/editor-client/src/js/keymap.json @@ -91,7 +91,8 @@ "alt-shift-w": "core:show-last-hidden-flow", "ctrl-+": "core:zoom-in", "ctrl--": "core:zoom-out", - "ctrl-0": "core:zoom-reset" + "ctrl-0": "core:zoom-reset", + "ctrl-1": "core:zoom-fit" }, "red-ui-editor-stack": { "ctrl-enter": "core:confirm-edit-tray", From 8286ec81316894e81613e549ff561a21ebcff2f5 Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 13:43:36 +0200 Subject: [PATCH 035/160] Remove animation from zoom buttons for instant, smooth zooming Replace animatedZoomView() with direct zoomView() calls for zoom buttons and keyboard shortcuts to eliminate jagged animation caused by redraw() being called on every frame. - Change zoomIn/zoomOut/zoomZero to use instant zoom like trackpad - Single redraw per zoom step instead of 8-10 redraws during animation - Makes all zoom methods (buttons, keyboard, trackpad) feel consistent - Keep animatedZoomView() only for zoomToFitAll() where animation helps Fixes stuttering when zooming with buttons or Ctrl+/-/0 shortcuts. --- .../node_modules/@node-red/editor-client/src/js/ui/view.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 607a676819..e71993663d 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -2847,16 +2847,16 @@ RED.view = (function() { function zoomIn(focalPoint) { if (scaleFactor < RED.view.zoomConstants.MAX_ZOOM) { - animatedZoomView(scaleFactor + RED.view.zoomConstants.ZOOM_STEP, focalPoint); + zoomView(scaleFactor + RED.view.zoomConstants.ZOOM_STEP, focalPoint); } } function zoomOut(focalPoint) { var minZoom = calculateMinZoom(); if (scaleFactor > minZoom) { - animatedZoomView(Math.max(scaleFactor - RED.view.zoomConstants.ZOOM_STEP, minZoom), focalPoint); + zoomView(Math.max(scaleFactor - RED.view.zoomConstants.ZOOM_STEP, minZoom), focalPoint); } } - function zoomZero() { animatedZoomView(1); } + function zoomZero() { zoomView(1); } function zoomToFitAll() { // Get all nodes in active workspace From a1854806afd728f7103844994b774828bae7dac5 Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 13:45:40 +0200 Subject: [PATCH 036/160] Fix viewport drift when using zoom buttons without focal point --- .../@node-red/editor-client/src/js/ui/view.js | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index e71993663d..ac7992f0ab 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -2940,32 +2940,30 @@ RED.view = (function() { var screenSize = [chart.width(),chart.height()]; var scrollPos = [chart.scrollLeft(),chart.scrollTop()]; - // Use focal point if provided (e.g., cursor position), otherwise use viewport center + // Calculate workspace coordinates of the point that should remain fixed var center; if (focalPoint) { // focalPoint is in screen coordinates, convert to workspace coordinates center = [(scrollPos[0] + focalPoint[0])/scaleFactor, (scrollPos[1] + focalPoint[1])/scaleFactor]; } else { - // Default to viewport center - center = [(scrollPos[0] + screenSize[0]/2)/scaleFactor,(scrollPos[1] + screenSize[1]/2)/scaleFactor]; + // Default to viewport center in workspace coordinates + center = [(scrollPos[0] + screenSize[0]/2)/scaleFactor, (scrollPos[1] + screenSize[1]/2)/scaleFactor]; } var oldScaleFactor = scaleFactor; scaleFactor = factor; - // Calculate where the focal point will be after zoom - var newCenter; + // Calculate new scroll position to keep the center point at the same screen position if (focalPoint) { // Keep the focal point at the same screen position - newCenter = [(scrollPos[0] + focalPoint[0])/scaleFactor, (scrollPos[1] + focalPoint[1])/scaleFactor]; + chart.scrollLeft(center[0] * scaleFactor - focalPoint[0]); + chart.scrollTop(center[1] * scaleFactor - focalPoint[1]); } else { - newCenter = [(scrollPos[0] + screenSize[0]/2)/scaleFactor,(scrollPos[1] + screenSize[1]/2)/scaleFactor]; + // Keep viewport center on the same workspace coordinates + chart.scrollLeft(center[0] * scaleFactor - screenSize[0]/2); + chart.scrollTop(center[1] * scaleFactor - screenSize[1]/2); } - var delta = [(newCenter[0]-center[0])*scaleFactor,(newCenter[1]-center[1])*scaleFactor] - chart.scrollLeft(scrollPos[0]-delta[0]); - chart.scrollTop(scrollPos[1]-delta[1]); - RED.view.navigator.resize(); redraw(); RED.events.emit("view:navigate"); From 324ca525160f81660c6892803d5f5a04a4f7e1a1 Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 13:46:44 +0200 Subject: [PATCH 037/160] Fix zoom center calculation to use oldScaleFactor consistently --- .../node_modules/@node-red/editor-client/src/js/ui/view.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index ac7992f0ab..6589522a04 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -2939,18 +2939,18 @@ RED.view = (function() { var screenSize = [chart.width(),chart.height()]; var scrollPos = [chart.scrollLeft(),chart.scrollTop()]; + var oldScaleFactor = scaleFactor; // Calculate workspace coordinates of the point that should remain fixed var center; if (focalPoint) { // focalPoint is in screen coordinates, convert to workspace coordinates - center = [(scrollPos[0] + focalPoint[0])/scaleFactor, (scrollPos[1] + focalPoint[1])/scaleFactor]; + center = [(scrollPos[0] + focalPoint[0])/oldScaleFactor, (scrollPos[1] + focalPoint[1])/oldScaleFactor]; } else { // Default to viewport center in workspace coordinates - center = [(scrollPos[0] + screenSize[0]/2)/scaleFactor, (scrollPos[1] + screenSize[1]/2)/scaleFactor]; + center = [(scrollPos[0] + screenSize[0]/2)/oldScaleFactor, (scrollPos[1] + screenSize[1]/2)/oldScaleFactor]; } - var oldScaleFactor = scaleFactor; scaleFactor = factor; // Calculate new scroll position to keep the center point at the same screen position From 95b750060f03c970a41da4b03e3627647a3742d4 Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 14:12:51 +0200 Subject: [PATCH 038/160] Fix zoom button animation and improve performance - Fixed viewport jump to 0,0 by preventing click event from being passed as focal point - Added smooth animation to zoom buttons and keyboard shortcuts (animatedZoomView) - Doubled zoom step from 0.1 to 0.2 for faster zooming - Optimized animation performance by only updating transforms during animation frames - Fixed undefined variable issue (vis/gridScale -> eventLayer/outer) - Full redraw only happens once at end of animation, eliminating jarring experience --- .../src/js/ui/view-zoom-constants.js | 2 +- .../@node-red/editor-client/src/js/ui/view.js | 27 ++++++++++++------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js index 92e0f526cd..9b10afd82e 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js @@ -7,7 +7,7 @@ RED.view.zoomConstants = { MAX_ZOOM: 2.0, // Zoom step for keyboard/button controls - ZOOM_STEP: 0.1, + ZOOM_STEP: 0.2, // Animation settings DEFAULT_ZOOM_DURATION: 125, // ms, faster animation diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 6589522a04..89ed5a35c1 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -763,11 +763,11 @@ RED.view = (function() { '') }) - $("#red-ui-view-zoom-out").on("click", zoomOut); + $("#red-ui-view-zoom-out").on("click", function() { zoomOut(); }); RED.popover.tooltip($("#red-ui-view-zoom-out"),RED._('actions.zoom-out'),'core:zoom-out'); $("#red-ui-view-zoom-zero").on("click", zoomZero); RED.popover.tooltip($("#red-ui-view-zoom-zero"),RED._('actions.zoom-reset'),'core:zoom-reset'); - $("#red-ui-view-zoom-in").on("click", zoomIn); + $("#red-ui-view-zoom-in").on("click", function() { zoomIn(); }); RED.popover.tooltip($("#red-ui-view-zoom-in"),RED._('actions.zoom-in'),'core:zoom-in'); $("#red-ui-view-zoom-fit").on("click", zoomToFitAll); RED.popover.tooltip($("#red-ui-view-zoom-fit"),RED._('actions.zoom-fit'),'core:zoom-fit'); @@ -2847,16 +2847,16 @@ RED.view = (function() { function zoomIn(focalPoint) { if (scaleFactor < RED.view.zoomConstants.MAX_ZOOM) { - zoomView(scaleFactor + RED.view.zoomConstants.ZOOM_STEP, focalPoint); + animatedZoomView(scaleFactor + RED.view.zoomConstants.ZOOM_STEP, focalPoint); } } function zoomOut(focalPoint) { var minZoom = calculateMinZoom(); if (scaleFactor > minZoom) { - zoomView(Math.max(scaleFactor - RED.view.zoomConstants.ZOOM_STEP, minZoom), focalPoint); + animatedZoomView(Math.max(scaleFactor - RED.view.zoomConstants.ZOOM_STEP, minZoom), focalPoint); } } - function zoomZero() { zoomView(1); } + function zoomZero() { animatedZoomView(1); } function zoomToFitAll() { // Get all nodes in active workspace @@ -2931,12 +2931,14 @@ RED.view = (function() { function zoomView(factor, focalPoint) { + console.log('=== ZOOM VIEW CALLED ===', 'factor:', factor, 'focalPoint:', focalPoint); // Early return if scale factor isn't actually changing // This prevents focal point shifts when at zoom limits if (Math.abs(scaleFactor - factor) < 0.001) { + console.log('Zoom view SKIPPED - already at target zoom'); return; } - + var screenSize = [chart.width(),chart.height()]; var scrollPos = [chart.scrollLeft(),chart.scrollTop()]; var oldScaleFactor = scaleFactor; @@ -2960,8 +2962,10 @@ RED.view = (function() { chart.scrollTop(center[1] * scaleFactor - focalPoint[1]); } else { // Keep viewport center on the same workspace coordinates - chart.scrollLeft(center[0] * scaleFactor - screenSize[0]/2); - chart.scrollTop(center[1] * scaleFactor - screenSize[1]/2); + var newScrollLeft = center[0] * scaleFactor - screenSize[0]/2; + var newScrollTop = center[1] * scaleFactor - screenSize[1]/2; + chart.scrollLeft(newScrollLeft); + chart.scrollTop(newScrollTop); } RED.view.navigator.resize(); @@ -3041,13 +3045,18 @@ RED.view = (function() { chart.scrollLeft(newScrollPos[0]); chart.scrollTop(newScrollPos[1]); + // During animation, only update the scale transform, not the full redraw + // This is much more performant with many nodes + eventLayer.attr("transform", "scale(" + scaleFactor + ")"); + outer.attr("width", space_width * scaleFactor).attr("height", space_height * scaleFactor); RED.view.navigator.resize(); - redraw(); }, onEnd: function() { cancelInProgressAnimation = null; // Ensure scaleFactor is exactly the target to prevent precision issues scaleFactor = targetFactor; + // Full redraw at the end to ensure everything is correct + redraw(); if (RED.settings.get("editor.view.view-store-zoom")) { RED.settings.setLocal('zoom-level', targetFactor.toFixed(1)); } From 79918f0187646868841ad37b3582f00e5ac4ec2b Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 14:19:31 +0200 Subject: [PATCH 039/160] Add focal point locking for sequential button/hotkey zooms - Store workspace center on first button/hotkey zoom operation - Maintain same focal point for sequential zooms within 1 second timeout - Pass workspace center directly to animatedZoomView to prevent recalculation - Focal point always at viewport center with consistent workspace point - Works correctly at canvas edges where viewport may shift - Does not interfere with wheel/pinch zoom which provide explicit focal points --- .../@node-red/editor-client/src/js/ui/view.js | 78 +++++++++++++++++-- 1 file changed, 73 insertions(+), 5 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 89ed5a35c1..d120a094bb 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -2845,18 +2845,83 @@ RED.view = (function() { return Math.max(calculatedMinZoom, RED.view.zoomConstants.MIN_ZOOM); } + // Track focal point for sequential button/hotkey zoom operations + // Store in workspace coordinates so it remains valid after viewport shifts + var buttonZoomWorkspaceCenter = null; + var buttonZoomTimeout = null; + var BUTTON_ZOOM_FOCAL_TIMEOUT = 1000; // ms - time to keep same focal point + function zoomIn(focalPoint) { if (scaleFactor < RED.view.zoomConstants.MAX_ZOOM) { - animatedZoomView(scaleFactor + RED.view.zoomConstants.ZOOM_STEP, focalPoint); + var useFocalPoint = null; + + // If focalPoint is explicitly provided (e.g., from wheel/pinch), use it directly + if (focalPoint) { + useFocalPoint = focalPoint; + } else { + // For button/hotkey zoom, maintain the same workspace center across sequential zooms + if (!buttonZoomWorkspaceCenter) { + // First button zoom - calculate and store workspace center + var screenSize = [chart.width(), chart.height()]; + var scrollPos = [chart.scrollLeft(), chart.scrollTop()]; + // Convert viewport center to workspace coordinates + buttonZoomWorkspaceCenter = [ + (scrollPos[0] + screenSize[0]/2) / scaleFactor, + (scrollPos[1] + screenSize[1]/2) / scaleFactor + ]; + } + + // ALWAYS use viewport center as focal point (fixed screen position) + // The stored workspace center will be kept at this screen position + var screenSize = [chart.width(), chart.height()]; + useFocalPoint = [screenSize[0]/2, screenSize[1]/2]; + + // Reset timeout + clearTimeout(buttonZoomTimeout); + buttonZoomTimeout = setTimeout(function() { + buttonZoomWorkspaceCenter = null; + }, BUTTON_ZOOM_FOCAL_TIMEOUT); + } + + animatedZoomView(scaleFactor + RED.view.zoomConstants.ZOOM_STEP, useFocalPoint, buttonZoomWorkspaceCenter); } } function zoomOut(focalPoint) { var minZoom = calculateMinZoom(); if (scaleFactor > minZoom) { - animatedZoomView(Math.max(scaleFactor - RED.view.zoomConstants.ZOOM_STEP, minZoom), focalPoint); + var useFocalPoint = null; + + if (focalPoint) { + useFocalPoint = focalPoint; + } else { + if (!buttonZoomWorkspaceCenter) { + var screenSize = [chart.width(), chart.height()]; + var scrollPos = [chart.scrollLeft(), chart.scrollTop()]; + buttonZoomWorkspaceCenter = [ + (scrollPos[0] + screenSize[0]/2) / scaleFactor, + (scrollPos[1] + screenSize[1]/2) / scaleFactor + ]; + } + + // ALWAYS use viewport center as focal point (fixed screen position) + var screenSize = [chart.width(), chart.height()]; + useFocalPoint = [screenSize[0]/2, screenSize[1]/2]; + + clearTimeout(buttonZoomTimeout); + buttonZoomTimeout = setTimeout(function() { + buttonZoomWorkspaceCenter = null; + }, BUTTON_ZOOM_FOCAL_TIMEOUT); + } + + animatedZoomView(Math.max(scaleFactor - RED.view.zoomConstants.ZOOM_STEP, minZoom), useFocalPoint, buttonZoomWorkspaceCenter); } } - function zoomZero() { animatedZoomView(1); } + function zoomZero() { + // Reset button zoom focal point for zoom reset + clearTimeout(buttonZoomTimeout); + buttonZoomWorkspaceCenter = null; + animatedZoomView(1); + } function zoomToFitAll() { // Get all nodes in active workspace @@ -2976,7 +3041,7 @@ RED.view = (function() { } } - function animatedZoomView(targetFactor, focalPoint) { + function animatedZoomView(targetFactor, focalPoint, workspaceCenter) { // Cancel any in-progress animation if (cancelInProgressAnimation) { cancelInProgressAnimation(); @@ -3002,7 +3067,10 @@ RED.view = (function() { // Calculate the focal point in workspace coordinates (will remain constant) var center; - if (focalPoint) { + if (workspaceCenter) { + // Use the provided workspace center directly (for button zoom focal point locking) + center = workspaceCenter; + } else if (focalPoint) { // focalPoint is in screen coordinates, convert to workspace coordinates center = [(scrollPos[0] + focalPoint[0])/scaleFactor, (scrollPos[1] + focalPoint[1])/scaleFactor]; } else { From 47026ec744c1fb1cf8f79f59f3d4d4a80654d64c Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 14:21:52 +0200 Subject: [PATCH 040/160] Add minimap auto-show for zoom button/hotkey interactions - Emit view:navigate event in animatedZoomView onStart callback - Minimap now appears when using zoom buttons (in/out/reset/fit) - Minimap now appears when using zoom hotkeys (Ctrl+/-/0/1) - Auto-hides after 2 seconds as expected - Applies to all animated zoom operations consistently --- .../node_modules/@node-red/editor-client/src/js/ui/view.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index d120a094bb..51ad868284 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -3119,6 +3119,10 @@ RED.view = (function() { outer.attr("width", space_width * scaleFactor).attr("height", space_height * scaleFactor); RED.view.navigator.resize(); }, + onStart: function() { + // Show minimap when zoom animation starts + RED.events.emit("view:navigate"); + }, onEnd: function() { cancelInProgressAnimation = null; // Ensure scaleFactor is exactly the target to prevent precision issues From 775d6181c91f85aa18fe568e0ed03bafdec1e3ea Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 14:26:53 +0200 Subject: [PATCH 041/160] Add grab/grabbing cursor for spacebar pan mode - Show grab cursor (open hand) when spacebar is pressed - Show grabbing cursor (closed hand) when actively panning with spacebar+drag - Revert to grab cursor on mouse release if spacebar still held - Clear cursor when spacebar is released - Apply cursor to SVG element (outer) where mouse events occur - Handle edge cases: window blur, canvas blur, spacebar release outside canvas --- .../@node-red/editor-client/src/js/ui/view.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 51ad868284..3a2d7baca6 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -632,8 +632,12 @@ RED.view = (function() { if (e.type === "keydown" && !spacebarPressed) { spacebarPressed = true; + // Change cursor to grab hand when spacebar is pressed + outer.style('cursor', 'grab'); } else if (e.type === "keyup" && spacebarPressed) { spacebarPressed = false; + // Revert cursor when spacebar is released + outer.style('cursor', ''); } } } @@ -642,6 +646,8 @@ RED.view = (function() { function handleWindowSpacebarUp(e) { if ((e.keyCode === 32 || e.key === ' ') && spacebarPressed) { spacebarPressed = false; + // Revert cursor when spacebar is released outside canvas + outer.style('cursor', ''); e.preventDefault(); e.stopPropagation(); } @@ -656,6 +662,8 @@ RED.view = (function() { window.addEventListener("blur", function() { if (spacebarPressed) { spacebarPressed = false; + // Revert cursor when window loses focus + outer.style('cursor', ''); } }) @@ -1114,6 +1122,8 @@ RED.view = (function() { // Reset spacebar state when chart loses focus to prevent stuck state if (spacebarPressed) { spacebarPressed = false; + // Revert cursor when chart loses focus + outer.style('cursor', ''); } }); @@ -1582,6 +1592,8 @@ RED.view = (function() { mouse_mode = RED.state.PANNING; mouse_position = [d3.event.pageX,d3.event.pageY] scroll_position = [chart.scrollLeft(),chart.scrollTop()]; + // Change cursor to grabbing while actively panning + outer.style('cursor', 'grabbing'); return; } @@ -2497,6 +2509,12 @@ RED.view = (function() { } if (mouse_mode === RED.state.PANNING) { resetMouseVars(); + // Revert to grab cursor if spacebar still held, otherwise clear cursor + if (spacebarPressed) { + outer.style('cursor', 'grab'); + } else { + outer.style('cursor', ''); + } return } if (mouse_mode === RED.state.SELECTING_NODE) { From f22915e1b978b68d7096673f1c948081edca104d Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 14:29:16 +0200 Subject: [PATCH 042/160] Add grabbing cursor for middle-click pan mode --- packages/node_modules/@node-red/editor-client/src/js/ui/view.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 3a2d7baca6..464e0f9236 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -1603,6 +1603,8 @@ RED.view = (function() { mouse_mode = RED.state.PANNING; mouse_position = [d3.event.pageX,d3.event.pageY] scroll_position = [chart.scrollLeft(),chart.scrollTop()]; + // Change cursor to grabbing while actively panning + outer.style('cursor', 'grabbing'); return; } if (d3.event.button === 2) { From 37a4440a5a9893440b8c7d5a680f958c4406fab7 Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 14:31:24 +0200 Subject: [PATCH 043/160] Make zoom animation duration relative to maintain consistent velocity --- .../@node-red/editor-client/src/js/ui/view.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 464e0f9236..0957ae749a 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -3098,6 +3098,14 @@ RED.view = (function() { center = [(scrollPos[0] + screenSize[0]/2)/scaleFactor, (scrollPos[1] + screenSize[1]/2)/scaleFactor]; } + // Calculate duration based on relative zoom change to maintain consistent velocity + // Use logarithmic scaling since zoom feels exponential to the user + var zoomRatio = targetFactor / startFactor; + var logChange = Math.abs(Math.log(zoomRatio)); + // Scale duration more aggressively: multiply by 2 for stronger effect + // At extreme zoom levels, animation will be noticeably longer + var duration = Math.max(100, Math.min(350, logChange / 0.693 * RED.view.zoomConstants.DEFAULT_ZOOM_DURATION * 2)); + // Start the animation cancelInProgressAnimation = RED.view.zoomAnimator.easeToValuesRAF({ fromValues: { @@ -3106,7 +3114,7 @@ RED.view = (function() { toValues: { zoom: targetFactor }, - duration: RED.view.zoomConstants.DEFAULT_ZOOM_DURATION, + duration: duration, interpolateValue: true, // Use exponential interpolation for zoom onStep: function(values) { var currentFactor = values.zoom; From 34d356230b9a8a5f61a652c140012303949c7cd7 Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 14:42:07 +0200 Subject: [PATCH 044/160] Set maximum zoom level to 1.0 --- .../@node-red/editor-client/src/js/ui/view-zoom-constants.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js index 9b10afd82e..3f789ced2d 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js @@ -4,7 +4,7 @@ RED.view.zoomConstants = { // Zoom limits MIN_ZOOM: 0.05, // Default minimum, will be dynamically calculated to fit canvas - MAX_ZOOM: 2.0, + MAX_ZOOM: 1.0, // Zoom step for keyboard/button controls ZOOM_STEP: 0.2, From f831df70cefb02a78d489d2a8f87848818f75ead Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 14:43:54 +0200 Subject: [PATCH 045/160] Fix zoom-to-fit to properly center nodes in viewport --- .../@node-red/editor-client/src/js/ui/view.js | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 0957ae749a..09ca0a98d0 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -2989,25 +2989,18 @@ RED.view = (function() { var minZoom = calculateMinZoom(); targetZoom = Math.max(minZoom, Math.min(RED.view.zoomConstants.MAX_ZOOM, targetZoom)); - // Calculate center point of bounding box as focal point + // Calculate center point of bounding box in workspace coordinates var centerX = (minX + maxX) / 2; var centerY = (minY + maxY) / 2; - // Convert to screen coordinates for focal point - // We want to center the bounding box in the viewport - var focalPoint = [viewportWidth / 2, viewportHeight / 2]; + // Reset button zoom focal point for zoom-to-fit + clearTimeout(buttonZoomTimeout); + buttonZoomWorkspaceCenter = null; - // First zoom to target level - animatedZoomView(targetZoom, focalPoint); - - // Then scroll to center the bounding box - // Wait for zoom animation to complete before scrolling - setTimeout(function() { - var scrollLeft = centerX * targetZoom - viewportWidth / 2; - var scrollTop = centerY * targetZoom - viewportHeight / 2; - chart.scrollLeft(scrollLeft); - chart.scrollTop(scrollTop); - }, RED.view.zoomConstants.DEFAULT_ZOOM_DURATION + 50); + // Pass the bounding box center as workspace center + // This ensures the nodes are centered in viewport after zoom + var focalPoint = [viewportWidth / 2, viewportHeight / 2]; + animatedZoomView(targetZoom, focalPoint, [centerX, centerY]); } function searchFlows() { RED.actions.invoke("core:search", $(this).data("term")); } From 79581bf51f772285f0df557b5e942cbaf1cf288a Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 14:45:45 +0200 Subject: [PATCH 046/160] Refresh active nodes before zoom-to-fit to work immediately --- .../@node-red/editor-client/src/js/ui/view.js | 58 ++++++++++++++++++- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 09ca0a98d0..0a63b7dfe0 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -2944,11 +2944,17 @@ RED.view = (function() { } function zoomToFitAll() { + // Refresh active nodes to ensure we have the latest + updateActiveNodes(); + // Get all nodes in active workspace if (!activeNodes || activeNodes.length === 0) { + console.log("zoomToFitAll: No active nodes found. activeNodes:", activeNodes); return; // No nodes to fit } + console.log("zoomToFitAll: Found", activeNodes.length, "nodes"); + // Calculate bounding box of all nodes var minX = Infinity, minY = Infinity; var maxX = -Infinity, maxY = -Infinity; @@ -2985,14 +2991,20 @@ RED.view = (function() { var zoomY = viewportHeight / boundingHeight; var targetZoom = Math.min(zoomX, zoomY); + console.log("zoomToFitAll: targetZoom calculated:", targetZoom, "bounds:", {minX, minY, maxX, maxY}, "viewport:", {viewportWidth, viewportHeight}); + // Respect minimum and maximum zoom limits var minZoom = calculateMinZoom(); targetZoom = Math.max(minZoom, Math.min(RED.view.zoomConstants.MAX_ZOOM, targetZoom)); + console.log("zoomToFitAll: clamped targetZoom:", targetZoom, "current scaleFactor:", scaleFactor); + // Calculate center point of bounding box in workspace coordinates var centerX = (minX + maxX) / 2; var centerY = (minY + maxY) / 2; + console.log("zoomToFitAll: center point:", centerX, centerY); + // Reset button zoom focal point for zoom-to-fit clearTimeout(buttonZoomTimeout); buttonZoomWorkspaceCenter = null; @@ -3000,7 +3012,49 @@ RED.view = (function() { // Pass the bounding box center as workspace center // This ensures the nodes are centered in viewport after zoom var focalPoint = [viewportWidth / 2, viewportHeight / 2]; - animatedZoomView(targetZoom, focalPoint, [centerX, centerY]); + + // If zoom level won't change significantly, animate just the pan + if (Math.abs(scaleFactor - targetZoom) < 0.01) { + console.log("zoomToFitAll: zoom unchanged, animating pan to center"); + var targetScrollLeft = centerX * scaleFactor - viewportWidth / 2; + var targetScrollTop = centerY * scaleFactor - viewportHeight / 2; + + // Calculate pan distance to determine duration (match zoom animation logic) + var startScrollLeft = chart.scrollLeft(); + var startScrollTop = chart.scrollTop(); + var panDistance = Math.sqrt( + Math.pow(targetScrollLeft - startScrollLeft, 2) + + Math.pow(targetScrollTop - startScrollTop, 2) + ); + + // Use similar duration calculation as zoom: scale with distance + // Normalize by viewport diagonal for consistent feel + var viewportDiagonal = Math.sqrt(viewportWidth * viewportWidth + viewportHeight * viewportHeight); + var relativeDistance = panDistance / viewportDiagonal; + // Duration scales with distance, matching zoom animation feel + var duration = Math.max(200, Math.min(350, relativeDistance * RED.view.zoomConstants.DEFAULT_ZOOM_DURATION * 4)); + + RED.view.zoomAnimator.easeToValuesRAF({ + fromValues: { + scrollLeft: startScrollLeft, + scrollTop: startScrollTop + }, + toValues: { + scrollLeft: targetScrollLeft, + scrollTop: targetScrollTop + }, + duration: duration, + onStep: function(values) { + chart.scrollLeft(values.scrollLeft); + chart.scrollTop(values.scrollTop); + }, + onStart: function() { + RED.events.emit("view:navigate"); + } + }); + } else { + animatedZoomView(targetZoom, focalPoint, [centerX, centerY]); + } } function searchFlows() { RED.actions.invoke("core:search", $(this).data("term")); } @@ -3097,7 +3151,7 @@ RED.view = (function() { var logChange = Math.abs(Math.log(zoomRatio)); // Scale duration more aggressively: multiply by 2 for stronger effect // At extreme zoom levels, animation will be noticeably longer - var duration = Math.max(100, Math.min(350, logChange / 0.693 * RED.view.zoomConstants.DEFAULT_ZOOM_DURATION * 2)); + var duration = Math.max(200, Math.min(350, logChange / 0.693 * RED.view.zoomConstants.DEFAULT_ZOOM_DURATION * 2)); // Start the animation cancelInProgressAnimation = RED.view.zoomAnimator.easeToValuesRAF({ From d308bc77638a822013d3291bce5de8369e169fd2 Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 15:02:32 +0200 Subject: [PATCH 047/160] Remove debug console logs and update documentation --- CANVAS_INTERACTION.md | 90 +++++++++++++++++-- .../@node-red/editor-client/src/js/ui/view.js | 10 --- 2 files changed, 84 insertions(+), 16 deletions(-) diff --git a/CANVAS_INTERACTION.md b/CANVAS_INTERACTION.md index 16261b2c60..831d96856d 100644 --- a/CANVAS_INTERACTION.md +++ b/CANVAS_INTERACTION.md @@ -11,6 +11,49 @@ Improve canvas interaction to work consistently and intuitively across: ## What Has Been Implemented +### Zoom Button & Hotkey Enhancements (Session 2) + +#### Zoom-to-Fit Feature (commits: 6f164a8, 788d0a3, ed71cf9, 732c828) +- ✅ New zoom-to-fit button in footer toolbar +- ✅ Shows all nodes with padding, properly centered in viewport +- ✅ Keyboard shortcut: Ctrl+1 / Cmd+1 for zoom-to-fit +- ✅ Respects maximum zoom level (won't zoom in beyond 1.0) +- ✅ Works immediately on page load (refreshes active nodes first) +- ✅ Smooth animated pan when zoom doesn't need to change +- ✅ Pan animation duration matches zoom animation (200-350ms) + +#### Smooth Zoom Button Animation (commits: 935ff62, f07907e) +- ✅ Smooth 200-350ms zoom transitions for button/hotkey zoom +- ✅ Performance optimized: only updates transforms during animation +- ✅ No viewport jumping or drift +- ✅ Focal point locking for sequential zooms (1 second timeout) +- ✅ Maintains viewport center across multiple rapid button presses + +#### Dynamic Zoom Animation Duration (commit: 594c0d6) +- ✅ Animation duration scales with zoom distance (logarithmic) +- ✅ Consistent perceived velocity across all zoom levels +- ✅ Range: 200-350ms (faster for small changes, slower for large) +- ✅ Pan-only animations also scale with distance traveled +- ✅ Reference: doubling/halving zoom takes ~250ms + +#### Visual Feedback Enhancements (commits: 6261213, ce5a031, 0247a91) +- ✅ Grab cursor (open hand) when spacebar pressed +- ✅ Grabbing cursor (closed hand) during active pan +- ✅ Works for spacebar+click and middle-click pan modes +- ✅ Minimap auto-shows during zoom button/hotkey operations +- ✅ Minimap auto-shows during zoom-to-fit and zoom reset + +#### Zoom Limits (commit: 45c2a79) +- ✅ Maximum zoom level set to 1.0 (100%, no zooming in beyond 1:1) +- ✅ All zoom methods respect this limit +- ✅ Zoom-to-fit properly clamps to max zoom + +#### Bug Fixes (commits: be1da36, 7fdff0c, 6e49e96, e3de29d) +- ✅ Fixed grey padding at canvas bottom (SVG margin reset) +- ✅ Fixed zoom button direction (were reversed) +- ✅ Fixed viewport drift without focal point +- ✅ Fixed zoom center calculation consistency + ### Zoom Functionality #### Smooth Zoom Animation (commits: bdfa06b, a12b65b) @@ -216,25 +259,37 @@ When verifying canvas interaction improvements: - [ ] Space+scroll zoom (keyboard modifier) - [ ] Trackpad pinch gesture (spread = zoom in, pinch = zoom out, generates Ctrl+wheel) - [ ] Touch screen pinch gesture (direct touch events) - - [ ] UI zoom buttons (zoom in, zoom out, reset) - - [ ] Zoom-to-fit button (shows all nodes with padding, respects min zoom) - - [ ] Zoom focal point stays on cursor position - - [ ] Dynamic zoom limits prevent empty space + - [x] UI zoom buttons (zoom in, zoom out, reset) - smooth animated, focal point locking + - [x] Zoom-to-fit button (shows all nodes with padding, respects max zoom of 1.0) + - [x] Zoom-to-fit hotkey (Ctrl+1 / Cmd+1) + - [x] Zoom hotkeys (Ctrl+Plus, Ctrl+Minus, Ctrl+0) + - [x] Zoom focal point stays on viewport center for button/hotkey zooms + - [x] Dynamic zoom limits prevent empty space + - [x] Maximum zoom capped at 1.0 (100%) + - [x] Animation duration scales with zoom distance (200-350ms) + - [x] Sequential zooms maintain same focal point (1 second timeout) + - [x] Zoom-to-fit works immediately after page load + - [x] Pan animation when zoom-to-fit doesn't need zoom change 2. **Pan Testing** - [x] Two-finger pan on trackpad/touch - [x] Diagonal panning works (not axis-locked) - [x] Spacebar+click pan on desktop + - [x] Middle-click pan on desktop - [x] Momentum scrolling with edge bounce - [x] No lag when switching between pan and zoom 3. **UI/UX Testing** - [x] Minimap auto-shows during panning and zooming + - [x] Minimap auto-shows during zoom button/hotkey/zoom-to-fit - [x] Minimap does not show on selection changes - [x] Minimap fades after 2 seconds - [x] No scrollbars visible on canvas - [x] No pinch-zoom on UI elements - [x] Gesture state cleanup on cursor exit + - [x] Grab cursor (open hand) shows when spacebar held + - [x] Grabbing cursor (closed hand) shows during active pan (spacebar or middle-click) + - [x] No grey padding visible at canvas bottom 4. **Browser Zoom Testing** - [ ] Test at 100% browser zoom @@ -257,8 +312,9 @@ Key files involved in canvas interaction improvements: ## Commit History -Interaction improvements span commits from e7a028b to present (13 commits total): +Interaction improvements (20 commits total on claude/issue-44-20250925-0754): +### Session 1: Previous commits (commits 1-13) 1. `e7a028b` - feat: Add enhanced zoom and scroll features 2. `bdfa06b` - Implement smooth zoom functionality with pinch-to-zoom support 3. `37f9786` - Fix trackpad zoom direction - spreading fingers now zooms in @@ -271,4 +327,26 @@ Interaction improvements span commits from e7a028b to present (13 commits total) 10. `f13ed66` - Add dynamic minimum zoom recalculation on viewport resize 11. `53dce6a` - Hide scrollbars and add auto-show/hide minimap on navigation 12. `875db2c` - Enable diagonal trackpad panning by preventing axis-locked scroll -13. (current) - Improve minimap auto-show behavior to only trigger during actual navigation \ No newline at end of file +13. (previous) - Improve minimap auto-show behavior to only trigger during actual navigation + +### Session 2: Zoom button/hotkey improvements (commits 14-20) +14. `ad00ca23e` - Add scroll spacer to fix scrollable area at minimum zoom +15. `48f0f3be` - Fix minimap viewport position at non-1.0 zoom levels +16. `be1da360` - Fix grey padding at canvas bottom by resetting SVG margins +17. `6f164a8a` - Add zoom-to-fit button to show all nodes at once +18. `7fdff0ca` - Fix zoom button handlers - zoom in/out were reversed +19. `e46cfc94` - Move zoom-to-fit button between reset and zoom-in +20. `95304e26` - Revert "Move zoom-to-fit button between reset and zoom-in" +21. `788d0a38` - Add Ctrl+1/Cmd+1 keyboard shortcut for zoom-to-fit +22. `5c090786` - Remove animation from zoom buttons for instant, smooth zooming +23. `6e49e962` - Fix viewport drift when using zoom buttons without focal point +24. `e3de29d8` - Fix zoom center calculation to use oldScaleFactor consistently +25. `935ff622` - Fix zoom button animation and improve performance +26. `f07907e1` - Add focal point locking for sequential button/hotkey zooms +27. `0247a910` - Add minimap auto-show for zoom button/hotkey interactions +28. `62612139` - Add grab/grabbing cursor for spacebar pan mode +29. `ce5a0313` - Add grabbing cursor for middle-click pan mode +30. `594c0d66` - Make zoom animation duration relative to maintain consistent velocity +31. `45c2a798` - Set maximum zoom level to 1.0 +32. `ed71cf91` - Fix zoom-to-fit to properly center nodes in viewport +33. `732c8283` - Refresh active nodes before zoom-to-fit to work immediately (includes pan animation matching zoom duration, 200-350ms range) \ No newline at end of file diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 0a63b7dfe0..7e4836a414 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -2949,12 +2949,9 @@ RED.view = (function() { // Get all nodes in active workspace if (!activeNodes || activeNodes.length === 0) { - console.log("zoomToFitAll: No active nodes found. activeNodes:", activeNodes); return; // No nodes to fit } - console.log("zoomToFitAll: Found", activeNodes.length, "nodes"); - // Calculate bounding box of all nodes var minX = Infinity, minY = Infinity; var maxX = -Infinity, maxY = -Infinity; @@ -2991,20 +2988,14 @@ RED.view = (function() { var zoomY = viewportHeight / boundingHeight; var targetZoom = Math.min(zoomX, zoomY); - console.log("zoomToFitAll: targetZoom calculated:", targetZoom, "bounds:", {minX, minY, maxX, maxY}, "viewport:", {viewportWidth, viewportHeight}); - // Respect minimum and maximum zoom limits var minZoom = calculateMinZoom(); targetZoom = Math.max(minZoom, Math.min(RED.view.zoomConstants.MAX_ZOOM, targetZoom)); - console.log("zoomToFitAll: clamped targetZoom:", targetZoom, "current scaleFactor:", scaleFactor); - // Calculate center point of bounding box in workspace coordinates var centerX = (minX + maxX) / 2; var centerY = (minY + maxY) / 2; - console.log("zoomToFitAll: center point:", centerX, centerY); - // Reset button zoom focal point for zoom-to-fit clearTimeout(buttonZoomTimeout); buttonZoomWorkspaceCenter = null; @@ -3015,7 +3006,6 @@ RED.view = (function() { // If zoom level won't change significantly, animate just the pan if (Math.abs(scaleFactor - targetZoom) < 0.01) { - console.log("zoomToFitAll: zoom unchanged, animating pan to center"); var targetScrollLeft = centerX * scaleFactor - viewportWidth / 2; var targetScrollTop = centerY * scaleFactor - viewportHeight / 2; From 250f7ab89772adf707a25e85497d6c029935d363 Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 15:24:34 +0200 Subject: [PATCH 048/160] Add minimap auto-show on flow startup and workspace changes Shows minimap briefly when: - Flow initially loads (if nodes exist) - Switching between workspace tabs - Continuing to show during zoom/pan navigation Implementation: - Listen to workspace:change events - Check for active workspace with nodes before showing - Use 100ms delay to ensure nodes are rendered - Reuse existing showTemporary() for consistent behavior --- .../editor-client/src/js/ui/view-navigator.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js index 5b1eb89255..61af52e500 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js @@ -199,6 +199,20 @@ RED.events.on("view:navigate", function() { showTemporary(); }); + + // Show minimap briefly when workspace changes (includes initial load) + RED.events.on("workspace:change", function(event) { + // Only show if there's an active workspace with nodes + if (event.workspace && RED.nodes.getWorkspaceOrder().length > 0) { + // Small delay to ensure nodes are rendered + setTimeout(function() { + var activeNodes = RED.nodes.filterNodes({z: event.workspace}); + if (activeNodes.length > 0) { + showTemporary(); + } + }, 100); + } + }); }, refresh: refreshNodes, resize: resizeNavBorder, From be3430c032af8099a57dfd47dc6a06ba26c6c2ed Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 15:26:33 +0200 Subject: [PATCH 049/160] Update documentation with minimap startup feature --- CANVAS_INTERACTION.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/CANVAS_INTERACTION.md b/CANVAS_INTERACTION.md index 831d96856d..63da03e5d4 100644 --- a/CANVAS_INTERACTION.md +++ b/CANVAS_INTERACTION.md @@ -124,12 +124,14 @@ Improve canvas interaction to work consistently and intuitively across: - ✅ JavaScript prevention for trackpad pinch on non-canvas areas - ✅ Block Ctrl+wheel events outside the workspace chart -#### Minimap Navigation (commit: 53dce6a) +#### Minimap Navigation (commits: 53dce6a, 5e056a4) - ✅ Auto-show minimap on zoom and pan operations +- ✅ Auto-show minimap on flow startup and workspace changes - ✅ Minimap appears for 2 seconds during navigation then fades out - ✅ Smooth fade in/out animations for minimap visibility - ✅ Minimap stays visible if manually toggled with button - ✅ Emit `view:navigate` events for all zoom and pan operations +- ✅ Check for active nodes before showing on workspace change #### Visual Polish (commit: 53dce6a) - ✅ Hide scrollbars on canvas while keeping it scrollable @@ -280,6 +282,7 @@ When verifying canvas interaction improvements: - [x] No lag when switching between pan and zoom 3. **UI/UX Testing** + - [x] Minimap auto-shows on flow startup and workspace changes - [x] Minimap auto-shows during panning and zooming - [x] Minimap auto-shows during zoom button/hotkey/zoom-to-fit - [x] Minimap does not show on selection changes @@ -349,4 +352,5 @@ Interaction improvements (20 commits total on claude/issue-44-20250925-0754): 30. `594c0d66` - Make zoom animation duration relative to maintain consistent velocity 31. `45c2a798` - Set maximum zoom level to 1.0 32. `ed71cf91` - Fix zoom-to-fit to properly center nodes in viewport -33. `732c8283` - Refresh active nodes before zoom-to-fit to work immediately (includes pan animation matching zoom duration, 200-350ms range) \ No newline at end of file +33. `732c8283` - Refresh active nodes before zoom-to-fit to work immediately (includes pan animation matching zoom duration, 200-350ms range) +34. `5e056a4d` - Add minimap auto-show on flow startup and workspace changes \ No newline at end of file From 1ff980d190c2fdb1eb3d1b4d52b64addc53f000e Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Tue, 30 Sep 2025 22:30:26 +0200 Subject: [PATCH 050/160] Increase maximum zoom level to 2.0 --- .../@node-red/editor-client/src/js/ui/view-zoom-constants.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js index 3f789ced2d..9b10afd82e 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js @@ -4,7 +4,7 @@ RED.view.zoomConstants = { // Zoom limits MIN_ZOOM: 0.05, // Default minimum, will be dynamically calculated to fit canvas - MAX_ZOOM: 1.0, + MAX_ZOOM: 2.0, // Zoom step for keyboard/button controls ZOOM_STEP: 0.2, From 1638fa927bbed10fadb61748ceab7b5ee92c21ad Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Wed, 1 Oct 2025 13:55:58 +0200 Subject: [PATCH 051/160] Fix mouse wheel zoom sensitivity by detecting input device type Mouse wheel events were being treated as trackpad input, causing excessive zoom jumps. Added delta magnitude detection (threshold: 50) to distinguish between mouse wheel (large deltas) and trackpad (small deltas), applying appropriate zoom calculation for each device. --- .../@node-red/editor-client/src/js/ui/view.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 7e4836a414..5ac2bdb76c 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -829,9 +829,10 @@ RED.view = (function() { // For trackpad pinch (Ctrl+wheel), use smooth proportional zoom if (evt.ctrlKey && !evt.altKey && !spacebarPressed) { - // Use the zoom animator's delta calculation for trackpad + // Detect input device: trackpad has small deltas, mouse wheel has large deltas + var isTrackpadInput = Math.abs(delta) < 50; // Invert delta: spreading fingers (negative deltaY) should zoom in - var scaleDelta = RED.view.zoomAnimator.calculateZoomDelta(scaleFactor, -delta, true); + var scaleDelta = RED.view.zoomAnimator.calculateZoomDelta(scaleFactor, -delta, isTrackpadInput); var minZoom = calculateMinZoom(); var newScale = Math.min(RED.view.zoomConstants.MAX_ZOOM, Math.max(minZoom, scaleFactor + scaleDelta)); @@ -878,8 +879,9 @@ RED.view = (function() { }, gestureEndThreshold); // Use 500ms timeout for gesture end detection } else { // Regular Alt+scroll or Space+scroll - use smooth zoom without animation - // Use same proportional zoom as trackpad for consistent feel - var scaleDelta = RED.view.zoomAnimator.calculateZoomDelta(scaleFactor, -delta, true); + // Detect input device: trackpad has small deltas, mouse wheel has large deltas + var isTrackpadInput = Math.abs(delta) < 50; + var scaleDelta = RED.view.zoomAnimator.calculateZoomDelta(scaleFactor, -delta, isTrackpadInput); var minZoom = calculateMinZoom(); var newScale = Math.min(RED.view.zoomConstants.MAX_ZOOM, Math.max(minZoom, scaleFactor + scaleDelta)); From a01c920c74ed0a5e3973d77ee5cb1b21d1b74d42 Mon Sep 17 00:00:00 2001 From: dimitrieh Date: Wed, 1 Oct 2025 13:56:47 +0200 Subject: [PATCH 052/160] Remove CANVAS_INTERACTION.md documentation file --- CANVAS_INTERACTION.md | 356 ------------------------------------------ 1 file changed, 356 deletions(-) delete mode 100644 CANVAS_INTERACTION.md diff --git a/CANVAS_INTERACTION.md b/CANVAS_INTERACTION.md deleted file mode 100644 index 63da03e5d4..0000000000 --- a/CANVAS_INTERACTION.md +++ /dev/null @@ -1,356 +0,0 @@ -# Canvas Interaction Improvements - -This document tracks the ongoing improvements to Node-RED's canvas interaction across different devices, input methods, and browser zoom settings. - -## Objectives - -Improve canvas interaction to work consistently and intuitively across: -- **Browser zoom levels**: 100%, 125%, 150%, 200%, etc. -- **Input devices**: Mouse, trackpad, and touchscreen -- **Platforms**: Desktop (Windows, macOS, Linux) and mobile/tablet devices - -## What Has Been Implemented - -### Zoom Button & Hotkey Enhancements (Session 2) - -#### Zoom-to-Fit Feature (commits: 6f164a8, 788d0a3, ed71cf9, 732c828) -- ✅ New zoom-to-fit button in footer toolbar -- ✅ Shows all nodes with padding, properly centered in viewport -- ✅ Keyboard shortcut: Ctrl+1 / Cmd+1 for zoom-to-fit -- ✅ Respects maximum zoom level (won't zoom in beyond 1.0) -- ✅ Works immediately on page load (refreshes active nodes first) -- ✅ Smooth animated pan when zoom doesn't need to change -- ✅ Pan animation duration matches zoom animation (200-350ms) - -#### Smooth Zoom Button Animation (commits: 935ff62, f07907e) -- ✅ Smooth 200-350ms zoom transitions for button/hotkey zoom -- ✅ Performance optimized: only updates transforms during animation -- ✅ No viewport jumping or drift -- ✅ Focal point locking for sequential zooms (1 second timeout) -- ✅ Maintains viewport center across multiple rapid button presses - -#### Dynamic Zoom Animation Duration (commit: 594c0d6) -- ✅ Animation duration scales with zoom distance (logarithmic) -- ✅ Consistent perceived velocity across all zoom levels -- ✅ Range: 200-350ms (faster for small changes, slower for large) -- ✅ Pan-only animations also scale with distance traveled -- ✅ Reference: doubling/halving zoom takes ~250ms - -#### Visual Feedback Enhancements (commits: 6261213, ce5a031, 0247a91) -- ✅ Grab cursor (open hand) when spacebar pressed -- ✅ Grabbing cursor (closed hand) during active pan -- ✅ Works for spacebar+click and middle-click pan modes -- ✅ Minimap auto-shows during zoom button/hotkey operations -- ✅ Minimap auto-shows during zoom-to-fit and zoom reset - -#### Zoom Limits (commit: 45c2a79) -- ✅ Maximum zoom level set to 1.0 (100%, no zooming in beyond 1:1) -- ✅ All zoom methods respect this limit -- ✅ Zoom-to-fit properly clamps to max zoom - -#### Bug Fixes (commits: be1da36, 7fdff0c, 6e49e96, e3de29d) -- ✅ Fixed grey padding at canvas bottom (SVG margin reset) -- ✅ Fixed zoom button direction (were reversed) -- ✅ Fixed viewport drift without focal point -- ✅ Fixed zoom center calculation consistency - -### Zoom Functionality - -#### Smooth Zoom Animation (commits: bdfa06b, a12b65b) -- ✅ 125ms smooth zoom transitions with ease-out curves -- ✅ Natural acceleration/deceleration for zoom operations -- ✅ Reduced acceleration from 2x to 1.2x max for better control -- ✅ Asymmetric zoom speeds (zoom out 40-50% slower than zoom in) -- ✅ Gentler acceleration range (0.7-1.1) for smoother transitions -- ✅ No jarring animations during mouse wheel zoom - -#### Zoom Input Methods (commits: e7a028b, bdfa06b) -- ✅ Mouse wheel zoom -- ✅ Alt+scroll zoom mode (keyboard modifier alternative) -- ✅ Space+scroll zoom mode (keyboard modifier alternative) -- ✅ Trackpad pinch-to-zoom (browsers translate to Ctrl+wheel events) -- ✅ Touch screen pinch-to-zoom with proper center tracking (direct touch events) -- ✅ UI zoom buttons (corrected zoom in/out direction) -- ✅ Zoom-to-fit button (zooms out to show all nodes with padding, respects minimum zoom) - -**Note**: Ctrl+wheel is used for trackpad pinch gestures on desktop. Browsers automatically translate two-finger pinch gestures on trackpads into Ctrl+wheel events. This is separate from touchscreen pinch-to-zoom, which uses direct touch events (touchstart/touchmove/touchend). - -#### Zoom Focal Point (commits: e42b09de, feec7ec, e7a028b) -- ✅ Cursor-centered zoom (focuses on cursor position) -- ✅ Store focal point in workspace coordinates instead of screen coordinates -- ✅ Prevents focal point drift when scroll changes due to canvas boundaries -- ✅ Maintains consistent zoom focus even when view shifts at edges -- ✅ Fixed focal point during pinch gestures - -#### Zoom Direction & Behavior (commits: 37f9786, bdfa06b) -- ✅ Fixed trackpad zoom direction (spreading fingers zooms in, pinching zooms out) -- ✅ Matches standard macOS trackpad behavior -- ✅ Proper ratio-based scaling for pinch gestures -- ✅ Scale lock issues fixed with improved tolerance handling - -#### Dynamic Zoom Limits (commits: 7918693, f13ed66) -- ✅ Calculate minimum zoom dynamically based on viewport size -- ✅ Ensure canvas always covers entire viewport (no empty space visible) -- ✅ Use 'cover' behavior: canvas fills viewport completely -- ✅ Recalculate minimum zoom on window resize -- ✅ Automatically adjust zoom if current level falls below new minimum after resize -- ✅ Prevent zooming out beyond what's needed to fill viewport - -### Panning Functionality - -#### Pan Input Methods (commit: feec7ec) -- ✅ Two-finger pan gesture for touch devices -- ✅ Spacebar+left-click panning for desktop -- ✅ Mode locking to prevent laggy gesture switching -- ✅ Lock into pan or zoom mode based on initial movement -- ✅ Better gesture detection thresholds (10px for zoom, 5px for pan) - -#### Scroll Behavior (commit: e7a028b) -- ✅ Momentum scrolling with edge bounce animation -- ✅ Enhanced spacebar handling to prevent scroll artifacts - -### UI/UX Enhancements - -#### Gesture State Management (commits: e42b09de, bdfa06b, 121982e) -- ✅ Improved gesture state management for trackpad and touch gestures -- ✅ Proper state cleanup when cursor leaves canvas -- ✅ Clear touchStartTime timeout when entering two-finger pan mode -- ✅ Prevent interference between long-press detection and pan gestures - -#### UI Pinch-Zoom Prevention (commit: e0c5b84) -- ✅ Prevent UI pinch-to-zoom while keeping canvas zoomable -- ✅ Apply `touch-action: pan-x pan-y` to html, body, and editor elements -- ✅ Apply `touch-action: none` to canvas for custom gestures -- ✅ JavaScript prevention for trackpad pinch on non-canvas areas -- ✅ Block Ctrl+wheel events outside the workspace chart - -#### Minimap Navigation (commits: 53dce6a, 5e056a4) -- ✅ Auto-show minimap on zoom and pan operations -- ✅ Auto-show minimap on flow startup and workspace changes -- ✅ Minimap appears for 2 seconds during navigation then fades out -- ✅ Smooth fade in/out animations for minimap visibility -- ✅ Minimap stays visible if manually toggled with button -- ✅ Emit `view:navigate` events for all zoom and pan operations -- ✅ Check for active nodes before showing on workspace change - -#### Visual Polish (commit: 53dce6a) -- ✅ Hide scrollbars on canvas while keeping it scrollable -- ✅ Clean visual appearance without visible scrollbars - -### Code Architecture - -#### New Modules (commit: bdfa06b) -- ✅ `view-zoom-animator.js` - Zoom animation utilities (223 lines) -- ✅ `view-zoom-constants.js` - Zoom configuration constants (21 lines) -- ✅ Updated Gruntfile to include new zoom modules in build - -## Current Expectations - -### Cross-Device Consistency -- Zoom and pan should feel natural on mouse, trackpad, and touchscreen -- Gestures should be responsive without lag or mode switching artifacts -- Zoom focal point should remain stable regardless of input method - -### Browser Zoom Compatibility -- Canvas interaction should work correctly at all browser zoom levels -- UI elements should remain accessible and functional -- No layout breaking or interaction dead zones - -### Visual Feedback -- Minimap should provide contextual navigation feedback -- Smooth animations should make interactions feel polished -- No visual glitches or artifacts during zoom/pan operations - -### Performance -- All interactions should be smooth (60fps target) -- No janky animations or delayed responses -- Efficient gesture detection without excessive computation - -## Recent Fixes - -### Grey Padding at Canvas Bottom (Latest) -**Issue**: When scrolled to the bottom of the canvas, 5 pixels of grey space appeared below the grid, allowing users to scroll slightly beyond the canvas boundary. - -**Root Cause**: Default browser margins on SVG elements caused the viewport's `scrollHeight` to be 8005px instead of 8000px, creating extra scrollable area beyond the canvas. - -**Solution**: -- Added explicit `padding: 0` and `margin: 0` to `#red-ui-workspace-chart` container -- Added `display: block`, `margin: 0`, and `padding: 0` to SVG element via `#red-ui-workspace-chart > svg` selector -- The `display: block` prevents inline element spacing issues - -**Files Changed**: -- `workspace.scss:41-42, 52-57` - Added margin/padding resets for container and SVG - -**Result**: Canvas now has exact 8000px scrollable area with no grey padding visible at bottom. - -### Spacebar Hold Scrolling Bug -**Issue**: When holding spacebar down, the canvas would move down unexpectedly, making the space+scroll interaction buggy. - -**Root Cause**: The `preventDefault()` was only called on the first spacebar keydown event. When spacebar is held, browsers fire repeated keydown events. After the first keydown set `spacebarPressed = true`, subsequent keydown events weren't prevented because the condition `e.type === "keydown" && !spacebarPressed` failed, allowing browser's default space-scroll behavior. - -**Solution**: -- Moved `preventDefault()` and `stopPropagation()` outside the conditional checks -- Now blocks ALL spacebar events (both keydown repeats and keyup), not just the first keydown - -**Files Changed**: -- `view.js:611-619` - Restructured spacebar event handler to always prevent default - -**Result**: Holding spacebar no longer causes unwanted canvas scrolling. - -### Minimap Auto-Show Behavior -**Issue**: Minimap was showing on selection changes and when entering pan mode (before actual panning), causing unnecessary flashing. - -**Solution**: -- Removed `view:selection-changed` event listener - minimap no longer shows when selecting nodes -- Removed `view:navigate` emissions from pan mode entry points (touch long-press, spacebar+click, middle-click) -- Added `view:navigate` emission to regular touchpad scroll handler for consistent behavior -- Kept emissions only during actual panning movement and zooming - -**Files Changed**: -- `view-navigator.js:195-198` - Removed selection-changed listener -- `view.js:483, 1529, 1539` - Removed navigate events from pan mode entry -- `view.js:876` - Added navigate event to touchpad scroll handler - -**Result**: Minimap now appears only during actual panning (touchpad or mouse) and zooming, not on selection or pan mode entry. - -### Diagonal Trackpad Panning -**Issue**: Trackpad scrolling was restricted to horizontal OR vertical movement, not both simultaneously. - -**Root Cause**: Browser's native scroll behavior on `overflow: auto` containers locks into one axis at a time, even before JavaScript wheel events fire. - -**Solution**: -- Added `evt.preventDefault()` and `evt.stopPropagation()` to regular scroll handling -- Manually apply both `deltaX` and `deltaY` to scrollLeft/scrollTop simultaneously -- Prevents browser's axis-locked scroll behavior from taking over -- Also updated CSS `touch-action` from `pan-x pan-y` to `manipulation` (though this primarily affects touch events, not trackpad) - -**Files Changed**: -- `view.js:864-890` - Added manual diagonal scroll handling -- `base.scss:22, 33` - Changed touch-action to manipulation - -**Result**: Trackpad can now pan diagonally without axis-locking. - -## Known Issues & Future Work - -### To Be Tested -- [ ] Comprehensive testing across different browser zoom levels (100%, 125%, 150%, 200%) -- [ ] Cross-browser testing (Chrome, Firefox, Safari, Edge) -- [ ] Testing on different touchscreen devices (tablets, touch-enabled laptops) -- [ ] Testing with different trackpad sensitivities and gesture settings -- [x] Diagonal trackpad panning (fixed) - -### Potential Improvements -- [ ] Additional fine-tuning of zoom speeds and acceleration curves based on user feedback -- [ ] Consider adding keyboard shortcuts for zoom reset (Ctrl+0 / Cmd+0) -- [ ] Evaluate need for custom zoom level indicator in UI -- [ ] Consider adding preferences for zoom/pan sensitivity - -### Edge Cases to Monitor -- [ ] Behavior when canvas content is very small or very large -- [ ] Interaction with browser accessibility features -- [ ] Performance with extremely large flows (100+ nodes) -- [ ] Multi-monitor scenarios with different DPI settings - -## Testing Checklist - -When verifying canvas interaction improvements: - -1. **Zoom Testing** - - [ ] Mouse wheel zoom in/out - - [ ] Alt+scroll zoom (keyboard modifier) - - [ ] Space+scroll zoom (keyboard modifier) - - [ ] Trackpad pinch gesture (spread = zoom in, pinch = zoom out, generates Ctrl+wheel) - - [ ] Touch screen pinch gesture (direct touch events) - - [x] UI zoom buttons (zoom in, zoom out, reset) - smooth animated, focal point locking - - [x] Zoom-to-fit button (shows all nodes with padding, respects max zoom of 1.0) - - [x] Zoom-to-fit hotkey (Ctrl+1 / Cmd+1) - - [x] Zoom hotkeys (Ctrl+Plus, Ctrl+Minus, Ctrl+0) - - [x] Zoom focal point stays on viewport center for button/hotkey zooms - - [x] Dynamic zoom limits prevent empty space - - [x] Maximum zoom capped at 1.0 (100%) - - [x] Animation duration scales with zoom distance (200-350ms) - - [x] Sequential zooms maintain same focal point (1 second timeout) - - [x] Zoom-to-fit works immediately after page load - - [x] Pan animation when zoom-to-fit doesn't need zoom change - -2. **Pan Testing** - - [x] Two-finger pan on trackpad/touch - - [x] Diagonal panning works (not axis-locked) - - [x] Spacebar+click pan on desktop - - [x] Middle-click pan on desktop - - [x] Momentum scrolling with edge bounce - - [x] No lag when switching between pan and zoom - -3. **UI/UX Testing** - - [x] Minimap auto-shows on flow startup and workspace changes - - [x] Minimap auto-shows during panning and zooming - - [x] Minimap auto-shows during zoom button/hotkey/zoom-to-fit - - [x] Minimap does not show on selection changes - - [x] Minimap fades after 2 seconds - - [x] No scrollbars visible on canvas - - [x] No pinch-zoom on UI elements - - [x] Gesture state cleanup on cursor exit - - [x] Grab cursor (open hand) shows when spacebar held - - [x] Grabbing cursor (closed hand) shows during active pan (spacebar or middle-click) - - [x] No grey padding visible at canvas bottom - -4. **Browser Zoom Testing** - - [ ] Test at 100% browser zoom - - [ ] Test at 125% browser zoom - - [ ] Test at 150% browser zoom - - [ ] Test at 200% browser zoom - - [ ] Verify all interactions work at each zoom level - -## Files Modified - -Key files involved in canvas interaction improvements: - -- `packages/node_modules/@node-red/editor-client/src/js/ui/view.js` - Main view controller -- `packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-animator.js` - Zoom animations -- `packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-constants.js` - Zoom configuration -- `packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js` - Minimap controller -- `packages/node_modules/@node-red/editor-client/src/sass/workspace.scss` - Canvas styling -- `packages/node_modules/@node-red/editor-client/src/sass/base.scss` - Base UI styling -- `Gruntfile.js` - Build configuration - -## Commit History - -Interaction improvements (20 commits total on claude/issue-44-20250925-0754): - -### Session 1: Previous commits (commits 1-13) -1. `e7a028b` - feat: Add enhanced zoom and scroll features -2. `bdfa06b` - Implement smooth zoom functionality with pinch-to-zoom support -3. `37f9786` - Fix trackpad zoom direction - spreading fingers now zooms in -4. `e42b09d` - Fix zoom focal point stability at canvas edges -5. `a12b65b` - Improve zoom smoothness and control -6. `feec7ec` - Add two-finger panning and spacebar+click panning -7. `e0c5b84` - Prevent UI pinch-to-zoom while keeping canvas zoomable -8. `121982e` - Fix zoom gesture detection after two-finger panning -9. `7918693` - Implement dynamic zoom limits to match canvas boundaries -10. `f13ed66` - Add dynamic minimum zoom recalculation on viewport resize -11. `53dce6a` - Hide scrollbars and add auto-show/hide minimap on navigation -12. `875db2c` - Enable diagonal trackpad panning by preventing axis-locked scroll -13. (previous) - Improve minimap auto-show behavior to only trigger during actual navigation - -### Session 2: Zoom button/hotkey improvements (commits 14-20) -14. `ad00ca23e` - Add scroll spacer to fix scrollable area at minimum zoom -15. `48f0f3be` - Fix minimap viewport position at non-1.0 zoom levels -16. `be1da360` - Fix grey padding at canvas bottom by resetting SVG margins -17. `6f164a8a` - Add zoom-to-fit button to show all nodes at once -18. `7fdff0ca` - Fix zoom button handlers - zoom in/out were reversed -19. `e46cfc94` - Move zoom-to-fit button between reset and zoom-in -20. `95304e26` - Revert "Move zoom-to-fit button between reset and zoom-in" -21. `788d0a38` - Add Ctrl+1/Cmd+1 keyboard shortcut for zoom-to-fit -22. `5c090786` - Remove animation from zoom buttons for instant, smooth zooming -23. `6e49e962` - Fix viewport drift when using zoom buttons without focal point -24. `e3de29d8` - Fix zoom center calculation to use oldScaleFactor consistently -25. `935ff622` - Fix zoom button animation and improve performance -26. `f07907e1` - Add focal point locking for sequential button/hotkey zooms -27. `0247a910` - Add minimap auto-show for zoom button/hotkey interactions -28. `62612139` - Add grab/grabbing cursor for spacebar pan mode -29. `ce5a0313` - Add grabbing cursor for middle-click pan mode -30. `594c0d66` - Make zoom animation duration relative to maintain consistent velocity -31. `45c2a798` - Set maximum zoom level to 1.0 -32. `ed71cf91` - Fix zoom-to-fit to properly center nodes in viewport -33. `732c8283` - Refresh active nodes before zoom-to-fit to work immediately (includes pan animation matching zoom duration, 200-350ms range) -34. `5e056a4d` - Add minimap auto-show on flow startup and workspace changes \ No newline at end of file From 9cedcd0a78d4808e1bce602b9d568675cffec15a Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 20 Oct 2025 13:15:09 +0100 Subject: [PATCH 053/160] Add nls message for zoom to fit --- .../@node-red/editor-client/locales/en-US/editor.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json index c1c9316d81..905b8ea5a0 100644 --- a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json @@ -169,6 +169,7 @@ "zoom-out": "Zoom out", "zoom-reset": "Reset zoom", "zoom-in": "Zoom in", + "fit-to-screen": "Zoom to fit", "search-flows": "Search flows", "search-prev": "Previous", "search-next": "Next", From 3bbdc7730054de2ff5b1c6ab02ec01dd061b2f05 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 20 Oct 2025 13:15:37 +0100 Subject: [PATCH 054/160] Fix up space-to-pan event handling --- .../@node-red/editor-client/src/js/ui/view.js | 168 ++++++++++-------- 1 file changed, 97 insertions(+), 71 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 5ac2bdb76c..baf605e0d3 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -398,8 +398,9 @@ RED.view = (function() { lasso.remove(); lasso = null; } - } else if (mouse_mode === RED.state.PANNING && d3.event.buttons !== 4) { - resetMouseVars(); + } else if (mouse_mode === RED.state.PANNING) { + // ensure the cursor is set to grab when re-entering the canvas while panning + outer.style('cursor', 'grabbing'); } else if (slicePath) { if (d3.event.buttons !== 2) { slicePath.remove(); @@ -597,9 +598,9 @@ RED.view = (function() { } d3.event.preventDefault(); }); - - - const handleAltToggle = (event) => { + + const handleChartKeyboardEvents = (event) => { + // Handle Alt toggle for pulling nodes out of groups if (mouse_mode === RED.state.MOVING_ACTIVE && event.key === 'Alt' && groupAddParentGroup) { RED.nodes.group(groupAddParentGroup).dirty = true for (let n = 0; n Date: Mon, 20 Oct 2025 13:15:52 +0100 Subject: [PATCH 055/160] Fix issues with navigator show/hide lifecycle --- .../editor-client/src/js/ui/view-navigator.js | 345 +++++++++--------- 1 file changed, 171 insertions(+), 174 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js index 61af52e500..438820227a 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js @@ -15,178 +15,176 @@ **/ - RED.view.navigator = (function() { - - var nav_scale = 50; - var nav_width = 8000/nav_scale; - var nav_height = 8000/nav_scale; - - var navContainer; - var navBox; - var navBorder; - var navVis; - var scrollPos; - var scaleFactor; - var chartSize; - var dimensions; - var isDragging; - var isShowing = false; - var autoHideTimeout; - var isManuallyToggled = false; - - function refreshNodes() { - if (!isShowing) { - return; - } - var navNode = navVis.selectAll(".red-ui-navigator-node").data(RED.view.getActiveNodes(),function(d){return d.id}); - navNode.exit().remove(); - navNode.enter().insert("rect") - .attr('class','red-ui-navigator-node') - .attr("pointer-events", "none"); - navNode.each(function(d) { - d3.select(this).attr("x",function(d) { return (d.x-d.w/2)/nav_scale }) - .attr("y",function(d) { return (d.y-d.h/2)/nav_scale }) - .attr("width",function(d) { return Math.max(9,d.w/nav_scale) }) - .attr("height",function(d) { return Math.max(3,d.h/nav_scale) }) - .attr("fill",function(d) { return RED.utils.getNodeColor(d.type,d._def);}) - }); - } - function onScroll() { - if (!isDragging) { - resizeNavBorder(); - } - } - function resizeNavBorder() { - if (navBorder) { - scaleFactor = RED.view.scale(); - chartSize = [ $("#red-ui-workspace-chart").width(), $("#red-ui-workspace-chart").height()]; - scrollPos = [$("#red-ui-workspace-chart").scrollLeft(),$("#red-ui-workspace-chart").scrollTop()]; - - // Convert scroll position (in scaled pixels) to workspace coordinates, then to minimap coordinates - // scrollPos is in scaled canvas pixels, divide by scaleFactor to get workspace coords - navBorder.attr('x',scrollPos[0]/scaleFactor/nav_scale) - .attr('y',scrollPos[1]/scaleFactor/nav_scale) - .attr('width',chartSize[0]/nav_scale/scaleFactor) - .attr('height',chartSize[1]/nav_scale/scaleFactor) - } - } - function toggle() { - if (!isShowing) { - isShowing = true; - isManuallyToggled = true; - clearTimeout(autoHideTimeout); - $("#red-ui-view-navigate").addClass("selected"); - resizeNavBorder(); - refreshNodes(); - $("#red-ui-workspace-chart").on("scroll",onScroll); - navContainer.addClass('red-ui-navigator-container'); - navContainer.show(); - setTimeout(function() { - navContainer.addClass('red-ui-navigator-visible'); - }, 10); - } else { - isShowing = false; - isManuallyToggled = false; - clearTimeout(autoHideTimeout); - navContainer.removeClass('red-ui-navigator-visible'); - setTimeout(function() { - navContainer.hide(); - }, 300); - $("#red-ui-workspace-chart").off("scroll",onScroll); - $("#red-ui-view-navigate").removeClass("selected"); - } - } - - function showTemporary() { - if (!isManuallyToggled) { - clearTimeout(autoHideTimeout); - - if (!isShowing) { - isShowing = true; - resizeNavBorder(); - refreshNodes(); - $("#red-ui-workspace-chart").on("scroll",onScroll); - navContainer.addClass('red-ui-navigator-container'); - navContainer.show(); - setTimeout(function() { - navContainer.addClass('red-ui-navigator-visible'); - }, 10); - } - - autoHideTimeout = setTimeout(function() { - if (!isManuallyToggled && isShowing) { - isShowing = false; - navContainer.removeClass('red-ui-navigator-visible'); - setTimeout(function() { - navContainer.hide(); - }, 300); - $("#red-ui-workspace-chart").off("scroll",onScroll); - } - }, 2000); - } - } - - return { - init: function() { - - $(window).on("resize", resizeNavBorder); - RED.events.on("sidebar:resize",resizeNavBorder); - RED.actions.add("core:toggle-navigator",toggle); - var hideTimeout; - - navContainer = $('
').css({ - "position":"absolute", - "bottom":$("#red-ui-workspace-footer").height(), - "right":0, - zIndex: 1 - }).addClass('red-ui-navigator-container').appendTo("#red-ui-workspace").hide(); - - navBox = d3.select(navContainer[0]) - .append("svg:svg") - .attr("width", nav_width) - .attr("height", nav_height) - .attr("pointer-events", "all") - .attr("id","red-ui-navigator-canvas") - - navBox.append("rect").attr("x",0).attr("y",0).attr("width",nav_width).attr("height",nav_height).style({ - fill:"none", - stroke:"none", - pointerEvents:"all" - }).on("mousedown", function() { - // Update these in case they have changed - scaleFactor = RED.view.scale(); - chartSize = [ $("#red-ui-workspace-chart").width(), $("#red-ui-workspace-chart").height()]; - dimensions = [chartSize[0]/nav_scale/scaleFactor, chartSize[1]/nav_scale/scaleFactor]; - var newX = Math.max(0,Math.min(d3.event.offsetX+dimensions[0]/2,nav_width)-dimensions[0]); - var newY = Math.max(0,Math.min(d3.event.offsetY+dimensions[1]/2,nav_height)-dimensions[1]); - navBorder.attr('x',newX).attr('y',newY); - isDragging = true; - $("#red-ui-workspace-chart").scrollLeft(newX*nav_scale*scaleFactor); - $("#red-ui-workspace-chart").scrollTop(newY*nav_scale*scaleFactor); - }).on("mousemove", function() { - if (!isDragging) { return } - if (d3.event.buttons === 0) { - isDragging = false; - return; - } - var newX = Math.max(0,Math.min(d3.event.offsetX+dimensions[0]/2,nav_width)-dimensions[0]); - var newY = Math.max(0,Math.min(d3.event.offsetY+dimensions[1]/2,nav_height)-dimensions[1]); - navBorder.attr('x',newX).attr('y',newY); - $("#red-ui-workspace-chart").scrollLeft(newX*nav_scale*scaleFactor); - $("#red-ui-workspace-chart").scrollTop(newY*nav_scale*scaleFactor); - }).on("mouseup", function() { - isDragging = false; - }) - - navBorder = navBox.append("rect").attr("class","red-ui-navigator-border") - - navVis = navBox.append("svg:g") - - RED.statusBar.add({ - id: "view-navigator", - align: "right", - element: $('') - }) +RED.view.navigator = (function() { + var nav_scale = 50; + var nav_width = 8000/nav_scale; + var nav_height = 8000/nav_scale; + var navContainer; + var navBox; + var navBorder; + var navVis; + var scrollPos; + var scaleFactor; + var chartSize; + var dimensions; + var isDragging; + var isShowing = false; + var toggleTimeout; + var autoHideTimeout; + var isManuallyToggled = false; + var isTemporaryShow = false; + function refreshNodes() { + if (!isShowing) { + return; + } + var navNode = navVis.selectAll(".red-ui-navigator-node").data(RED.view.getActiveNodes(),function(d){return d.id}); + navNode.exit().remove(); + navNode.enter().insert("rect") + .attr('class','red-ui-navigator-node') + .attr("pointer-events", "none"); + navNode.each(function(d) { + d3.select(this).attr("x",function(d) { return (d.x-d.w/2)/nav_scale }) + .attr("y",function(d) { return (d.y-d.h/2)/nav_scale }) + .attr("width",function(d) { return Math.max(9,d.w/nav_scale) }) + .attr("height",function(d) { return Math.max(3,d.h/nav_scale) }) + .attr("fill",function(d) { return RED.utils.getNodeColor(d.type,d._def);}) + }); + } + function onScroll() { + if (!isDragging) { + resizeNavBorder(); + } + } + function resizeNavBorder() { + if (navBorder) { + scaleFactor = RED.view.scale(); + chartSize = [ $("#red-ui-workspace-chart").width(), $("#red-ui-workspace-chart").height()]; + scrollPos = [$("#red-ui-workspace-chart").scrollLeft(),$("#red-ui-workspace-chart").scrollTop()]; + // Convert scroll position (in scaled pixels) to workspace coordinates, then to minimap coordinates + // scrollPos is in scaled canvas pixels, divide by scaleFactor to get workspace coords + navBorder.attr('x',scrollPos[0]/scaleFactor/nav_scale) + .attr('y',scrollPos[1]/scaleFactor/nav_scale) + .attr('width',chartSize[0]/nav_scale/scaleFactor) + .attr('height',chartSize[1]/nav_scale/scaleFactor) + } + } + function show () { + if (!isShowing) { + isShowing = true; + clearTimeout(autoHideTimeout); + $("#red-ui-view-navigate").addClass("selected"); + resizeNavBorder(); + refreshNodes(); + $("#red-ui-workspace-chart").on("scroll",onScroll); + navContainer.addClass('red-ui-navigator-container'); + navContainer.show(); + clearTimeout(toggleTimeout) + toggleTimeout = setTimeout(function() { + navContainer.addClass('red-ui-navigator-visible'); + }, 10); + } + } + function hide () { + if (isShowing) { + isShowing = false; + isTemporaryShow = false; + isManuallyToggled = false; + clearTimeout(autoHideTimeout); + navContainer.removeClass('red-ui-navigator-visible'); + clearTimeout(toggleTimeout) + toggleTimeout = setTimeout(function() { + navContainer.hide(); + }, 300); + $("#red-ui-workspace-chart").off("scroll",onScroll); + $("#red-ui-view-navigate").removeClass("selected"); + } + } + function toggle() { + if (!isShowing) { + isManuallyToggled = true; + show() + } else { + isManuallyToggled = false; + hide() + } + } + function setupAutoHide () { + clearTimeout(autoHideTimeout); + autoHideTimeout = setTimeout(function() { + hide() + }, 2000) + } + function showTemporary() { + if (!isManuallyToggled) { + isTemporaryShow = true + clearTimeout(autoHideTimeout); + show() + setupAutoHide() + } + } + return { + init: function() { + $(window).on("resize", resizeNavBorder); + RED.events.on("sidebar:resize",resizeNavBorder); + RED.actions.add("core:toggle-navigator",toggle); + navContainer = $('
').css({ + "position":"absolute", + "bottom":$("#red-ui-workspace-footer").height(), + "right":0, + zIndex: 1 + }).addClass('red-ui-navigator-container').appendTo("#red-ui-workspace").hide(); + navBox = d3.select(navContainer[0]) + .append("svg:svg") + .attr("width", nav_width) + .attr("height", nav_height) + .attr("pointer-events", "all") + .attr("id","red-ui-navigator-canvas") + navBox.append("rect").attr("x",0).attr("y",0).attr("width",nav_width).attr("height",nav_height).style({ + fill:"none", + stroke:"none", + pointerEvents:"all" + }).on("mousedown", function() { + // Update these in case they have changed + scaleFactor = RED.view.scale(); + chartSize = [ $("#red-ui-workspace-chart").width(), $("#red-ui-workspace-chart").height()]; + dimensions = [chartSize[0]/nav_scale/scaleFactor, chartSize[1]/nav_scale/scaleFactor]; + var newX = Math.max(0,Math.min(d3.event.offsetX+dimensions[0]/2,nav_width)-dimensions[0]); + var newY = Math.max(0,Math.min(d3.event.offsetY+dimensions[1]/2,nav_height)-dimensions[1]); + navBorder.attr('x',newX).attr('y',newY); + isDragging = true; + $("#red-ui-workspace-chart").scrollLeft(newX*nav_scale*scaleFactor); + $("#red-ui-workspace-chart").scrollTop(newY*nav_scale*scaleFactor); + }).on("mousemove", function() { + if (!isDragging) { return } + if (d3.event.buttons === 0) { + isDragging = false; + return; + } + var newX = Math.max(0,Math.min(d3.event.offsetX+dimensions[0]/2,nav_width)-dimensions[0]); + var newY = Math.max(0,Math.min(d3.event.offsetY+dimensions[1]/2,nav_height)-dimensions[1]); + navBorder.attr('x',newX).attr('y',newY); + $("#red-ui-workspace-chart").scrollLeft(newX*nav_scale*scaleFactor); + $("#red-ui-workspace-chart").scrollTop(newY*nav_scale*scaleFactor); + }).on("mouseup", function() { + isDragging = false; + }).on("mouseenter", function () { + if (isTemporaryShow) { + // If user hovers over the minimap while it's temporarily shown, keep it shown + clearTimeout(autoHideTimeout); + } + }).on("mouseleave", function () { + if (isTemporaryShow) { + // Restart the auto-hide timer after mouse leaves the minimap + setupAutoHide() + } + }) + navBorder = navBox.append("rect").attr("class","red-ui-navigator-border") + navVis = navBox.append("svg:g") + RED.statusBar.add({ + id: "view-navigator", + align: "right", + element: $('') + }) $("#red-ui-view-navigate").on("click", function(evt) { evt.preventDefault(); @@ -216,8 +214,7 @@ }, refresh: refreshNodes, resize: resizeNavBorder, - toggle: toggle, - showTemporary: showTemporary + toggle: toggle } From fa05811b08206024cafa885a443e225c5508d5ae Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 20 Oct 2025 13:20:30 +0100 Subject: [PATCH 056/160] Fix linting --- .../src/js/ui/view-zoom-animator.js | 22 ++++++++++--------- .../@node-red/editor-client/src/js/ui/view.js | 4 +++- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-animator.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-animator.js index 7938ca0de1..cda28591cb 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-animator.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view-zoom-animator.js @@ -77,16 +77,18 @@ RED.view.zoomAnimator = (function() { const interpolatedValues = {}; for (const key in fromValues) { - const from = fromValues[key]; - const to = toValues[key]; - - if (interpolateValue && key === 'zoom') { - // Special interpolation for zoom to feel more natural - // Exponential interpolation preserves relative zoom feel - interpolatedValues[key] = from * Math.pow(to / from, easedProgress); - } else { - // Linear interpolation for other values - interpolatedValues[key] = from + (to - from) * easedProgress; + if (fromValues.hasOwnProperty(key)) { + const from = fromValues[key]; + const to = toValues[key]; + + if (interpolateValue && key === 'zoom') { + // Special interpolation for zoom to feel more natural + // Exponential interpolation preserves relative zoom feel + interpolatedValues[key] = from * Math.pow(to / from, easedProgress); + } else { + // Linear interpolation for other values + interpolatedValues[key] = from + (to - from) * easedProgress; + } } } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index baf605e0d3..07ba14e2be 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -3229,7 +3229,9 @@ RED.view = (function() { } function animateMomentumScroll() { - if (!momentumActive) return; + if (!momentumActive) { + return; + } var scrollX = chart.scrollLeft(); var scrollY = chart.scrollTop(); From c9e0aaf34ebf93ba9ce9af53a064eb804cfb72c1 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 21 Oct 2025 09:24:58 +0100 Subject: [PATCH 057/160] Make zoom scale 1 sticky to make it easier to get to --- .../@node-red/editor-client/src/js/ui/view.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 07ba14e2be..453a545ada 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -3073,7 +3073,12 @@ RED.view = (function() { if (Math.abs(scaleFactor - factor) < 0.001) { return; } + // Make scale 1 'sticky' + if (Math.abs(1.0 - factor) < 0.02) { + factor = 1 + } + console.log(factor) var screenSize = [chart.width(),chart.height()]; var scrollPos = [chart.scrollLeft(),chart.scrollTop()]; var oldScaleFactor = scaleFactor; @@ -3130,6 +3135,11 @@ RED.view = (function() { if (Math.abs(scaleFactor - targetFactor) < 0.01) { return; } + // Make scale 1 'sticky' + if (Math.abs(1.0 - targetFactor) < 0.02) { + targetFactor = 1 + } + var startFactor = scaleFactor; var screenSize = [chart.width(), chart.height()]; From b0cafda4964daf846f1b42d905143acb0a29c557 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 21 Oct 2025 17:46:59 +0100 Subject: [PATCH 058/160] Reimplement Palette as Sidebar component --- .../@node-red/editor-client/src/js/red.js | 4 +- .../editor-client/src/js/ui/palette.js | 37 ++++++------ .../editor-client/src/js/ui/sidebar.js | 1 + .../editor-client/src/sass/palette.scss | 58 ++++++++++--------- 4 files changed, 51 insertions(+), 49 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/red.js b/packages/node_modules/@node-red/editor-client/src/js/red.js index 99cb8375b9..64cb2483ae 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/red.js +++ b/packages/node_modules/@node-red/editor-client/src/js/red.js @@ -843,6 +843,7 @@ var RED = (function() { RED.user.init(); RED.notifications.init(); RED.library.init(); + RED.sidebar.init(); RED.palette.init(); RED.eventLog.init(); @@ -852,7 +853,6 @@ var RED = (function() { console.log("Palette editor disabled"); } - RED.sidebar.init(); if (RED.settings.theme("projects.enabled",false)) { RED.projects.init(); @@ -897,7 +897,7 @@ var RED = (function() { $('
'+ '
'+ '
'+ - '
'+ + // '
'+ '
'+ '
'+ '
').appendTo(options.target); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js index 89337e7c9e..63bba053cf 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js @@ -33,7 +33,6 @@ RED.palette = (function() { ]; var categoryContainers = {}; - var sidebarControls; let paletteState = { filter: "", collapsed: [] }; @@ -310,6 +309,7 @@ RED.palette = (function() { width: "300px", content: "hi", delay: { show: 750, hide: 50 } + // direction: "left" }); d.data('popover',popover); @@ -332,7 +332,7 @@ RED.palette = (function() { revert: 'invalid', revertDuration: 200, containment:'#red-ui-main-container', - start: function() { + start: function(e, ui) { dropEnabled = !(RED.nodes.workspace(RED.workspaces.active())?.locked); paletteWidth = $("#red-ui-palette").width(); paletteTop = $("#red-ui-palette").parent().position().top + $("#red-ui-palette-container").position().top; @@ -358,7 +358,9 @@ RED.palette = (function() { }, drag: function(e,ui) { var paletteNode = getPaletteNode(nt); - ui.originalPosition.left = paletteNode.offset().left; + console.log(ui.originalPosition.left, paletteNode.offset().left) + // ui.originalPosition.left = paletteNode.offset().left; + // console.log(paletteNode.offset()) if (dropEnabled) { mouseX = ui.position.left - paletteWidth + (ui.helper.width()/2) + chart.scrollLeft(); mouseY = ui.position.top - paletteTop + (ui.helper.height()/2) + chart.scrollTop() + 10; @@ -607,11 +609,22 @@ RED.palette = (function() { function init() { + const content = $('
') + RED.sidebar.addTab({ + id: "palette", + label: "Palette", + name: "Palette", + iconClass: "fa fa-tags", + content: content, + pinned: true, + enableOnEdit: true + }); + $('').appendTo("#red-ui-palette"); $('').appendTo("#red-ui-palette"); $('
').appendTo("#red-ui-palette"); $('').appendTo("#red-ui-palette"); - $('
').appendTo("#red-ui-palette"); + // $('
').appendTo("#red-ui-palette"); $("#red-ui-palette > .red-ui-palette-spinner").show(); @@ -670,19 +683,6 @@ RED.palette = (function() { } }); - sidebarControls = $('
').appendTo($("#red-ui-palette")); - RED.popover.tooltip(sidebarControls,RED._("keyboard.togglePalette"),"core:toggle-palette"); - - sidebarControls.on("click", function() { - RED.menu.toggleSelected("menu-item-palette"); - }) - $("#red-ui-palette").on("mouseenter", function() { - sidebarControls.toggle("slide", { direction: "left" }, 200); - }) - $("#red-ui-palette").on("mouseleave", function() { - sidebarControls.stop(false,true); - sidebarControls.hide(); - }) var userCategories = []; if (RED.settings.paletteCategories) { userCategories = RED.settings.paletteCategories; @@ -754,11 +754,8 @@ RED.palette = (function() { function togglePalette(state) { if (!state) { $("#red-ui-main-container").addClass("red-ui-palette-closed"); - sidebarControls.hide(); - sidebarControls.find("i").addClass("fa-chevron-right").removeClass("fa-chevron-left"); } else { $("#red-ui-main-container").removeClass("red-ui-palette-closed"); - sidebarControls.find("i").removeClass("fa-chevron-right").addClass("fa-chevron-left"); } setTimeout(function() { $(window).trigger("resize"); } ,200); } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js index eb10fe043d..fa817f564a 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js @@ -223,6 +223,7 @@ RED.sidebar = (function() { } function init () { + console.log('sidebar init') setupSidebarSeparator(); sidebar_tabs = RED.tabs.create({ element: $('
    ').appendTo("#red-ui-sidebar"), diff --git a/packages/node_modules/@node-red/editor-client/src/sass/palette.scss b/packages/node_modules/@node-red/editor-client/src/sass/palette.scss index 507869690b..3277826749 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/palette.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/palette.scss @@ -18,36 +18,35 @@ #red-ui-palette{ - position: absolute; - top: 0px; - bottom: 0px; - left:0px; + // position: absolute; + // top: 0px; + // bottom: 0px; + // left:0px; background: var(--red-ui-primary-background); - width: 180px; + // width: 180px; text-align: center; @include mixins.disable-selection; - @include mixins.component-border; transition: width 0.2s ease-in-out; - &:before { - content: ''; - top: 0px; - bottom: 0px; - right: 0px; - width: 7px; - height: 100%; - z-index: 4; - position: absolute; - -webkit-mask-image: url(images/grip.svg); - mask-image: url(images/grip.svg); - -webkit-mask-size: auto; - mask-size: auto; - -webkit-mask-position: 50% 50%; - mask-position: 50% 50%; - -webkit-mask-repeat: no-repeat; - mask-repeat: no-repeat; - background-color: var(--red-ui-grip-color); - } + // &:before { + // content: ''; + // top: 0px; + // bottom: 0px; + // right: 0px; + // width: 7px; + // height: 100%; + // z-index: 4; + // position: absolute; + // -webkit-mask-image: url(images/grip.svg); + // mask-image: url(images/grip.svg); + // -webkit-mask-size: auto; + // mask-size: auto; + // -webkit-mask-position: 50% 50%; + // mask-position: 50% 50%; + // -webkit-mask-repeat: no-repeat; + // mask-repeat: no-repeat; + // background-color: var(--red-ui-grip-color); + // } } .red-ui-palette-closed { @@ -91,6 +90,11 @@ .red-ui-palette-content { background: var(--red-ui-palette-content-background); padding: 3px; + > div { + display: flex; + flex-direction: column; + align-items: center; + } } .red-ui-palette-header { @@ -144,7 +148,7 @@ // display: inline-block; cursor: move; background: var(--red-ui-secondary-background); - margin: 10px auto; + margin: 5px 0; height: 25px; border-radius: 5px; border: 1px solid var(--red-ui-node-border); @@ -153,7 +157,7 @@ width: 120px; background-size: contain; position: relative; - z-index: 4; + z-index: 20; &:not(.red-ui-palette-node-config):not(.red-ui-palette-node-small):first-child { margin-top: 15px; } From 4bcec3741dfc5b5b618644a407d186444124fea0 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 21 Oct 2025 18:54:33 +0100 Subject: [PATCH 059/160] Move palette footer to sidebar toolbar --- .../@node-red/editor-client/src/js/ui/palette.js | 7 ++++--- .../@node-red/editor-client/src/sass/palette.scss | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js index 63bba053cf..de66eb224a 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js @@ -610,12 +610,14 @@ RED.palette = (function() { function init() { const content = $('
    ') + const toolbar = $('
    '); RED.sidebar.addTab({ id: "palette", label: "Palette", name: "Palette", iconClass: "fa fa-tags", - content: content, + content, + toolbar, pinned: true, enableOnEdit: true }); @@ -623,7 +625,6 @@ RED.palette = (function() { $('').appendTo("#red-ui-palette"); $('').appendTo("#red-ui-palette"); $('
    ').appendTo("#red-ui-palette"); - $('').appendTo("#red-ui-palette"); // $('
    ').appendTo("#red-ui-palette"); $("#red-ui-palette > .red-ui-palette-spinner").show(); @@ -704,7 +705,7 @@ RED.palette = (function() { } }); - var paletteFooterButtons = $('').appendTo("#red-ui-palette .red-ui-component-footer"); + var paletteFooterButtons = $('').appendTo(toolbar); var paletteCollapseAll = $('').appendTo(paletteFooterButtons); paletteCollapseAll.on("click", function(e) { e.preventDefault(); diff --git a/packages/node_modules/@node-red/editor-client/src/sass/palette.scss b/packages/node_modules/@node-red/editor-client/src/sass/palette.scss index 3277826749..236bdf5706 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/palette.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/palette.scss @@ -64,7 +64,7 @@ position: absolute; top: 35px; right: 0; - bottom: 25px; + bottom: 0; left:0; padding: 0; overflow-y: auto; From 6e264084e747fb8c3df1b308c917e55c6009e5b0 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 22 Oct 2025 11:39:13 +0100 Subject: [PATCH 060/160] Fix z ordering of palette nodes --- .../node_modules/@node-red/editor-client/src/js/ui/palette.js | 1 + .../node_modules/@node-red/editor-client/src/sass/palette.scss | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js index de66eb224a..df42149009 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js @@ -333,6 +333,7 @@ RED.palette = (function() { revertDuration: 200, containment:'#red-ui-main-container', start: function(e, ui) { + ui.helper.css('z-index', 1000); dropEnabled = !(RED.nodes.workspace(RED.workspaces.active())?.locked); paletteWidth = $("#red-ui-palette").width(); paletteTop = $("#red-ui-palette").parent().position().top + $("#red-ui-palette-container").position().top; diff --git a/packages/node_modules/@node-red/editor-client/src/sass/palette.scss b/packages/node_modules/@node-red/editor-client/src/sass/palette.scss index 236bdf5706..d451d44a81 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/palette.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/palette.scss @@ -157,7 +157,7 @@ width: 120px; background-size: contain; position: relative; - z-index: 20; + z-index: 5; &:not(.red-ui-palette-node-config):not(.red-ui-palette-node-small):first-child { margin-top: 15px; } From c90f93ec5618c53f6baa44b589db4a110ea84fec Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 23 Oct 2025 17:24:15 +0100 Subject: [PATCH 061/160] Fix sidebar apis for dual sidebars --- .../@node-red/editor-client/src/js/red.js | 7 +- .../editor-client/src/js/ui/common/tabs.js | 4 +- .../editor-client/src/js/ui/palette.js | 18 +- .../editor-client/src/js/ui/sidebar.js | 244 +++++++++++------- .../editor-client/src/js/ui/tab-info.js | 1 + .../editor-client/src/sass/base.scss | 2 + .../editor-client/src/sass/palette.scss | 11 - .../editor-client/src/sass/sidebar.scss | 50 ++-- .../editor-client/src/sass/workspace.scss | 23 +- 9 files changed, 189 insertions(+), 171 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/red.js b/packages/node_modules/@node-red/editor-client/src/js/red.js index 64cb2483ae..1c073b137d 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/red.js +++ b/packages/node_modules/@node-red/editor-client/src/js/red.js @@ -894,13 +894,14 @@ var RED = (function() { var logo = $('').appendTo(header); $('
      ').appendTo(header); $('
      ').appendTo(header); - $('
      '+ + $('
      '+ + '
      '+ '
      '+ + '
      '+ '
      '+ // '
      '+ - '
      '+ - '
      '+ '
      ').appendTo(options.target); + $('
      ').appendTo(options.target); $('
      ').appendTo(options.target); $('
      ').appendTo(options.target); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/tabs.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/tabs.js index d9dc4b2893..a9fef7cee5 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/tabs.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/tabs.js @@ -545,7 +545,6 @@ RED.tabs = (function() { ul.find("li.red-ui-tab.active .red-ui-tab-label").css({paddingLeft:""}) } } - } ul.find("li.red-ui-tab a") @@ -1045,7 +1044,8 @@ RED.tabs = (function() { pinnedButtons["__menu__"].appendTo(collapsedButtonsRow); updateTabWidths(); } - } + }, + container: wrapper } return tabAPI; } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js index df42149009..1cd2d0b41e 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js @@ -613,6 +613,7 @@ RED.palette = (function() { const content = $('
      ') const toolbar = $('
      '); RED.sidebar.addTab({ + target: 'secondary', id: "palette", label: "Palette", name: "Palette", @@ -729,13 +730,7 @@ RED.palette = (function() { }); RED.popover.tooltip(paletteExpandAll,RED._('palette.actions.expand-all')); - RED.actions.add("core:toggle-palette", function(state) { - if (state === undefined) { - RED.menu.toggleSelected("menu-item-palette"); - } else { - togglePalette(state); - } - }); + try { paletteState = JSON.parse(RED.settings.getLocal("palette-state") || '{"filter":"", "collapsed": []}'); @@ -753,15 +748,6 @@ RED.palette = (function() { }, 10000) } - function togglePalette(state) { - if (!state) { - $("#red-ui-main-container").addClass("red-ui-palette-closed"); - } else { - $("#red-ui-main-container").removeClass("red-ui-palette-closed"); - } - setTimeout(function() { $(window).trigger("resize"); } ,200); - } - function getCategories() { var categories = []; $("#red-ui-palette-container .red-ui-palette-category").each(function(i,d) { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js index fa817f564a..f4ec5be40e 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js @@ -15,13 +15,29 @@ **/ RED.sidebar = (function() { - //$('#sidebar').tabs(); - var sidebar_tabs; + const primarySidebar = { + id: 'primary', + direction: 'right', + menuToggle: 'menu-item-sidebar', + minimumWidth: 180, + defaultWidth: 300 + } + + // Palette Sidebar + const secondarySidebar = { + id: 'secondary', + direction: 'left', + menuToggle: 'menu-item-palette', + minimumWidth: 180, + defaultWidth: 180 + } + + var knownTabs = {}; // We store the current sidebar tab id in localStorage as 'last-sidebar-tab' // This is restored when the editor is reloaded. - // We use sidebar_tabs.onchange to update localStorage. However that will + // We use primarySidebar.tabs.onchange to update localStorage. However that will // also get triggered when the first tab gets added to the tabs - typically // the 'info' tab. So we use the following variable to store the retrieved // value from localStorage before we start adding the actual tabs @@ -44,9 +60,10 @@ RED.sidebar = (function() { options = title; } + const targetSidebar = options.target === 'secondary' ? secondarySidebar : primarySidebar; delete options.closeable; - options.wrapper = $('
      ',{style:"height:100%"}).appendTo("#red-ui-sidebar-content") + options.wrapper = $('
      ',{style:"height:100%"}).appendTo(targetSidebar.content) options.wrapper.append(options.content); options.wrapper.hide(); @@ -55,7 +72,7 @@ RED.sidebar = (function() { } if (options.toolbar) { - $("#red-ui-sidebar-footer").append(options.toolbar); + targetSidebar.footer.append(options.toolbar); $(options.toolbar).hide(); } var id = options.id; @@ -74,131 +91,151 @@ RED.sidebar = (function() { knownTabs[options.id] = options; if (options.visible !== false) { - sidebar_tabs.addTab(knownTabs[options.id]); + targetSidebar.tabs.addTab(knownTabs[options.id]); + } + if (targetSidebar.tabs.count() > 1) { + targetSidebar.tabs.container.show() } } function removeTab(id) { - sidebar_tabs.removeTab(id); - $(knownTabs[id].wrapper).remove(); - if (knownTabs[id].footer) { - knownTabs[id].footer.remove(); + if (knownTabs[id]) { + const targetSidebar = knownTabs[id].target === 'secondary' ? secondarySidebar : primarySidebar; + targetSidebar.tabs.removeTab(id); + $(knownTabs[id].wrapper).remove(); + if (knownTabs[id].footer) { + knownTabs[id].footer.remove(); + } + delete knownTabs[id]; + RED.menu.removeItem("menu-item-view-menu-"+id); + if (targetSidebar.tabs.count() <= 1) { + targetSidebar.tabs.container.hide() + } } - delete knownTabs[id]; - RED.menu.removeItem("menu-item-view-menu-"+id); } var sidebarSeparator = {}; sidebarSeparator.dragging = false; - function setupSidebarSeparator() { - $("#red-ui-sidebar-separator").draggable({ + function setupSidebarSeparator(sidebar) { + const separator = $('
      '); + let scaleFactor = 1; + let controlClass = 'red-ui-sidebar-control-right'; + let controlSlideDirection = 'right'; + if (sidebar.direction === 'right') { + separator.insertBefore(sidebar.container); + } else if (sidebar.direction === 'left') { + scaleFactor = -1; + controlClass = 'red-ui-sidebar-control-left'; + controlSlideDirection = 'left'; + separator.insertAfter(sidebar.container); + } + separator.draggable({ axis: "x", start:function(event,ui) { sidebarSeparator.closing = false; sidebarSeparator.opening = false; - var winWidth = $("#red-ui-editor").width(); + // var winWidth = $("#red-ui-editor").width(); sidebarSeparator.start = ui.position.left; + sidebarSeparator.width = sidebar.container.width(); sidebarSeparator.chartWidth = $("#red-ui-workspace").width(); - sidebarSeparator.chartRight = winWidth-$("#red-ui-workspace").width()-$("#red-ui-workspace").offset().left-2; sidebarSeparator.dragging = true; - if (!RED.menu.isSelected("menu-item-sidebar")) { + if (!RED.menu.isSelected(sidebar.menuToggle)) { sidebarSeparator.opening = true; - var newChartRight = 7; - $("#red-ui-sidebar").addClass("closing"); - $("#red-ui-workspace").css("right",newChartRight); - $("#red-ui-editor-stack").css("right",newChartRight+1); - $("#red-ui-sidebar").width(0); - RED.menu.setSelected("menu-item-sidebar",true); + sidebar.container.width(0); + RED.menu.setSelected(sidebar.menuToggle,true); RED.events.emit("sidebar:resize"); } - sidebarSeparator.width = $("#red-ui-sidebar").width(); + sidebarSeparator.width = sidebar.container.width(); }, drag: function(event,ui) { - var d = ui.position.left-sidebarSeparator.start; - var newSidebarWidth = sidebarSeparator.width-d; + var d = scaleFactor * (ui.position.left-sidebarSeparator.start); + + var newSidebarWidth = sidebarSeparator.width - d; if (sidebarSeparator.opening) { - newSidebarWidth -= 3; + newSidebarWidth -= 3 * scaleFactor; } if (newSidebarWidth > 150) { - if (sidebarSeparator.chartWidth+d < 200) { + if (sidebarSeparator.chartWidth + d < 200) { ui.position.left = 200+sidebarSeparator.start-sidebarSeparator.chartWidth; d = ui.position.left-sidebarSeparator.start; newSidebarWidth = sidebarSeparator.width-d; } } - if (newSidebarWidth < 150) { - if (!sidebarSeparator.closing) { - $("#red-ui-sidebar").addClass("closing"); - sidebarSeparator.closing = true; - } - if (!sidebarSeparator.opening) { - newSidebarWidth = 150; - ui.position.left = sidebarSeparator.width-(150 - sidebarSeparator.start); - d = ui.position.left-sidebarSeparator.start; + if (newSidebarWidth < sidebar.minimumWidth) { + if (newSidebarWidth > 100) { + newSidebarWidth = sidebar.minimumWidth + sidebarSeparator.closing = false + } else { + newSidebarWidth = 0 + sidebarSeparator.closing = true } - } else if (newSidebarWidth > 150 && (sidebarSeparator.closing || sidebarSeparator.opening)) { - sidebarSeparator.closing = false; - $("#red-ui-sidebar").removeClass("closing"); + } else { + sidebarSeparator.closing = false } + sidebar.container.width(newSidebarWidth); + ui.position.left -= scaleFactor * d - var newChartRight = sidebarSeparator.chartRight-d; - $("#red-ui-workspace").css("right",newChartRight); - $("#red-ui-editor-stack").css("right",newChartRight+1); - $("#red-ui-sidebar").width(newSidebarWidth); - - sidebar_tabs.resize(); + sidebar.tabs.resize(); RED.events.emit("sidebar:resize"); }, stop:function(event,ui) { sidebarSeparator.dragging = false; if (sidebarSeparator.closing) { - $("#red-ui-sidebar").removeClass("closing"); - RED.menu.setSelected("menu-item-sidebar",false); - if ($("#red-ui-sidebar").width() < 180) { - $("#red-ui-sidebar").width(180); - $("#red-ui-workspace").css("right",187); - $("#red-ui-editor-stack").css("right",188); + sidebar.container.removeClass("closing"); + if (sidebar.menuToggle) { + RED.menu.setSelected(sidebar.menuToggle,false); + } + sidebar.container.hide() + if (sidebar.container.width() < sidebar.minimumWidth) { + sidebar.container.width(sidebar.defaultWidth); } } - $("#red-ui-sidebar-separator").css("left","auto"); - $("#red-ui-sidebar-separator").css("right",($("#red-ui-sidebar").width()+2)+"px"); + // $(".red-ui-sidebar-separator").css("left","auto"); + // $(".red-ui-sidebar-separator").css("right",(sidebar.container.width()+2)+"px"); RED.events.emit("sidebar:resize"); } }); - var sidebarControls = $('
      ').appendTo($("#red-ui-sidebar-separator")); + var sidebarControls = $('
      ').appendTo(separator); + sidebarControls.addClass(controlClass) sidebarControls.on("click", function() { sidebarControls.hide(); - RED.menu.toggleSelected("menu-item-sidebar"); + RED.menu.toggleSelected(sidebar.menuToggle); }) - $("#red-ui-sidebar-separator").on("mouseenter", function() { + separator.on("mouseenter", function() { if (!sidebarSeparator.dragging) { - if (RED.menu.isSelected("menu-item-sidebar")) { + if ( (RED.menu.isSelected(sidebar.menuToggle) && sidebar.direction === 'right') || + (!RED.menu.isSelected(sidebar.menuToggle) && sidebar.direction === 'left') ) { sidebarControls.find("i").addClass("fa-chevron-right").removeClass("fa-chevron-left"); } else { sidebarControls.find("i").removeClass("fa-chevron-right").addClass("fa-chevron-left"); } - sidebarControls.toggle("slide", { direction: "right" }, 200); + sidebarControls.toggle("slide", { direction: controlSlideDirection }, 200); } }) - $("#red-ui-sidebar-separator").on("mouseleave", function() { + separator.on("mouseleave", function() { if (!sidebarSeparator.dragging) { sidebarControls.stop(false,true); sidebarControls.hide(); } }); + return separator } - function toggleSidebar(state) { + function toggleSidebar(sidebar, state) { if (!state) { - $("#red-ui-main-container").addClass("red-ui-sidebar-closed"); + sidebar.container.hide() } else { - $("#red-ui-main-container").removeClass("red-ui-sidebar-closed"); - sidebar_tabs.resize(); + // console.log(sidebar.container.width(),sidebar.tabs.container.width()) + sidebar.container.show() + sidebar.tabs.container.width() + setTimeout(function () { + sidebar.tabs.resize() + }, 100) } RED.events.emit("sidebar:resize"); } @@ -208,36 +245,43 @@ RED.sidebar = (function() { id = lastSessionSelectedTab || RED.settings.get("editor.sidebar.order",["info", "help", "version-control", "debug"])[0] } if (id) { - if (!containsTab(id) && knownTabs[id]) { - sidebar_tabs.addTab(knownTabs[id]); - } - sidebar_tabs.activateTab(id); - if (!skipShowSidebar && !RED.menu.isSelected("menu-item-sidebar")) { - RED.menu.setSelected("menu-item-sidebar",true); + const tabOptions = knownTabs[id]; + if (tabOptions) { + const targetSidebar = tabOptions.target === 'secondary' ? secondarySidebar : primarySidebar; + if (!targetSidebar.tabs.contains(id)) { + targetSidebar.tabs.addTab(knownTabs[id]); + } + targetSidebar.tabs.activateTab(id); + if (!skipShowSidebar && !RED.menu.isSelected(targetSidebar.menuToggle)) { + RED.menu.setSelected(targetSidebar.menuToggle,true); + } } } } function containsTab(id) { - return sidebar_tabs.contains(id); + return primarySidebar.tabs.contains(id); } - function init () { - console.log('sidebar init') - setupSidebarSeparator(); - sidebar_tabs = RED.tabs.create({ - element: $('
        ').appendTo("#red-ui-sidebar"), + function setupSidebar(sidebar) { + sidebar.container.addClass("red-ui-sidebar"); + sidebar.container.width(sidebar.defaultWidth); + sidebar.separator = setupSidebarSeparator(sidebar); + sidebar.tabs = RED.tabs.create({ + element: $('
          ').appendTo(sidebar.container), onchange:function(tab) { - $("#red-ui-sidebar-content").children().hide(); - $("#red-ui-sidebar-footer").children().hide(); - if (tab.onchange) { - tab.onchange.call(tab); - } - $(tab.wrapper).show(); - if (tab.toolbar) { - $(tab.toolbar).show(); + sidebar.content.children().hide(); + sidebar.footer.children().hide(); + if (tab) { + if (tab.onchange) { + tab.onchange.call(tab); + } + $(tab.wrapper).show(); + if (tab.toolbar) { + $(tab.toolbar).show(); + } + RED.settings.setLocal("last-sidebar-tab", tab.id) } - RED.settings.setLocal("last-sidebar-tab", tab.id) }, onremove: function(tab) { $(tab.wrapper).hide(); @@ -253,19 +297,35 @@ RED.sidebar = (function() { order: RED.settings.get("editor.sidebar.order",["info", "help", "version-control", "debug"]) // scrollable: true }); + sidebar.tabs.container.hide() + sidebar.content = $('
          ').appendTo(sidebar.container); + sidebar.footer = $('').appendTo(sidebar.container); + sidebar.shade = $('
          ').appendTo(sidebar.container); - $('
          ').appendTo("#red-ui-sidebar"); - $('').appendTo("#red-ui-sidebar"); - $('
          ').appendTo("#red-ui-sidebar"); + } + function init () { + primarySidebar.container = $("#red-ui-sidebar"); + setupSidebar(primarySidebar) + secondarySidebar.container = $("#red-ui-sidebar-left"); + setupSidebar(secondarySidebar) RED.actions.add("core:toggle-sidebar",function(state){ if (state === undefined) { - RED.menu.toggleSelected("menu-item-sidebar"); + RED.menu.toggleSelected(primarySidebar.menuToggle); } else { - toggleSidebar(state); + toggleSidebar(primarySidebar, state); } }); - RED.popover.tooltip($("#red-ui-sidebar-separator").find(".red-ui-sidebar-control-right"),RED._("keyboard.toggleSidebar"),"core:toggle-sidebar"); + RED.actions.add("core:toggle-palette", function(state) { + if (state === undefined) { + RED.menu.toggleSelected(secondarySidebar.menuToggle); + } else { + toggleSidebar(secondarySidebar, state); + } + }); + + + RED.popover.tooltip(primarySidebar.separator.find(".red-ui-sidebar-control-right"),RED._("keyboard.toggleSidebar"),"core:toggle-sidebar"); lastSessionSelectedTab = RED.settings.getLocal("last-sidebar-tab") @@ -273,7 +333,7 @@ RED.sidebar = (function() { RED.sidebar.help.init(); RED.sidebar.config.init(); RED.sidebar.context.init(); - // hide info bar at start if screen rather narrow... + // hide sidebar at start if screen rather narrow... if ($("#red-ui-editor").width() < 600) { RED.menu.setSelected("menu-item-sidebar",false); } } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js index fa9b98322b..b6fdb8f33c 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js @@ -119,6 +119,7 @@ RED.sidebar.info = (function() { RED.sidebar.addTab({ id: "info", + // target: "secondary", label: RED._("sidebar.info.label"), name: RED._("sidebar.info.name"), iconClass: "fa fa-info", diff --git a/packages/node_modules/@node-red/editor-client/src/sass/base.scss b/packages/node_modules/@node-red/editor-client/src/sass/base.scss index afbafe049b..b6bded65d6 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/base.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/base.scss @@ -42,6 +42,8 @@ body { position: absolute; top: var(--red-ui-header-height); left:0; bottom: 0; right:0; overflow:hidden; + display: flex; + flex-direction: row; } #red-ui-palette-shade, #red-ui-editor-shade, #red-ui-header-shade, #red-ui-sidebar-shade { diff --git a/packages/node_modules/@node-red/editor-client/src/sass/palette.scss b/packages/node_modules/@node-red/editor-client/src/sass/palette.scss index d451d44a81..39b17eab2c 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/palette.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/palette.scss @@ -49,17 +49,6 @@ // } } -.red-ui-palette-closed { - #red-ui-palette { - width: 8px; - .red-ui-component-footer { - display: none; - } - } - #red-ui-palette-search { display: none; } - #red-ui-palette-container { display: none; } -} - .red-ui-palette-scroll { position: absolute; top: 35px; diff --git a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss index 47c8dbc131..acd983aad3 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss @@ -16,38 +16,42 @@ * limitations under the License. **/ -#red-ui-sidebar { - position: absolute; - top: 0px; - right: 0px; - bottom: 0px; +.red-ui-sidebar { + position: relative; + flex-grow: 0; + flex-shrink: 0; width: 315px; background: var(--red-ui-primary-background); box-sizing: border-box; z-index: 10; @include mixins.component-border; + display: flex; + flex-direction: column; } #red-ui-sidebar.closing { border-style: dashed; } - -#red-ui-sidebar-content { - position: absolute; +.red-ui-sidebar > .red-ui-tabs { + flex-grow: 0; + flex-shrink: 0; +} +.red-ui-sidebar-footer { + @include mixins.component-footer; + position: relative; + flex-grow: 0; + flex-shrink: 0; +} +.red-ui-sidebar-content { + position: relative; background: var(--red-ui-secondary-background); - top: 35px; - right: 0; - bottom: 25px; - left: 0px; + flex-grow: 1; overflow-y: auto; } -#red-ui-sidebar-separator { - position: absolute; - top: 5px; - right: 315px; - bottom:10px; - width: 7px; +.red-ui-sidebar-separator { + width: 10px; + flex: 0 0 auto; // z-index: 11; background-color: var(--red-ui-primary-background); cursor: col-resize; @@ -69,12 +73,7 @@ } } -.red-ui-sidebar-closed > #red-ui-sidebar { display: none; } -.red-ui-sidebar-closed > #red-ui-sidebar-separator { right: 0px !important; } -.red-ui-sidebar-closed > #red-ui-workspace { right: 7px !important; } -.red-ui-sidebar-closed > #red-ui-editor-stack { right: 8px !important; } - -#red-ui-sidebar .button { +.red-ui-sidebar .button { @include mixins.workspace-button; line-height: 18px; font-size: 12px; @@ -138,7 +137,7 @@ button.red-ui-sidebar-header-button-toggle { display: none; position: absolute; top: calc(50% - 26px); - + z-index: 13; padding:15px 8px; border:1px solid var(--red-ui-primary-border-color); background:var(--red-ui-primary-background); @@ -152,7 +151,6 @@ button.red-ui-sidebar-header-button-toggle { right: calc(100%); border-top-left-radius: 5px; border-bottom-left-radius: 5px; - z-index: 13; } .red-ui-sidebar-control-left { @include red-ui-sidebar-control; diff --git a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss index 95b8b4b458..d95cbf295a 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss @@ -17,15 +17,12 @@ **/ #red-ui-workspace { - position: absolute; margin: 0; - top:0px; - left:179px; - bottom: 0px; - right: 322px; overflow: hidden; @include mixins.component-border; transition: left 0.1s ease-in-out; + position: relative; + flex-grow: 1; } #red-ui-workspace-chart { @@ -66,22 +63,6 @@ } } -.red-ui-palette-closed #red-ui-workspace { - left: 7px; -} - -// .workspace-footer-button { -// @include component-footer-button; -// margin-left: 2px; -// margin-right: 2px; -// } -// -// .workspace-footer-button-toggle { -// @include component-footer-button-toggle; -// margin-left: 2px; -// margin-right: 2px; -// } - #red-ui-workspace-tabs:not(.red-ui-workspace-focussed) { opacity:0.8; } From 2e777db80c87fbb48e83ab49568116c2cb5a551b Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 24 Oct 2025 11:40:56 +0100 Subject: [PATCH 062/160] Handle resizing and shade on separators --- .../editor-client/src/js/ui/actionList.js | 8 +- .../editor-client/src/js/ui/deploy.js | 4 +- .../@node-red/editor-client/src/js/ui/diff.js | 4 +- .../src/js/ui/projects/projectSettings.js | 4 +- .../editor-client/src/js/ui/search.js | 8 +- .../editor-client/src/js/ui/sidebar.js | 132 +++++++++--------- .../@node-red/editor-client/src/js/ui/tray.js | 2 + .../editor-client/src/js/ui/userSettings.js | 4 +- .../@node-red/editor-client/src/js/ui/view.js | 4 +- .../editor-client/src/sass/base.scss | 7 +- .../editor-client/src/sass/sidebar.scss | 6 +- 11 files changed, 91 insertions(+), 92 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js b/packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js index d47a20f5d2..4ec773d395 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js @@ -154,8 +154,7 @@ RED.actionList = (function() { $("#red-ui-header-shade").show(); $("#red-ui-editor-shade").show(); $("#red-ui-palette-shade").show(); - $("#red-ui-sidebar-shade").show(); - $("#red-ui-sidebar-separator").hide(); + $(".red-ui-sidebar-shade").show(); if (dialog === null) { createDialog(); } @@ -189,8 +188,7 @@ RED.actionList = (function() { $("#red-ui-header-shade").hide(); $("#red-ui-editor-shade").hide(); $("#red-ui-palette-shade").hide(); - $("#red-ui-sidebar-shade").hide(); - $("#red-ui-sidebar-separator").show(); + $(".red-ui-sidebar-shade").hide(); if (dialog !== null) { dialog.slideUp(200,function() { searchInput.searchBox('value',''); @@ -222,7 +220,7 @@ RED.actionList = (function() { $("#red-ui-header-shade").on('mousedown',hide); $("#red-ui-editor-shade").on('mousedown',hide); $("#red-ui-palette-shade").on('mousedown',hide); - $("#red-ui-sidebar-shade").on('mousedown',hide); + $(".red-ui-sidebar-shade").on('mousedown',hide); } return { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js b/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js index d318f476cb..456c0f249f 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js @@ -313,13 +313,13 @@ RED.deploy = (function() { $("#red-ui-header-shade").show(); $("#red-ui-editor-shade").show(); $("#red-ui-palette-shade").show(); - $("#red-ui-sidebar-shade").show(); + $(".red-ui-sidebar-shade").show(); } function shadeHide() { $("#red-ui-header-shade").hide(); $("#red-ui-editor-shade").hide(); $("#red-ui-palette-shade").hide(); - $("#red-ui-sidebar-shade").hide(); + $(".red-ui-sidebar-shade").hide(); } function deployButtonSetBusy(){ $(".red-ui-deploy-button-content").css('opacity',0); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/diff.js b/packages/node_modules/@node-red/editor-client/src/js/ui/diff.js index 26cdceb7e5..186a56fcca 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/diff.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/diff.js @@ -1363,11 +1363,11 @@ RED.diff = (function() { diffTable.finish(); diffTable.list.show(); },300); - $("#red-ui-sidebar-shade").show(); + $(".red-ui-sidebar-shade").show(); }, close: function() { diffVisible = false; - $("#red-ui-sidebar-shade").hide(); + $(".red-ui-sidebar-shade").hide(); }, show: function() { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectSettings.js b/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectSettings.js index b682a5f60e..0c47c45108 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectSettings.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/projects/projectSettings.js @@ -95,7 +95,7 @@ RED.projects.settings = (function() { }); settingsContent.i18n(); settingsTabs.activateTab("red-ui-project-settings-tab-"+(initialTab||'main')) - $("#red-ui-sidebar-shade").show(); + $(".red-ui-sidebar-shade").show(); }, close: function() { settingsVisible = false; @@ -104,7 +104,7 @@ RED.projects.settings = (function() { pane.close(); } }); - $("#red-ui-sidebar-shade").hide(); + $(".red-ui-sidebar-shade").hide(); }, show: function() {} diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js index 3903a4a0a9..d07023484b 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js @@ -518,8 +518,7 @@ RED.search = (function() { $("#red-ui-header-shade").show(); $("#red-ui-editor-shade").show(); $("#red-ui-palette-shade").show(); - $("#red-ui-sidebar-shade").show(); - $("#red-ui-sidebar-separator").hide(); + $(".red-ui-sidebar-shade").show(); if (dialog === null) { createDialog(); @@ -543,8 +542,7 @@ RED.search = (function() { $("#red-ui-header-shade").hide(); $("#red-ui-editor-shade").hide(); $("#red-ui-palette-shade").hide(); - $("#red-ui-sidebar-shade").hide(); - $("#red-ui-sidebar-separator").show(); + $(".red-ui-sidebar-shade").hide(); if (dialog !== null) { dialog.slideUp(200,function() { searchInput.searchBox('value',''); @@ -644,7 +642,7 @@ RED.search = (function() { $("#red-ui-header-shade").on('mousedown',hide); $("#red-ui-editor-shade").on('mousedown',hide); $("#red-ui-palette-shade").on('mousedown',hide); - $("#red-ui-sidebar-shade").on('mousedown',hide); + $(".red-ui-sidebar-shade").on('mousedown',hide); $("#red-ui-view-searchtools-close").on("click", function close() { clearActiveSearch(); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js index f4ec5be40e..be6f8863a0 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js @@ -20,6 +20,7 @@ RED.sidebar = (function() { direction: 'right', menuToggle: 'menu-item-sidebar', minimumWidth: 180, + maximumWidth: 800, defaultWidth: 300 } @@ -29,10 +30,10 @@ RED.sidebar = (function() { direction: 'left', menuToggle: 'menu-item-palette', minimumWidth: 180, + maximumWidth: 180, defaultWidth: 180 } - var knownTabs = {}; // We store the current sidebar tab id in localStorage as 'last-sidebar-tab' @@ -119,6 +120,7 @@ RED.sidebar = (function() { function setupSidebarSeparator(sidebar) { const separator = $('
          '); + const shade = $('
          ').appendTo(separator); let scaleFactor = 1; let controlClass = 'red-ui-sidebar-control-right'; let controlSlideDirection = 'right'; @@ -131,73 +133,75 @@ RED.sidebar = (function() { separator.insertAfter(sidebar.container); } separator.draggable({ - axis: "x", - start:function(event,ui) { - sidebarSeparator.closing = false; - sidebarSeparator.opening = false; - // var winWidth = $("#red-ui-editor").width(); - sidebarSeparator.start = ui.position.left; - sidebarSeparator.width = sidebar.container.width(); - sidebarSeparator.chartWidth = $("#red-ui-workspace").width(); - sidebarSeparator.dragging = true; - - if (!RED.menu.isSelected(sidebar.menuToggle)) { - sidebarSeparator.opening = true; - sidebar.container.width(0); - RED.menu.setSelected(sidebar.menuToggle,true); - RED.events.emit("sidebar:resize"); - } - sidebarSeparator.width = sidebar.container.width(); - }, - drag: function(event,ui) { - var d = scaleFactor * (ui.position.left-sidebarSeparator.start); - - var newSidebarWidth = sidebarSeparator.width - d; - if (sidebarSeparator.opening) { - newSidebarWidth -= 3 * scaleFactor; - } - - if (newSidebarWidth > 150) { - if (sidebarSeparator.chartWidth + d < 200) { - ui.position.left = 200+sidebarSeparator.start-sidebarSeparator.chartWidth; - d = ui.position.left-sidebarSeparator.start; - newSidebarWidth = sidebarSeparator.width-d; - } + axis: "x", + start:function(event,ui) { + if (shade.is(":visible")) { + return false + } + sidebarSeparator.closing = false; + sidebarSeparator.opening = false; + // var winWidth = $("#red-ui-editor").width(); + sidebarSeparator.start = ui.position.left; + sidebarSeparator.width = sidebar.container.width(); + sidebarSeparator.chartWidth = $("#red-ui-workspace").width(); + sidebarSeparator.dragging = true; + + if (!RED.menu.isSelected(sidebar.menuToggle)) { + sidebarSeparator.opening = true; + sidebar.container.width(0); + RED.menu.setSelected(sidebar.menuToggle,true); + RED.events.emit("sidebar:resize"); + } + sidebarSeparator.width = sidebar.container.width(); + }, + drag: function(event,ui) { + var d = scaleFactor * (ui.position.left-sidebarSeparator.start); + + var newSidebarWidth = sidebarSeparator.width - d; + if (newSidebarWidth > sidebar.maximumWidth) { + newSidebarWidth = sidebar.maximumWidth; + d = sidebarSeparator.width - sidebar.maximumWidth; + ui.position.left = sidebarSeparator.start + scaleFactor * d; + } + + if (newSidebarWidth > sidebar.minimumWidth) { + if (sidebarSeparator.chartWidth + d < 200) { + // Chart is now too small, but we have room to resize the sidebar + d += (200 - (sidebarSeparator.chartWidth + d)); + newSidebarWidth = sidebarSeparator.width - d; + ui.position.left = sidebarSeparator.start + scaleFactor * d; } - - if (newSidebarWidth < sidebar.minimumWidth) { - if (newSidebarWidth > 100) { - newSidebarWidth = sidebar.minimumWidth - sidebarSeparator.closing = false - } else { - newSidebarWidth = 0 - sidebarSeparator.closing = true - } - } else { + } else if (newSidebarWidth < sidebar.minimumWidth) { + if (newSidebarWidth > 100) { + newSidebarWidth = sidebar.minimumWidth sidebarSeparator.closing = false + } else { + newSidebarWidth = 0 + sidebarSeparator.closing = true } - sidebar.container.width(newSidebarWidth); - ui.position.left -= scaleFactor * d + } else { + sidebarSeparator.closing = false + } + sidebar.container.width(newSidebarWidth); + ui.position.left -= scaleFactor * d - sidebar.tabs.resize(); - RED.events.emit("sidebar:resize"); - }, - stop:function(event,ui) { - sidebarSeparator.dragging = false; - if (sidebarSeparator.closing) { - sidebar.container.removeClass("closing"); - if (sidebar.menuToggle) { - RED.menu.setSelected(sidebar.menuToggle,false); - } - sidebar.container.hide() - if (sidebar.container.width() < sidebar.minimumWidth) { - sidebar.container.width(sidebar.defaultWidth); - } + sidebar.tabs.resize(); + RED.events.emit("sidebar:resize"); + }, + stop:function(event,ui) { + sidebarSeparator.dragging = false; + if (sidebarSeparator.closing) { + sidebar.container.removeClass("closing"); + if (sidebar.menuToggle) { + RED.menu.setSelected(sidebar.menuToggle,false); + } + sidebar.container.hide() + if (sidebar.container.width() < sidebar.minimumWidth) { + sidebar.container.width(sidebar.defaultWidth); } - // $(".red-ui-sidebar-separator").css("left","auto"); - // $(".red-ui-sidebar-separator").css("right",(sidebar.container.width()+2)+"px"); - RED.events.emit("sidebar:resize"); } + RED.events.emit("sidebar:resize"); + } }); var sidebarControls = $('
          ').appendTo(separator); @@ -207,7 +211,7 @@ RED.sidebar = (function() { RED.menu.toggleSelected(sidebar.menuToggle); }) separator.on("mouseenter", function() { - if (!sidebarSeparator.dragging) { + if (!sidebarSeparator.dragging && !shade.is(":visible")) { if ( (RED.menu.isSelected(sidebar.menuToggle) && sidebar.direction === 'right') || (!RED.menu.isSelected(sidebar.menuToggle) && sidebar.direction === 'left') ) { sidebarControls.find("i").addClass("fa-chevron-right").removeClass("fa-chevron-left"); @@ -218,7 +222,7 @@ RED.sidebar = (function() { } }) separator.on("mouseleave", function() { - if (!sidebarSeparator.dragging) { + if (!sidebarSeparator.dragging && !shade.is(":visible")) { sidebarControls.stop(false,true); sidebarControls.hide(); } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tray.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tray.js index b0f188457d..faeac3a22e 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tray.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tray.js @@ -194,6 +194,8 @@ } function handleWindowResize() { + // TODO: red-ui-sidebar has a width when hidden - so we need to handle that case and set the right pos to its separator + $("#red-ui-editor-stack").css('right', $("#red-ui-sidebar").outerWidth() + 11); if (stack.length > 0) { var tray = stack[stack.length-1]; if (tray.options.maximized || tray.width > $("#red-ui-editor-stack").position().left-8) { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js b/packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js index 3bc99e6026..a1a1a56615 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js @@ -81,7 +81,7 @@ RED.userSettings = (function() { }); settingsContent.i18n(); settingsTabs.activateTab("red-ui-settings-tab-"+(initialTab||'view')) - $("#red-ui-sidebar-shade").show(); + $(".red-ui-sidebar-shade").show(); }, close: function() { settingsVisible = false; @@ -90,7 +90,7 @@ RED.userSettings = (function() { pane.close(); } }); - $("#red-ui-sidebar-shade").hide(); + $(".red-ui-sidebar-shade").hide(); }, show: function() {} diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 89019005fe..b28c473ae1 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -6973,7 +6973,7 @@ RED.view = (function() { selectNodes: function(options) { $("#red-ui-workspace-tabs-shade").show(); $("#red-ui-palette-shade").show(); - $("#red-ui-sidebar-shade").show(); + $(".red-ui-sidebar-shade").show(); $("#red-ui-header-shade").show(); $("#red-ui-workspace").addClass("red-ui-workspace-select-mode"); @@ -6995,7 +6995,7 @@ RED.view = (function() { clearSelection(); $("#red-ui-workspace-tabs-shade").hide(); $("#red-ui-palette-shade").hide(); - $("#red-ui-sidebar-shade").hide(); + $(".red-ui-sidebar-shade").hide(); $("#red-ui-header-shade").hide(); $("#red-ui-workspace").removeClass("red-ui-workspace-select-mode"); resetMouseVars(); diff --git a/packages/node_modules/@node-red/editor-client/src/sass/base.scss b/packages/node_modules/@node-red/editor-client/src/sass/base.scss index b6bded65d6..298dab4167 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/base.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/base.scss @@ -46,15 +46,10 @@ body { flex-direction: row; } -#red-ui-palette-shade, #red-ui-editor-shade, #red-ui-header-shade, #red-ui-sidebar-shade { +#red-ui-palette-shade, #red-ui-editor-shade, #red-ui-header-shade, .red-ui-sidebar-shade { @include mixins.shade; z-index: 5; } -#red-ui-sidebar-shade { - left: -8px; - top: -1px; - bottom: -1px; -} #red-ui-full-shade { @include mixins.shade; z-index: 15; diff --git a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss index acd983aad3..e098b39a7d 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss @@ -128,8 +128,10 @@ button.red-ui-sidebar-header-button-toggle { border-left: none; } -.red-ui-sidebar-shade { - @include mixins.shade; +.red-ui-sidebar-separator .red-ui-sidebar-shade { + // Other shades overlay their element so consume pointer events + // Sidebar separator shade is a child element so needs to explicitly block + pointer-events: none; } From 0ead2d815c5a707a7dbb7a2d7b0874a4107f905d Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 24 Oct 2025 17:35:00 +0100 Subject: [PATCH 063/160] Update sidebar tab ux --- .../editor-client/src/js/ui/sidebar.js | 270 +++++++++++------- .../editor-client/src/sass/sidebar.scss | 57 ++-- 2 files changed, 192 insertions(+), 135 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js index be6f8863a0..67f2bb5beb 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js @@ -15,30 +15,30 @@ **/ RED.sidebar = (function() { - const primarySidebar = { - id: 'primary', - direction: 'right', - menuToggle: 'menu-item-sidebar', - minimumWidth: 180, - maximumWidth: 800, - defaultWidth: 300 - } - - // Palette Sidebar - const secondarySidebar = { - id: 'secondary', - direction: 'left', - menuToggle: 'menu-item-palette', - minimumWidth: 180, - maximumWidth: 180, - defaultWidth: 180 + const sidebars = { + primary: { + id: 'primary', + direction: 'right', + menuToggle: 'menu-item-sidebar', + minimumWidth: 180, + maximumWidth: 800, + defaultWidth: 300 + }, + secondary: { + id: 'secondary', + direction: 'left', + menuToggle: 'menu-item-palette', + minimumWidth: 180, + maximumWidth: 800, + defaultWidth: 180 + } } var knownTabs = {}; // We store the current sidebar tab id in localStorage as 'last-sidebar-tab' // This is restored when the editor is reloaded. - // We use primarySidebar.tabs.onchange to update localStorage. However that will + // We use sidebars.primary.tabs.onchange to update localStorage. However that will // also get triggered when the first tab gets added to the tabs - typically // the 'info' tab. So we use the following variable to store the retrieved // value from localStorage before we start adding the actual tabs @@ -61,7 +61,7 @@ RED.sidebar = (function() { options = title; } - const targetSidebar = options.target === 'secondary' ? secondarySidebar : primarySidebar; + const targetSidebar = options.target === 'secondary' ? sidebars.secondary : sidebars.primary; delete options.closeable; options.wrapper = $('
          ',{style:"height:100%"}).appendTo(targetSidebar.content) @@ -91,45 +91,115 @@ RED.sidebar = (function() { knownTabs[options.id] = options; - if (options.visible !== false) { - targetSidebar.tabs.addTab(knownTabs[options.id]); + options.tabButton = $('').appendTo(targetSidebar.tabBar); + options.tabButton.attr('data-tab-id', options.id) + + options.tabButtonTooltip = RED.popover.tooltip(options.tabButton, options.name, options.action); + if (options.icon) { + $('',{style:"mask-image: url("+options.icon+"); -webkit-mask-image: url("+options.icon+");"}).appendTo(options.tabButton); + } else if (options.iconClass) { + $('',{class:options.iconClass}).appendTo(options.tabButton); } - if (targetSidebar.tabs.count() > 1) { - targetSidebar.tabs.container.show() + options.tabButton.on('click', function() { + const targetSidebar = options.target === 'secondary' ? sidebars.secondary : sidebars.primary; + if (targetSidebar.activeTab === options.id && RED.menu.isSelected(targetSidebar.menuToggle)) { + RED.menu.setSelected(targetSidebar.menuToggle, false); + } else { + RED.sidebar.show(options.id) + } + }) + if (targetSidebar.content.children().length === 1) { + RED.sidebar.show(options.id) } } function removeTab(id) { if (knownTabs[id]) { - const targetSidebar = knownTabs[id].target === 'secondary' ? secondarySidebar : primarySidebar; - targetSidebar.tabs.removeTab(id); + const targetSidebar = knownTabs[id].target === 'secondary' ? sidebars.secondary : sidebars.primary; $(knownTabs[id].wrapper).remove(); if (knownTabs[id].footer) { knownTabs[id].footer.remove(); } - delete knownTabs[id]; + targetSidebar.tabBar.find('button[data-tab-id="'+id+'"]').remove() RED.menu.removeItem("menu-item-view-menu-"+id); - if (targetSidebar.tabs.count() <= 1) { - targetSidebar.tabs.container.hide() + if (knownTabs[id].onremove) { + knownTabs[id].onremove.call(knownTabs[id]); + } + delete knownTabs[id]; + const firstTab = targetSidebar.tabBar.find('button').first().attr('data-tab-id'); + if (firstTab) { + RED.sidebar.show(firstTab); } } } + function moveTab(id, targetSidebar) { + const options = knownTabs[id]; + options.target = targetSidebar.id; + $(options.wrapper).appendTo(targetSidebar.content); + if (options.toolbar) { + targetSidebar.footer.append(options.toolbar); + } + // Reset the tooltip so its left/right direction is recalculated + options.tabButtonTooltip.delete() + options.tabButtonTooltip = RED.popover.tooltip(options.tabButton, options.name, options.action); + + } + var sidebarSeparator = {}; sidebarSeparator.dragging = false; + function setupSidebarTabs(sidebar) { + const tabBar = $('
          ') + tabBar.data('sidebar', sidebar.id) + if (sidebar.direction === 'right') { + tabBar.insertAfter(sidebar.container); + } else if (sidebar.direction === 'left') { + tabBar.insertBefore(sidebar.container); + } + tabBar.sortable({ + cancel: false, + placeholder: "red-ui-sidebar-tab-bar-button-placeholder", + connectWith: ".red-ui-sidebar-tab-bar", + start: function(event, ui) { + // Remove the tooltip so it doesn't display unexpectedly whilst dragging + const tabId = ui.item.attr('data-tab-id'); + const options = knownTabs[tabId]; + options.tabButtonTooltip.delete() + }, + stop: function(event, ui) { + // Restore the tooltip + const tabId = ui.item.attr('data-tab-id'); + const options = knownTabs[tabId]; + options.tabButtonTooltip.delete() + options.tabButtonTooltip = RED.popover.tooltip(options.tabButton, options.name, options.action); + }, + receive: function(event, ui) { + // Tab has been moved from one sidebar to another + const src = sidebars[ui.sender.data('sidebar')] + const dest = sidebars[$(this).data('sidebar')] + const tabId = ui.item.attr('data-tab-id'); + const tabOptions = knownTabs[tabId]; + moveTab(tabId, dest) + if (ui.item.hasClass('selected')) { + const firstTab = src.tabBar.find('button').first().attr('data-tab-id'); + if (firstTab) { + RED.sidebar.show(firstTab); + } + } + RED.sidebar.show(tabId) + } + }) + return tabBar + } function setupSidebarSeparator(sidebar) { const separator = $('
          '); const shade = $('
          ').appendTo(separator); let scaleFactor = 1; - let controlClass = 'red-ui-sidebar-control-right'; - let controlSlideDirection = 'right'; if (sidebar.direction === 'right') { separator.insertBefore(sidebar.container); } else if (sidebar.direction === 'left') { scaleFactor = -1; - controlClass = 'red-ui-sidebar-control-left'; - controlSlideDirection = 'left'; separator.insertAfter(sidebar.container); } separator.draggable({ @@ -185,7 +255,7 @@ RED.sidebar = (function() { sidebar.container.width(newSidebarWidth); ui.position.left -= scaleFactor * d - sidebar.tabs.resize(); + // sidebar.tabs.resize(); RED.events.emit("sidebar:resize"); }, stop:function(event,ui) { @@ -196,6 +266,7 @@ RED.sidebar = (function() { RED.menu.setSelected(sidebar.menuToggle,false); } sidebar.container.hide() + sidebar.separator.hide() if (sidebar.container.width() < sidebar.minimumWidth) { sidebar.container.width(sidebar.defaultWidth); } @@ -203,43 +274,16 @@ RED.sidebar = (function() { RED.events.emit("sidebar:resize"); } }); - - var sidebarControls = $('
          ').appendTo(separator); - sidebarControls.addClass(controlClass) - sidebarControls.on("click", function() { - sidebarControls.hide(); - RED.menu.toggleSelected(sidebar.menuToggle); - }) - separator.on("mouseenter", function() { - if (!sidebarSeparator.dragging && !shade.is(":visible")) { - if ( (RED.menu.isSelected(sidebar.menuToggle) && sidebar.direction === 'right') || - (!RED.menu.isSelected(sidebar.menuToggle) && sidebar.direction === 'left') ) { - sidebarControls.find("i").addClass("fa-chevron-right").removeClass("fa-chevron-left"); - } else { - sidebarControls.find("i").removeClass("fa-chevron-right").addClass("fa-chevron-left"); - } - sidebarControls.toggle("slide", { direction: controlSlideDirection }, 200); - } - }) - separator.on("mouseleave", function() { - if (!sidebarSeparator.dragging && !shade.is(":visible")) { - sidebarControls.stop(false,true); - sidebarControls.hide(); - } - }); return separator } function toggleSidebar(sidebar, state) { if (!state) { sidebar.container.hide() + sidebar.separator.hide() } else { - // console.log(sidebar.container.width(),sidebar.tabs.container.width()) sidebar.container.show() - sidebar.tabs.container.width() - setTimeout(function () { - sidebar.tabs.resize() - }, 100) + sidebar.separator.show() } RED.events.emit("sidebar:resize"); } @@ -251,11 +295,21 @@ RED.sidebar = (function() { if (id) { const tabOptions = knownTabs[id]; if (tabOptions) { - const targetSidebar = tabOptions.target === 'secondary' ? secondarySidebar : primarySidebar; - if (!targetSidebar.tabs.contains(id)) { - targetSidebar.tabs.addTab(knownTabs[id]); + const targetSidebar = tabOptions.target === 'secondary' ? sidebars.secondary : sidebars.primary; + targetSidebar.content.children().hide(); + targetSidebar.footer.children().hide(); + if (tabOptions.onchange) { + tabOptions.onchange.call(tabOptions); + } + $(tabOptions.wrapper).show(); + if (tabOptions.toolbar) { + $(tabOptions.toolbar).show(); } - targetSidebar.tabs.activateTab(id); + RED.settings.setLocal("last-sidebar-tab", tabOptions.id) + targetSidebar.tabBar.find('button').removeClass('selected') + targetSidebar.tabBar.find('button[data-tab-id="'+id+'"]').addClass('selected') + targetSidebar.activeTab = id + if (!skipShowSidebar && !RED.menu.isSelected(targetSidebar.menuToggle)) { RED.menu.setSelected(targetSidebar.menuToggle,true); } @@ -264,73 +318,71 @@ RED.sidebar = (function() { } function containsTab(id) { - return primarySidebar.tabs.contains(id); + return sidebars.primary.tabs.contains(id); } function setupSidebar(sidebar) { sidebar.container.addClass("red-ui-sidebar"); sidebar.container.width(sidebar.defaultWidth); sidebar.separator = setupSidebarSeparator(sidebar); - sidebar.tabs = RED.tabs.create({ - element: $('
            ').appendTo(sidebar.container), - onchange:function(tab) { - sidebar.content.children().hide(); - sidebar.footer.children().hide(); - if (tab) { - if (tab.onchange) { - tab.onchange.call(tab); - } - $(tab.wrapper).show(); - if (tab.toolbar) { - $(tab.toolbar).show(); - } - RED.settings.setLocal("last-sidebar-tab", tab.id) - } - }, - onremove: function(tab) { - $(tab.wrapper).hide(); - if (tab.onremove) { - tab.onremove.call(tab); - } - }, - // minimumActiveTabWidth: 70, - collapsible: true, - onreorder: function(order) { - RED.settings.set("editor.sidebar.order",order); - }, - order: RED.settings.get("editor.sidebar.order",["info", "help", "version-control", "debug"]) - // scrollable: true - }); - sidebar.tabs.container.hide() + sidebar.tabBar = setupSidebarTabs(sidebar) + // sidebar.tabs = RED.tabs.create({ + // element: $('
              ').appendTo(sidebar.container), + // onchange:function(tab) { + // sidebar.content.children().hide(); + // sidebar.footer.children().hide(); + // if (tab) { + // if (tab.onchange) { + // tab.onchange.call(tab); + // } + // $(tab.wrapper).show(); + // if (tab.toolbar) { + // $(tab.toolbar).show(); + // } + // RED.settings.setLocal("last-sidebar-tab", tab.id) + // } + // }, + // onremove: function(tab) { + // $(tab.wrapper).hide(); + // if (tab.onremove) { + // tab.onremove.call(tab); + // } + // }, + // // minimumActiveTabWidth: 70, + // collapsible: true, + // onreorder: function(order) { + // RED.settings.set("editor.sidebar.order",order); + // }, + // order: RED.settings.get("editor.sidebar.order",["info", "help", "version-control", "debug"]) + // // scrollable: true + // }); + // sidebar.tabs.container.hide() sidebar.content = $('
              ').appendTo(sidebar.container); sidebar.footer = $('').appendTo(sidebar.container); sidebar.shade = $('
              ').appendTo(sidebar.container); } function init () { - primarySidebar.container = $("#red-ui-sidebar"); - setupSidebar(primarySidebar) - secondarySidebar.container = $("#red-ui-sidebar-left"); - setupSidebar(secondarySidebar) + sidebars.primary.container = $("#red-ui-sidebar"); + setupSidebar(sidebars.primary) + sidebars.secondary.container = $("#red-ui-sidebar-left"); + setupSidebar(sidebars.secondary) RED.actions.add("core:toggle-sidebar",function(state){ if (state === undefined) { - RED.menu.toggleSelected(primarySidebar.menuToggle); + RED.menu.toggleSelected(sidebars.primary.menuToggle); } else { - toggleSidebar(primarySidebar, state); + toggleSidebar(sidebars.primary, state); } }); RED.actions.add("core:toggle-palette", function(state) { if (state === undefined) { - RED.menu.toggleSelected(secondarySidebar.menuToggle); + RED.menu.toggleSelected(sidebars.secondary.menuToggle); } else { - toggleSidebar(secondarySidebar, state); + toggleSidebar(sidebars.secondary, state); } }); - - RED.popover.tooltip(primarySidebar.separator.find(".red-ui-sidebar-control-right"),RED._("keyboard.toggleSidebar"),"core:toggle-sidebar"); - lastSessionSelectedTab = RED.settings.getLocal("last-sidebar-tab") RED.sidebar.info.init(); diff --git a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss index e098b39a7d..6a03841915 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss @@ -27,6 +27,7 @@ @include mixins.component-border; display: flex; flex-direction: column; + overflow: hidden; } #red-ui-sidebar.closing { @@ -73,6 +74,36 @@ } } +.red-ui-sidebar-tab-bar { + // width: 40px; + padding: 5px; + background-color: var(--red-ui-primary-background); + flex: 0 0 auto; + display: flex; + flex-direction: column; + align-items: center; + gap: 10px; + + button { + @include mixins.workspace-button; + display: flex; + align-items: center; + justify-content: center; + padding: 0; + height: 28px; + width: 28px; + &:not(.selected):not(:hover) i { + opacity: 0.6; + } + &.selected { + box-shadow: 0 2px 0 0 var(--red-ui-form-input-border-selected-color); + } + } + .red-ui-sidebar-tab-bar-button-placeholder { + border: 1px dashed var(--red-ui-form-input-border-color); + } +} + .red-ui-sidebar .button { @include mixins.workspace-button; line-height: 18px; @@ -134,29 +165,3 @@ button.red-ui-sidebar-header-button-toggle { pointer-events: none; } - -@mixin red-ui-sidebar-control { - display: none; - position: absolute; - top: calc(50% - 26px); - z-index: 13; - padding:15px 8px; - border:1px solid var(--red-ui-primary-border-color); - background:var(--red-ui-primary-background); - color: var(--red-ui-secondary-text-color); - text-align: center; - cursor: pointer; -} - -.red-ui-sidebar-control-right { - @include red-ui-sidebar-control; - right: calc(100%); - border-top-left-radius: 5px; - border-bottom-left-radius: 5px; -} -.red-ui-sidebar-control-left { - @include red-ui-sidebar-control; - left: calc(100%); - border-top-right-radius: 5px; - border-bottom-right-radius: 5px; -} From b23d455ad549c2ed7db8884ddc22310e7d367567 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 27 Oct 2025 10:06:44 +0000 Subject: [PATCH 064/160] Fix tray positioning --- .../editor-client/src/js/ui/sidebar.js | 52 +++++-------------- .../@node-red/editor-client/src/js/ui/tray.js | 4 +- .../editor-client/src/sass/sidebar.scss | 7 +-- 3 files changed, 17 insertions(+), 46 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js index 67f2bb5beb..27f6105c17 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js @@ -60,6 +60,7 @@ RED.sidebar = (function() { } else if (typeof title === "object") { options = title; } + options.target = options.target || 'primary'; const targetSidebar = options.target === 'secondary' ? sidebars.secondary : sidebars.primary; delete options.closeable; @@ -133,7 +134,7 @@ RED.sidebar = (function() { } } - function moveTab(id, targetSidebar) { + function moveTab(id, srcSidebar, targetSidebar) { const options = knownTabs[id]; options.target = targetSidebar.id; $(options.wrapper).appendTo(targetSidebar.content); @@ -144,6 +145,14 @@ RED.sidebar = (function() { options.tabButtonTooltip.delete() options.tabButtonTooltip = RED.popover.tooltip(options.tabButton, options.name, options.action); + if (targetSidebar.content.children().length === 1) { + RED.sidebar.show(options.id) + } + if (srcSidebar.content.children().length === 0) { + RED.menu.setSelected(srcSidebar.menuToggle, false); + } + + } var sidebarSeparator = {}; @@ -151,6 +160,7 @@ RED.sidebar = (function() { function setupSidebarTabs(sidebar) { const tabBar = $('
              ') + tabBar.attr('id', sidebar.container.attr('id') + '-tab-bar') tabBar.data('sidebar', sidebar.id) if (sidebar.direction === 'right') { tabBar.insertAfter(sidebar.container); @@ -179,8 +189,7 @@ RED.sidebar = (function() { const src = sidebars[ui.sender.data('sidebar')] const dest = sidebars[$(this).data('sidebar')] const tabId = ui.item.attr('data-tab-id'); - const tabOptions = knownTabs[tabId]; - moveTab(tabId, dest) + moveTab(tabId, src, dest) if (ui.item.hasClass('selected')) { const firstTab = src.tabBar.find('button').first().attr('data-tab-id'); if (firstTab) { @@ -194,7 +203,8 @@ RED.sidebar = (function() { } function setupSidebarSeparator(sidebar) { const separator = $('
              '); - const shade = $('
              ').appendTo(separator); + separator.attr('id', sidebar.container.attr('id') + '-separator') + $('
              ').appendTo(separator); let scaleFactor = 1; if (sidebar.direction === 'right') { separator.insertBefore(sidebar.container); @@ -205,9 +215,6 @@ RED.sidebar = (function() { separator.draggable({ axis: "x", start:function(event,ui) { - if (shade.is(":visible")) { - return false - } sidebarSeparator.closing = false; sidebarSeparator.opening = false; // var winWidth = $("#red-ui-editor").width(); @@ -326,37 +333,6 @@ RED.sidebar = (function() { sidebar.container.width(sidebar.defaultWidth); sidebar.separator = setupSidebarSeparator(sidebar); sidebar.tabBar = setupSidebarTabs(sidebar) - // sidebar.tabs = RED.tabs.create({ - // element: $('
                ').appendTo(sidebar.container), - // onchange:function(tab) { - // sidebar.content.children().hide(); - // sidebar.footer.children().hide(); - // if (tab) { - // if (tab.onchange) { - // tab.onchange.call(tab); - // } - // $(tab.wrapper).show(); - // if (tab.toolbar) { - // $(tab.toolbar).show(); - // } - // RED.settings.setLocal("last-sidebar-tab", tab.id) - // } - // }, - // onremove: function(tab) { - // $(tab.wrapper).hide(); - // if (tab.onremove) { - // tab.onremove.call(tab); - // } - // }, - // // minimumActiveTabWidth: 70, - // collapsible: true, - // onreorder: function(order) { - // RED.settings.set("editor.sidebar.order",order); - // }, - // order: RED.settings.get("editor.sidebar.order",["info", "help", "version-control", "debug"]) - // // scrollable: true - // }); - // sidebar.tabs.container.hide() sidebar.content = $('
                ').appendTo(sidebar.container); sidebar.footer = $('').appendTo(sidebar.container); sidebar.shade = $('
                ').appendTo(sidebar.container); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tray.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tray.js index faeac3a22e..a275a1173d 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tray.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tray.js @@ -194,8 +194,8 @@ } function handleWindowResize() { - // TODO: red-ui-sidebar has a width when hidden - so we need to handle that case and set the right pos to its separator - $("#red-ui-editor-stack").css('right', $("#red-ui-sidebar").outerWidth() + 11); + let sidebarWidth = $("#red-ui-sidebar").is(":visible") ? $("#red-ui-sidebar").outerWidth() + $("#red-ui-sidebar-separator").outerWidth() : 0; + $("#red-ui-editor-stack").css('right', sidebarWidth + $("#red-ui-sidebar-tab-bar").outerWidth() + 1); if (stack.length > 0) { var tray = stack[stack.length-1]; if (tray.options.maximized || tray.width > $("#red-ui-editor-stack").position().left-8) { diff --git a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss index 6a03841915..d5b6b454e3 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss @@ -83,6 +83,7 @@ flex-direction: column; align-items: center; gap: 10px; + z-index: 10; button { @include mixins.workspace-button; @@ -159,9 +160,3 @@ button.red-ui-sidebar-header-button-toggle { border-left: none; } -.red-ui-sidebar-separator .red-ui-sidebar-shade { - // Other shades overlay their element so consume pointer events - // Sidebar separator shade is a child element so needs to explicitly block - pointer-events: none; -} - From 6ffa23a44e5a8f42038a4d541d6775678fbae7e1 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 27 Oct 2025 16:28:40 +0000 Subject: [PATCH 065/160] Fix sidebar sortable for touch events --- .../node_modules/@node-red/editor-client/src/js/ui/sidebar.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js index 27f6105c17..ba2cb632ce 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js @@ -14,7 +14,6 @@ * limitations under the License. **/ RED.sidebar = (function() { - const sidebars = { primary: { id: 'primary', @@ -101,7 +100,7 @@ RED.sidebar = (function() { } else if (options.iconClass) { $('',{class:options.iconClass}).appendTo(options.tabButton); } - options.tabButton.on('click', function() { + options.tabButton.on('mouseup', function(evt) { const targetSidebar = options.target === 'secondary' ? sidebars.secondary : sidebars.primary; if (targetSidebar.activeTab === options.id && RED.menu.isSelected(targetSidebar.menuToggle)) { RED.menu.setSelected(targetSidebar.menuToggle, false); @@ -168,6 +167,7 @@ RED.sidebar = (function() { tabBar.insertBefore(sidebar.container); } tabBar.sortable({ + distance: 10, cancel: false, placeholder: "red-ui-sidebar-tab-bar-button-placeholder", connectWith: ".red-ui-sidebar-tab-bar", From 6c36f789bde66569a8c02ad5e52a049e365f1e76 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 28 Oct 2025 14:41:19 +0000 Subject: [PATCH 066/160] Fix login display --- packages/node_modules/@node-red/editor-client/src/js/red.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/red.js b/packages/node_modules/@node-red/editor-client/src/js/red.js index 1c073b137d..7645482eb6 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/red.js +++ b/packages/node_modules/@node-red/editor-client/src/js/red.js @@ -894,13 +894,17 @@ var RED = (function() { var logo = $('').appendTo(header); $('
                  ').appendTo(header); $('
                  ').appendTo(header); - $('
                  '+ + $('
                  '+ '
                  '+ '
                  '+ '
                  '+ '
                  '+ // '
                  '+ '
                  ').appendTo(options.target); + + // Don't use the `hide` class on this container, as the show reverts it to block rather + // than the expected flex. So hide via jQuery as it'll track the show state internally. + options.target.find('#red-ui-main-container').hide() $('
                  ').appendTo(options.target); $('
                  ').appendTo(options.target); From b6367bbb44be5aa01732476a638bb757b5ed0075 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 29 Oct 2025 10:40:02 +0000 Subject: [PATCH 067/160] Track sidebar state --- .../editor-client/src/js/ui/sidebar.js | 100 ++++++++++++++---- 1 file changed, 79 insertions(+), 21 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js index ba2cb632ce..30a58d897e 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js @@ -33,7 +33,24 @@ RED.sidebar = (function() { } } - var knownTabs = {}; + const knownTabs = {}; + + function exportSidebarState () { + const state = { + primary: [], + secondary: [] + } + sidebars.primary.tabBar.children('button').each(function() { + const tabId = $(this).attr('data-tab-id'); + state.primary.push(tabId); + }) + sidebars.secondary.tabBar.children('button').each(function() { + const tabId = $(this).attr('data-tab-id'); + state.secondary.push(tabId); + }) + RED.settings.set('editor.sidebar.state', state) + } + // We store the current sidebar tab id in localStorage as 'last-sidebar-tab' // This is restored when the editor is reloaded. @@ -41,8 +58,7 @@ RED.sidebar = (function() { // also get triggered when the first tab gets added to the tabs - typically // the 'info' tab. So we use the following variable to store the retrieved // value from localStorage before we start adding the actual tabs - var lastSessionSelectedTab = null; - + let lastSessionSelectedTabs = {} function addTab(title,content,closeable,visible) { var options; @@ -60,6 +76,28 @@ RED.sidebar = (function() { options = title; } options.target = options.target || 'primary'; + let targetTabButtonIndex = -1 // Append to end by default + + // Check the saved sidebar state to see if this tab should be added to the primary or secondary sidebar + const savedState = RED.settings.get('editor.sidebar.state', null) + if (savedState) { + let targetSidebar = null + let sidebarState + if (savedState.secondary.includes(options.id)) { + options.target = 'secondary' + sidebarState = savedState.secondary + targetSidebar = sidebars.secondary + } else if (savedState.primary.includes(options.id)) { + options.target = 'primary' + sidebarState = savedState.primary + targetSidebar = sidebars.primary + } + if (targetSidebar) { + // This tab was found in the saved sidebar state. Now find the target position for the tab button + targetTabButtonIndex = sidebarState.indexOf(options.id) + } + } + const targetSidebar = options.target === 'secondary' ? sidebars.secondary : sidebars.primary; delete options.closeable; @@ -78,6 +116,7 @@ RED.sidebar = (function() { } var id = options.id; + // console.log('menu', options.id, options.name) RED.menu.addItem("menu-item-view-menu",{ id:"menu-item-view-menu-"+options.id, label:options.name, @@ -90,17 +129,28 @@ RED.sidebar = (function() { options.iconClass = options.iconClass || "fa fa-square-o" knownTabs[options.id] = options; - - options.tabButton = $('').appendTo(targetSidebar.tabBar); + options.tabButton = $('') + // Insert the tab button at the correct index + if (targetTabButtonIndex === -1 || targetTabButtonIndex >= targetSidebar.tabBar.children().length) { + // Append to end + options.tabButton = $('').appendTo(targetSidebar.tabBar); + } else { + // Insert before the item at targetTabButtonIndex + options.tabButton = $('').insertBefore(targetSidebar.tabBar.children().eq(targetTabButtonIndex)); + } options.tabButton.attr('data-tab-id', options.id) options.tabButtonTooltip = RED.popover.tooltip(options.tabButton, options.name, options.action); if (options.icon) { - $('',{style:"mask-image: url("+options.icon+"); -webkit-mask-image: url("+options.icon+");"}).appendTo(options.tabButton); + $('',{class: 'red-ui-sidebar-tab-icon', style:"mask-image: url("+options.icon+"); -webkit-mask-image: url("+options.icon+");"}).appendTo(options.tabButton); } else if (options.iconClass) { $('',{class:options.iconClass}).appendTo(options.tabButton); } options.tabButton.on('mouseup', function(evt) { + if (draggingTabButton) { + draggingTabButton = false + return + } const targetSidebar = options.target === 'secondary' ? sidebars.secondary : sidebars.primary; if (targetSidebar.activeTab === options.id && RED.menu.isSelected(targetSidebar.menuToggle)) { RED.menu.setSelected(targetSidebar.menuToggle, false); @@ -150,13 +200,9 @@ RED.sidebar = (function() { if (srcSidebar.content.children().length === 0) { RED.menu.setSelected(srcSidebar.menuToggle, false); } - - } - var sidebarSeparator = {}; - sidebarSeparator.dragging = false; - + let draggingTabButton = false function setupSidebarTabs(sidebar) { const tabBar = $('
                  ') tabBar.attr('id', sidebar.container.attr('id') + '-tab-bar') @@ -176,6 +222,7 @@ RED.sidebar = (function() { const tabId = ui.item.attr('data-tab-id'); const options = knownTabs[tabId]; options.tabButtonTooltip.delete() + draggingTabButton = true }, stop: function(event, ui) { // Restore the tooltip @@ -183,6 +230,8 @@ RED.sidebar = (function() { const options = knownTabs[tabId]; options.tabButtonTooltip.delete() options.tabButtonTooltip = RED.popover.tooltip(options.tabButton, options.name, options.action); + // Save the sidebar state + exportSidebarState() }, receive: function(event, ui) { // Tab has been moved from one sidebar to another @@ -212,6 +261,8 @@ RED.sidebar = (function() { scaleFactor = -1; separator.insertAfter(sidebar.container); } + // Track sidebar state whilst dragging + const sidebarSeparator = {} separator.draggable({ axis: "x", start:function(event,ui) { @@ -288,6 +339,7 @@ RED.sidebar = (function() { if (!state) { sidebar.container.hide() sidebar.separator.hide() + sidebar.tabBar.find('button').removeClass('selected') } else { sidebar.container.show() sidebar.separator.show() @@ -297,7 +349,16 @@ RED.sidebar = (function() { function showSidebar(id, skipShowSidebar) { if (id === ":first") { - id = lastSessionSelectedTab || RED.settings.get("editor.sidebar.order",["info", "help", "version-control", "debug"])[0] + // Show the last selected tab for each sidebar + Object.keys(sidebars).forEach(function(sidebarKey) { + const sidebar = sidebars[sidebarKey]; + let lastTabId = lastSessionSelectedTabs[sidebarKey]; + if (!lastTabId) { + lastTabId = sidebar.tabBar.children('button').first().attr('data-tab-id'); + } + showSidebar(lastTabId, true) + }) + return } if (id) { const tabOptions = knownTabs[id]; @@ -312,7 +373,7 @@ RED.sidebar = (function() { if (tabOptions.toolbar) { $(tabOptions.toolbar).show(); } - RED.settings.setLocal("last-sidebar-tab", tabOptions.id) + RED.settings.setLocal("last-sidebar-tab-" + targetSidebar.id, tabOptions.id) targetSidebar.tabBar.find('button').removeClass('selected') targetSidebar.tabBar.find('button[data-tab-id="'+id+'"]').addClass('selected') targetSidebar.activeTab = id @@ -359,14 +420,11 @@ RED.sidebar = (function() { } }); - lastSessionSelectedTab = RED.settings.getLocal("last-sidebar-tab") - - RED.sidebar.info.init(); - RED.sidebar.help.init(); - RED.sidebar.config.init(); - RED.sidebar.context.init(); - // hide sidebar at start if screen rather narrow... - if ($("#red-ui-editor").width() < 600) { RED.menu.setSelected("menu-item-sidebar",false); } + // Remember the last selected tab for each sidebar before + // the tabs are readded causing the state to get updated + Object.keys(sidebars).forEach(function(sidebarKey) { + lastSessionSelectedTabs[sidebarKey] = RED.settings.getLocal("last-sidebar-tab-" + sidebarKey) + }) } return { From d5a28ce5e795f5372a1ffb05d81794f3a98e95a0 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 29 Oct 2025 10:40:21 +0000 Subject: [PATCH 068/160] Fix sidebar menu to include all options Needed to reorder initialisation as sidebars were adding before the menu component was initialised, meaning their menu entries didn't get added --- .../@node-red/editor-client/src/js/red.js | 34 ++++++++++++------- .../editor-client/src/js/ui/common/menu.js | 2 +- .../editor-client/src/js/ui/tab-info.js | 2 ++ 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/red.js b/packages/node_modules/@node-red/editor-client/src/js/red.js index 7645482eb6..7a49b114f7 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/red.js +++ b/packages/node_modules/@node-red/editor-client/src/js/red.js @@ -844,7 +844,6 @@ var RED = (function() { RED.notifications.init(); RED.library.init(); RED.sidebar.init(); - RED.palette.init(); RED.eventLog.init(); if (RED.settings.get('externalModules.palette.allowInstall', true) !== false) { @@ -869,23 +868,34 @@ var RED = (function() { RED.diagnostics.init(); RED.diff.init(); - RED.deploy.init(RED.settings.theme("deployButton",null)); + RED.keyboard.init(() => { + buildMainMenu(); - RED.keyboard.init(buildMainMenu); - RED.envVar.init(); + // Register the core set of sidebar panels now the menu is ready to receive items + RED.palette.init(); + RED.sidebar.info.init(); + RED.sidebar.help.init(); + RED.sidebar.config.init(); + RED.sidebar.context.init(); + // hide sidebar at start if screen rather narrow... + if ($("#red-ui-editor").width() < 600) { RED.menu.setSelected("menu-item-sidebar", false); } - RED.nodes.init(); - RED.runtime.init() + RED.envVar.init(); - if (RED.settings.theme("multiplayer.enabled",false)) { - RED.multiplayer.init() - } - RED.comms.connect(); + RED.nodes.init(); + RED.runtime.init() - $("#red-ui-main-container").show(); + if (RED.settings.theme("multiplayer.enabled",false)) { + RED.multiplayer.init() + } + RED.comms.connect(); - loadPluginList(); + $("#red-ui-main-container").show(); + RED.events.emit("sidebar:resize") + + loadPluginList(); + }); } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/menu.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/menu.js index 8d0f1dbd33..091c69c34e 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/menu.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/menu.js @@ -323,7 +323,7 @@ RED.menu = (function() { } else { for (var i=0;i Date: Wed, 29 Oct 2025 10:41:15 +0000 Subject: [PATCH 069/160] Update palette sidebar icon to custom svg --- .../editor-client/src/js/ui/palette.js | 2 +- .../editor-client/src/sass/sidebar.scss | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js index 1cd2d0b41e..5fece2198a 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js @@ -617,7 +617,7 @@ RED.palette = (function() { id: "palette", label: "Palette", name: "Palette", - iconClass: "fa fa-tags", + icon: "red/images/subflow_tab.svg", content, toolbar, pinned: true, diff --git a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss index d5b6b454e3..46a023bb5d 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss @@ -160,3 +160,20 @@ button.red-ui-sidebar-header-button-toggle { border-left: none; } +i.red-ui-sidebar-tab-icon { + display: inline-block; + // margin-left: -8px; + // margin-right: 3px; + // margin-top: -2px; + opacity: 1; + width: 18px; + height: 18px; + vertical-align: middle; + -webkit-mask-size: contain; + mask-size: contain; + -webkit-mask-position: center; + mask-position: center; + -webkit-mask-repeat: no-repeat; + mask-repeat: no-repeat; + background-color: var(--red-ui-workspace-button-color); +} \ No newline at end of file From 41ed5c94b6df45e21ebd264c5cd1a83417cfaae0 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 29 Oct 2025 10:51:31 +0000 Subject: [PATCH 070/160] Don't squash buttons when resizing window --- .../@node-red/editor-client/src/js/ui/sidebar.js | 10 ++++++++++ .../@node-red/editor-client/src/sass/sidebar.scss | 2 ++ 2 files changed, 12 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js index 30a58d897e..4ddfcd8ee8 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js @@ -248,6 +248,16 @@ RED.sidebar = (function() { RED.sidebar.show(tabId) } }) + // $(window).on("resize", function () { + // const lastChild = tabBar.children().last(); + // if (lastChild.length > 0) { + // const tabBarHeight = tabBar.height(); + // const lastChildBottom = lastChild.position().top + lastChild.outerHeight(); + // if (lastChildBottom > tabBarHeight) { + // console.log('overflow') + // } + // } + // }) return tabBar } function setupSidebarSeparator(sidebar) { diff --git a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss index 46a023bb5d..af20097dcd 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss @@ -88,6 +88,8 @@ button { @include mixins.workspace-button; display: flex; + flex-grow: 0; + flex-shrink: 0; align-items: center; justify-content: center; padding: 0; From f690fcb295331237f816f61837d98e00353e06eb Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 29 Oct 2025 11:01:13 +0000 Subject: [PATCH 071/160] Apply default layout --- .../@node-red/editor-client/src/js/ui/sidebar.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js index 4ddfcd8ee8..f438df2830 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js @@ -29,9 +29,14 @@ RED.sidebar = (function() { menuToggle: 'menu-item-palette', minimumWidth: 180, maximumWidth: 800, + // Make LH side slightly narrower by default as its the palette that doesn't require a lot of width defaultWidth: 180 } } + const defaultSidebarConfiguration = { + primary: ['info','debug','help','config','context'], + secondary: ['palette'] + } const knownTabs = {}; @@ -79,7 +84,7 @@ RED.sidebar = (function() { let targetTabButtonIndex = -1 // Append to end by default // Check the saved sidebar state to see if this tab should be added to the primary or secondary sidebar - const savedState = RED.settings.get('editor.sidebar.state', null) + const savedState = RED.settings.get('editor.sidebar.state', defaultSidebarConfiguration) if (savedState) { let targetSidebar = null let sidebarState From bd8a1eda90426920dfd11ea49d7fca6d5e19352b Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 29 Oct 2025 16:14:55 +0000 Subject: [PATCH 072/160] Make sidebar separators a bit narrower --- .../node_modules/@node-red/editor-client/src/sass/sidebar.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss index af20097dcd..7437e1b30c 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss @@ -51,7 +51,7 @@ } .red-ui-sidebar-separator { - width: 10px; + width: 7px; flex: 0 0 auto; // z-index: 11; background-color: var(--red-ui-primary-background); From 8b0f926856a413fe173f79448fee75591e456862 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 29 Oct 2025 16:48:10 +0000 Subject: [PATCH 073/160] Improve styling for info sidebar on LH side --- .../@node-red/editor-client/src/sass/tab-info.scss | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/sass/tab-info.scss b/packages/node_modules/@node-red/editor-client/src/sass/tab-info.scss index 732d4dfe88..a8fc624460 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/tab-info.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/tab-info.scss @@ -442,18 +442,6 @@ div.red-ui-info-table { right: 1px; padding: 1px 2px 0 1px; text-align: right; - background: var(--red-ui-list-item-background); - - .red-ui-treeList-label:hover & { - background: var(--red-ui-list-item-background-hover); - } - .red-ui-treeList-label.focus & { - background: var(--red-ui-list-item-background-hover); - } - .red-ui-treeList-label.selected & { - background: var(--red-ui-list-item-background-selected); - } - &.red-ui-info-outline-item-hover-controls button { min-width: 23px; @@ -580,6 +568,7 @@ div.red-ui-info-table { top: 6px; right: 8px; width: calc(100% - 130px); + min-width: 150px; max-width: 250px; background: var(--red-ui-palette-header-background); } From 56b243951134a8a39f6da2c62022a2f9a512c26a Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 29 Oct 2025 17:07:55 +0000 Subject: [PATCH 074/160] Ensure tab button is visible when sorting --- .../node_modules/@node-red/editor-client/src/js/ui/sidebar.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js index f438df2830..6813e76266 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js @@ -228,6 +228,7 @@ RED.sidebar = (function() { const options = knownTabs[tabId]; options.tabButtonTooltip.delete() draggingTabButton = true + tabBar.css('z-index','inherit') }, stop: function(event, ui) { // Restore the tooltip @@ -237,6 +238,7 @@ RED.sidebar = (function() { options.tabButtonTooltip = RED.popover.tooltip(options.tabButton, options.name, options.action); // Save the sidebar state exportSidebarState() + tabBar.css('z-index','') }, receive: function(event, ui) { // Tab has been moved from one sidebar to another From 096bafb75c7b68f767542e9f3271fe3e2c14d2da Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 30 Oct 2025 14:15:59 +0000 Subject: [PATCH 075/160] Update info tab sidebar --- .../@node-red/editor-client/src/images/explorer.svg | 1 + .../node_modules/@node-red/editor-client/src/js/ui/tab-info.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 packages/node_modules/@node-red/editor-client/src/images/explorer.svg diff --git a/packages/node_modules/@node-red/editor-client/src/images/explorer.svg b/packages/node_modules/@node-red/editor-client/src/images/explorer.svg new file mode 100644 index 0000000000..555efcc92b --- /dev/null +++ b/packages/node_modules/@node-red/editor-client/src/images/explorer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js index 557fd970bf..49b171ec5f 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js @@ -122,7 +122,7 @@ RED.sidebar.info = (function() { // target: "secondary", label: RED._("sidebar.info.label"), name: RED._("sidebar.info.name"), - iconClass: "fa fa-info", + icon: "red/images/explorer.svg", action:"core:show-info-tab", content: content, pinned: true, From 351d25a7d62c4803c15bf4823502fe0b56bb4f0e Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 31 Oct 2025 11:28:53 +0000 Subject: [PATCH 076/160] Fix nls message name --- .../@node-red/editor-client/locales/en-US/editor.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json index 905b8ea5a0..8018b745f8 100644 --- a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json @@ -169,7 +169,7 @@ "zoom-out": "Zoom out", "zoom-reset": "Reset zoom", "zoom-in": "Zoom in", - "fit-to-screen": "Zoom to fit", + "zoom-fit": "Zoom to fit", "search-flows": "Search flows", "search-prev": "Previous", "search-next": "Next", From 7b6c838e7eef227de8af127c10553a8237f96ce8 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 31 Oct 2025 11:29:07 +0000 Subject: [PATCH 077/160] Reshow scrollbars and disable navigator temporary show --- .../editor-client/src/js/ui/view-navigator.js | 30 +++++++++---------- .../editor-client/src/sass/workspace.scss | 14 ++++----- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js index 438820227a..d2275608c6 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js @@ -194,23 +194,23 @@ RED.view.navigator = (function() { // Listen for canvas interactions to show minimap temporarily // Only show on actual pan/zoom navigation, not selection changes - RED.events.on("view:navigate", function() { - showTemporary(); - }); + // RED.events.on("view:navigate", function() { + // showTemporary(); + // }); // Show minimap briefly when workspace changes (includes initial load) - RED.events.on("workspace:change", function(event) { - // Only show if there's an active workspace with nodes - if (event.workspace && RED.nodes.getWorkspaceOrder().length > 0) { - // Small delay to ensure nodes are rendered - setTimeout(function() { - var activeNodes = RED.nodes.filterNodes({z: event.workspace}); - if (activeNodes.length > 0) { - showTemporary(); - } - }, 100); - } - }); + // RED.events.on("workspace:change", function(event) { + // // Only show if there's an active workspace with nodes + // if (event.workspace && RED.nodes.getWorkspaceOrder().length > 0) { + // // Small delay to ensure nodes are rendered + // setTimeout(function() { + // var activeNodes = RED.nodes.filterNodes({z: event.workspace}); + // if (activeNodes.length > 0) { + // showTemporary(); + // } + // }, 100); + // } + // }); }, refresh: refreshNodes, resize: resizeNavBorder, diff --git a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss index a29932e9df..30a5c245f0 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss @@ -41,13 +41,13 @@ padding: 0; margin: 0; - // Hide scrollbars - scrollbar-width: none; /* Firefox */ - -ms-overflow-style: none; /* Internet Explorer 10+ */ - &::-webkit-scrollbar { /* WebKit */ - width: 0; - height: 0; - } + // Hide scrollbars - to be done in a future iteration + // scrollbar-width: none; /* Firefox */ + // -ms-overflow-style: none; /* Internet Explorer 10+ */ + // &::-webkit-scrollbar { /* WebKit */ + // width: 0; + // height: 0; + // } // Reset SVG default margins > svg { From cab7ce247b743f8424ad5d70d2ccb39004914dd6 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 3 Dec 2025 16:51:19 +0000 Subject: [PATCH 078/160] Prep dev branch for beta releases --- package.json | 2 +- .../node_modules/@node-red/editor-api/package.json | 6 +++--- .../node_modules/@node-red/editor-client/package.json | 2 +- packages/node_modules/@node-red/nodes/package.json | 2 +- packages/node_modules/@node-red/registry/package.json | 4 ++-- packages/node_modules/@node-red/runtime/package.json | 6 +++--- packages/node_modules/@node-red/util/package.json | 2 +- packages/node_modules/node-red/package.json | 10 +++++----- scripts/generate-publish-script.js | 2 +- 9 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 666d5b0db2..4bd0dd589a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "4.1.2", + "version": "5.0.0-beta.0", "description": "Low-code programming for event-driven applications", "homepage": "https://nodered.org", "license": "Apache-2.0", diff --git a/packages/node_modules/@node-red/editor-api/package.json b/packages/node_modules/@node-red/editor-api/package.json index d15b85f3e0..a24dd40b2c 100644 --- a/packages/node_modules/@node-red/editor-api/package.json +++ b/packages/node_modules/@node-red/editor-api/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/editor-api", - "version": "4.1.2", + "version": "5.0.0-beta.0", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/util": "4.1.2", - "@node-red/editor-client": "4.1.2", + "@node-red/util": "5.0.0-beta.0", + "@node-red/editor-client": "5.0.0-beta.0", "bcryptjs": "3.0.2", "body-parser": "1.20.3", "clone": "2.1.2", diff --git a/packages/node_modules/@node-red/editor-client/package.json b/packages/node_modules/@node-red/editor-client/package.json index d673eb66a9..1d4c9d70e1 100644 --- a/packages/node_modules/@node-red/editor-client/package.json +++ b/packages/node_modules/@node-red/editor-client/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/editor-client", - "version": "4.1.2", + "version": "5.0.0-beta.0", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/nodes/package.json b/packages/node_modules/@node-red/nodes/package.json index dd83cb3936..5dcbd66402 100644 --- a/packages/node_modules/@node-red/nodes/package.json +++ b/packages/node_modules/@node-red/nodes/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/nodes", - "version": "4.1.2", + "version": "5.0.0-beta.0", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/registry/package.json b/packages/node_modules/@node-red/registry/package.json index 1e23e343f3..0134b6ecbd 100644 --- a/packages/node_modules/@node-red/registry/package.json +++ b/packages/node_modules/@node-red/registry/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/registry", - "version": "4.1.2", + "version": "5.0.0-beta.0", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,7 +16,7 @@ } ], "dependencies": { - "@node-red/util": "4.1.2", + "@node-red/util": "5.0.0-beta.0", "clone": "2.1.2", "fs-extra": "11.3.0", "semver": "7.7.1", diff --git a/packages/node_modules/@node-red/runtime/package.json b/packages/node_modules/@node-red/runtime/package.json index be53e7012b..5e22788a3e 100644 --- a/packages/node_modules/@node-red/runtime/package.json +++ b/packages/node_modules/@node-red/runtime/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/runtime", - "version": "4.1.2", + "version": "5.0.0-beta.0", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/registry": "4.1.2", - "@node-red/util": "4.1.2", + "@node-red/registry": "5.0.0-beta.0", + "@node-red/util": "5.0.0-beta.0", "async-mutex": "0.5.0", "clone": "2.1.2", "cronosjs": "1.7.1", diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json index a647daee6c..c633229757 100644 --- a/packages/node_modules/@node-red/util/package.json +++ b/packages/node_modules/@node-red/util/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/util", - "version": "4.1.2", + "version": "5.0.0-beta.0", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/node-red/package.json b/packages/node_modules/node-red/package.json index 133a81f0c8..f758b3bc03 100644 --- a/packages/node_modules/node-red/package.json +++ b/packages/node_modules/node-red/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "4.1.2", + "version": "5.0.0-beta.0", "description": "Low-code programming for event-driven applications", "homepage": "https://nodered.org", "license": "Apache-2.0", @@ -31,10 +31,10 @@ "flow" ], "dependencies": { - "@node-red/editor-api": "4.1.2", - "@node-red/runtime": "4.1.2", - "@node-red/util": "4.1.2", - "@node-red/nodes": "4.1.2", + "@node-red/editor-api": "5.0.0-beta.0", + "@node-red/runtime": "5.0.0-beta.0", + "@node-red/util": "5.0.0-beta.0", + "@node-red/nodes": "5.0.0-beta.0", "basic-auth": "2.0.1", "bcryptjs": "3.0.2", "cors": "2.8.5", diff --git a/scripts/generate-publish-script.js b/scripts/generate-publish-script.js index c31b2dd9e0..7e91c08f98 100644 --- a/scripts/generate-publish-script.js +++ b/scripts/generate-publish-script.js @@ -4,7 +4,7 @@ const path = require("path"); const fs = require("fs-extra"); const should = require("should"); -const LATEST = "4"; +const LATEST = "5"; function generateScript() { return new Promise((resolve, reject) => { From 9e9fa2b92da12a7a083747d974584f6fc051f17a Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 4 Dec 2025 13:33:44 +0000 Subject: [PATCH 079/160] Improve styling --- .../editor-client/src/js/ui/sidebar.js | 7 +- .../editor-client/src/sass/mixins.scss | 1 + .../editor-client/src/sass/sidebar.scss | 70 +++++++++++++------ .../editor-client/src/sass/workspace.scss | 2 + 4 files changed, 55 insertions(+), 25 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js index 6813e76266..dc1b97f478 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js @@ -30,7 +30,7 @@ RED.sidebar = (function() { minimumWidth: 180, maximumWidth: 800, // Make LH side slightly narrower by default as its the palette that doesn't require a lot of width - defaultWidth: 180 + defaultWidth: 210 } } const defaultSidebarConfiguration = { @@ -209,7 +209,7 @@ RED.sidebar = (function() { let draggingTabButton = false function setupSidebarTabs(sidebar) { - const tabBar = $('
                  ') + const tabBar = $('
                  ').addClass('red-ui-sidebar-' + sidebar.direction); tabBar.attr('id', sidebar.container.attr('id') + '-tab-bar') tabBar.data('sidebar', sidebar.id) if (sidebar.direction === 'right') { @@ -271,6 +271,7 @@ RED.sidebar = (function() { const separator = $('
                  '); separator.attr('id', sidebar.container.attr('id') + '-separator') $('
                  ').appendTo(separator); + $('
                  ').appendTo(separator); let scaleFactor = 1; if (sidebar.direction === 'right') { separator.insertBefore(sidebar.container); @@ -407,7 +408,7 @@ RED.sidebar = (function() { } function setupSidebar(sidebar) { - sidebar.container.addClass("red-ui-sidebar"); + sidebar.container.addClass("red-ui-sidebar").addClass('red-ui-sidebar-' + sidebar.direction);; sidebar.container.width(sidebar.defaultWidth); sidebar.separator = setupSidebarSeparator(sidebar); sidebar.tabBar = setupSidebarTabs(sidebar) diff --git a/packages/node_modules/@node-red/editor-client/src/sass/mixins.scss b/packages/node_modules/@node-red/editor-client/src/sass/mixins.scss index 486396c595..28eeba3c27 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/mixins.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/mixins.scss @@ -70,6 +70,7 @@ text-align: center; margin:0; cursor:pointer; + border-radius: 3px; &.selected:not(.disabled):not(:disabled) { color: var(--red-ui-workspace-button-color-selected) !important; diff --git a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss index 7437e1b30c..02a4bec8db 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss @@ -29,7 +29,12 @@ flex-direction: column; overflow: hidden; } - +.red-ui-sidebar-left { + border-left: none; +} +.red-ui-sidebar-right { + border-right: none; +} #red-ui-sidebar.closing { border-style: dashed; } @@ -51,39 +56,57 @@ } .red-ui-sidebar-separator { - width: 7px; + width: 0; flex: 0 0 auto; // z-index: 11; - background-color: var(--red-ui-primary-background); + background-color: var(--red-ui-view-background); + overflow: visible; cursor: col-resize; - &:before { - content: ''; - display: block; - width: 100%; + .red-ui-sidebar-separator-handle { + position: absolute; + // background: rgba(255,140,0,0.2); + top: 0; + left: -6px; + width: 12px; height: 100%; - -webkit-mask-image: url(images/grip.svg); - mask-image: url(images/grip.svg); - -webkit-mask-size: auto; - mask-size: auto; - -webkit-mask-position: 50% 50%; - mask-position: 50% 50%; - -webkit-mask-repeat: no-repeat; - mask-repeat: no-repeat; - background-color: var(--red-ui-grip-color); + z-index: 20; } + // &:before { + // content: ''; + // display: block; + // width: 100%; + // height: 100%; + // -webkit-mask-image: url(images/grip.svg); + // mask-image: url(images/grip.svg); + // -webkit-mask-size: auto; + // mask-size: auto; + // -webkit-mask-position: 50% 50%; + // mask-position: 50% 50%; + // -webkit-mask-repeat: no-repeat; + // mask-repeat: no-repeat; + // background-color: var(--red-ui-grip-color); + // } } .red-ui-sidebar-tab-bar { // width: 40px; - padding: 5px; - background-color: var(--red-ui-primary-background); + padding: 8px; + background-color: var(--red-ui-secondary-background); flex: 0 0 auto; display: flex; flex-direction: column; align-items: center; - gap: 10px; + gap: 12px; z-index: 10; + border: 1px solid var(--red-ui-primary-border-color); + + &.red-ui-sidebar-left { + border-left: none; + } + &.red-ui-sidebar-right { + border-right: none; + } button { @include mixins.workspace-button; @@ -95,11 +118,14 @@ padding: 0; height: 28px; width: 28px; - &:not(.selected):not(:hover) i { - opacity: 0.6; + &:not(.selected):not(:hover) { + border: none; + i { + opacity: 0.7; + } } &.selected { - box-shadow: 0 2px 0 0 var(--red-ui-form-input-border-selected-color); + // box-shadow: 0 2px 0 0 var(--red-ui-form-input-border-selected-color); } } .red-ui-sidebar-tab-bar-button-placeholder { diff --git a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss index d95cbf295a..7e48434021 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss @@ -20,6 +20,8 @@ margin: 0; overflow: hidden; @include mixins.component-border; + border-left: none; + border-right: none; transition: left 0.1s ease-in-out; position: relative; flex-grow: 1; From 503fe7377bedc72d3db8b1bdb8ed0d9e76a97104 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 4 Dec 2025 13:37:23 +0000 Subject: [PATCH 080/160] Fix linting --- .../node_modules/@node-red/editor-client/src/js/ui/sidebar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js index dc1b97f478..8bbc516bd3 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js @@ -408,7 +408,7 @@ RED.sidebar = (function() { } function setupSidebar(sidebar) { - sidebar.container.addClass("red-ui-sidebar").addClass('red-ui-sidebar-' + sidebar.direction);; + sidebar.container.addClass("red-ui-sidebar").addClass('red-ui-sidebar-' + sidebar.direction); sidebar.container.width(sidebar.defaultWidth); sidebar.separator = setupSidebarSeparator(sidebar); sidebar.tabBar = setupSidebarTabs(sidebar) From 39dc8073d3191f6f8255790809bddfa5cfe13b7c Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 4 Dec 2025 13:37:44 +0000 Subject: [PATCH 081/160] Update tour for 5-beta --- .../editor-client/src/js/ui/tour/tourGuide.js | 7 +- .../src/tours/4.1/images/missing-modules.png | Bin 0 -> 47386 bytes .../src/tours/4.1/images/node-docs.png | Bin 0 -> 7524 bytes .../tours/4.1/images/update-notification.png | Bin 0 -> 24604 bytes .../editor-client/src/tours/4.1/welcome.js | 126 ++++++++++++++++++ .../editor-client/src/tours/welcome.js | 124 ++--------------- 6 files changed, 141 insertions(+), 116 deletions(-) create mode 100644 packages/node_modules/@node-red/editor-client/src/tours/4.1/images/missing-modules.png create mode 100644 packages/node_modules/@node-red/editor-client/src/tours/4.1/images/node-docs.png create mode 100644 packages/node_modules/@node-red/editor-client/src/tours/4.1/images/update-notification.png create mode 100644 packages/node_modules/@node-red/editor-client/src/tours/4.1/welcome.js diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tour/tourGuide.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tour/tourGuide.js index 30130d2d1b..808624dd07 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tour/tourGuide.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tour/tourGuide.js @@ -435,10 +435,15 @@ RED.tourGuide = (function() { function listTour() { return [ + { + id: "5_0", + label: "5.0", + path: "./tours/welcome.js" + }, { id: "4_1", label: "4.1", - path: "./tours/welcome.js" + path: "./tours/4.1/welcome.js" }, { id: "4_0", diff --git a/packages/node_modules/@node-red/editor-client/src/tours/4.1/images/missing-modules.png b/packages/node_modules/@node-red/editor-client/src/tours/4.1/images/missing-modules.png new file mode 100644 index 0000000000000000000000000000000000000000..f96144395b9e8c9dea38bafccd07164521be4f4f GIT binary patch literal 47386 zcmeFZWmH_vwgn0#xCIF=!QI^n1PIVL!CiuTgKOiO;O_1&2`<6i-QVV%d+zzp zz2DFG=Z$wWx<_}@d-vW|t7_F;bIwYLqP!F;5&;qv6cnoT#}CR-P_GG~prGRr;DEoR z>b+M4UZ9eWB~ z4g&=hYytK9zmAayUSIxw2c9qI{PPti6Xst>ye7ze^{@BPaW9ANbbQhQUJ&g+YC1td z;ZVIip{126PoSVgp`<^&S9OCvfWRgZOI+14kbSgAe2;^OhB&ZBwzGCX-eFn+1)cDS z^Sq9Dbi_!oh!`gRRo3qh;%iq|)c3J0b{!U$9*t$->lP=oqhrA_(Dh*{v-{7+#=T!f zKjhbYBU1lR9wvw;GV3l<#)8)Po%ep(PGx=z^F#RdpARq*j4r>tatZ?#M8Ne52`&x= z6XOl^|9qHZ!zgod%E+tYp)=wtGWUmOi5WOj!;ruG&xfKq3>MRIQ~l|B-+fzSP;vVY zaz9w{8};8^j*S0#$ZR`IO= zGfF_*3Pqsl2=>Nw$U^^D=Y10mrg|qK9z3E&1^R!vnLB4k_s7#Bs(*XGEm{;rQ160fwu_+}x^Ds5jhtpO)6^Z#vhU1IF%J zC;!NBC_C$@|83^q{0>;>C9I3hp9cRftVb_l6>x<8+ps3Sgq6oGp8apGTqy7o)<_-b zzYA;MOIZ6xwDbNptn$F-)D4Pb?Z)h37d-Y zQ-183Elj;?dpHXdc)XbMj-yF7!F0X+tb=3CkLprAGy7VbD=v|-X$X0e3 zb7-7kL7HP|s&ORW*Kud0FOuE`Ze~Z#=kgiS0te;(+Mb6s@rHjL=)``aPAJi?e&OVZ zbxSU(3#N&>i`yB#%kPzQP5$>f0p^6MG&f%-g7`k&E-A}0#p5AMl8M~yP+TuMjWv+^ z+;lYE0==VswZVg_J%pe7KK;or~lf%5(HoZBT298X2zB;*fuqMc?B;S?YUo4$6uWN z<-^s^1cl5`c_0&=VVQTkS~l+HJ3UDMH8Jty0C{Cz+NY90AZ)Sa`RQJ`HxDP4h{ra~ z^L&J7$*QbnOXIiqUQxl7fcnM$%-9I$6zFYU5;68H)1Tk!`pzp}=MgKHF#E{GwB_t> zoAK(4Q6f(}k6I?t5{o9Wa$94Fsb+6*N=z(2rZnFlH68sdYdx#meXSX6{BUz>d$BX| zwE&cl&Zi z|Js32z@=DWObnT614rNMG}PtX4;mzW9Zc%8lb_+^A$23DKy?1G-#S6_^Qn6v7rfU; ztkcii7_(imoT*;-hjq)S&Hd=q!bkwO!Q*5p1tHg}4>^s|h zvlbTlkh|=M?i-I_s3a1B&(S+$9LC&O=!@f1o=k|A#~OjVog8l(>c*SC0j9de zHGvagb|o4+`>J53IZta&Fe8II-AS^X9M(c;o=(C0T|i)t)7{n(eP4;}Qj+CPJ&1mB z=y|Jtv;WX^Ijx=ZX%8NiU_(GXn8c&-el3iJoQKf1+A!Droe)TXZBuGvCkl(7O^U=l z_kKwK3A1g}x9b!b3t%8`*!{eBU2;x5EenM}OKPS= zN$M)UoUH=QJ$Hr)jaQTm$6NJfuIR>G-ea(lB8hu7 zvy_+iACtQhW4sh=uKxEU-Lyq{v14_2Z=Hu3T zYI=M|qBYl}hV4cms{PEH{6?ChDQm>!=W%EhNHCos74|<@z=Uy0W2jD|5Z{?|!B^UGbH~ zp=9ZUf3URP7+w25U;9$6J1sfSG(=NK1x3~JMzyK9Pkw|1C^O0p7(nNM#3%e}BvW!L z?tuXbq-vu55}wKQp6p#9e}bCj?%euh)RRFu!P1X{sOkX{CL5smL`|JP*vMl z3g#C0<-_bl)!z`1URR<0>D~KTcBH1~ZYuKiBL%4}6v29b`D)i9=al?9_llR(bE+>` zcta>-1JY^SC1$+YkABK(Q+Q02BEA*x5Fp=I54Si4+I z*fux+tC)U=b&i(j^ZkBVTWf~AXj=KxJ3R!7k)*BEIlh^C*AcE6`#o6OS8yoyLY`L_ zIj11hcT3Y`UK`O;59j;ERgpq#Q8pd<60hkWqOV&JN-S9O%zi=WcSsVJ=_Fw9HjGhr)Jh|1fQxz zl;4y)x&bM+$&EM~CsELXQW%GaK~|QzA(z4@t`ArP#xQUL*qz6OuH$qcxJeWqc({S( zDqR6rB_K(%L%=%p!yZpQOrVU$GPKJsTZdTaHIl7Hh9bIwwD{t;|43<>cmUMK?qaKA z0l&uYi9{xbBWPRfYo6ivsTY6$CIx|`G2Fcpkz#F#xvBW^!YLwoC8~1uY>4H01|N0B zZ9T%9CJ-5{)5Y3ZgtB-Hz$5)AC||ry+t(HHzmXV<|H$oj)gUKP8xg;ouFb5%ST5iY zlR{C;B{Y47a(8`v94i^TGF;hEel>4(9|L5`x z5cdE&f=!pXQ#7n6Vux-FrfH+h<}TQuR4SN?pT#A*MtD|;ZeO!3Gc4<3#TBylu4U<| zY2nmH{u_aeM+F2okqAGn=chZM7I%$;#?W7!I;L} zDvv2snvXcIH1e_>TMxER3-q~vWv7luY^{m0L*Yi!bxV5;Ew*+zd$VM+=xSH?*M|;~ zpN!@0FideMTj+x=ina5WKXGK>n(BTj%g$NknuIaurftX>-w4W-P`*br^3ot;5BnoE z`8DcSNUad{lhLNZ*UFJ%zxrNJ0($&mVx%zN$9?@P6{)`_7Z?N+ySKP+>YEEAp{8Io zz|72965T(3mJ+lPKjy1oM%{XN&@1dZlN99p!m4S|eVLxxhi5L?vn0}X@p4lfmAlWbBs2dsqx zR%d5uSGU^wwySnUMZKyA%6jr<%R3ga{ny0^8hCMN&h_a~O{V3dG`@tk^@e#9R-4RT zJnKB-`+?OE9qXBdo2opYZ8_uF0W%2Zw4EUmqH`$X=EO}vs8EysK!xg)A+!l5{dDI8 z4J0o=hLtIFSLUzu(HA2GV0f?*aol&(A4pR;yO}SXCTp^yZofho9A~k`bx9XLx5YV; zC1|Nb2tsurT&m4!klyc~_0A_BAK+p@YSKHVplFeX?AdSNbNJ>H$6=-#eIbMe;mXC2jCM((`n6M4cYfo`{(ru>86gXzB9q+lnKXFkfe%~%w^Hs`2pksgFpFg~U{ zSU#@%AgDkvhuAeu*P)-!JR8YI+ojl94$Fv?TJ4A*r7(GHZ#9;C@4}=C6?jRYq9=2@ zN^Wfx%XhLy`nGu> zTjlG+HJlaOosks8h03Uo=g3&*F5Kp_()(Tk#Go}?EvvXN76Hw6P95y3m}sLlBjo9L z|IArqOF7+Ii{C3^3;rvRapiU3ejNH)s>rm|`}f@*uk$2F+)FX2 z6bR@j7}W-FDzkb}b~ku@i{ZsvI;&ao?M#(;O)9t%_G@lxQ>1UdJ8MbB=r{g_?HhUF z6kHTxG@QN=Q<8X{yeD0--{)78M~B7QSH?lj(zZI`plQ=Wl*{?)J-ry56XjBpVm!a& z3qXAeyN||P#0ZO3p}w@Mf)^(qZcjsHZ2=+z-R?!${)#^2s1B? z-*+im_zPgOfool74TEu1^olxf3SG+dHg+NQ3uxj3lz?jfnoAg{Upq|eM!;&<2m0vb3)kVK%)&ADr{_G zwHCt+C)(sor)7Z61?VJo;*atm687ug8i+|Nr#U@*J}r|g!%gxr_GW&1LY@up{o$$j z7~D|pT@EN!NefZj7x?) zDQA`@f&7b6;5) zh2hU1-$Y-M1fi22J@3$xojRl8RWMO8UL{bk(yp!T0EIHj1pi{+qIp$ zgazIoc(`?oy`~1rUj#uaY=z=GH&tVFE@1xu2UorahtCeTXdcM`O`gJa7 z@d3lkOEQAsH+jeg!#?{#<9_K;n$xI-1B>c#b-mI_lppxo-908e?zTqPUMS0Sfb6i`yxdPV=9G|$9={L54 z_(B(b(uLIqk>C^&uwr?7VIZsBqRW>|j&92vi?5wZ=3NL7Glpo z@Br~VYAEX9s2La}jHK74p!(g#zuX@ynU9U1krT;J@8P;OVP+{&fBCtPGNOs;jAyWd zRlo2)CV+o$-l|NlG0*C+p~VNty6+e|+JZQ?4!AB}GaAMb=2qPKoaOeq%4TN6No>pq z*i}3&1KbO?#sxl4d`_k7p-}udW)SBDHxeUN~Gj^hAT$bcl>;2jP%KqS>prH~{))c{wKGE}@? z0_xETJ9$NRMUjAM0VblI;J2Ib>M1weGY!JYO2FxW|%V?{+j^3N~RQ&Xkwp zw#n!5?v`nxoUz@5ENwdyR@_``v=J>_Rl6@1!{kAu_PDaNPf+M#`dhetun(n@K{Sur zavdx~Fbe(}uAebD84X@0bUcQ9Ad0-Sq;c& zavpz^OXWSRo>~Mz(W-0q9}=tN%;u^Zm2VWp$CfyxBQd4q83U=k@oHKFOJ3(A!ZOzP z(k<`PjXr&#A<26?Sg&}h$s+M8S_>%Vm*jYsu$kc8U+6hPyXJ|uE=Cubr$Cu(^0`5l ze?u4Z&j8M@&RHx_F$hbkuoazU`>c*Mjg(0iFAmUey-Yg!e6G(%WB~;_x)I;%a4CJpsew}B~v!;5& z)pP4O#l@ZM;r^lF(Va)jt?}Cc!{}hyeVe#XpBDJ&cM8BwWEORB`gIHM#&_`t0+im+ z=v#ZRaQN$KR)8&Xb1TwK+m>EW(6-&h^{zhiC$Id)830hHb%Ad`lt5S9_XF$8UL@ZZ zUfIPv!87(WoNlf?@@3yR%#Za>5p9{if1RJ7Fm9ZZDu48C@S=YiXU`(=P0%n3>F0xN z-()+z)LT3p8LrFj+Qr)j=o5wu0DbY0@><# z?9=*kd+N|OdvEl`I2jHdIT@Q^%}BCcpkP-HfTb7rtN|)9jo?dFh-Rf|7q1Qdsr7{ma4x{x(q0k z&AXTXD;!@~W3qv~UCwy%!uQ;yb|w`RjZ;z%Cmge%wG^LM-#P%41L>nVUjl(OB2uiS zB(r7?jFS%z(}(0v{US6S42RNSQji5%RQa+2l3Wp*v6fe;fjB-H3BVxb84Jh_>dexC zkegEW-ItLWwcHB6ks=ewbBu8M^x+IDO`H}}%Skkj#7fR8)3A{_CesHzbwh)i zU#DK&%DhFD3zZtcfyOY0f&s0UOXvU@N4tzjCKLw=4jYx45j3w9CzU`=Eb%W%GbK?} zo0gzjQv5uDCr{@E5AkzC<9O9@ah3NYxn`9I7+1Wt)gJ`Y)8U6l{-wnG9s%f5bM?D) z|Huem;Aq-Q@qp^J4sp8HkOnD#vz(SvAl;y)T@@)7V4vrU{&MO&n18NWX(a#Dm&~nU z7$PD+zbxihWs_B3&YGilasdPd-Lnuwl4m7mP3|C#06TZ0t5PT z)AoEXQU{QU1xJG7uQi7gmdv=9-PXAy%3y#){!6v~5-BDc_TD8ft=Nfwmh8`rzVBs| z28eGn&KXU&;{`d0UcT12IGs`uxfBRiw5w=B^i`4L`gEDTi}b7LR^KrlDA7m;41Ztt~j0WSsF9ry%Owe+WLMHuN=D*P%6W12v=nj^Dp&`^?%G8S(!v`F|bz|A*m|DQnY`cr5uR zQQya5O!&U|aTu%vo{(6ocUWHpP|IqD{)^ZI=u)u*EJCXKFaT$re!r6wwU`?#zlWo3 z%{Eh{QgA0Jngz`L`Z1B`#TEctrg!T<->LK5Zp6;SAsq`I`)rRwmVo-}h&tIMCM9TQ zI$Z=PdX508(1l}6uqxFo-93A!8OS_GFLXA*<|mguXA?T}-X7MiECQ+IP&@^Yj24Tl zMztIY6@)J12t|CFQ*CPJ7J*Vm^VG?4_6Z@JSYWyZ&~1d*04=Bt5M;IQWk0}2oB|o@ zP|y4FQ%0j+i$}wYFzTOQ?H+SE$WT^q*LvG4Cv^F%)NCvrHPJr4VXg8*XwaHQ!o}|W zahod*1gtF0vuR5LtolcQ=HP6W;a%(6IHTv;007^3PtY}?UwgS>*CO!Up|Rt%rdh+$ zQWKA8F?L`!;=@T7`q6@2+vV~o?|OKv@h33e84Cm|!XJ=t3DFR%k{}E7#TwX^B z-=tC)jdI8&06KD3j1;{KKxFp0)dAFcrodidPWCo) z^NH9saQ^Mei|h+-A)yg@yimC~)CJV0rDe}!U59d-H2bfvgbE5hB>jd>WG7Ge$5NXn zVNA95gf`VmWDd^&h2QcOYYY!hW{*;RE&qFewTeQaK=ETUK(@Jj>DGdpgFJ_W$nb%{)|Nvywz6{b@Bb8{IfbE%;gXpBz`NuvKI_{WLwH)thRY29 zTx)29pq%M1f3}A8oD@$d%6?A$EjQtg$umL;(VYqD(_)@2Oi-w4h@B9kutH{OwqKj7 z-Gbr4H#Ith{paE;dQV+`)VR<8M0pt7{#IRQLYSgd-~{H#tfrm$|u?ki%z27jHWyzZ8y$qk3G2h zCWBaO@p<8W>)$VVOq1)KtdYqM8ROLCWj0xkRjGV(1EXo4Cm*c4_nYrGxSD@p>=Esq zXvJaRh;IM|1&&8?jY-M#H{9K^J2`rC-3SeN!mOu3?Yh`9&3W1lx)q#dy4C@SR#Nx< zYVtusi^0iWI^5bCs=}(OYU9djt51o^&%ZDLrk?dMz(+s6AtnbM;Cs&F?I!NL4kbFfC%~Y!zPga zjIaL_lNup<#t6aZ9jS-3U0N?rjS25|Kj-*g!33==r4jx~v8 z<>S38)o4N?g(^Tn(@0%v|A#>_v?f0VhV50HEkT zv;Ydl;tbZqyE4N-`;3PI!742g0l4;;1YJb$8*=?gU3XJMHzkOo)AseokPJh~hK2!4 zT=6Zu(-{PfO@J_|90z*Rd+W${{Lg!rhMs74_wo1ew`NT)hkF{s-`Qg*bGvZX@`MdK z>K)JeDWX1@rehGfu!#0ANRfK~!l2%#R5U{+`~IDX0!m!|tsZO6#*1z*BOMe9z_q z=%m7niO@p=P14P7ZFE=?$t|COagGJK2UeHf2oj-rwwa}X9#MDoL@i6YCe=#^K#skB zQu%zFPOdp*(a;`7AEvp-vi8|D=G-_+h}&U8>>-~BYvw!RQ+8tT1{Q^P z@@HIl9DOF5X8mR}#*~lVl4+8WM7xD`Z#ZxB`C`DaD;S4k*bLJBA-1ZU59wk?N#JHQ zbg1hkurgU@@~@>_@m!|(Nx`VoI*@8xTcmBC6?hOMqLnr&E+r=>BvibDl zQ6Lon7PTBZq?s22r);VfSnOOEt)5@(23Iz$t+LZse}Z)DDviv z|Dnn7s`LbkZS9-kzCcL^U$CIY@aR_I+IKn@#IvY6DH z9w^c;PNRH%6Gaio5$_221df}lj&lRAC%)cLX$o#HfMmuLh!(Oabr%2 z2vI+yJV;uPY_4|f<_^%dYjK`j51IKh0*_1f07yM#mYMUf>a!NBjFBTOriBm#zMQ}=%$C$+IE-6 ztTM1zp16~eTJ};85lXXPHi#?sGrZ11?A`=iGlk2X<4RB-Q#6Zbed%rLC56;eCF-y@ zLb#p{jEJNAt3qfJNQV4R(jikf@828RTA1_^UTq~r#x{trs)n>rrjw;p11ccaF{Z#o zcc5EUIW2K0K<*Xv*sM7MoJ3vyXOY4>T2il9@_d`vJb;Ppo>xO~Shrt5=RVkeE}1NX zaE8vGmfzehpYAhbnqyz_CFzq7;8<%FPf=BqW?2!b4IHKarSg%tg>56DCS5vI0mGEd z>QTb0801LeYu6BTQaXE8PTKt3ag0mzB*kXBiQFSX99n%Wb)ndac!~UUA|*A{$zITn z%=0j@nu8W{yw-j%CO{=;&X5K$zk0Xfl{LymwestPMj%F%J#Z6Tfz0A;RW9T`Roq*L zthBSfKNu@zmaaAQmnGDUR`Ag@t9}vj$;Fp=J~d%LHLg-ff#;@1AcJn(If;Bs^wrAL&>}(O7~flk*Hj^fEnB7 z)84}9{yu0quCTaCx7Bq~@nFsl{|P)v)OE2}Un)9J7Yz$DrYzM>SZXM|N5&9b`Z3Z2R?-SEf+Oi9U-snJq0=}6V_VIHh7Zb94>($YUZktzWvEl(G=X`eu&iGBvnEZ*sw9X>6X&MU6$k0X6t>Ks2p_ zKTp0r{0YE}=a;a%X2HnV;qhAI9c)BzG7keBBkgdV-`I$$Y#2u4(GxJ*YVNV6=b=^D zFx*D;5UwD%&ipd9Mh6K6nd;-vk=y*@sJ4*KK|KA?5nu4c-Zn@q?f<)>p6Q?Hj(OSr zIB_k#09A9JJ&|XL`1F<;a3yLP?ygCEsFKU;R>DCI%#yqOHY!XF$w&FKjuq)LQHb&u z6^tS`AX?zD@_1##CZiw@kIJ4RNe~UTHCK%-xT?sC*<3d;#N^}G;f8tN6&3Y*%j@Gb z>tolahn)9a@L%MU0a?a+T@L#e3X5gZB*KzE!VosHh)YEtG_B`pBVsAmMVJ*G@p*w@ z`o{h7awgTuZY{W|3eml*8k<14o-512Fy;ltm6uON8cGF75}}e~<$oQo$O?a# z6WzcYA+pD4Wq!7t6!T@2Awpw+5d%%-y}3CCO+fD)P<|f7Zo623-`Y3Il=sLs4 zfZGj=0tk)=F+@GZm)5}=32JM4x^UZ@+th5sq7xBv2)Gve6Jhx;!5`NWWV86#LNysU z5SL9G0|MoeqOAR;h-J<2vz$y#qwAA0KXgqFz6O%M%YqG$zNEdZaT5R7o)BX(?ez(l z?UmqVoO8FLvcqsTFUN z>x;yMvISpB?(ha(7=S6rlQkXzo1JVu;5+_}E@^U^;StXrfoPh_-sdTgzjZG|Y#u7o zI;JC)uwR$9;8Z3AfbI?N)df?3wrUkcP<%|WGr{Rr6sxtT>|Uh3rz{-xU;~+Lk~;@` zROU@yvFrZy$nzHI3iY0D>r!)ohp&3lI!Yxk+yir9;XGciM0r+hbTzEIphO=eC;AC)9W=>6lt5Xs0mnO|NNde^{uA zso!=`3B9){NXKc}{#{FErMq>O+mJqXrCpj~M|eJx8$s0SD$%!oowb+k9q;Q*)(&q5 z6dX!@t#gHX0TVmyjqAN&{eJj7{S>hL#7Cl!D*$Ax&xR#FHgHX?F<8U6~=sW@P8 zg#UKdX)GavxT%kgAyx1eBZyR_Al4LBLXumI%D(}1q?e5lgcXMp9@*9Y8Wu-|;*Dg( z%NJRzt?Q8j^9mwJZyyWSULWO~l=mgo5hq}Ti9{rp$Bq%8O;=QzS?HW9Rb9khOMfoj zYMrN8wBV#@RtT5x6}Sc8DW)d}pwcy|bz@AqW22s)h_}U_B}V2%1jW`#hvF>vwR+!s zlzrrY1X31JKgXn(T@X-&a#xOVOgErs(CAWwaYC^rPk>vwm4ldIPHTr>Bqg2A_&DXR zib71C0Z$Ri5*0)nKHL+``*OcLfv|0dj}@N3NvfuOn?1w(lTS(mWZ+8ATa}}dsNx%# z?lesJMznB%suii>EOII`Qz-hAd0)V>->rY3_>H##F&>r*``P{R^Uc!y@R36eWo;w7#Hr1omSI>X6iQ ztrgel*gE&<3q&RXDqt;vy(&NfTu(FQSz1Pvz`fSo zeDeIa&XCG;mM9Mu%U~A?mR$c-fCPgTRSj){=AaS9FMYCg@+6g@sQ|PJy7x+|^R(9@ z&$nZR4_buX5ACSaZ>qI_L}%|+TXu#w)zl){G*usttr~{Hw3^1t^R!z=yONknK6s7@ z^fszn4E|wF|2=K2;gNJ=J>OYbty0Cf7_uUfhr0jkrgO%9k44rsuP?i;#xQww(xrrR z*?o!1VQea>SSooabu045D={*u@UyhaqeJ{@)<*dfCFo`S__^l~o2HCu5G5v%Xtg(v+^$YfO-?K4Js zcKZTG(kVs^=VeCTQ+W{xao1ssM4#MxZ1x?KB|g~^>)ed9b`ixRrNFL-Yg&-{v=O>| z8}^xKr4M;@hxRTzY;`M-%2mjiEw5Qw zIhvr->^5))YV5dl-XKmW#3dvJrkcJPWKP`%6%a}g`2HG@HWfOfT@7d)1XNz6=I0x` z<2Jf=Op=m2<@7sr701}>$iyWcWXgNpjS8GiPFYQq{m9xMZQ%^7>W$P9La|_!{ka=& z{yfHVYhrswPmNf=#%Pgzn#tts2W1*1A3BaJlD>psBMh^9IQD)Oi>8ru zx=o(zaQsjix6?jXg3q<`AU=_LeH$U1ggNCEfrnmxh9N(3B@1Mx*;xiT5Vj^_-$`8Kb^C)^4a>ud=xQ89Yzi*itrI@&gk zr4m^?mAM<)!P}?RkfJ_<3zTm_gAYwr>@fE6dYCwF5}Q4i8O+pNo#lupYLdU*2CVIi z!PGmOI1^$;5`5@{e(?cHqjIzEGL?RG*Ir83v4fV2$JGz0LtrZRur__4OVdS9b(^P} zvv*yvd&MsfZ4qhR&lE$e^4!v>87S{-+;ZnV(t?w(u4a0C>Vy&Y+2dYW%MOw{Prf(| zx_g+kKfJs0Mx09?Akh@W_NzXjxONE(z*RZ2z|&R&y=%B{wKGN6RA3$Dnao0{I3TY z{xwo<*~(J!JRh1{6(BnFY%-`9Z`2l3-qAheT1n(F?WW=-Aa|C=L23$O*HXbHI4kqb zHZ!?y(`#Co*Mc_v9&rs?_U6YvG85y=PUWFD3&BZJaPgPuokpH-s2O=7Hj334|odi?~JB zc0->(tNQar=c|&DRwx_lF;K7j-VW(M432|HY4fZq@d28Z97#x z+4*C}Ie$MX`^%DtBIk*)ARwa%BMsx1Nof{ywrHfE^wFYPc`BlFNG&bP?xg{nwR-KK z)okMyI!y{lmVFsk;-qnWH{F+gpZZsn_eYcTHzN)CeqMQY%Un>edT_Zg2?p7A?MHa& z*=QE4KYo&ajQ+(}m{9YZEH52-X?B#I7XL-C*kPMzj?;(xcyQmNS^|*Xtd1&2xh4D6 z_U{6Y*{rrz$yc#El#lRvk#KvqQitp2+}QfXQlpq!!{W-*;_jDCy@SJKw3Fa_-zhwr z`lvb<_tbIQ0r1H!HPv1g)TFk{7UG%CZ6Y+NlV@Q??W!v&e0u+5T7r_miA(s7)4unS zcQig@Q~N{VS&lMHRs+{hV!P@I$#~)ULEVt1IS8Kzzqt@eh({aNhJJ`d z1_g`Gi5kOFA);CduSs`;!^SrTu~EU_5BPCN@`j&dB;mtMR4jZb^H`cCjXUE|I43m< z$cifKB0t_(yQTMHI;mqx23xU-SwE>ep^ON#;WJSsY}aS8sl{b>vtF6^Nedh{^)#=UyhmOrT9gkfO1!f|)5o`@J#t3h)p#fyn4BYy6;nd^R!n}Hopdcuz_HB%{yA;N*ETaH zUJJ*LeYK@iPbVQFNkJhCjYCVONjj3w%jlW&8c!X z(LNtG|9W=IAv+-<#H1?YG8HW4?4RW*}-(61iWoQCJ3khSa=Izv3c%cmj=NvEu# zPsBd7tX%R~!rjxnS?4y?kl{S820$@9to|L%XDS`B^ny>Me)jh;2e=Oz*-Oj75%~2| zT)E9*4lKQS9eA;`(XE$!hleMn=;~aC#Sp)9iwz#jns(pFWqSIW! zG^TBQYnPGjU;h`tWN$vYp=B!fAfY}DB~y6uj5x`(pWIoPXF}U==Fx-=eWe*OQy3NM zqo!-&W3B{-JnRsOK>ZLAYa1!u;RL5s{h z;F-#_?V{(->v%58^6rmVam$BFKj^~9qKYro%{OsJ{n6%x0QzioEG0d0e&WST7)>4_ z&pW6DhdS)|-O3^iwe8Gt|4OzffKv=2S%69Ay(;GOWONdR;q_BpJkae=ZjZ$cvx*%h z9lrT<;E|Tw_jRdR!(5@*>3q=v2SEM%M68Urt(D89@c7Bu2$Q5=g}KYD>k1^8R9(w( zRNT_xuH_jb_;E-*eTdwB{(B9xljh_U${6@)&T8#x9`=!G(g~yPgdDjE7FUaP9;Ouk zU2P)g`-XpK`0?#(WIg*`ZdIfWTCDKqL7Ct`3L_&F}XdgwRJ_xD$o7N8FLY* z{v8P(H>gC1{b^*pmqH2b(1~R6jeB2gXUVi-Tz|)I0ZI}365@epCK)YGrXcr&3*RJ_ zj-Vf5@M|s_Ch1|8c(B$RCdn^iRqcRm`oZ=fAlep(zc{aaub~BNM#o8RO`u1hg8*uS z$#>Po$$fpgVJf5X-0~KS`w|in*_om1`bN8~wZG+ zcg@KrxujK?Qfb@aGRHo_OH$L}R?`4+V&vF*L16P9^Wqw_Pg}IFx(ZHMVVjt#gxB_4 z-YkPwKnUCmLfQ1497WXlHJ-&iXWxbTNarj~D{T{}lp|TA;aM1SrfmYjY1KE>={l$6 zSw$lP1n|#mb%;NeaX_4CS!?_kB7*4qe!0g&wsWSv#W^>+s(sNNbc6@1OFaZs>1Gf4 ztreUYK6%Rf)tg0a^m5{KuI_`T%e4%rNCjY4jW=TgH^IjiMb)ZKEdP+%N>jj`vDzgQ zF&bg zwa+9JbSrNI!9!D_>g@hu{ek?oAHug47BVwEo7&>WN{E*g=;8#B>R_(sqr>o7hZM{1%qDj zR=E2*&m+o|lwKyIkrWL7Qv6YFN7q00hNWO~+cM~mQ6n`6(F|vBQvrgd8%y%k80XtH zP>aMI8{!bc%%At}`GOUnn2_iR9)8WmIcvwla99pfI13*0<@D1w6bpB=EUR?#Y?96V zhz4kM!xKh`(puMb@Lj4^E_4;(1n`(gCDglT*O&A7>8vfMIjrp)h$OPt7^@&W$MzTk z{rYTfdDn94d!Nuk)mg;hQd6C=$Ga8P!FNb30d{EGf5WGva$9P zT1kO2$E-rD?)B?XE4r;5zo?p3G!Q4$P?%o1B^-0vP@YkgSp$k>D^rMwm*?&0iW-hf zj8`JG%?GJ!HX4^7wbSo@&R=vdZPO)6RO=2<%$vo%UFNCP+|tcuc`tm1inI`Vdb52C z0ocPK0BXw--vUsZ-|>h#H$w6iL=XotM@fd_6tIEF*zYc?Y1?dCv$$@B16$djp4KCb zafsJhqzk*@K%9qM0|fa(`a|o04dRehqPAg{XVKn&orM`3ga&LHRU@_I{}g^Pi@=V$ zklS1Gso%l(AH(#NH=r$<#sZ=#{7wU>8&-}Rm5KnSK1=X4I_p#^#Ng{_>v*D`N0BR< zz&ft)Q+XF!nB?vHb?B3v9+AgR*3qnS)Fr7rp}PW7@FA@DK8_Ps3gzTG&P_r{i(@F< zgJ_Xh*I*nBXE<=Hi%RLVQABdAHLbvI{YOu^)^Wrz1;p&th*T}42ps}~gaR;%7y}A2 z;Xdl5Vs0iahaNcT*58vW6pmoN77orK2MtJ!swT}pPs469H?pz(6xE8GyB|Abf}+b5 zcfM7b(ir(%94^ebdi4vaa4MFaGI!@G919<9s_R9zk^;hLS<~K+pUt-(i#81_n)@OT zc@IR6{bW8BvaP1H;?`_qtU8N<6qTzjk|JgKj9VpbZmytHG~8O9Ef#F-{5XimNwt@F z(dW<_R_5jzFIO>G9%2z}a)i@rM-t)Sv)^zkZgz^96|;tP11bf9NN)z|{BaSiJ|<;n zVe$Z8@n1?(?h>z7^2aM_!v&6MkWbafX@7PJwgJ*Pk#E*X#QTXaT%=;27$l4c5Ou|O z6Q>+Mm0G=}Lt$0keZtZcnoKBo`a#WPVS64o)NG>;r$}q2(fp1!cTI-wEc1SNiDIa| z8m#L1!mlKlmd=AY!|p{6L8(+dsOh7Q$Q5%W+ws&C2j6Bn!ga>Kn3yo`3dg^afnCU+ zOxFfPLT@QXBDp$GqSG)qAjC^odJPRum%?HE zC24}ocU}Zg;SYiNCRc(p8a+a3ECc{>cp=~nPs2zJMU8_dV(T@Y(t+K?B?S2K;pqWS zY@2=<1=Z1t{9AE3mRmhE@tdr}x#w=TSru~Pp}pqK#V3MWJ-}wv)D^w&=r%g6DpCt1 zEV9x*JsF!kMDFQmZsvnTjd>MO(&Wb$w6q!hsrHn8M=EF)n;eg5QoSm1`enw zBQ?_YMu%Mg;Lj7~Sa*Tt&+5;+nNq&s#{ZnwrfY$RWJPw0~1XW(}#VLu3 zYwAWw!EJQ+$Wb2g&k?)xg89m%x~J@BO1jN{&*fKpZ)9bgL0V~Hyk}1_c0A4atbP6byy>k}#$e{`cJNU>%Ki8WC& zcl)+?L#Mw&6U_YW_i?f0k@^s@Ecn&cS6QuMw1R#cq%M{(Y7_Pjirs*U&U4wt8#+A( z^OXX|RF3dY$j3m8Z3nLNY|*&o$#aKdbpT`mouvO;X;lG~QipVg;1pI1itdyk{gaBYbVW zilvv@)TYSLzX#ic{*fN7`2|`RR>GRdqbIU`oibfQW$3xJ#=00xxw$O!-_IX^R3YDg zLJ?Ry%*t!L@V;PLxtZ#jbxHy0T|`Do{*pu`YaYR%KS?A<1fyl{#e0!HBi?!KIim1P zG4Vl@rFIvMIZ+nZk1K52ehV%2E2@Wz8Zwaq5|LM!_jG+DtaL(msG`4DUGgE=aMOl8vS-TZ}b** zLLVWFS^e^TlbcQ-yCQR=&NCcYb{Ek8x_kf4Ds%pBz$)6X`XdCr&^f-NpltSVv3l$k zE&47|!Z45yP>-l8tt>x1t#D>oPCIBpkGiN`a;4}unQZ%>nv!p;wfH-+ixmwf+>rf; z_jgQ5XYv;VcyO`#bfD}rd#i?;ae_I2p!(;$B87qpHbPGWhCs9FE?9rDnnYH0 zUTWSK188s)i@vj#-!8lwd%wB;VB&+JM~F#Earr+HWsf}lUV=*@V%EU!kv8<* zp5n+x<6p$ZIurgTH~$|bi(d^ixr7V9MEnmiHYsexV}L@Em$#w(4~_Q=StyU|BUb0{ zL-W6H{QU+052#igJ{_`X}kkYX>-sm;Mop(|uRRZ-#6A#eI81Ma~E%HxUI=E$B zk2hxWH7Ys=fo5x8+x_-*qXG(%`H%mS31Jf|Cf=it*EsBN#E3p~d&xEacRByxMnh33 z88uifX>m15#~up(xpvz*-vioLh*tH5#^?okh0@~-&>Apn+t0Jk3v{CWH98G$7N8+F zZz!tV`VO4RbtU!{=$2nJ03BZCU)~93k+`0G2O;;l=HJ!3a4OX!V{o8vjN=?2J+6&< zKp$Jo*k>_ke<)x=CkZq?*;%Cc;+brx)BF?iWkdt39mnqvrN&tAH{93D+~DiDEV^^x ze&M3DpZKY_2c)8ASTtP;BJ!-s4+x+NUjWmXMPun1cu@d+{{-&M^st*UAWQAtE$(KZ z->X;+0a0Hipy-T=E&@riJu2N#ehrb#=Pf{JQ#cDnAVKL9)F+p9ipVn8W)THBrlSx?RN56_F7RZ^g%z#AMLW?N%FwjJ^2TDYGOm}mKlbbt<{Nv_M zaRbcW6M)#c1}aBa^$jaYpg-K@(LyJ7&&ZCZt37DmYkY`lry$AX%W+!1&1FF80pAA2 z{qPLnB=0;Wx)iGu3X10ri2K`<#$SSc5a74i;xGF2NnPYfFt#z(mKgXikl@|K z;7O!Bpll506Kf|=cF0;@%a{LK!|{uOJ7hbcPKZk@Blu~c>bM#)?Vd9whw}47)?3xA zV^F`(`DL6#w3erDqb(7`sON?04dLZ16tR*a%ylh@WgMDmhHo>5<<4{CG{72)I92gIc?i+vuXpE5(fG4aR)Q)ilN4x< z#my(tBVGpWyyLq-A#sOgPc;c7gBm>2lt;iyLxAF3aU_Mpg6`J^p!je@L}9obp-dX* z1y95oATe7`TCIY%E4Sk5^yF8q#SXH5R`$%$`~+AaGmvqu^?hdgkL8mF$Ll+989#J< z+u%x=1Ciq#RIT1OMy1Epht4rGkpHt8WsZ1^_k7;H!5L^2ZY}S6-yHV@o9pRep~PEO zt>U>G4q(XB3BM@iP8%k>sw+9ie7gVhgayXrAyo>olhLoXWC>I5UvYkl2Bf4e`W++CjW~aFO#`0Qp!n%mF zg%StnCDo6m@h{__+eI!KIObi3&FfCb7WMCLz^$|bO^a_+aWNJXfN;+O^t_s%YF43+ z)(RQBeOwHL#luKXxJVm7o#$>&%_EfP>cHUMTc}V)Uv6?Xw=jz(4DgeU2@l^-A>sO~ z!3(;Ui%<^u@~o+-eZVDNw%RwS4rkfB10B!Rj2h0J0?C`b2UmQWiLq*+~ zyrFdk+AKnk^O-)O4cyy)DC6x*+8tO7!W{Ie(@KJcg{WgdsUmgIWl8Tn*$rUklu8T^ za#eti=pXvI5_Cw~Pj0>TKLc9B8{#=YntJJkAmP`7$@hkE(*Q<(ELS&9iA&32#@gQ< zqX83$nJs@bvF8bYfiy18S6J%wKih`q8b{KLJ#hPJL`mEXY#r@;Comq4fr077L?HWZ zSPIrVUagf`@SQtucbA6q#^n19l?$-`z8=WLsv><-9V~fVvhTjlLt7d4ca{)uCaS;F zKV25Qph}gb()n3-;|`RdFK99H9_w-gP+PPupRkvly~3}9r+XdC1D1506rf$iGDQzl zAHE2n-mdLzf>?ELnE=D>6631lJDIDx**L0mL8$%@kiFM&ya+{5c*Aplb6j8Rx2Ws- z9+rd7PBNwu(iKuiTWbiKUg}xVQZiUxKt>0RfH$$Qhe6 z(YMU}3ZZ%oeiVtGn1V}!9r9vt&TSb%*o#_1S;rMp(Hg1owtq1D*DDD`1@b2lQAU<| zhXz;TNHz-93AAT#CTKs%_6!thfS=v9e=gc{9@DJrCAbJG?jicF$k-Vvbd?KUXT#qM zptzPnD!wsnDzDHFpaZvR)_$H|oTc9a7{y>?+^?Tn^Z~od0#I{;o?#v*_VFa#TH!zG z>K3C+z%iHl5=w1MgGOuuC)^H<^RzgDXPGDDB!&x1B~p`lCG=hA12WZ^Z@~bX*4`e( z3N=UdlIn8`&*XeaS$Y_~D{>Z%ih+Rtin%YG02@ap;vMIR*Y5@Wu}}#p1c-_j#Jd7a`ypBqH%4sv9r&Kn_Sw zbTm~=)Mpck!tNwb-*9~AUFLzuLyW9_x4OMW$<LjltLqz)aC4z(6CF)BU)v~!{*7Ydy|ARJ?t z4C0ry2ih20QA8)uFHoA~mV?PB`$ktxznPFACDe19itSVR9Pw7I3pJ{$A!!EZF(1X9 zegYh6EpW7i*!BsFw?z#XIApe&Y5!QZOYwnU&#EdNW6U=AKAoF)$ZW7R ze7vR{A;Mq2mTdS zMp5*O0EbCcD@pVqg-dAhX^Z~p;j^|Y5xmf#L?_YZWdq|(fmCPX&$iDO|j?mHKXk)2Vl_`XdSf3*9(~8NAQwsJaL_I-st52-Vnx(h9U|OdKJcKO8>eH38X}#`ph) zJkS^Xq7(zDWk-vj(A=Y{X36+WnPE`}p5W39PXtrOsK6qRxAaERu;9ipQVbP!u7 zaX-0ckF+lgyH{GSF#bKFx;jpaK;1Q1>gML;|38XIXLf_x%XoF>H!F8a`R-wZ$ZJC?&EiU#P*lj z!^+Zfdi`V9Po!lU1@%UiRPw1%b~|U{YiU2a>Ji&Mwur=DEWlj6eaX4#gr73hG}8yV z7VXtfturj#dAkKuSMykqbOWd}4irB9ggqOtP|Rcky!=_e z60lGN5G%i}TMP(o{(6&O&IX!-Oe>&0fZ`SWX3Hy=3oQxwONV;t z^ISPIB^Xu{O$~s;CvKyMDi(I|x+Ze{NpR(~6P(zc96~429klIl|7B@Ga+o=)76p$x za8)U^3MR|GDLkvsYtmiCmw=DM^E~xOwva^Xw)fo}FHF)J``1cG2eZpHsH@gZb3gV) zFVh#e`ISm&pbJyf0j$9y<0^m?*s!Z-m$DG{!oiu;B##){es`rh1XBZi>e-9KWsTOW zwK&VO8si1OR?L!u*8^S4T$;()iRosf2_THn#(6j)k4SioP#2{gB!|}UGt%G0&pDqUL={#Gr~q z13ii+CmrCdpF)h%0&(Ld`C3lC=K?QfcHc|Dtq|bw?yed=AI>f`dEdV7f)&}DwDyEh z{#0yy;mwBhsEhPm^7AWVL#_eIqzTYOdvo$6Bh&>1IeVL#iS{jim@MlM9=z75&6nkS zUgV^TFMhU36(-g_?GnV!ka|ho-4;x|?T1G2zVF74I!+o}Yvi9vkWw<}Dx_r7{d&=mUq01!x;0AcR+Zvjl0}IMpUSxSN=)`~^s2{fW=R*MJmT#FwAeYdizkXB z$zD9SBm&Qe)Q;y>#tGVF!U2iJoJh_~6Nr50IB-xG?Lrtow_tGh?Az##zq@|!|8yxB z%#x&voinQ@c>Iao4WqBAs1Q!-0836OFQemvUzzdHwnlm!^c3a{3^Aog|Hw`O2J&5L zl0^v>t4?FIcGP2$&zok@>em-;{A68Klk6W)Gq#28u7;P20WZ3Wx9&bZWh)x4)*$l**F@{gbt~|>DW)|P6djEHdDHAe8F6;d;Eo#j>b{M;-8l4JCfbi zUd=uQ4(@ZwA2A_8j;w2qv*ouAa@vMRneEZvV-ihE{THr46Z7?;UU{D6R9ErfQam~D zZ=?`PSdlTqn2&hvtf6NwC0{Xhhd@zFg%yplXp%9y&-em$nNNRlHASQcu@Qhc4!hkx z(yYIu0Atj?ixxREo@l6P1bs=6tAk{EsCcF%5+TuWa7cdIE%G>b;~KA`d`-iydL`)} zuFn%sXi{0my>jt!yPfe>*wft2sA!#tXKavEd3p1VVAyZ$IWvBPG;fT!e%?S{>J{(? z(jG+#%hKph4vyKLi6M%6(bdGUiW7!jaM;X*F6I7%M)hLg8IHAr6nV}*srcJ_k&rmUr5U*%bek{;AB{?vb9YSIH@ z)*uqSR@r~V8{nr*_@Sv~{)nhvF^^re7JBr!FfaMPL&(7|4(!0OLQ*FsJceHVNB$Nb zn%m`%J`(@;SA%blO#rFgUTxTLxBufbVX&yafrIeP;VS=ig*#Aw$JyiLlYiLFKXSsJ z;2_nbjM~TlarFk2ASGN9_27rjf1D4>OK{MWaW&!}H~RMlpB1`AKx`cx)$Mt^ zSK03FV3@4ij*V=;{*NI6H%}tD8y1y8R&~W4WMDY}SMMD3=w9gSJ?kd>&kyv#ttC2J zZ~%l_6{xQEkpK#OXpdWj^UrROSC#FPYCV@@m1Lj%Fy{*PGNEyk#`q5)3YZ3>jW}o< z4`ewNbBr#)dgPLxGe``k=kAdl?|qg&(wTAM9~_S<#Z63XXyb5o zk$!tMI5bBOk_C(O2`T~$*_nwp(C4V6mpv{Hbn~WB>NxMRor8AuDv%Kvp|8JK8iXW# z=9h!}q9hBe3A%OQmRk#}R*ObB$2bN3Fx~oKl>;SkaRiHz$Q`B_wV-y6GG#t`| zi!2Ub12@>F?dw=aO!cPQ!41yYIRe?>udYl{vXb0Dq{6ME7Q~|OTV;rz3^e?R12n;Ks9Jc#< z07BNvluk%>=K4Dx$><(x2=5)UaDbH>`ThV8wF9umwAy8H!~YrzaHy073Ykl)m6rt1 zH=&0|hA=BX1r^HQO&Pire~mP&-C1dWhbu^e2EU#d?eam!o&jK(P1Q!Gz=Nl@2WnBz zbD>-lx29it{VK;#59wQxgP|k~Hf^U0s}FL5c)_{;-+}>2{DngOYOn2(KZ%db+^9H} zf|_Hq{|#y4={FGc^aT-dFxbk5chc=YGG$nCy%!h0f}&u+0GLx#;?AZ8i(!u)Qk_a? z@QBuS=pR+9duogs=AujN{bihzwc$Pt%Dx&Rri%yu zSx?sA_c(m_<#XO&4l5ns-8|pTNHTZ6eu^69%p<`y)Ti=#F#&z;Ip3T69u_W+JV98nWv5Zl?ycYkxovjxU`X?f)q zT=)*)xh!tHei}Mf-+cnP<=EKoel@=Fl?19$Y7Yj5p05(x0G5jBzQb$lz+rTd%vW&d zrfV&A+@!BI5UKZQP;y6ls{$<7F*Jo53d#ah+PhvFnqfKx^#svUS2kUD|^pK6Y6r&AHAnyGB`e(^qJ&u)iT-G5AX4v@EN$?mMn#1_1@g z*3~|Hdm76isp(YJ1tID?y=VD*o?~yUvp z>^;E!GE0v}vK-1@*!M&vv7%yjI^DvZJ6k7lIq>9O`b_p>m4Cyd5(~PO3!%0JL>h4u zN_xe0;1X={LqB%6ql*GGQ00DQ8&5f_<+s`coQ-#!>fEPEyjOxQ@Tt_`B7E{TVP;kuHhwn}y_TKve&m`Y?qNgqVjY-w3V1?aarUNe_kV^x`IpAYyJGyH;%ba zWNzK}ZI)csR4#(gL&W&p&8oz!x~h-i9WAVVD_W`1LMqcfEm;=Uo!Q)8ouXP^+v13X zQ$K0-#b9)&vMUEvJ{@ysUZ(F2n&Nn@*wp)+E}7oTSy6AxXP+cA)G^4A4YIfuw*h5@;SJp6?{3!3E3`);XT60>dZ9Nj>*2_VtIJFi#z zeI>oG!m$|%WJnT?`G}`=&h}=fuaWsaJ^z|Gobn!rEo251HR-w3e>nn%=czWZUlHF! zJ*Bbfo(Q+~T!Y-YEfw!Z<4;rAgeXwbVhZSDYJZAdwDunCOH}6t-`b3trgK16u!v-H zqU(pvWnuSJ>dC2rPoj%6fJMwI$ndOk%i5*ticB(^M%Fr7=q*(Qt?6$H)HAmF^d$OpjvWGqZuhOYgBosCpZnoZcRr8$|%AL7yZc;h0FEr0@k zrGwNY*Urxtmn!K`wK)A&}btr&HjPnD=0uVF& z`e#8|)B<&r&R^xwq4@XU7S6qjk?jepO-JRgo0P04cgG?rRlTKb79Otg>fN=#r-tM`|n z>M6@7zK89FAR*9eVaPRQwD(woZqa@gqB2k2Le`T-01?*ZSKpA0(Y=z=)H6!^0o}Wx zLCU`ahs!Q?BYv=oZBdQuqg{O9Bd)I$s)0|f8e!&o;!GuD_^XP*cM22JhrebIP2}jO z*W_*!-OTSv{vfz9l4g`lcO*(VP+swYP&|8=p1zQM)=q&B_u&uOGG?m6QyxB%;ft%$XfRNRtGl~BDb zc{n<4VQumLXMK9Tv1fLXjw-ve?Mx`hC0h$TzB~#Z_Vca|`}k;*n=K<>?&s%R8`b1y zZ%O!mcFRXPwvl^ zqhko*9`Qeb0e_M`QNzbkh%N+dKET3U4ae7!yqa^7b?SRfrYXZYDl8-x!CHo4B_{Lnmef0P8}k}iJU$nv&2q@F zJEH5EmaVZ8V`{ZQR&mN0jCjtcocB*SvL%)JZc$R&{H?^+cMu6mH4*T&?BtBnc{lgO ziglhVkhfwoS2D9n`_YJ5hoRwc$__Dg@>IbVP@Zoo?1iE_wbrc_yx|yC(8X`G>Sk5q zZz3;S`4R@*Unq@V=;*b9e8!&Zy{hIjEt1(NhRg9e`rJ-M7>fHuc>-Tw-|}uBbxW$v zt19tgnnJgMjZg^&F(hUqXIFnkm~l>Y@#^)Near@;;A+IG>p_brH)+>Gp21*^m?Xi+ zvD?m#+v3!EB-ns>L+ag~ne1C_`ymwPgKToICDso-k}blNbpA||4^|&dNbbtyRglQh z=Qcu7%Pae1w;aB=9a*gxEF_0k$5t}XRA=H`ST)S=AT;rze8?hygbckM(0ej53XjCP zv!%kgc`>Y1FqAJt!;lu@)D?4sSi+nWnoMyje)svdAiE+mmpSt3%K;nm+rj+I9EK|1 zLlpJOfFK0dopl~x$aHl!!a<;T0bTy^VWzm#(QatlYuTY`(vbkt(f(B7K+Q;+;jCrr z2uw#|cofCYG!#Hj@r_<4f_=Pn3e(MKp+>ROQYy4oD(Bd$d$#Pj*KT$s{tXRvbm|`Q z)gXVMxOJi9k=x13*EE+fWLlZA6iU*#Jz2&_`_n7TcEnl-g5&)>MFpF#KO)Jw=CacF zfABrZBC6rlf(Nl^HgNr&yJ&UjvWeoL#%xMN=N#Cu|hPhLG6_tlk@=86kPUoy+uJ#J!{@O{SaC}NOFzER@ zWyLqhRdYZUk@c=GS3DiTUQ&ANdJgakd|GMd%g$td^Q+fx?uw{FXae?(v%T2%Iw8#% zG`vQ2uml#)6}@2580HnIJ7`8Vw}tQ++hiZno*XtEfk)K|{RmW-Yw-)|%c9Iok?NEU#XoTbKRnFkT0ETAwWM#tLNmJ{az%(s6 z;_I#`gS$eK1+mrG9M=0c!>d8nYn`jrFce`?>sz+*9`UeT1u||q%ZK|K9Lai8`?+@G zqwc*~*BF-(w(h!vS<9oBm3T0B5JiaxL8#xKD#{NCEPu(W@lr3{IE|Woi9eu_xUxsu zxtfmpe#03HLLW(=??Rs2)wANfj<{KHGZ;~h>+epi6zuiVi8vF%NXetmz2$37-xR~_ zxsrEY=pQEafv1+52OfIO(P$v2J^W)<{^V_g?+Lx$A+cl`@?4ustgW0x6^>BBA1JJ9fbT% zYzSMS;qlrzkxT?%mte%tEp@vry78P}g-<^g^WAeUY1=mBRY#xi7nz-}@8xbCT~2ex zfyrW#_g(S&_;*};LUzfBYHhhGSXbYS37p?Ht}kcSsxsT7~nRUw}h zuC5W1078O#eXhrFhI|bT+RI#(Yd2f3685NT zl2l}@!jhJ*wiSA7GMn$5;K>y|Raylj8lbxy=p@+BLHq}X<&}^Wg5r_`q!fJ>J^iu- zaMSE}Zpx(Xv*#j{U3masvm6QDpEWr-se)qs&DJLqTeY0K!Z&i?}@F(o9;0#^%39VuBZzbB{;KvII>4^GS0*1nETRpK0t)0dHxN= zh78O6-rOR)Ld#z1gnWVx(>J8zM@*ZxBM#EtqmWkeI-B7-`(gTS0~+kxjq_YsTEfCb zkaVb+H;zavqQx;f*gYYB2hr{d+lw_Kdi?uShD18>4Ss`b@LQquSN&mCQFLlc?Agpp@RT%{^p7(nV;+}% z(aL}T*EQo-&NqcUl&DAE^MQL~>xwH>;=5Q>*_A|ckX0aa4m_n$P0g{S+pg?3>~|5` zZkHd)IBxUQ6y|1sX>qS+ce2Tp75Y`r)FnLMx?r71aekjqsxXu6H<$Pb_pQzKSz$zt z&dvTeFUTnT&P@U4o^#rGQ6k97m7DrF6Mdad$}oAppiQ3BZ?d?68JYDlJJj@b`l(Zk zcn$-3b%;sqO%X}XwM7=K&-L9r$ZXg0UH<5Ui7yw|h=h%SD&f{4%4 zeNv}evz+T|U3vk37$u~U%mOD8 z^u92B22BIkBa0IF;g=bXKrMRvzQr-6*3S;W^du-i$Ql9-T(lJV!nq4MADT zIywRAHDBSH%yO`Ds_F(Cj9jI$hh1&faCl!_t2MaQ$u)M6-v>RiP?O34yAfoX4~E98 zG%;};q^S2-au{#SozK5bJ;X_^md%pzXw$Ijgr_^b9X%Iv#gyqo$D=d>+z7>bb;OsH#8D(ZlG;goC0@=96Uo~vNoh$c0_x|t@GtuN18qqqw>Pl3eVB zw#{`xLNfgTntT{8BhwsgWVmUX9*#QP#d8xA4cOFx*1 zHNQy-JaRohA(VtP3^~YpqPlWu9yL4!R;r+Eh-;D-DNCi5#wv}0!K8`Fa_&u31ofW= z=bHk|=rLT&|U7t22}6o-{{S3HH>#o(4xe2kuH{S?gJZHFTrMkTT{vAV@H8 z702aO8d0dTuVa)|?Z4Mc$a%s$BvrdeV*MVj0pCI@nK4e_U??G;hItQjz4A7A zcsKC$l=hp+K$D{AstV^UyAw~M`lBqz;x>wR1xUGkl~-IfZi@^_aXG0el-~i1yds9h zL0ZslS4L*4pKF_L8gM2xX&*%CtS6(~Z49QFbD-akx?03RmGbeQmcF#P6Yh()b;B8QwV64cnbf(S!twIv?!18mn^Kb1vi4GBBDHZ$0g8hxkS(VM{863R-3=zhRjnuN{vDtoA>e`oxPjzZF?_C?MSF9vvh@yc(q=m zaAgIyV9UJGW9{?g<|yNo&4r!SFHlmHYDn5bS#m?%{1h6dPG-b+cY!h`(xAdxxeR4b zVxJNZ9A^FSa&vfjzc;*(b1SVN+fIU`xVkkb=RjD7Rt2gsrBsXOk=OU51q&p9hT5bO zFz5^U4MeyP2Usun!xdYrBGD#)VZ_3@3UMl#tk0xuJzOSDh!_ zQJTs#{a1HXRLLBi8=N?j9V0?oqKd|#$j*~p*lR00Osf>hN|i{XG8tWEnn9t-R<&jw zwEdz%(~jPb2SUFR7MPxS;RHzytuCo#cv5{2ncom=pxJa&`679i>nv(%JHV5+b`yi( zVCUAAxgQM6btNM?Yi#4VZ%lH9k;Pn)es4MQLSSA4vMQUK$SJn`t3#&2|HO6pkg{Qj zImhMJJ(Ki@x{r}Fyb^O=9~WX-j=Xlz>H;i<$zsYvN+?3YNSyV%KbIVSDR^F@@}%DC z!!O7XJfr08w^D_8mo_xXC_YywH3AF8^lvPnGZ_^~m%r^6n0|B?exgve@~%Qi$u2aB zG_zY__|&8-9mQNqo}oZZ>P#cbQE_nmf(R0^XiPx))A%FTAtgJAw=;*rv zR&SsVE*YMzl?XlU2(!>bqntROHui(CYW2%yu}VDRJN6#3KSL&@ktC>hQexQu+m&L$ z5?0C=nkva}BS3-%JbrFjq#Y8TI7vjEfeqdXD{`zqG7A40#6IfC2Ophrk|%_kX?{tV zx>12;JR{O~C_M2%mc=_!zq*}v+X zMKN(4hbZ5G_A@h#*DH@$9FIN_eXz2W93+hZOZl8rii+Zz{!ldb-qlt<)5|}nvaSmD zLOyoQ6z=k;KMm8L*^3U@WZpThLDm+1eU?Ap{=YNlCxxDR>07h^4a5Ip$QYDIMjeU) zyMG2ze}3Qp`^f(rvH#m93{GTt_=jrqsa^Y>2|aeR30-jsiQQ7Asi*%j@5|_uovzMy zr*|#NEoMznP*94eKC%}*RA>Dl+}-xq1N_G;*#v$)e+=RrjigboG9xM)nqo&3RMe8L z|9UGoEXbv>w6?a2Fg=iBF&|t|Xa0cAoh&T0t0^S@mo@n#4=e|sKcn!dgfNl6p4Q)9 zCELRxv5o}O{&?}PhjxGpmQ2$HZz1jzyT4*$=AmJK4K!8{L?<* z$A}^<5r+k3D%u8FDvP7KtMU74;zKQ#lXm==vlc}1yk((Vq(??sLJsf*YrSzQ{>~p% zkQ84fdqlbUVGxV|OmU(a`)w3Qiaos03f-=sz@nAyNFE}sqv0z zsHZa83=$IQBT@bap%I#`#zXhd3TTeDq>WF|U-S2rB8_W#kqTwJH&cm&MX}q|RKNN=%QX9=LMC@I{{qIpfQUiG(ULCDI^#2+4-{+Vo7g&~L+ZT2) z{(Zm&x?c6GMA`l?b^B+%A{b1%5hl)>e;*)C0tZ%(M^|V5y@F)vgBb)t>)ZSHfeu4( z;L-*1n&aPRyrl}x`2WY3LY23CTU6tOa{&}Py^-`9l3^55J)g12B!@FDi4E0D41z9! z04whT$U>y#gRx{f@_LF`!+2YI)%B+n@K(0zMWp z(R;#qoNkplEz!U%0qXuY@tu-Mfv=dQP-ySVua@?#4c3EuV?KP06QLW(xqmdgTH~+k z`O)3E&rD7GuEJC^l)XhXCfNULSu0)4LG)z38)OFT1PWx4aD>H6Q)L`(pxW76Za%#u zmL)h11qkz{0GZdMcsWM8?Rwv9p2W@J%s3$7>5rT&(Bd90)Zyc9aJjT$F&=u!-2fya z(NNuW-}oBe=JA^M+dA2THM-fUZn&!vkbU29n}Ggby9oty5 zYnI>3Ky8E+yrK-K@7MGeFfBosEgG7*2^f09;#6}NBFnkj$vmx^u@A%f0uQCPC`NiU zh{RS+lSR>gM)z8ewiRsz(j=X3j}yU9{psodG(`AGB7UL9gR6gY@yM->FXFOIAIH>E{TXV)PRs8g+ z<}^MgVIqXrfy(;0#ztOhH3tSSSHi}0?uQ{H?rp(vQN=UnAy)dV$`W9H0PcYO z&$o3&0-gxub=iXFUEp4kyf#`6z@_a8r&j1`_C>{}x$hb;F_bwDvUF*wuyj#^>5+>67p{mA+o^cxYmNkMs49aHNd#=SRpFFd#wHMx#Te&nD)T z>+Q|7@vB;vJX<8?GLI@$%(cshSWOkoP-1`F5mnA^-1asmX&X#o%nP||l80Bh-XfIj z_^R}@bKKGBIqs9(H14<^#@J6H;%k|rc)OxiUcDGDHmq2n$H%=!xy!gRX%b{P&ZF%q zABsS}ob}(MOnQH%X1t1u zi!s#1+cErN%wj{ra>6kltL*9&O|eG^-+nMknH1;9clqPeWDfCr4c*qnELy|1O2(;& zo8IJ3xndwCY2e;bKvh;nF2^BlUW=%6_~Vrz8Wi zFxYqciM8_u8plZl24_E1ge^E0rjnu)=kE)&&hLE3qlY#X$SMNWC${5lC6kV&*?YMi z(DvJRx5wfj$9T~)?hYYpeCM|`lQ_u)cE>VbtMPn;aW%~8so5l+Igh#6J73P9C^45L z&%v|uyIETo<&PW38V4ebhd%%9+1t9c8NY|gQfkbQirWdH86=FCD|ELLKp;->f;ACl zw3y*6`E@~if|+O(J_4!qb3_Gql&IuK$M#z4Vl<(R%lf4FqXk#Nd4+d)U6 z-YC}dwDOoJRo6-p+mScBmnI<@+t!rPu6H*6#@sKAJimduxd{9trv#_G$>XLP>@MTE zvM_2Snxm^tn_o=^D@ks~>ZiL(1Rn;*1RV3dtzXoiT@7datlZLQ^_xA@V0oFfQ@)|h z){(r^>#+UaZ|+8aczee7l<7HjG_(CtSjMpDb#y8Qt^k5L){cTe;9|pd%qFDGdXWjQ z+&tl%j!YLW&W3$Yh4%w#;crcAujVbs$uO7^YmYvCX<87*Ax} z6-Ac;!UAsi)F}*-4;Y^=@4ZygA`!hpkI(CF9+#Z^OiNlf%prsG%X~2UQ%6VNDbdEv zhW)zAIPl1{z}5^aUO#7q3+b-%S_r0CGE{wF=eC2hq@4{PF&~SId?v)#d^$S#df!~+ ze)rk1{YX7>YuU!!E6#aQsdY=@ZyTyb5e1!l_z53H?k>-KTwILeq0aX@M83sG-DhJQnRF**A8b?RpzGTlu}-6EF5{hUMd`)c|Bp^JA5RbAqn|nXjn`nv0bCP~})QSH!5w2#$cxNMAi`ppxPf^^vt0*y}(8)Cx zh_3j&RE!EBYUZn!2Zioc?l!YbA&zOtg2W)nXeop(kf(O7-Wi zS1`k+!ryxflwp6A@Ulugb8pIXbuXY+(Ai)3G=&yyp_CJecFhZMpV$)8l2C47YoT*n zQBz>%F%pnHtQEr@d8p(1Vk3C4huEM^L21HV_zjgrMj(mnSY8Y}OHbjc^Xxr$T4PIJ zvc`UZ${eH4o11VoZd>Wfpu`@``l_QVBjIVDb7U{7aU}#hFH=osePzeX{T@0#2lFRz znh5thHp7<#Ehp5HD0Gu583?@M+#Hr=>$NLi@OP}$Yjms3rF1K@YTVD_KSiM@PVgXD z{2=KmSuZo`nm*$!)6~AcS+$>5`b9kXneRU1NE@l3u3YESzRuS^SlkcpIB zHk_6Q%LNNUi1>8O=6IKW`Sh+Kx^oA)-jdh6%HMGL<jIB;eHEYc-bdyXFV8khnQhp@*F!DiI0|_@%}2Vxj$A;;i9OJ$C$Qf3om7XU#*q4 z9dY&oTVrv=9>t>exbFCIHSz}Xx!WtrQkju5DI3C1w~&nF%A0*LNPo2b$)v&cRToOO zI`_`?i8p(LI`;|J{nKON0|)(bF_^Co{k1cB*9)_Z+a5{U=2!8q@)v5?NlqJL2J2^C z+pHUF+fw~uT{Xlwm|G+kxiO0sw=ZsL^X(F1+?suxc#0S`GZqG;7beUDJ#;r0;tJVw zwJ!}T-9nPIpY~a5S2s&?FX5EvZ?{>+w6#y1$5^lCznK{dNcOo_B~pN_Zv5;=(kPuV zh_}yHKN(^2a%Z?V{)TeG+PmBgZiCB4_h1Z}z?{x{Q2nqp;d6xhAnL zSyaSz4q{u7Ki(UZT2*3lx$g;l?1k1xzEyo-)G2DvJis#5{@AJyo7HiLiSgWt$X~V4+C8??(PniQs2jS z`L*b8_E7c{E?ay^y_wCmN=AA(nKrnv1Ol!o+wniODO|jOwr!g!PcOEYoysye8Z=R{LHGfvurlltVnp7a+$XH7(6O??97jkCBa)DE2l{mP^$IjFTM%L6>+=< z+s*a>2gA5q?AeZ@00!hZE71DI`y?dzKk~l(>Yn7w&)6Tj<0!&;XB-k<^vMv)B%d}O zq109jLc19i1YI3L9Q_ddBZFYBx)MaBO&c*4;+<+be5L_>bl#=UG45yc0K~ZZhA`pi~S8 zY{pU-`dy!?lo!2Oq$38bQkVt<0E}C8(vTqUPSc>3v z(v7Q5X_DBbVak-g=W5Sb_CP+iuK^Ugw3^bpQQu{?7ugVVhJ1NiT*w{HhR~nm;}&Zuyg^Yk7do&k)Q0Uquz~0I$N@ZK^dtpwU+9%AiTmXKb|9RXmh$e=-7C}_vN9IcWcuornN<84zF&ZpnNP;;lED`M#fhlMLC%CJ zpZFyDr7SWR=UrbN;AK7!*B%^~<$i-7wE7(3ypb;OK4?ozBrcjyB6sA9 z$1R(~(36d7#yg9)XA*H9*ow9gPeLx)HlkZ9xovkWFkz(BC+VFv^73iv8vXZIoh*#6 zc;N>2`(eB&OZ0Nq3Cg;VZcn*WCr`6FJjm=@t!Yy0R}YYj505p(5UQo9M6c)1jQJ%C zF$>pR<%8iA7K^Gl#4i(^{rB*!G46zY$nG^S9-DDcp~o<8?#)JcnjcKDcdzJ1z!3(u zR+8KG!8Sg~A@Yke;7$$p21xFqMpES;;jl{Ch50Cb(*lIQ3_un^FNLJrl?Vc;gNXIF z_T&$~@hU}cql5YdI1w0vt;Yk|iuP$+&__`!2 zY6V*Bfw{1aW;0}u+-#Pr@ev&P$WME@1r3&3mFAg#_F{LECpvbVHKbM7WVjUaII0g~ ziOy5aYS(YoEPyMFj~SA(K8T{T_SX6|;U3Ol+cT907I)q68x3!or5w91HlFL3wU^7= zZ}U#rwmqy;x%mzcOwl8W#gxudmiJnXc{(XV3%yl49?OXK%$8YxEfKNMacO^Oz4g)v z{?ds4dp*Xl4`l&Z^lNbTAknvE;4-B-;1a$fG;?oFJAGMbgL?Cm!eS zHb<@jVIqlI@=l-W$h4{#i)N8~_BO9wbs!w#^T>G_-`LR?05Msgd%43whJ$#Pa{K$n z4q<{6RgsCWOsvapAeQws>7PdD@{6rKl+A&>b}zAJ(Jexp<9(U$iQ$|-f#tPIn*wZ%N!vZ zDRW+y@X@shUeJ;?K+xW+h^?>;NTScvm3Vh}!8K%Ms(U&|TXh~rQ;dnOz099!*+PgU z*p2P?cY)9L+`A5fC!aOl9+sIEcN~tvW5&k`HgZ%<{Gvc~O`*SZkSr=*QUu_rja`}y zq+Tj@0itk5IALuY+M7gw5h@>k)A%6FbweG2*HHtS8XQy6Xgf3oXWw@f0rlX z^lG+@gzGlVGLbmJ7noLUTE`P<=Ck9pRLG)h{gxEAx=`S!98H>_^43@!R)(^1YcPlPYx8=pMCcg~w8evvvt(jQd8^BYd>a;N9!z};z^8~a-|yNXqgN5_9`w0VmgsjAhfOHz_b`c{pd5LSv=pIMo(#UVS_qHY{t`fedQ;{{V*lw)z32L;F$4z#K88z zK#SjENE@e0i$6x$ds&UjI0jvd-&v;}AVsk28cEj(*O9&M_0Yt)T=N`AI82bFB8Gw>lN zAU|jw9-~{Bo3xYn!R3I(3Si?2iAb>-*=lp0q}ntEAoVe`so`7lr*|`4=(mkpk3zUy zFOUX|lAq2n(9w}yDhzAqFn=(MZRH@psH*}6fCcW!sP`p1KFAr@)G$S-c!TQl!X%T; zJ?#7!nV%t_<@HJB(zzu0via;uTYhCA`{=$(}i^!)1|Z{uQvM2;jcEr_A8J$4%A8>y&Rs6LlohFo1$^@9&! zMCqbe=e|6HvY4UVM3P3F1_28ns&v)W^uAzG3Bg3Pt)6BGawqf~XbaD-48ktu?O_5` z$K5na(-<+|9d~2bt+$$C;bbjZ=EGs^wmym5Xil#P=2MGqlZIBUW{IM4jC_J_h=U-> z^{AG>#}dGaEQ&>Xmb=Jf?qSj7bWl3lv`Nia45y)`)vrEJSf8K!?j&oy^_?NiEJ>>M zhQHLp1Kc;&9xK$vbYz2>#H!lqVTjiHm%tbAWUCiFL=MUZhMQbkYOw{@9hEFafsZ+? z08A%jqs0lk{p}S6^pggd!->qqGqYnHJYz1hTf)@QJx^enIjk?HBAZ*@MFZ}X&x4GF zJtq^BN3W%#!UGCWpGVrW2FAsaiQYr>G%V&m39b(1-%ycYh|;=*L*1cl6MNMc-Oe48 z-Nq+Ha~+H6hPYCB-e8zo)md26BRvg&6j{JFPv^?_xX2?fmJoEl&*ph6 z<3%4|0gUAQmDGL#Wgma5#gMWl*BD#BBcNzp47JFTUDBwf$Yu#6;_>Rs(wz%pGJQE3 zZ0hN~-StYXm|oSO*yb(T6iSKD=z|fTrqp}7JlIv+_TYSbtQeAj4a!!y3qaT*rrw#N z0Ix(^a0UnqoOXI2xd$XO`EYb+>iaZM%j0leJWA6<<{{=45Vkky2gF)>M6}0WAPV|* zMyNS;1LB;*f=#7rR4yTtc!*zXW#K?(4W!3@YtS}NW4u)vJ6Ttir#yC=is{1?8fg|j z=<%6T#BMa#sx1bV?GW7&2;i=vW`--}hhz8TD7arj9ZX9v`Mm+H6{!p62A>fXLG44? z7F@q+KrCP2*ECil9cow$rXi`z;kXWxh&3hYk`xZj{F?-dBDKee!wJM?~ ztVFJLZ`+%2NH+48wFJ~xY8)DSxlUtjEqx*>GqKk?PE;MLa#=A<^eFcGG-bIZK?jHS z#}MWKd{|;7@*ZEm0XdLowm6scKqgkdR^;2wrtL*-LK1k>C(8Zk5+eCac(<+j$gPDU zViqwaARau%QS0n%+Os#*>T>w)=l%4n26mOG*bCRZf4cuTrBBotHl`(sRPB4&%>b(4~q(5DGYT0#@dM$CM=`SD?-%z!T&7$uPqCGlbPbKP+VP`o>ED3^5 zwKC2A3|w~c$aBZV#pN-)^wG`E)ZmQkZk#k9dD=|gOCa`qu<>3vdqUOi^9D++qFOK! zyDa6>O2Ld~`O(+AfQKNY^199Fiz#?rvXL~F0fP2D$_}r^6g=ZzarMCfMagKV&>}N% zS+7N}QIkgA`JhU5tUOCV+za7x=2hg2M;$Idp3jerURfjXUf!)Ip=5{lWoyhmIV#t* z8A)jM>h^s!yZAZcQ3)w*Z~-jt(T<#%5bL#z`k5JzG3MjGae?B^R>*g0R)8TRkNWCp zvBCOR!FNo!L>yq!_Gdn^@+QMArF*K4^^0644+Pf$NL|7Q`K&wp4u&RLv7;F9;T6j{ zhYVHPg|6Jo-$Mpz#fg<$veG55jNxJ#8|-<@ZkT|TKjE*XY4tYPgTAT}u0UHY|_URA$M18#38 zktDBnzuUiYcc3!#gB6x>Y@+$zoy3nn*92s^zTm@Ai~5qo=qrm|H;uvX0iL(0E3_?a zH}pba&k?8P7efN73~i<(SPi51-KyX{gI#lRYidGiYbdc1SQ$0_S{G_Tjd3-X&T^zQ zE8^TKYq~NDJtJ;Jkz*+Ky+dq{Tn|I6)#zXCMQvHY8w}R1Z1K9!at1hadSiZM$+cg3X;aSJNMz`R%P22279-$U6GB z?|%GeCL1XDUmr?MPEHQ{ZX5sE3?6_d)c2h0@5#K}`B5oye@Mtzfe2cCZo*TksXQJS z`MOlG)A-n`V^@m83rbVA#-i-|C(y7;rl`>xmWqp1KN(3UpaZ;>F zw_u*LMbpiYFD~@xDo+W3z9n|#mXHgb&XGi#$b&Ff|Bj=D?$a~xPrqp|R1#PhOqUfP z#@#b#V$!rH!}DM4s{>gmDJgvmd(;xfW(8bukzQQft8P4-Gjnh~LpNK`3IH~(7Q55L zCn7kkn+=!Si0xY8oUm23pMh9A+?^0Cr`vj6qR19_Pvk`Kel_j#d8mmd=mc5G6U_+u zI+gof#95!5#%s}eqm}O2+}E$a920Erc6dZyY;zxKVEjfm8MtHwQOZoE&stRXQmeZ5_F08xD=nd0?6e3?FqU+3O>_vcG8{<&-vA-e}p*#fD%f|LERUWI+G!X1DERwzX)ew-gl1RXw`ft2$3W-Pie5hw0w7XUC))eH>{ z`<2@eI+~i%LecFsk<-Xg9y^tT6dhr+7iM#MTEaV@%!VGVFHO#ke}VBsq-S2zB_zId`718=ov%ZzNQ)3Pfg(KO};~Z_!t&9kDW3(ckth5>F;JFc5x^%YRv@y zXe!Zi#?vl=)W&7t5>L%Lj$QQ|&A7n->6CYCoFKz!SBPTVBptipO~_{Xssff#QOqYc z#9hyaU{*x&=)6bEYP zqw{M|^s65kPJja2@h2UWJ6@Uh6+lad^I!cGcua+X{HcKL!5VKp;W+L2>t*Ow`~Dnm zWa`%BA1#64?4&kbn&H@G)?bbPiURYavw6Vy@rB0&VDrBlA@y{jv-3;`J53AITH(Ym z>HhCBi&(|mbkU;XM~_by=L7|<&AMRBafUb%)C*A1Q+sdEAM4Bs5*c7d*vX3isEJks zunsbEuD@*v|F$2`u7ThUP3DY$)HDUO{c>Ird|a8)t^>>A#oYdk zr$izs84b+vkD6WrZC^~}s5rh9pn5va&It>_H^&x_hAIKJMejwVEg+Uk#* dI1}p+$zw_8h#7GlAw1e*yP9NzMtMdaBs#q*(=GOYwoqPvQNgGpWmn};9!ztf3|ISed#>YoIa6MxFYXs+k|9b`sZ{CytjzKk#Q?v358-W4CSyA5&1R`O0yik-h z>5oC67YRzTQrg}q2iaKeI@9U>ouZ1t^zon&NkT$uQ9=j}sz1$Xjc}-W!|(Ck*%o1T zJ8R*C>$38pDt(^GUDtX2@?F8ok~LS##&4cwuhavmHHhiMK!noN@$q50oFS6bA);16 zcUH@-M+l*-WIwmjjvJ@n8#%3`;&=XAO?3}f3!|B1tl-{P^^J{#BG#6cy}!T@P2mB^ z8;CGgUJAKoB+z$uYL?)PxYpE?EFZq=LgA3PRT-49?Rx zm!d}x4*m?l7*ohUqN3o}(8rHWOc2%;X{3o=k*r)*U zEJ1MIT!NG+Kn#lH;&f0g4y^##8mnloQDI5@3Ew)&o$GKEezWx=n#>A^@`pcO)9HQ;#q>ZD==; z%@bh$AFyD_S{IU^Koub<1SRF=-^Bbb$4=JzOPiWzxU0j$AcF$~`9f}+Z_Lc{EyoC|SabBGaZ?q6WrY?jk zE}K9_W{WNi zMQB_U-DH?sM;NsoU4)*HQO=vb=@XOe0)eqe*f_hC9~c>d-_4B%L2sS%+y~px&i>E< za;Y4yXej-JHM=reeFhgr zrEcnh5fPi~6Cn;jL(vcfN01P{rbi9ArU@3Wzh+hu#Xt|1d_m}381Z|2T&kg=VQO|( z5tgCx_U`6VQ1*)gIAoSEvR|CHA0uPFx)cVBXlZS={Cwup7B)3C>X{ahDKri z)XMWo`L2o*i}61bjA!h_h&W~BuV)Z2f!=$Mgt**;;=QU?bw`|Muf%efo1CZ|mfGgB zc|}ArQ(hY>r>CbE&X{;XNvQU&WR1J; zKuVGj&elIoy{1N?U-IvU+dpp7*#Ot_hB+xaMG=8O)Kdzd?iMKqfIL}j-6%B_f* zP9%jh#prGGgduW|PRdl_!*d;eBTVLUpXQ(2QKG4&RprgH9+gHtIrE7ODi-1$_M$R_ zqCY-=ILtp-Y}Jj@x3bgt6Qv(EggqA`ISbKCb4<%o79vwxucnI_bs<+T?}>40F|5x? zg7taK*wPe-g0r);wRLpljEs!x^U$+5)bG}U#ZHv+OjT)#W0WxN{#LOm=3kWwTP(7( zuwaVh+8B~*;Z^46OW}f4N0f_C$hi3AYSqa3K3^wim@qDXLwVr?4c>t;TF^(Lh@^7# zc+4u%6jNr*!?F~3K9K2kX}WFsr00oy@#_p;k9=~iKD!2iWzxHz{oR=UjHuFi>4_Pg zhB?3Ud$PxExDVDp5>ub}K1?9x!+T2QSwR$81PPHkHW#=|uJ=EQtH#6Qur$Za`9_DQ z>+7HMwCCx~!iAzhU~0*vB>{n?y_&Dms!!Q}Q@bCrlD_}6m5llo+ZJePb6ILnhjvo2 znih6H>vth{!`hP*O+tfeT9*?o3vmWUQG&psLP|tBL7BmEci6b*$hGG7GM2bQ>6i>S zU%MfnD)RLC1X@R00`(1&Qp3`s?)~aOJGq8;2Sfavvjm{c7^9;@S8X|~fu#F<{KLNNEP>W+=4~W-$vkk7n zMkbJSOr?KiS&NG4wRVR6Gg1WjDXFIKRg?J?N>%plvXZ&DU*|NOtdre*T$6{5A8Tu? zc}Yb$<9pa`jbwkN=$)RK(Na-Sk(l&W*s9cbogL$?f_s`WXk*Yr;C#Ic(M42Hei+Y7S!-e6(z51Ml1+w*DfCnaS9#~5 zZ0YYp?`*wZ+Uzn}eN=h71lLP{mT*^_ws`z=d9dwJk2`|0(#;A)8SmKB*5}3-Iv` zKGihN5LY)h+o_VbQet`w>HK!W^YlR`E79`Ecad!+Pc0)+J}=$X4?1joyE4=;F%gaU z#87UIa}eE=o$v(LjzSD-IqfcvoYp57@GY!&zkGJqk=NqqYpbh9)ZP&IypmO7o3W#Y zJ~uJ(pF{h$I{EYyk~)O+upo9Jk_Cs9?X6bO4MF%%#IRZ>|A45^6L?!&Tl^^%pYO91 zRyw*+TuM^6jA$Mx#;TRRnF}b)(dGdO=J&ElPGRtrc3M7 z-9FJtUkTrZpG+l^@8?oP;+u0 zF2a;o;v4s1X<%?jvY0m4Rjq}`| z8wMRq8I7fue5;Ed$!etz%%ZD7JGDIE^7=jLipCFjk^0kAX>|SpoBBMG3g>25Rm8*C z{l4BDuCKH2R71=&QU~w4xT17KCcxwFhT)BJWk}alBKsevVI|%+qM$AsFU`Z?+>qq# zp!uquj~s|>QaCO4^(Rz|<83$llJ>QN64R~4-yJstj`MAMoD7VN6K;6R>LOPH6Rby$ zU$=A@J&6&yW(N!pXF-9|5nmeK%pX6yonBtr9XUF{@!JmNxEvboM4lXI>rX0DeXJ~Y z&{5ddUJhvHL2lYd?c7f6ta?#ab~<;=`pFtg5c_^o) z)o&+T+Ky3)Y~& z;`%Terts{&+}E@F(aYvc^&rBW%%$93wIPKZ6S{DjMN@rSg5>1&&zp?n3JZ26wWA#- z$Sc&A-CAj8Y@$A^U)F0#29lS!Ge+Wa-dwNmsyiwq`wps|QjY#DpAS%e`E+#G)7ie& zm_5qD!CFuruE&Hi>QR0S6~8X{^v(8QYuf!_L#utiiYTWHGglifyz8^_m!#X%*O>q0 z*Dl4LXR}y?h8I;qtD|#rc+2altKzRYFHNd5#Du1X5|$z)YmZ(K=AOA+jXTbLWyZ_k zc^w+)K4U(&uL<>B`$5L7F7}h*?@MO9&8T#r0_w&JmF&pg!W%j-my zGVSkF81lXkM0$;Dzk^fyzZZ&L^Y)1CkGq6ENZGT`&eJY;mG?TszD8fOd}$*>1O98 z`#A4IpE=$-ST4jD**%s4KO2)bx@ea)WFLhkSJcF8DKZ_xT~;C$WR?AIU3cq+3|h7} z?t<@d{ld(AJFJ&7j0X&%?r5=O8yU3ur>51Pw^Y8T!ba^R+^T-EYiC_fGaX$L5_{aM z>5jO<$}b2K#TqDED>f}$f=D9Beryu_j2Kw^-H3I*Pw{@8YvJE2QIOf(3qzm9kG_6u zlx1Zi%$eK!)692QFU4u9w;tdaNDaJ-c!ZZ%p`f1L>M5a+qn>MGAWOwsz(tPV2-~rD zrkUlZ=vRjjhmxdHUAf~O#j0^g0eoyS>D=;Lo8YBYZQaBoth_<_a{b<9kI5=4KC`22 zz(BBjt+~DRM#W2fx!p3PD9r`RwVFdEb`^ZB_M1|fK&3%@>@I0AOdvUH|G+p$c=3=j z=~ea)nY*ujK+z!du+!&1n4U0*5Oo){@2|HC1+lvOT&E1Sf64LW5!(@yRn@t*4q?VC z;VU$9Z)(|a+VKiGQc{#rlZmd=?&(lf(^09>NVELk`{q2Cc51adU&V4#9cejUYP#ja z^~)lZxoAtlR}%W+@|8z0i!$pnDUWuQSJxRLsffCksh2Q;4Q-2Wq-NS?abLCuP8tl( z8sTGZ%Y#oSGo6Ty(>gh6dpD+cZ0CD!CZ8H>z^dQ8xlg{mc@sA$qWxnq z=apXy`V%^QFDOZgkIgjwhDX+c&Jj+`I<+yvtw6gjx;@EE+*s9Txk+4?kagTt>mo|% zJq7+sf;eA0^e$dgt0Gg!lgK1l@w9yo3yW|2UeC8PXHcQ@$Q{A6xXe^2`m*ORU5E0* z9HkSJsJ}&?*@JRsgk2kU*S>e}HHo_YcIS#MbK|~f;;1hYJu0|Kf@+H4B=uLl4p<>` z;SZg|S+T|`3x3XVSq2ozGNAr_Up_n?*rpM)%7+7PEIcJ6t)i>Wi%N=i@6!H&qXJH^ z+p)|Eo_YdRkL5*!hxzpvx?10h4%#yNwH;QZjlOldeQh)xe!JFn)}3U^Dz)xie&;HR zc4685gkgscwb4yFb`x=X8QOCA=|P4ezRhmB>`gUBS|F!9515>wALD#bcXd*s7%NeH zS*gF9a*68qk*5N&?GrFsJ!5uqMB!^q;>^3{B&NQzWo^Yq3WEccE(Ci{)KGwdvi9{e zjjoL@1PA5#^pl0ku-PG=jTk7ls7L75p37J#w)?34F8!XBFrIe_NA%64*u9t3Qj1A# zyGKsr-|8Z<)JjA(DL)mdzebkCbonfwW-lkLO-jql+_)T&~=BF0e z+sfE;wYs_QYi)W(c^N6XDc+mvCk1vRUw%@Kf0_Bvz7T_7B;SHW;}|16x$P~lV#fE! z;b7H77zr)PMrKobOSNQFRv*cUFsN|Drt#9qm)j{V-eWvp-a!)Nl|!oh7* zFsO$zf3=%FD^K9s>5aLdv|Sr!1L&8nO38QDHfOip?YGg$ zMMcbpPv%-8o`yWZ+T0v8xC)p;5x}GJTbeZSS-5bUVlETe9MH`@D<+(>!)m$U`?9~` zvP_1SQ**a-DC|@5&>s-0(Q)0;N)#Bb$J{lPCs?CqCp7bq>@r8Uq0g=hWkgh?e89^YBtlL>PePHP#mjhF4Uy(av zX=}CQaG^3zO{3)Yx|J332=iLk>7L;UIKC|3&}0#RIIcSylUe1dmQ*CjlsOb0Q?!?; z^z;k*ql!d2=$2RXY!@pis_;@CLITiQ>k~Gh9i@~Vw$OY3H$>Kp3)q*pHpQ7)$@Btl zF&6ihYNRpv#8RxUUl$K%C%e8Cazc4_7)KEs8_SJ{+TA*X%bV7r9Gv?Q-}tldMRfWG z!~BxzA5pEkd18^vUGLAagxO>U%ds7P5uGR~0fWD$43ChEBw?*i@T|axlh-~&)_3oo zl-!kj9cl+{R_hLm^Af{G_sqZSBy24w!$@0Gwx7AdqG^WNapItOon~K>@gQtsU89B>A<+SSk2y5e}!S3=0^}aAIa|D8K>wg2#2nzk5! z=-U#Er9ADk9{h55%lPwDl&hR8;wa#r#ovRs!^AgFp|&db!-*t#_*9q1v(KfsX9oxv4JDEnhqTZ zy`r&qbbzTCElMlON9nc{k?#1MOhwhL3L~wkUNd&@e#`R}4(bM)quIG><=scZS5m_Kp$+fZmj%k8eFEs`bj(?O0;St+0cI)02T|m}5SF9VyP8_LdUdwd>ZS=NU z1YaZ%>Dds}k~~?w-qb119ni(7@s+?b%47cRJgBzwwJ=2z@l$Y!HyvjognbDUZ}bV6 zdPR+zz00G3%oqZx&9R zsFQH9((u%knDPP295vYGZ~lplfsbtnWk+4U=o`YUM~ygA@((&Wk2MGTZ1AR4O<_DP zWS9nDONxTaKTK~XRq-G@L0^5)n7n%EoatRvGRhHA8;=`O(X8|g{W$Rzu3<#>GxPa~ zl=NgJ2kV9H^=8V9M7#SBFaCC!e_u^K(#DCg`6NR$6D%17W*Tj2q}vqUF9fm=4Gbh? zO8#!Zl%k*zlF|yMF^z&ONm18AaGT(e*#BrenOQeCH?;$E-o+6~t0EY7w>4IJ z=8Vhi4-%Q+xFXCw+GCnpTBU`BVTp-}Hhw=Dm|Q~GfvRyZ!x1soaO!qEbB>2Y+HC3C0d`(wxJUtsLT06Er+zV|&`#^vw$P%Qw zQ8K&X?V!Vyk^3E4-gPh46#)|9nem@v&djj2wXGewrFZG+Pjft;ou6l+v9Pop-zrFOIBQ)Bw|+EcX9OXifbrNT^Xy(g;_Z-^W%X^#Ca}tRdIws+o`q@CXXjs2wcGV}~f2f?!>{l(7N(bN z7B)D7`h9GWF)#Ps)Y&+*QT8Wo!ve7b^LZw#ooOW$uraseoq;X_f&T(-Nw^B`Ob7^F z@Xc*Z1Pt& z@ObQ;@CO&*af}1Lh5U1>7@$?h09(hMToCY1I5U71ZLfwt+9bljD%79!1CcxtV3-*B za{`*1Bojz#(st$1I$4{%Agfn35kFCP68HNY=%Kk0sSU$Q|EHCV_8Ao>On z#Jm<5rmR0tDl|Xlua6x&yhgQR9Fph7qt~TCPnWO&xU*w0N@XfA?Y) zZES6K_--*C3kIQ|1KR&5iKl>~3a5!5W0kJRDQ;-cSrTStWqrqZ-OjOp7R|Jxbc_}G n%L#mZ7TteJFZ%yA?~qhpA1*0=(Xx^~I+sdv>atbRrqKTbTr~rM literal 0 HcmV?d00001 diff --git a/packages/node_modules/@node-red/editor-client/src/tours/4.1/images/update-notification.png b/packages/node_modules/@node-red/editor-client/src/tours/4.1/images/update-notification.png new file mode 100644 index 0000000000000000000000000000000000000000..4e4b610e787e6e24af4f02870d95825780ee229f GIT binary patch literal 24604 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

                  )SC(KkOSHwVyfwaZzU-Bcwh;n`ZR}ad97O0zrZ8V?M<^`bPJ;Uu%nbnvXh* zWuSTP-9Nu0r3|2S#}TO(sm?T;@EDU&@~(5r15wz)FBA36xpwyiS7~1CDZnA(Scn_| zI9&fH*`x&{$32C=R;`}4R4^D7C4z6|n35wb45Z42>b-=vFQ^Bd>@OO#_K=?GYg6;r zlzL#9LQ=q5nrqnlE=so1GL*&{zxGZe4lW^jq5 z)E?KauetL$&*1%9^Bb+wmE;wI$8%Q;L=yK?Ge1lzDGee~*DB{-+?%zG@>IE%MHTH+ z?|0JVsMKTMT9sHc+nm2lbm-n?uWR%gmfk&)%)RYB+gG_vYw}{NEobPw+?~ZR-iV8y@?>d?}95wEmw!_Dh-l$CiLVGLn%)~$Vk{|ch! zP7R8qf#VUbSt8%kf|g^&DulPfs(I!R+>gGPUQD`70c)|H_XCQyL?%?@-ib;;ePjq1 zn%Jt$YF!0Bue#lK@}kH1A}xj^g1iq)3<6ZGYXzb$>!-s~t%bxADVC6$e6Hs(g6sGS$FtLZhs= zXda7tpO4R4-|Z9ZGPa$Mhs$ZCY}9;Xwo5*aeO&wXmVy4S_1@ZO6s|n&g9A{f#nkS0 z!5?cQ{7B;a8v~#HcXf^h=4;K3j6a0VXU2!@8pf`C=K8C|zwrcEQ7hB)`G<$~L(Uys ze1}cs(n+j|On;!m_D7RknV(cp;!Uh^35fKkPu#OOZ}ICJ(N^@yx=Gh0m{0`?-=A#{Jz}Jji(tX?W`0NJqTOM>O;;Lu zg^_|%R4HszS3X_uK?S=HiD+CFvl8j~S-jJqfAsWd4tne@HgYZT533|LDUd0rH%%Ij zCfu0$q4lsjyU0!X!8#xqwAjSMF^{!~q;PeC+F@z zqq&udQk=rhjSW9_9~qJ}u)t8#>PN1I-Uk>?6%7+^t3A4LEiZkh#Gq=Y2r2{~ zdmfDks*B1pGVj*&Q4#K8Y;&OJ3?tzQ_?6S)uvGt#Fu)eykw@AOi>Utkpx4JJ#k#pS zLm|m^SX?V4TA|$Cv%xNB)!q11Qk>dNsskbTy<+{FO3|tZmhQ8<0(odRJ~h>xx46)} zo`lz8KTbtCwWqcCi~)f*aKyqE_W2sTzdE0ALv z)s$xA7RQ#s)m%|KmeH*IL(4#L29d|9M;pAgt@Let's take a moment to discover the new features in this release.

                  ", + "ja": "

                  本リリースの新機能を見つけてみましょう。

                  ", + "fr": "

                  Prenons un moment pour découvrir les nouvelles fonctionnalités de cette version.

                  " + } + }, + { + title: { + "en-US": "Update notifications", + "ja": "更新の通知", + "fr": "Notifications de mise à jour" + }, + image: 'images/update-notification.png', + description: { + "en-US": `

                  Stay up to date with notifications when there is a new Node-RED version available, or updates to the nodes you have installed

                  `, + "ja": `

                  新バージョンのNode-REDの提供や、インストールしたノードの更新があった時に、通知を受け取ることができます。

                  `, + "fr": `

                  Désormais vous recevrez une notification lorsqu'une nouvelle version de Node-RED ou une nouvelle version relative à un des noeuds que vous avez installés est disponible

                  ` + } + }, + { + title: { + "en-US": "Flow documentation", + "ja": "フローのドキュメント", + "fr": "Documentation des flux" + }, + image: 'images/node-docs.png', + description: { + "en-US": `

                  Quickly see which nodes have additional documentation with the new documentation icon.

                  +

                  Clicking on the icon opens up the Description tab of the node edit dialog.

                  `, + "ja": `

                  ドキュメントアイコンによって、どのノードにドキュメントが追加されているかをすぐに確認できます。

                  +

                  アイコンをクリックすると、ノード編集ダイアログの説明タブが開きます。

                  `, + "fr": `

                  Voyez rapidement quels noeuds ont une documentation supplémentaire avec la nouvelle icône de documentation.

                  +

                  Cliquer sur l'icône ouvre l'onglet Description de la boîte de dialogue d'édition du noeud.

                  ` + } + }, + { + title: { + "en-US": "Palette Manager Improvements", + "ja": "パレットの管理の改善", + "fr": "Améliorations du Gestionnaire de Palettes" + }, + description: { + "en-US": `

                  There are lots of improvements to the palette manager:

                  +
                    +
                  • Search results are sorted by downloads to help you find the most popular nodes
                  • +
                  • See which nodes have been deprecated by their author and are no longer recommended for use
                  • +
                  • Links to node documentation for the nodes you already have installed
                  • +
                  `, + "ja": `

                  パレットの管理に多くの改善が加えられました:

                  +
                    +
                  • 検索結果はダウンロード数順で並べられ、最も人気のあるノードを見つけやすくなりました。
                  • +
                  • 作者によって非推奨とされ、利用が推奨されなくなったノードかを確認できるようになりました。
                  • +
                  • 既にインストールされているノードに、ノードのドキュメントへのリンクが追加されました。
                  • +
                  `, + "fr": `

                  Le Gestionnaire de Palettes a bénéficié de nombreuses améliorations :

                  +
                    +
                  • Les résultats de recherche sont triés par téléchargement pour vous aider à trouver les noeuds les plus populaires.
                  • +
                  • Indique les noeuds obsolètes par leur auteur et dont l'utilisation n'est plus recommandée.
                  • +
                  • Liens vers la documentation des noeuds déjà installés.
                  • +
                  ` + } + }, + { + title: { + "en-US": "Installing missing modules", + "ja": "不足モジュールのインストール", + "fr": "Installation des modules manquants" + }, + image: 'images/missing-modules.png', + description: { + "en-US": `

                  Flows exported from Node-RED 4.1 now include information on what additional modules need to be installed.

                  +

                  When importing a flow with this information, the editor will let you know what is missing and help to get them installed.

                  + `, + "ja": `

                  Node-RED 4.1から書き出したフローには、インストールが必要な追加モジュールの情報が含まれる様になりました。

                  +

                  この情報を含むフローを読み込むと、エディタは不足しているモジュールを通知し、インストールを支援します。

                  + `, + "fr": `

                  Les flux exportés depuis Node-RED 4.1 incluent désormais des informations sur les modules supplémentaires à installer.

                  +

                  Lors de l'importation d'un flux contenant ces informations, l'éditeur vous indiquera les modules manquants et vous aidera à les installer.

                  + ` + } + }, + { + title: { + "en-US": "Node Updates", + "ja": "ノードの更新", + "fr": "Mises à jour des noeuds" + }, + // image: "images/", + description: { + "en-US": `

                  The core nodes have received lots of minor fixes, documentation updates and + small enhancements. Check the full changelog in the Help sidebar for a full list.

                  +
                    +
                  • Support for node: prefixed modules in the Function node
                  • +
                  • The ability to set a global timeout for Function nodes via the runtime settings
                  • +
                  • Better display of error objects in the Debug sidebar
                  • +
                  • and lots more...
                  • +
                  `, + "ja": `

                  コアノードには沢山の軽微な修正、ドキュメント更新、小さな機能拡張が入っています。全リストはヘルプサイドバーにある変更履歴を参照してください。

                  +
                    +
                  • Functionノードでnode:のプレフィックスモジュールをサポート
                  • +
                  • ランタイム設定からFunctionノードのグローバルタイムアウトを設定可能
                  • +
                  • デバッグサイドバーでのエラーオブジェクトの表示を改善
                  • +
                  • その他、多数...
                  • +
                  `, + "fr": `

                  Les noeuds principaux ont bénéficié de nombreux correctifs mineurs, de mises à jour de documentation et d'améliorations mineures. + Consultez le journal complet des modifications dans la barre latérale d'aide pour une liste complète.

                  +
                    +
                  • Prise en charge des modules préfixés node: dans le noeud Fonction.
                  • +
                  • Possibilité de définir un délai d'expiration global pour les noeuds Fonction via les paramètres d'exécution.
                  • +
                  • Meilleur affichage des objets d'erreur dans la barre latérale de débogage.
                  • +
                  • Et bien plus encore...
                  • +
                  ` + } + } + ] +} diff --git a/packages/node_modules/@node-red/editor-client/src/tours/welcome.js b/packages/node_modules/@node-red/editor-client/src/tours/welcome.js index 8041db4697..fcc2519b1e 100644 --- a/packages/node_modules/@node-red/editor-client/src/tours/welcome.js +++ b/packages/node_modules/@node-red/editor-client/src/tours/welcome.js @@ -1,125 +1,19 @@ export default { - version: "4.1.0", + version: "5.0.0-beta.0", steps: [ { titleIcon: "fa fa-map-o", title: { - "en-US": "Welcome to Node-RED 4.1!", - "ja": "Node-RED 4.1 へようこそ!", - "fr": "Bienvenue dans Node-RED 4.1!" + "en-US": "Welcome to Node-RED 5.0 Beta 0!", + "ja": "Node-RED 5.0 へようこそ!", + "fr": "Bienvenue dans Node-RED 5.0 Beta 0!" }, description: { - "en-US": "

                  Let's take a moment to discover the new features in this release.

                  ", - "ja": "

                  本リリースの新機能を見つけてみましょう。

                  ", - "fr": "

                  Prenons un moment pour découvrir les nouvelles fonctionnalités de cette version.

                  " - } - }, - { - title: { - "en-US": "Update notifications", - "ja": "更新の通知", - "fr": "Notifications de mise à jour" - }, - image: 'images/update-notification.png', - description: { - "en-US": `

                  Stay up to date with notifications when there is a new Node-RED version available, or updates to the nodes you have installed

                  `, - "ja": `

                  新バージョンのNode-REDの提供や、インストールしたノードの更新があった時に、通知を受け取ることができます。

                  `, - "fr": `

                  Désormais vous recevrez une notification lorsqu'une nouvelle version de Node-RED ou une nouvelle version relative à un des noeuds que vous avez installés est disponible

                  ` - } - }, - { - title: { - "en-US": "Flow documentation", - "ja": "フローのドキュメント", - "fr": "Documentation des flux" - }, - image: 'images/node-docs.png', - description: { - "en-US": `

                  Quickly see which nodes have additional documentation with the new documentation icon.

                  -

                  Clicking on the icon opens up the Description tab of the node edit dialog.

                  `, - "ja": `

                  ドキュメントアイコンによって、どのノードにドキュメントが追加されているかをすぐに確認できます。

                  -

                  アイコンをクリックすると、ノード編集ダイアログの説明タブが開きます。

                  `, - "fr": `

                  Voyez rapidement quels noeuds ont une documentation supplémentaire avec la nouvelle icône de documentation.

                  -

                  Cliquer sur l'icône ouvre l'onglet Description de la boîte de dialogue d'édition du noeud.

                  ` - } - }, - { - title: { - "en-US": "Palette Manager Improvements", - "ja": "パレットの管理の改善", - "fr": "Améliorations du Gestionnaire de Palettes" - }, - description: { - "en-US": `

                  There are lots of improvements to the palette manager:

                  -
                    -
                  • Search results are sorted by downloads to help you find the most popular nodes
                  • -
                  • See which nodes have been deprecated by their author and are no longer recommended for use
                  • -
                  • Links to node documentation for the nodes you already have installed
                  • -
                  `, - "ja": `

                  パレットの管理に多くの改善が加えられました:

                  -
                    -
                  • 検索結果はダウンロード数順で並べられ、最も人気のあるノードを見つけやすくなりました。
                  • -
                  • 作者によって非推奨とされ、利用が推奨されなくなったノードかを確認できるようになりました。
                  • -
                  • 既にインストールされているノードに、ノードのドキュメントへのリンクが追加されました。
                  • -
                  `, - "fr": `

                  Le Gestionnaire de Palettes a bénéficié de nombreuses améliorations :

                  -
                    -
                  • Les résultats de recherche sont triés par téléchargement pour vous aider à trouver les noeuds les plus populaires.
                  • -
                  • Indique les noeuds obsolètes par leur auteur et dont l'utilisation n'est plus recommandée.
                  • -
                  • Liens vers la documentation des noeuds déjà installés.
                  • -
                  ` - } - }, - { - title: { - "en-US": "Installing missing modules", - "ja": "不足モジュールのインストール", - "fr": "Installation des modules manquants" - }, - image: 'images/missing-modules.png', - description: { - "en-US": `

                  Flows exported from Node-RED 4.1 now include information on what additional modules need to be installed.

                  -

                  When importing a flow with this information, the editor will let you know what is missing and help to get them installed.

                  - `, - "ja": `

                  Node-RED 4.1から書き出したフローには、インストールが必要な追加モジュールの情報が含まれる様になりました。

                  -

                  この情報を含むフローを読み込むと、エディタは不足しているモジュールを通知し、インストールを支援します。

                  - `, - "fr": `

                  Les flux exportés depuis Node-RED 4.1 incluent désormais des informations sur les modules supplémentaires à installer.

                  -

                  Lors de l'importation d'un flux contenant ces informations, l'éditeur vous indiquera les modules manquants et vous aidera à les installer.

                  - ` - } - }, - { - title: { - "en-US": "Node Updates", - "ja": "ノードの更新", - "fr": "Mises à jour des noeuds" - }, - // image: "images/", - description: { - "en-US": `

                  The core nodes have received lots of minor fixes, documentation updates and - small enhancements. Check the full changelog in the Help sidebar for a full list.

                  -
                    -
                  • Support for node: prefixed modules in the Function node
                  • -
                  • The ability to set a global timeout for Function nodes via the runtime settings
                  • -
                  • Better display of error objects in the Debug sidebar
                  • -
                  • and lots more...
                  • -
                  `, - "ja": `

                  コアノードには沢山の軽微な修正、ドキュメント更新、小さな機能拡張が入っています。全リストはヘルプサイドバーにある変更履歴を参照してください。

                  -
                    -
                  • Functionノードでnode:のプレフィックスモジュールをサポート
                  • -
                  • ランタイム設定からFunctionノードのグローバルタイムアウトを設定可能
                  • -
                  • デバッグサイドバーでのエラーオブジェクトの表示を改善
                  • -
                  • その他、多数...
                  • -
                  `, - "fr": `

                  Les noeuds principaux ont bénéficié de nombreux correctifs mineurs, de mises à jour de documentation et d'améliorations mineures. - Consultez le journal complet des modifications dans la barre latérale d'aide pour une liste complète.

                  -
                    -
                  • Prise en charge des modules préfixés node: dans le noeud Fonction.
                  • -
                  • Possibilité de définir un délai d'expiration global pour les noeuds Fonction via les paramètres d'exécution.
                  • -
                  • Meilleur affichage des objets d'erreur dans la barre latérale de débogage.
                  • -
                  • Et bien plus encore...
                  • -
                  ` + "en-US": ` +

                  As a beta release, this is a step towards the final version of Node-RED 5.0.

                  +

                  With a number of UX improvements planned, this release focuses on laying the groundwork for those changes.

                  +

                  We will be making incremental changes betwen each beta release, so please try it out and let us know your feedback!

                  +` } } ] From 81ab7d7e0a992185d28a001eb530da3652640ff1 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 4 Dec 2025 14:09:06 +0000 Subject: [PATCH 082/160] Update tour with sidebar details --- .../editor-client/src/tours/welcome.js | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/packages/node_modules/@node-red/editor-client/src/tours/welcome.js b/packages/node_modules/@node-red/editor-client/src/tours/welcome.js index fcc2519b1e..4dd3866835 100644 --- a/packages/node_modules/@node-red/editor-client/src/tours/welcome.js +++ b/packages/node_modules/@node-red/editor-client/src/tours/welcome.js @@ -15,6 +15,33 @@ export default {

                  We will be making incremental changes betwen each beta release, so please try it out and let us know your feedback!

                  ` } + }, + { + title: { + "en-US": "New Sidebar Design", + }, + description: { + "en-US": ` +

                  The sidebars have been redesigned to provide a cleaner and more consistent user experience.

                  +

                  Rather than hide them in a dropdown menu, the available sidebars are now listed down each side of the editor.

                  +

                  You can also move the sidebars between the two sides by dragging their buttons around.

                  +

                  We have moved the Information sidebar to the left-hand side to provide a more natural way to navigate around your flows.

                  +

                  This is the first iteration of changes. In a future beta we will add the ability to split the sidebar vertically, so you can have multiple +panels showing at once.

                  +`, + } + }, + { + title: { + "en-US": "Better Flow Navigation", + }, + description: { + "en-US": ` +

                  Some of the ways you can pan and zoom around the editor workspace have been improved to provide a more standard way of working.

                  +

                  You can use your middle-mouse button to pan around the workspace, but if you don't have such a button, you can press the spacebar and drag with the left mouse button.

                  +

                  There is also a new 'zoom to fit' button in the status bar; this will set your zoom level to ensure all of your nodes are currently visible.

                  +`, + } } ] } From ea5cc1f53cb15ae10fe4f63d60152b7fd674197c Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 4 Dec 2025 14:35:22 +0000 Subject: [PATCH 083/160] Fix touchmove event handling for panning workspace --- .../@node-red/editor-client/src/js/ui/view.js | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 4aa9bc128b..09c1779efb 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -2150,24 +2150,27 @@ RED.view = (function() { function startPanning () { } - window.addEventListener('mousemove', function (event) { + window.addEventListener('mousemove', windowMouseMove) + window.addEventListener('touchmove', windowMouseMove) + + function windowMouseMove (event) { if (mouse_mode === RED.state.PANNING) { - var pos = [event.pageX, event.pageY]; - // if (d3.event.touches) { - // var touch0 = d3.event.touches.item(0); - // pos = [touch0.pageX, touch0.pageY]; - // } - var deltaPos = [ + let pos = [event.pageX, event.pageY] + if (event.touches) { + let touch0 = event.touches.item(0) + pos = [touch0.pageX, touch0.pageY] + } + const deltaPos = [ mouse_position[0]-pos[0], mouse_position[1]-pos[1] - ]; - + ] chart.scrollLeft(scroll_position[0]+deltaPos[0]) chart.scrollTop(scroll_position[1]+deltaPos[1]) RED.events.emit("view:navigate"); return } - }) + } + function canvasMouseMove() { var i; var node; From c2cfdacc84adb4973404b0af8e63ae03dbb91d7c Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Fri, 5 Dec 2025 11:00:48 +0000 Subject: [PATCH 084/160] Update changelog --- CHANGELOG.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 33751efd76..35546c4bbc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,21 @@ +#### 5.0.0-beta.0: Beta Release + +Editor + + - Update Sidebar UX (#5318) @knolleary + - Workspace pan/zoom updates (#5312) @knolleary + - Fix panning workspace on touchscreens (#5371) @knolleary + - Update tour for 5-beta (#5370) @knolleary + +Runtime + + - Prep dev branch for beta releases (#5367) @knolleary + +Nodes + + - Add ability to use pfx or p12 file for TLS connection settings option (#4907) @dceejay + + #### 4.1.2: Maintenance Release From c17b6bfde81b06b2b37187c65a68520f02d9615e Mon Sep 17 00:00:00 2001 From: Ben Hardill Date: Sun, 7 Dec 2025 12:48:33 +0000 Subject: [PATCH 085/160] Add TLS certs/keys from Env Vars --- .../@node-red/nodes/core/network/05-tls.html | 47 ++++++++++++++++++- .../@node-red/nodes/core/network/05-tls.js | 27 ++++++++++- .../nodes/locales/en-US/messages.json | 3 +- 3 files changed, 73 insertions(+), 4 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/05-tls.html b/packages/node_modules/@node-red/nodes/core/network/05-tls.html index 1dda38842c..f889154b76 100644 --- a/packages/node_modules/@node-red/nodes/core/network/05-tls.html +++ b/packages/node_modules/@node-red/nodes/core/network/05-tls.html @@ -24,6 +24,7 @@
                  @@ -38,6 +39,10 @@
                  +
                  + + +
                  @@ -50,6 +55,10 @@
                  +
                  + + +
                  @@ -78,6 +87,10 @@
                  +
                  + + +
                  @@ -131,7 +144,10 @@ caname: {value:""}, servername: {value:""}, verifyservercert: {value: true}, - alpnprotocol: {value: ""} + alpnprotocol: {value: ""}, + certEnv: {value: ""}, + keyEnv: {value: ""}, + caEnv: {value: ""} }, credentials: { certdata: {type:"text"}, @@ -152,15 +168,42 @@ $("#node-tls-conf-cer").hide(); $("#node-tls-conf-key").hide(); $("#node-tls-conf-ca").hide(); + $("#node-tls-conf-cer-env").hide(); + $("#node-tls-conf-key-env").hide(); + $("#node-tls-conf-ca-env").hide(); $("#node-tls-conf-p12").show(); } - else { + else if ($("#node-config-input-certType").val() === "env") { + $("#node-tls-conf-cer").hide(); + $("#node-tls-conf-key").hide(); + $("#node-tls-conf-ca").hide(); + $("#node-tls-conf-cer-env").show(); + $("#node-tls-conf-key-env").show(); + $("#node-tls-conf-ca-env").show(); + $("#node-tls-conf-p12").hide(); + } else { $("#node-tls-conf-cer").show(); $("#node-tls-conf-key").show(); $("#node-tls-conf-ca").show(); + $("#node-tls-conf-cer-env").hide(); + $("#node-tls-conf-key-env").hide(); + $("#node-tls-conf-ca-env").hide(); $("#node-tls-conf-p12").hide(); } }); + + $("#node-config-input-certEnv").typedInput({ + type:"env", + types:["env"] + }); + $("#node-config-input-keyEnv").typedInput({ + type:"env", + types:["env"] + }); + $("#node-config-input-caEnv").typedInput({ + type:"env", + types:["env"] + }); function updateFileUpload() { if ($("#node-config-input-uselocalfiles").is(':checked')) { diff --git a/packages/node_modules/@node-red/nodes/core/network/05-tls.js b/packages/node_modules/@node-red/nodes/core/network/05-tls.js index 5e83f07a43..50cab6fb31 100644 --- a/packages/node_modules/@node-red/nodes/core/network/05-tls.js +++ b/packages/node_modules/@node-red/nodes/core/network/05-tls.js @@ -23,10 +23,14 @@ module.exports = function(RED) { this.valid = true; this.verifyservercert = n.verifyservercert; var certPath, keyPath, caPath, p12Path; + var certEnv, keyEnv, caEnv; if (n.cert) { certPath = n.cert.trim(); } if (n.key) { keyPath = n.key.trim(); } if (n.ca) { caPath = n.ca.trim(); } if (n.p12) { p12Path = n.p12.trim(); } + if (n.certEnv) { certEnv = n.certEnv } + if (n.keyEnv) { keyEnv = n.keyEnv } + if (n.caEnv) { caEnv = n.caEnv } this.certType = n.certType || "files"; this.servername = (n.servername||"").trim(); this.alpnprotocol = (n.alpnprotocol||"").trim(); @@ -41,13 +45,23 @@ module.exports = function(RED) { return; } } + else if (this.certType === "env") { + if (certEnv) { + this.certEnv = Buffer.from(RED.util.evaluateNodeProperty(certEnv, 'env', this)) + } + if (keyEnv) { + this.keyEnv = Buffer.from(RED.util.evaluateNodeProperty(keyEnv, 'env', this)) + } + if (caEnv) { + this.caEnv = Buffer.from(RED.util.evaluateNodeProperty(caEnv, 'env', this)) + } + } else if ((certPath && certPath.length > 0) || (keyPath && keyPath.length > 0) || (caPath && caPath.length > 0)) { if ( (certPath && certPath.length > 0) !== (keyPath && keyPath.length > 0)) { this.valid = false; this.error(RED._("tls.error.missing-file")); return; } - try { if (certPath) { this.cert = fs.readFileSync(certPath); @@ -122,6 +136,17 @@ module.exports = function(RED) { opts.ca = this.ca; } } + else if (this.certType === "env") { + if (this.keyEnv) { + opts.key = this.keyEnv + } + if (this.certEnv) { + opts.cert= this.certEnv + } + if (this.caEnv) { + opts.ca = this.caEnv + } + } else { if (this.pfx) { opts.pfx = this.pfx; diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json index 34462a4aa9..0e5f4ae623 100644 --- a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json @@ -208,7 +208,8 @@ "certtype": "Cert Type", "files": "Individual files", "p12": "pfx or p12", - "pfx": "pfx or p12 file" + "pfx": "pfx or p12 file", + "env": "Environment Variable" }, "placeholder": { "cert": "path to certificate (PEM format)", From 48b8659ddb965e090442ea17f1ccb92928e17125 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 8 Dec 2025 11:10:46 +0000 Subject: [PATCH 086/160] Show overflow button when not enough space in tab bar --- .../editor-client/src/js/ui/sidebar.js | 123 +++++++++++++++--- .../editor-client/src/sass/sidebar.scss | 50 ++++--- 2 files changed, 130 insertions(+), 43 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js index 8bbc516bd3..4373506129 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js @@ -138,7 +138,7 @@ RED.sidebar = (function() { // Insert the tab button at the correct index if (targetTabButtonIndex === -1 || targetTabButtonIndex >= targetSidebar.tabBar.children().length) { // Append to end - options.tabButton = $('').appendTo(targetSidebar.tabBar); + options.tabButton = $('').insertBefore(targetSidebar.tabOverflowButton); } else { // Insert before the item at targetTabButtonIndex options.tabButton = $('').insertBefore(targetSidebar.tabBar.children().eq(targetTabButtonIndex)); @@ -166,6 +166,7 @@ RED.sidebar = (function() { if (targetSidebar.content.children().length === 1) { RED.sidebar.show(options.id) } + targetSidebar.resizeSidebarTabBar() } function removeTab(id) { @@ -210,18 +211,67 @@ RED.sidebar = (function() { let draggingTabButton = false function setupSidebarTabs(sidebar) { const tabBar = $('
                  ').addClass('red-ui-sidebar-' + sidebar.direction); - tabBar.attr('id', sidebar.container.attr('id') + '-tab-bar') - tabBar.data('sidebar', sidebar.id) + const tabBarButtonsContainer = $('
                  ').appendTo(tabBar); + const tabOverflowButton = $('').appendTo(tabBarButtonsContainer); + sidebar.tabOverflowButton = tabOverflowButton + tabOverflowButton.hide() + tabOverflowButton.on('click', function(evt) { + try { + const menuOptions = [] + tabBarButtonsContainer.find('button:not(.red-ui-sidebar-tab-bar-overflow-button)').each(function () { + if ($(this).is(':visible')) { + return + } + const tabId = $(this).attr('data-tab-id') + const tabOptions = knownTabs[tabId] + menuOptions.push({ + label: tabOptions.name, + onselect: function() { + RED.sidebar.show(tabId) + } + }) + }) + if (menuOptions.length === 0) { + return + } + const menu = RED.menu.init({ options: menuOptions }); + menu.attr("id",sidebar.container.attr('id')+"-menu"); + menu.css({ + position: "absolute" + }) + menu.appendTo("body"); + var elementPos = tabOverflowButton.offset(); + menu.css({ + top: (elementPos.top+tabOverflowButton.height()- menu.height() - 10)+"px", + left: (elementPos.left - menu.width() - 3)+"px" + }) + $(".red-ui-menu.red-ui-menu-dropdown").hide(); + setTimeout(() => { + $(document).on("click.red-ui-sidebar-tabmenu", function(evt) { + $(document).off("click.red-ui-sidebar-tabmenu"); + console.log('done the remov') + menu.remove(); + }); + }, 0) + menu.show(); + console.log(menu) + } catch (err) { + console.log(err) + } + }) + tabBarButtonsContainer.attr('id', sidebar.container.attr('id') + '-tab-bar') + tabBarButtonsContainer.data('sidebar', sidebar.id) if (sidebar.direction === 'right') { tabBar.insertAfter(sidebar.container); } else if (sidebar.direction === 'left') { tabBar.insertBefore(sidebar.container); } - tabBar.sortable({ + tabBarButtonsContainer.sortable({ distance: 10, cancel: false, + items: "button:not(.red-ui-sidebar-tab-bar-overflow-button)", placeholder: "red-ui-sidebar-tab-bar-button-placeholder", - connectWith: ".red-ui-sidebar-tab-bar", + connectWith: ".red-ui-sidebar-tab-bar-buttons", start: function(event, ui) { // Remove the tooltip so it doesn't display unexpectedly whilst dragging const tabId = ui.item.attr('data-tab-id'); @@ -252,20 +302,61 @@ RED.sidebar = (function() { RED.sidebar.show(firstTab); } } + src.resizeSidebarTabBar(); + dest.resizeSidebarTabBar(); + RED.sidebar.show(tabId) } }) - // $(window).on("resize", function () { - // const lastChild = tabBar.children().last(); - // if (lastChild.length > 0) { - // const tabBarHeight = tabBar.height(); - // const lastChildBottom = lastChild.position().top + lastChild.outerHeight(); - // if (lastChildBottom > tabBarHeight) { - // console.log('overflow') - // } - // } - // }) - return tabBar + + let hasHidden = false + sidebar.resizeSidebarTabBar = function () { + let tabBarButtonsBottom = tabBarButtonsContainer.position().top + tabBarButtonsContainer.outerHeight(); + const buttonHeight = tabOverflowButton.outerHeight() + // Find the last visible button + let bottomButton = tabBarButtonsContainer.children(":visible").last() + if (bottomButton.length === 0) { + // Nothing visible - bail out + return + } + if (tabBarButtonsBottom < bottomButton.position().top + buttonHeight * 1.5) { + tabOverflowButton.show() + let tabOverflowButtonBottom = tabOverflowButton.position().top + buttonHeight * 1.5; + while (tabBarButtonsBottom < tabOverflowButtonBottom) { + const lastVisible = tabBarButtonsContainer.children(':not(".red-ui-sidebar-tab-bar-overflow-button"):visible').last() + if (lastVisible.length === 0) { + // Nothing left to hide + break + } + lastVisible.hide() + tabOverflowButtonBottom = tabOverflowButton.position().top + buttonHeight * 1.5; + } + } else { + const hiddenChildren = tabBarButtonsContainer.children(':not(".red-ui-sidebar-tab-bar-overflow-button"):hidden') + if (hiddenChildren.length > 0) { + // We may be able to show some more buttons + let tabOverflowButtonBottom = tabOverflowButton.position().top + buttonHeight * 2; + let shownCount = 0 + while (tabBarButtonsBottom > tabOverflowButtonBottom + buttonHeight) { + const firstHidden = tabBarButtonsContainer.children(':not(".red-ui-sidebar-tab-bar-overflow-button"):hidden').first() + if (firstHidden.length === 0) { + // Nothing left to show + break + } + firstHidden.show() + shownCount++ + tabOverflowButtonBottom = tabOverflowButton.position().top + buttonHeight * 2; + } + if (hiddenChildren.length - shownCount <= 1) { + // We were able to show all of the hidden buttons + // so hide the overflow button again + tabOverflowButton.hide() + } + } + } + } + $(window).on("resize", sidebar.resizeSidebarTabBar) + return tabBarButtonsContainer } function setupSidebarSeparator(sidebar) { const separator = $('
                  '); diff --git a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss index 02a4bec8db..04c8ade13e 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss @@ -35,13 +35,7 @@ .red-ui-sidebar-right { border-right: none; } -#red-ui-sidebar.closing { - border-style: dashed; -} -.red-ui-sidebar > .red-ui-tabs { - flex-grow: 0; - flex-shrink: 0; -} + .red-ui-sidebar-footer { @include mixins.component-footer; position: relative; @@ -72,34 +66,17 @@ height: 100%; z-index: 20; } - // &:before { - // content: ''; - // display: block; - // width: 100%; - // height: 100%; - // -webkit-mask-image: url(images/grip.svg); - // mask-image: url(images/grip.svg); - // -webkit-mask-size: auto; - // mask-size: auto; - // -webkit-mask-position: 50% 50%; - // mask-position: 50% 50%; - // -webkit-mask-repeat: no-repeat; - // mask-repeat: no-repeat; - // background-color: var(--red-ui-grip-color); - // } } .red-ui-sidebar-tab-bar { - // width: 40px; - padding: 8px; background-color: var(--red-ui-secondary-background); flex: 0 0 auto; display: flex; flex-direction: column; align-items: center; - gap: 12px; z-index: 10; border: 1px solid var(--red-ui-primary-border-color); + // height: 100%; &.red-ui-sidebar-left { border-left: none; @@ -116,8 +93,8 @@ align-items: center; justify-content: center; padding: 0; - height: 28px; - width: 28px; + height: 24px; + width: 24px; &:not(.selected):not(:hover) { border: none; i { @@ -131,6 +108,25 @@ .red-ui-sidebar-tab-bar-button-placeholder { border: 1px dashed var(--red-ui-form-input-border-color); } + + .red-ui-sidebar-tab-bar-buttons { + display: flex; + background: rgba(255, 0, 0, 0.1); + padding: 6px 6px 10px; + flex-direction: column; + align-items: center; + gap: 10px; + height: 100%; + } + .red-ui-sidebar-tab-bar-bottom-buttons { + display: flex; + flex-grow: 1; + background: rgba(0, 255, 0, 0.1); + padding: 8px 8px 12px; + flex-direction: column; + align-items: center; + gap: 12px; + } } .red-ui-sidebar .button { From 04f7c8dc9fe3cd17f03ec7faf62eb374e0778cbb Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 8 Dec 2025 16:27:33 +0000 Subject: [PATCH 087/160] Checkpoint --- .../editor-client/src/js/ui/sidebar.js | 9 +++++++++ .../editor-client/src/sass/sidebar.scss | 17 ++++++----------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js index 4373506129..95288378cb 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js @@ -209,9 +209,18 @@ RED.sidebar = (function() { } let draggingTabButton = false + + function setupSidebarTabButtonContainer(sidebar, position) { + + } function setupSidebarTabs(sidebar) { const tabBar = $('
                  ').addClass('red-ui-sidebar-' + sidebar.direction); const tabBarButtonsContainer = $('
                  ').appendTo(tabBar); + const tabBarButtonsContainerBottom = $('
                  ').appendTo(tabBar); + const dummyButton = $('').appendTo(tabBarButtonsContainerBottom); + const dummyButton2 = $('').appendTo(tabBarButtonsContainerBottom); + + const tabOverflowButton = $('').appendTo(tabBarButtonsContainer); sidebar.tabOverflowButton = tabOverflowButton tabOverflowButton.hide() diff --git a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss index 04c8ade13e..d8acb980be 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss @@ -101,9 +101,6 @@ opacity: 0.7; } } - &.selected { - // box-shadow: 0 2px 0 0 var(--red-ui-form-input-border-selected-color); - } } .red-ui-sidebar-tab-bar-button-placeholder { border: 1px dashed var(--red-ui-form-input-border-color); @@ -111,21 +108,19 @@ .red-ui-sidebar-tab-bar-buttons { display: flex; + width: 100%; background: rgba(255, 0, 0, 0.1); - padding: 6px 6px 10px; + padding: 6px; + box-sizing: border-box; flex-direction: column; align-items: center; gap: 10px; - height: 100%; + flex-grow: 1; } .red-ui-sidebar-tab-bar-bottom-buttons { - display: flex; - flex-grow: 1; background: rgba(0, 255, 0, 0.1); - padding: 8px 8px 12px; - flex-direction: column; - align-items: center; - gap: 12px; + min-height: 50px; + flex-grow: 0; } } From 55d08ba79ee0e3482d046a863ee5e72fa10118a3 Mon Sep 17 00:00:00 2001 From: Ben Hardill Date: Mon, 8 Dec 2025 17:39:25 +0000 Subject: [PATCH 088/160] Move localfiles checkbox --- .../@node-red/nodes/core/network/05-tls.html | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/05-tls.html b/packages/node_modules/@node-red/nodes/core/network/05-tls.html index f889154b76..f4dc50f624 100644 --- a/packages/node_modules/@node-red/nodes/core/network/05-tls.html +++ b/packages/node_modules/@node-red/nodes/core/network/05-tls.html @@ -15,10 +15,6 @@ --> diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json index 34462a4aa9..5c00081a07 100644 --- a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json @@ -308,7 +308,8 @@ "delayvarmsg": "Override delay with msg.delay", "randomdelay": "Random delay", "limitrate": "Rate Limit", - "limitall": "All messages", + "limitall": "All messages - even spacing", + "limitburst": "All messages - burst mode", "limittopic": "For each msg.topic", "fairqueue": "Send each topic in turn", "timedqueue": "Send all topics", @@ -332,6 +333,7 @@ "label": { "delay": "delay", "variable": "variable", + "burst": "burst", "limit": "limit", "limitTopic": "limit topic", "random": "random", diff --git a/test/nodes/core/function/89-delay_spec.js b/test/nodes/core/function/89-delay_spec.js index 4fbf3df545..15dbe340d2 100644 --- a/test/nodes/core/function/89-delay_spec.js +++ b/test/nodes/core/function/89-delay_spec.js @@ -1009,6 +1009,67 @@ describe('delay Node', function() { }); }); + it('can handle a burst in burst mode', function(done) { + this.timeout(2000); + var flow = [{"id":"delayNode1","type":"delay","name":"delayNode","pauseType":"burst","timeout":1,"timeoutUnits":"seconds","rate":3,"nbRateUnits":1,"rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"wires":[["helperNode1"]]}, + {id:"helperNode1", type:"helper", wires:[]}]; + helper.load(delayNode, flow, function() { + var delayNode1 = helper.getNode("delayNode1"); + var helperNode1 = helper.getNode("helperNode1"); + var t = Date.now(); + var c = 0; + helperNode1.on("input", function(msg) { + msg.should.have.a.property('payload'); + c += 1; + if (c > 3) { done(err)} + done(); + }); + + setTimeout( function() { + if (c === 3) { done(); } + }, 700); + + // send test messages + delayNode1.receive({payload:1}); + setImmediate( function() { delayNode1.receive({payload:2}); } ); + setImmediate( function() { delayNode1.receive({payload:3}); } ); + setImmediate( function() { delayNode1.receive({payload:4}); } ); + setImmediate( function() { delayNode1.receive({payload:5}); } ); + }); + }); + + it('can reset a burst in burst mode', function(done) { + this.timeout(2000); + var flow = [{"id":"delayNode1","type":"delay","name":"delayNode","pauseType":"burst","timeout":1,"timeoutUnits":"seconds","rate":3,"nbRateUnits":1,"rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"wires":[["helperNode1"]]}, + {id:"helperNode1", type:"helper", wires:[]}]; + helper.load(delayNode, flow, function() { + var delayNode1 = helper.getNode("delayNode1"); + var helperNode1 = helper.getNode("helperNode1"); + var t = Date.now(); + var c = 0; + helperNode1.on("input", function(msg) { + msg.should.have.a.property('payload'); + c += 1; + if (c > 4) { done(err)} + done(); + }); + + setTimeout( function() { + if (c === 4) { done(); } + }, 700); + + // send test messages + delayNode1.receive({payload:1}); + setImmediate( function() { delayNode1.receive({payload:2}); } ); + setImmediate( function() { delayNode1.receive({payload:3}); } ); + setImmediate( function() { delayNode1.receive({payload:4}); } ); + setImmediate( function() { delayNode1.receive({payload:5}); } ); + setImmediate( function() { delayNode1.receive({reset:true}); } ); + setImmediate( function() { delayNode1.receive({payload:6}); } ); + }); + }); + + it('sending a msg with reset to empty queue doesnt send anything', function(done) { this.timeout(2000); var flow = [{"id":"delayNode1","type":"delay","name":"delayNode","pauseType":"rate","timeout":1,"timeoutUnits":"seconds","rate":2,"rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"wires":[["helperNode1"]]}, From 471c5eecda0f80ebf6828f1cd60a8e0ecad0d7a8 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 7 Jan 2026 16:33:04 +0000 Subject: [PATCH 098/160] WIP --- .../src/js/ui/common/treeList.js | 30 +++++---- .../editor-client/src/js/ui/sidebar.js | 58 +++++++++++----- .../src/js/ui/tab-info-outliner.js | 25 ++++--- .../editor-client/src/sass/colors.scss | 40 ++++++----- .../editor-client/src/sass/dropdownMenu.scss | 8 +-- .../editor-client/src/sass/header.scss | 67 ++++++++++--------- .../editor-client/src/sass/sizes.scss | 2 +- .../editor-client/src/sass/tab-info.scss | 13 +++- .../editor-client/src/sass/variables.scss | 2 + 9 files changed, 150 insertions(+), 95 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js index 85c6f0992a..3769474fcd 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js @@ -28,6 +28,7 @@ * - autoSelect: boolean - default true - triggers item selection when navigating * list by keyboard. If the list has checkboxed items * you probably want to set this to false + * - expandOnLabel: boolean - default true - items expand when their label is clicked * * methods: * - data(items) - clears existing items and replaces with new data @@ -91,6 +92,7 @@ * * */ + const paddingPerDepth = 5; $.widget( "nodered.treeList", { _create: function() { @@ -342,11 +344,11 @@ if (child.depth !== parent.depth+1) { child.depth = parent.depth+1; // var labelPaddingWidth = ((child.gutter ? child.gutter[0].offsetWidth + 2 : 0) + (child.depth * 20)); - var labelPaddingWidth = (((child.gutter&&!child.gutter.hasClass("red-ui-treeList-gutter-float"))?child.gutter.width()+2:0)+(child.depth*20)); + var labelPaddingWidth = (((child.gutter&&!child.gutter.hasClass("red-ui-treeList-gutter-float"))?child.gutter.width()+2:0)+(child.depth*paddingPerDepth)); child.treeList.labelPadding.width(labelPaddingWidth+'px'); if (child.element) { $(child.element).css({ - width: "calc(100% - "+(labelPaddingWidth+20+(child.icon?20:0))+"px)" + width: "calc(100% - "+(labelPaddingWidth+paddingPerDepth+(child.icon?paddingPerDepth:0))+"px)" }) } // This corrects all child item depths @@ -475,7 +477,7 @@ if (!childrenAdded) { startTime = Date.now(); spinner = $('
                  ').css({ - "background-position": (35+depth*20)+'px 50%' + "background-position": (35+depth*paddingPerDepth)+'px 50%' }).appendTo(container); } @@ -527,10 +529,10 @@ $(element).appendTo(item.treeList.label); // using the JQuery Object, the gutter width will // be wrong when the element is reattached the second time - var labelPaddingWidth = (item.gutter ? item.gutter[0].offsetWidth + 2 : 0) + (item.depth * 20); + var labelPaddingWidth = (item.gutter ? item.gutter[0].offsetWidth + 2 : 0) + (item.depth * paddingPerDepth); $(element).css({ - width: "calc(100% - "+(labelPaddingWidth+20+(item.icon?20:0))+"px)" + width: "calc(100% - "+(labelPaddingWidth+paddingPerDepth+(item.icon?paddingPerDepth:0))+"px)" }) } item.element = element; @@ -565,7 +567,7 @@ } - var labelPaddingWidth = ((item.gutter&&!item.gutter.hasClass("red-ui-treeList-gutter-float"))?item.gutter.width()+2:0)+(depth*20); + var labelPaddingWidth = ((item.gutter&&!item.gutter.hasClass("red-ui-treeList-gutter-float"))?item.gutter.width()+2:0)+(depth*paddingPerDepth); item.treeList.labelPadding = $('').css({ display: "inline-block", @@ -617,6 +619,7 @@ } $('').toggleClass("hide",item.collapsible === false).appendTo(treeListIcon); treeListIcon.on("click.red-ui-treeList-expand", function(e) { + console.log('click expand icon') e.stopPropagation(); e.preventDefault(); if (container.hasClass("expanded")) { @@ -627,12 +630,15 @@ }); // $('').appendTo(label); label.on("click.red-ui-treeList-expand", function(e) { - if (container.hasClass("expanded")) { - if (item.hasOwnProperty('selected') || label.hasClass("selected")) { - item.treeList.collapse(); + if (that.options.expandOnLabel !== false) { + if (container.hasClass("expanded")) { + if (item.hasOwnProperty('selected') || label.hasClass("selected")) { + item.treeList.collapse(); + } + } else { + console.log('click on label expand') + item.treeList.expand(); } - } else { - item.treeList.expand(); } }) if (!item.children) { @@ -770,7 +776,7 @@ } else if (item.element) { $(item.element).appendTo(label); $(item.element).css({ - width: "calc(100% - "+(labelPaddingWidth+20+(item.icon?20:0))+"px)" + width: "calc(100% - "+(labelPaddingWidth+paddingPerDepth+(item.icon?paddingPerDepth:0))+"px)" }) } if (item.children) { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js index f7b1c3dc3c..190c7a2253 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js @@ -32,7 +32,7 @@ RED.sidebar = (function() { maximumWidth: 800, // Make LH side slightly narrower by default as its the palette that doesn't require a lot of width defaultWidth: 210, - defaultTopHeight: 0.4 + defaultTopHeight: 0.5 } } const defaultSidebarConfiguration = { @@ -189,6 +189,11 @@ RED.sidebar = (function() { const targetSidebar = options.target === 'secondary' ? sidebars.secondary : sidebars.primary; // if (targetSidebar.tabBars[options.targetSection].active === options.id && RED.menu.isSelected(targetSidebar.menuToggle)) { + // if (!targetSidebar.sections[options.targetSection].hidden) { + // targetSidebar.hideSection(options.targetSection) + // } else { + // targetSidebar.showSection(options.targetSection) + // } RED.menu.setSelected(targetSidebar.menuToggle, false); } else { RED.sidebar.show(options.id) @@ -264,23 +269,30 @@ RED.sidebar = (function() { sidebar.tabBars.bottom.resizeSidebarTabBar(); } sidebar.hideSection = function (position) { - sidebar.sections.bottom.container.hide() - sidebar.sections.bottom.hidden = true - sidebar.sections.top.container.css('flex-grow', '1') - sidebar.tabBars.top.container.css('flex-grow', '1') - sidebar.tabBars.bottom.container.css('flex-grow', '0') - sidebar.tabBars.bottom.container.css('height', '60px') + sidebar.sections[position].container.hide() + sidebar.sections[position].hidden = true + + const otherPosition = position === 'top' ? 'bottom' : 'top' + sidebar.sections[otherPosition].container.css('flex-grow', '1') + + sidebar.tabBars[position].clearSelected() + // sidebar.tabBars.top.container.css('flex-grow', '1') + // sidebar.tabBars[position].container.css('flex-grow', '0') + // sidebar.tabBars[position].container.css('height', '60px') sidebar.resizeSidebar() } sidebar.showSection = function (position) { - sidebar.sections.bottom.container.show() - sidebar.sections.bottom.hidden = false - sidebar.sections.top.container.css('flex-grow', '0') - sidebar.sections.top.container.css('height', '70%') - sidebar.tabBars.top.container.css('flex-grow', '') - sidebar.tabBars.bottom.container.css('flex-grow', '') - sidebar.tabBars.bottom.container.css('height', '') + sidebar.sections[position].container.show() + sidebar.sections[position].hidden = false + const otherPosition = position === 'top' ? 'bottom' : 'top' + sidebar.sections[otherPosition].container.css('flex-grow', '0') + sidebar.sections[otherPosition].container.css('height', '70%') + // sidebar.tabBars.top.container.css('flex-grow', '') + // sidebar.tabBars[position].container.css('flex-grow', '') + // sidebar.tabBars[position].container.css('height', '') + sidebar.tabBars[position].active + sidebar.tabBars[position].container.find('button[data-tab-id="'+sidebar.tabBars[position].active+'"]').addClass('selected') sidebar.resizeSidebar() } @@ -342,6 +354,14 @@ RED.sidebar = (function() { connectWith: ".red-ui-sidebar-tab-bar-buttons", start: function(event, ui) { const tabId = ui.item.attr('data-tab-id'); + const tabCount = tabBarButtonsContainer.children('button:not(.red-ui-sidebar-tab-bar-overflow-button):not(.red-ui-sidebar-tab-bar-button-placeholder)').length + if (position === 'top' && tabCount === 1) { + // Call in a timeout to allow the stortable start event to complete + // processing - otherwise errors are thrown + setTimeout(function () { + tabBarButtonsContainer.sortable('cancel'); + }, 0); + } const options = knownTabs[tabId]; options.tabButtonTooltip.delete() draggingTabButton = true @@ -584,6 +604,9 @@ RED.sidebar = (function() { if (!skipShowSidebar && !RED.menu.isSelected(targetSidebar.menuToggle)) { RED.menu.setSelected(targetSidebar.menuToggle,true); } + if (targetSidebar.sections[targetSection].hidden) { + targetSidebar.showSection(targetSection) + } } } } @@ -604,11 +627,13 @@ RED.sidebar = (function() { sidebar.sections = {}; sidebar.sections.top = {} sidebar.sections.top.container = $('
                  ').appendTo(sidebar.container); + // sidebar.sections.top.banner = $('
                  Head
                  ').appendTo(sidebar.sections.top.container); sidebar.sections.top.content = $('
                  ').appendTo(sidebar.sections.top.container); sidebar.sections.top.footer = $('').appendTo(sidebar.sections.top.container); sidebar.sectionsSeparator = $('
                  ').appendTo(sidebar.container); sidebar.sections.bottom = {} sidebar.sections.bottom.container = $('
                  ').appendTo(sidebar.container); + // sidebar.sections.bottom.banner = $('
                  Head
                  ').appendTo(sidebar.sections.bottom.container); sidebar.sections.bottom.content = $('
                  ').appendTo(sidebar.sections.bottom.container); sidebar.sections.bottom.footer = $('').appendTo(sidebar.sections.bottom.container); @@ -616,12 +641,14 @@ RED.sidebar = (function() { let startTopSectionHeight let startTopTabSectionHeight let startSidebarHeight + let lastSeparatorPosition sidebar.sectionsSeparator.draggable({ axis: "y", containment: sidebar.container, scroll: false, start:function(event,ui) { startPosition = ui.position.top + lastSeparatorPosition = ui.position.top startTopSectionHeight = sidebar.sections.top.container.outerHeight() startTopTabSectionHeight = sidebar.tabBars.top.container.outerHeight() startSidebarHeight = sidebar.container.height() @@ -631,12 +658,13 @@ RED.sidebar = (function() { const newTopHeight = startTopSectionHeight + delta const newBottomHeight = startSidebarHeight - newTopHeight if (newTopHeight < 100 || newBottomHeight < 100) { - ui.position.top += delta + ui.position.top = lastSeparatorPosition return } sidebar.sections.top.container.outerHeight(startTopSectionHeight + delta) sidebar.tabBars.top.container.outerHeight(startTopTabSectionHeight + delta) ui.position.top -= delta + lastSeparatorPosition = ui.position.top sidebar.resizeSidebar() }, stop:function(event,ui) { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js index 816824716d..18d5b06d97 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js @@ -43,7 +43,6 @@ RED.sidebar.info.outliner = (function() { subflowList = flowData[1]; globalConfigNodes = flowData[2]; configNodeTypes = { __global__: globalConfigNodes}; - return flowData; } @@ -222,8 +221,6 @@ RED.sidebar.info.outliner = (function() { } return RED._("common.label."+(((n.type==='tab' && n.disabled) || (n.type!=='tab' && n.d))?"enable":"disable")); }); - } else { - $('
                  ').appendTo(controls) } if (n.type === 'tab') { var lockToggleButton = $('').appendTo(controls).on("click",function(evt) { @@ -238,7 +235,7 @@ RED.sidebar.info.outliner = (function() { RED.popover.tooltip(lockToggleButton,function() { return RED._("common.label."+(n.locked?"unlock":"lock")); }); - } else { + } else if (n.type !== 'subflow') { $('
                  ').appendTo(controls) } controls.find("button").on("dblclick", function(evt) { @@ -297,7 +294,8 @@ RED.sidebar.info.outliner = (function() { //
                  Space Monkey
                  ').appendTo(container) treeList = $("
                  ").css({width: "100%"}).appendTo(container).treeList({ - data:getFlowData() + data:getFlowData(), + expandOnLabel: false }) treeList.on('treelistselect', function(e,item) { var node = RED.nodes.node(item.id) || RED.nodes.group(item.id) || RED.nodes.workspace(item.id) || RED.nodes.subflow(item.id); @@ -591,14 +589,15 @@ RED.sidebar.info.outliner = (function() { } } function getGutter(n) { - var span = $("",{class:"red-ui-info-outline-gutter red-ui-treeList-gutter-float"}); - var revealButton = $('').appendTo(span).on("click",function(evt) { - evt.preventDefault(); - evt.stopPropagation(); - RED.view.reveal(n.id); - }) - RED.popover.tooltip(revealButton,RED._("sidebar.info.find")); - return span; + // var span = $("",{class:"red-ui-info-outline-gutter red-ui-treeList-gutter-float"}); + // var revealButton = $('').appendTo(span).on("click",function(evt) { + // evt.preventDefault(); + // evt.stopPropagation(); + // RED.view.reveal(n.id); + // }) + // RED.popover.tooltip(revealButton,RED._("sidebar.info.find")); + // return span; + return null; } function createFlowConfigNode(parent,type) { diff --git a/packages/node_modules/@node-red/editor-client/src/sass/colors.scss b/packages/node_modules/@node-red/editor-client/src/sass/colors.scss index 098094f868..b5ce5404c8 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/colors.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/colors.scss @@ -182,7 +182,7 @@ $diff-merge-header-color: #800080; $diff-merge-header-background: #e5f9ff; $diff-merge-header-border-color: #b2edff; -$menuBackground: $primary-background; +$menuBackground: $secondary-background; $menuDivider: $secondary-border-color; $menuColor: $primary-text-color; $menuActiveColor: $secondary-text-color-active; @@ -247,28 +247,32 @@ $link-unknown-color: #f00; $clipboard-textarea-background: #F3E7E7; +$header-background: $primary-background; +$header-button-border: $primary-border-color; +$header-button-background-active: $workspace-button-background-active; +$header-accent: $primary-background; + +$header-menu-color: $primary-text-color; +$header-menu-color-disabled: $secondary-text-color-disabled; +$header-menu-heading-color:$primary-text-color; +$header-menu-sublabel-color: $secondary-text-color-active; +$header-menu-background: $menuBackground; +$header-menu-item-hover: $secondary-background-hover; +$header-menu-item-border-active: $secondary-background-hover; +$headerMenuItemDivider: $secondary-border-color; +$headerMenuCaret: $tertiary-text-color; + + $deploy-button-color: #eee; $deploy-button-color-active: #ccc; -$deploy-button-color-disabled: #999; +$deploy-button-color-disabled: $secondary-text-color-disabled; +$deploy-button-border-color: $header-button-border; $deploy-button-background: #8C101C; $deploy-button-background-hover: #6E0A1E; $deploy-button-background-active: #4C0A17; -$deploy-button-background-disabled: #444; -$deploy-button-background-disabled-hover: #555; - - -$header-background: #000; -$header-button-background-active: #121212; -$header-accent: #C02020; -$header-menu-color: #eee; -$header-menu-color-disabled: #666; -$header-menu-heading-color: #fff; -$header-menu-sublabel-color: #aeaeae; -$header-menu-background: #121212; -$header-menu-item-hover: #323232; -$header-menu-item-border-active: #777677; -$headerMenuItemDivider: #464646; -$headerMenuCaret: #C7C7C7; +$deploy-button-background-disabled: $header-background; +$deploy-button-background-disabled-hover: $secondary-background-hover; + $vcCommitShaColor: #c38888; diff --git a/packages/node_modules/@node-red/editor-client/src/sass/dropdownMenu.scss b/packages/node_modules/@node-red/editor-client/src/sass/dropdownMenu.scss index f6a2d6fdec..061faf82ce 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/dropdownMenu.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/dropdownMenu.scss @@ -30,7 +30,8 @@ list-style: none; background: var(--red-ui-menuBackground); border: 1px solid var(--red-ui-secondary-border-color); - box-shadow: 0 5px 10px var(--red-ui-shadow); + border-radius: 4px; + box-shadow: -2px 2px 6px 2px var(--red-ui-shadow); &.pull-right { right: 0; @@ -163,7 +164,7 @@ position: relative; & > .red-ui-menu-dropdown { top: 0; - left: calc(100% - 5px); + left: calc(100%); margin-top: 0; margin-left: -1px; } @@ -187,8 +188,7 @@ &.pull-left { float: none; & > .red-ui-menu-dropdown { - left: -100%; - margin-left: 10px; + left: calc(-100% - 2px); } } } diff --git a/packages/node_modules/@node-red/editor-client/src/sass/header.scss b/packages/node_modules/@node-red/editor-client/src/sass/header.scss index ed8de31657..0bc7899742 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/header.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/header.scss @@ -28,31 +28,29 @@ height: var(--red-ui-header-height); background: var(--red-ui-header-background); box-sizing: border-box; - padding: 0px 0px 0px 20px; + padding: 0px; color: var(--red-ui-header-menu-color); font-size: 14px; display: flex; justify-content: space-between; align-items: center; - border-bottom: 2px solid var(--red-ui-header-accent); - padding-top: 2px; + padding-top: 6px; span.red-ui-header-logo { float: left; - font-size: 30px; - line-height: 30px; + margin-left: 8px; text-decoration: none; white-space: nowrap; span { vertical-align: middle; - font-size: 16px !important; + font-size: 14px !important; &:not(:first-child) { margin-left: 8px; } } img { - height: 32px; + height: 28px; } a { @@ -68,9 +66,9 @@ display: flex; align-items: stretch; padding: 0; - margin: 0; + margin: 0 10px 0 0; list-style: none; - float: right; + gap: 15px; > li { display: inline-flex; @@ -82,24 +80,20 @@ } .button { - height: 100%; + height: 24px; display: inline-flex; align-items: center; justify-content: center; - min-width: 20px; + min-width: 24px; text-align: center; - font-size: 20px; - padding: 0px 12px; + font-size: 16px; + padding: 0px; text-decoration: none; color: var(--red-ui-header-menu-color); - margin: auto 5px; + margin: auto 0; vertical-align: middle; - border-left: 2px solid var(--red-ui-header-background); - border-right: 2px solid var(--red-ui-header-background); + mask-size: contain; - &:hover { - border-color: var(--red-ui-header-menu-item-hover); - } &:active, &.active { background: var(--red-ui-header-button-background-active); } @@ -110,7 +104,6 @@ .button-group { display: inline-block; - margin: auto 15px; vertical-align: middle; clear: both; & > a { @@ -128,7 +121,7 @@ .red-ui-deploy-button { background: var(--red-ui-deploy-button-background); color: var(--red-ui-deploy-button-color); - + border: 1px solid var(--red-ui-deploy-button-border-color); &:hover { background: var(--red-ui-deploy-button-background-hover); } @@ -156,18 +149,24 @@ } #red-ui-header-button-deploy { - padding: 4px 12px; + padding: 3px 8px; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + border-right: none; + border-color: var(--red-ui-deploy-button-background); + &.disabled { cursor: default; background: var(--red-ui-deploy-button-background-disabled); color: var(--red-ui-deploy-button-color-disabled); - + border-color: var(--red-ui-deploy-button-border-color); .red-ui-deploy-button-content>img { - opacity: 0.3; + opacity: 0.7; } &+ #red-ui-header-button-deploy-options { background: var(--red-ui-deploy-button-background-disabled); color: var(--red-ui-deploy-button-color-active); + border-color: var(--red-ui-deploy-button-border-color); } &+ #red-ui-header-button-deploy-options:hover { background: var(--red-ui-deploy-button-background-disabled-hover); @@ -176,9 +175,17 @@ background: var(--red-ui-deploy-button-background-disabled); } } + &+ #red-ui-header-button-deploy-options { + padding: 3px 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + border-left: none; + border-color: var(--red-ui-deploy-button-background); + } .red-ui-deploy-button-content>img { margin-right: 8px; + height: 16px; } } @@ -212,7 +219,7 @@ background: var(--red-ui-header-menu-background); border: 1px solid var(--red-ui-header-menu-background); width: 260px !important; - margin-top: 0; + margin-top: 5px; li a { color: var(--red-ui-header-menu-color); padding: 3px 10px 3px 30px; @@ -295,10 +302,10 @@ .red-ui-user-profile { background-color: var(--red-ui-header-background); - border: 2px solid var(--red-ui-header-menu-color); + border: 1px solid var(--red-ui-header-button-border); border-radius: 30px; overflow: hidden; - + padding: 3px; background-position: center center; background-repeat: no-repeat; background-size: contain; @@ -306,9 +313,9 @@ justify-content: center; align-items: center; vertical-align: middle; - width: 30px; - height: 30px; - font-size: 20px; + width: 22px; + height: 22px; + font-size: 14px; &.red-ui-user-profile-color-1 { background-color: var(--red-ui-user-profile-colors-1); diff --git a/packages/node_modules/@node-red/editor-client/src/sass/sizes.scss b/packages/node_modules/@node-red/editor-client/src/sass/sizes.scss index a3d48e76d5..ecefc02947 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/sizes.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/sizes.scss @@ -14,4 +14,4 @@ * limitations under the License. **/ - $header-height: 48px; \ No newline at end of file + $header-height: 36px; \ No newline at end of file diff --git a/packages/node_modules/@node-red/editor-client/src/sass/tab-info.scss b/packages/node_modules/@node-red/editor-client/src/sass/tab-info.scss index a8fc624460..5af00579f0 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/tab-info.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/tab-info.scss @@ -423,7 +423,7 @@ div.red-ui-info-table { .red-ui-info-outline-item-control-spacer { display: inline-block; - width: 23px; + width: 18px; } .red-ui-info-outline-gutter { display:none; @@ -442,9 +442,18 @@ div.red-ui-info-table { right: 1px; padding: 1px 2px 0 1px; text-align: right; + &.red-ui-info-outline-item-hover-controls button { - min-width: 23px; + margin: 0; + padding: 0 2px; + min-width: 18px; + height: 18px; + border-radius: 4px; + line-height: 0; + i { + font-size: 8px; + } } .red-ui-treeList-label:not(:hover) &.red-ui-info-outline-item-hover-controls { diff --git a/packages/node_modules/@node-red/editor-client/src/sass/variables.scss b/packages/node_modules/@node-red/editor-client/src/sass/variables.scss index 9f34d8fde9..56379bdedd 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/variables.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/variables.scss @@ -239,6 +239,7 @@ --red-ui-deploy-button-color: #{colors.$deploy-button-color}; --red-ui-deploy-button-color-active: #{colors.$deploy-button-color-active}; --red-ui-deploy-button-color-disabled: #{colors.$deploy-button-color-disabled}; + --red-ui-deploy-button-border-color: #{colors.$deploy-button-border-color}; --red-ui-deploy-button-background: #{colors.$deploy-button-background}; --red-ui-deploy-button-background-hover: #{colors.$deploy-button-background-hover}; --red-ui-deploy-button-background-active: #{colors.$deploy-button-background-active}; @@ -249,6 +250,7 @@ --red-ui-header-background: #{colors.$header-background}; --red-ui-header-accent: #{colors.$header-accent}; --red-ui-header-button-background-active: #{colors.$header-button-background-active}; + --red-ui-header-button-border: #{colors.$header-button-border}; --red-ui-header-menu-color: #{colors.$header-menu-color}; --red-ui-header-menu-color-disabled: #{colors.$header-menu-color-disabled}; --red-ui-header-menu-heading-color: #{colors.$header-menu-heading-color}; From 96bef841a05740e49986c20584a98a0291932d48 Mon Sep 17 00:00:00 2001 From: Dennis Bosmans Date: Fri, 16 Jan 2026 22:22:11 +0100 Subject: [PATCH 099/160] fix: prevent uncaught exceptions in core node event handlers Added try-catch blocks and null checks to event handlers in core nodes to prevent uncaught exceptions from crashing the Node-RED runtime. Changes per node: **TCP (31-tcpin.js)** - Wrapped all `on('data')` handlers in try-catch (TcpIn client/server, TcpGet) **UDP (32-udp.js)** - Wrapped `on('message')` handler in try-catch **Exec (90-exec.js)** - Wrapped stdout/stderr `on('data')` handlers in try-catch **WebSocket (22-websocket.js)** - Wrapped send() loop in handleEvent() with try-catch **MQTT (10-mqtt.js)** - Added null check for packet parameter in subscriptionHandler() - Wrapped subscription handler callback in try-catch - Added null check for mpacket.properties Without these protections, malformed data or unexpected errors in async event handlers could cause uncaught exceptions that crash the entire Node-RED process. --- .../@node-red/nodes/core/function/90-exec.js | 26 +++-- .../@node-red/nodes/core/network/10-mqtt.js | 17 +-- .../nodes/core/network/22-websocket.js | 6 +- .../@node-red/nodes/core/network/31-tcpin.js | 102 ++++++++++-------- .../@node-red/nodes/core/network/32-udp.js | 20 ++-- 5 files changed, 102 insertions(+), 69 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/function/90-exec.js b/packages/node_modules/@node-red/nodes/core/function/90-exec.js index 02a908d4bd..beb4d11d46 100644 --- a/packages/node_modules/@node-red/nodes/core/function/90-exec.js +++ b/packages/node_modules/@node-red/nodes/core/function/90-exec.js @@ -105,18 +105,26 @@ module.exports = function(RED) { } node.activeProcesses[child.pid] = child; child.stdout.on('data', function (data) { - if (node.activeProcesses.hasOwnProperty(child.pid) && node.activeProcesses[child.pid] !== null) { - // console.log('[exec] stdout: ' + data,child.pid); - if (isUtf8(data)) { msg.payload = data.toString(); } - else { msg.payload = data; } - nodeSend([RED.util.cloneMessage(msg),null,null]); + try { + if (node.activeProcesses.hasOwnProperty(child.pid) && node.activeProcesses[child.pid] !== null) { + // console.log('[exec] stdout: ' + data,child.pid); + if (isUtf8(data)) { msg.payload = data.toString(); } + else { msg.payload = data; } + nodeSend([RED.util.cloneMessage(msg),null,null]); + } + } catch (err) { + node.error(err.toString()); } }); child.stderr.on('data', function (data) { - if (node.activeProcesses.hasOwnProperty(child.pid) && node.activeProcesses[child.pid] !== null) { - if (isUtf8(data)) { msg.payload = data.toString(); } - else { msg.payload = data; } - nodeSend([null,RED.util.cloneMessage(msg),null]); + try { + if (node.activeProcesses.hasOwnProperty(child.pid) && node.activeProcesses[child.pid] !== null) { + if (isUtf8(data)) { msg.payload = data.toString(); } + else { msg.payload = data; } + nodeSend([null,RED.util.cloneMessage(msg),null]); + } + } catch (err) { + node.error(err.toString()); } }); child.on('close', function (code,signal) { diff --git a/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js b/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js index 451035a740..3600b016b5 100644 --- a/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js +++ b/packages/node_modules/@node-red/nodes/core/network/10-mqtt.js @@ -227,6 +227,7 @@ module.exports = function(RED) { * Handle the payload / packet recieved in MQTT In and MQTT Sub nodes */ function subscriptionHandler(node, datatype ,topic, payload, packet) { + if (!packet) { packet = {}; } const msg = {topic:topic, payload:null, qos:packet.qos, retain:packet.retain}; const v5 = (node && node.brokerConn) ? node.brokerConn.v5() @@ -1074,12 +1075,16 @@ module.exports = function(RED) { if (!subscription.handler) { subscription.handler = function (mtopic, mpayload, mpacket) { - const sops = subscription.options ? subscription.options.properties : {} - const pops = mpacket.properties || {} - if (subIdsAvailable && pops.subscriptionIdentifier && sops.subscriptionIdentifier && (pops.subscriptionIdentifier !== sops.subscriptionIdentifier)) { - //do nothing as subscriptionIdentifier does not match - } else if (matchTopic(topic, mtopic)) { - subscription.callback && subscription.callback(mtopic, mpayload, mpacket) + try { + const sops = subscription.options ? subscription.options.properties : {} + const pops = (mpacket && mpacket.properties) || {} + if (subIdsAvailable && pops.subscriptionIdentifier && sops.subscriptionIdentifier && (pops.subscriptionIdentifier !== sops.subscriptionIdentifier)) { + //do nothing as subscriptionIdentifier does not match + } else if (matchTopic(topic, mtopic)) { + subscription.callback && subscription.callback(mtopic, mpayload, mpacket) + } + } catch (err) { + node.error("MQTT subscription handler error: " + err.toString()); } } } diff --git a/packages/node_modules/@node-red/nodes/core/network/22-websocket.js b/packages/node_modules/@node-red/nodes/core/network/22-websocket.js index f30fd91ce0..3c877dc796 100644 --- a/packages/node_modules/@node-red/nodes/core/network/22-websocket.js +++ b/packages/node_modules/@node-red/nodes/core/network/22-websocket.js @@ -297,7 +297,11 @@ module.exports = function(RED) { } msg._session = {type:"websocket",id:id}; for (var i = 0; i < this._inputNodes.length; i++) { - this._inputNodes[i].send(msg); + try { + this._inputNodes[i].send(msg); + } catch (err) { + this.error(RED._("websocket.errors.send-error") + " " + err.toString()); + } } } diff --git a/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js b/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js index 500bbe2c2c..9c4ce13c6e 100644 --- a/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js +++ b/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js @@ -127,32 +127,36 @@ module.exports = function(RED) { connectionPool[id] = client; client.on('data', function (data) { - if (node.datatype != 'buffer') { - data = data.toString(node.datatype); - } - if (node.stream) { - var msg; - if ((node.datatype) === "utf8" && node.newline !== "") { - buffer = buffer+data; - var parts = buffer.split(node.newline); - for (var i = 0; i Date: Sun, 18 Jan 2026 15:51:44 +0100 Subject: [PATCH 100/160] style: fix indentation in tcpin.js try-catch block --- .../@node-red/nodes/core/network/31-tcpin.js | 192 +++++++++--------- 1 file changed, 96 insertions(+), 96 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js b/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js index 9c4ce13c6e..e91a9b7c37 100644 --- a/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js +++ b/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js @@ -687,118 +687,118 @@ module.exports = function(RED) { var chunk = ""; clients[connection_id].client.on('data', function(data) { try { - if (node.out === "sit") { // if we are staying connected just send the buffer - if (clients[connection_id]) { - const msg = clients[connection_id].lastMsg || {}; - msg.payload = RED.util.cloneMessage(data); - if (node.ret === "string") { - try { - if (node.newline && node.newline !== "" ) { - chunk += msg.payload.toString(); - let parts = chunk.split(node.newline); - for (var p=0; p= node.splitc) { + // else if (node.splitc === 0) { + // clients[connection_id].msg.payload = data; + // node.send(clients[connection_id].msg); + // } + else { + for (var j = 0; j < data.length; j++ ) { + if (node.out === "time") { if (clients[connection_id]) { - const msg = clients[connection_id].lastMsg || {}; - msg.payload = Buffer.alloc(i); - buf.copy(msg.payload,0,0,i); - if (node.ret === "string") { - try { msg.payload = msg.payload.toString(); } - catch(e) { node.error("Failed to create string", msg); } + // do the timer thing + if (clients[connection_id].timeout) { + i += 1; + buf[i] = data[j]; } - nodeSend(msg); - if (clients[connection_id].client) { - node.status({}); - clients[connection_id].client.destroy(); - delete clients[connection_id]; + else { + clients[connection_id].timeout = setTimeout(function () { + if (clients[connection_id]) { + clients[connection_id].timeout = null; + const msg = clients[connection_id].lastMsg || {}; + msg.payload = Buffer.alloc(i+1); + buf.copy(msg.payload,0,0,i+1); + if (node.ret === "string") { + try { msg.payload = msg.payload.toString(); } + catch(e) { node.error("Failed to create string", msg); } + } + nodeSend(msg); + if (clients[connection_id].client) { + node.status({}); + clients[connection_id].client.destroy(); + delete clients[connection_id]; + } + } + }, node.splitc); + i = 0; + buf[0] = data[j]; } - i = 0; } } - } - // look for a char - else { - buf[i] = data[j]; - i += 1; - if (data[j] == node.splitc) { - if (clients[connection_id]) { - const msg = clients[connection_id].lastMsg || {}; - msg.payload = Buffer.alloc(i); - buf.copy(msg.payload,0,0,i); - if (node.ret === "string") { - try { msg.payload = msg.payload.toString(); } - catch(e) { node.error("Failed to create string", msg); } + // count bytes into a buffer... + else if (node.out == "count") { + buf[i] = data[j]; + i += 1; + if ( i >= node.splitc) { + if (clients[connection_id]) { + const msg = clients[connection_id].lastMsg || {}; + msg.payload = Buffer.alloc(i); + buf.copy(msg.payload,0,0,i); + if (node.ret === "string") { + try { msg.payload = msg.payload.toString(); } + catch(e) { node.error("Failed to create string", msg); } + } + nodeSend(msg); + if (clients[connection_id].client) { + node.status({}); + clients[connection_id].client.destroy(); + delete clients[connection_id]; + } + i = 0; } - nodeSend(msg); - if (clients[connection_id].client) { - node.status({}); - clients[connection_id].client.destroy(); - delete clients[connection_id]; + } + } + // look for a char + else { + buf[i] = data[j]; + i += 1; + if (data[j] == node.splitc) { + if (clients[connection_id]) { + const msg = clients[connection_id].lastMsg || {}; + msg.payload = Buffer.alloc(i); + buf.copy(msg.payload,0,0,i); + if (node.ret === "string") { + try { msg.payload = msg.payload.toString(); } + catch(e) { node.error("Failed to create string", msg); } + } + nodeSend(msg); + if (clients[connection_id].client) { + node.status({}); + clients[connection_id].client.destroy(); + delete clients[connection_id]; + } + i = 0; } - i = 0; } } } } - } } catch (err) { node.error(RED._("tcpin.errors.error",{error:err.toString()})); } From 0142085874385a1af92aeb8525eec3bcb2756d5c Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 20 Jan 2026 15:11:34 +0000 Subject: [PATCH 101/160] Lots of UI tweaks --- .../editor-client/src/images/deploy-flows.svg | 57 +++++++++++- .../editor-client/src/images/deploy-full.svg | 54 ++++++++++- .../editor-client/src/images/deploy-nodes.svg | 55 +++++++++++- .../src/images/deploy-reload.svg | 48 +++++++++- .../editor-client/src/images/node-red.svg | 89 +++++++++++++++---- .../@node-red/editor-client/src/js/red.js | 2 +- .../editor-client/src/js/ui/actionList.js | 21 ++--- .../editor-client/src/js/ui/deploy.js | 10 +-- .../editor-client/src/js/ui/notifications.js | 9 +- .../editor-client/src/js/ui/palette.js | 1 - .../editor-client/src/js/ui/search.js | 21 ++--- .../@node-red/editor-client/src/js/ui/tray.js | 4 - .../editor-client/src/js/ui/view-navigator.js | 4 +- .../@node-red/editor-client/src/js/ui/view.js | 6 +- .../editor-client/src/sass/base.scss | 2 +- .../editor-client/src/sass/colors.scss | 17 ++-- .../editor-client/src/sass/header.scss | 11 ++- .../editor-client/src/sass/jquery.scss | 11 ++- .../editor-client/src/sass/multiplayer.scss | 2 +- .../editor-client/src/sass/notifications.scss | 1 + .../editor-client/src/sass/palette.scss | 2 +- .../editor-client/src/sass/search.scss | 3 +- .../editor-client/src/sass/variables.scss | 1 + .../editor-client/src/sass/workspace.scss | 20 +++-- 24 files changed, 349 insertions(+), 102 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/images/deploy-flows.svg b/packages/node_modules/@node-red/editor-client/src/images/deploy-flows.svg index 0b00692721..5c153a029c 100644 --- a/packages/node_modules/@node-red/editor-client/src/images/deploy-flows.svg +++ b/packages/node_modules/@node-red/editor-client/src/images/deploy-flows.svg @@ -1 +1,56 @@ - \ No newline at end of file + + + + + + + + + + + diff --git a/packages/node_modules/@node-red/editor-client/src/images/deploy-full.svg b/packages/node_modules/@node-red/editor-client/src/images/deploy-full.svg index e4448e10f2..79e756bf68 100644 --- a/packages/node_modules/@node-red/editor-client/src/images/deploy-full.svg +++ b/packages/node_modules/@node-red/editor-client/src/images/deploy-full.svg @@ -1 +1,53 @@ - \ No newline at end of file + + + + + + + + + + diff --git a/packages/node_modules/@node-red/editor-client/src/images/deploy-nodes.svg b/packages/node_modules/@node-red/editor-client/src/images/deploy-nodes.svg index 12d4c8972e..a013f94153 100644 --- a/packages/node_modules/@node-red/editor-client/src/images/deploy-nodes.svg +++ b/packages/node_modules/@node-red/editor-client/src/images/deploy-nodes.svg @@ -1 +1,54 @@ - \ No newline at end of file + + + + + + + + + diff --git a/packages/node_modules/@node-red/editor-client/src/images/deploy-reload.svg b/packages/node_modules/@node-red/editor-client/src/images/deploy-reload.svg index 00f3190145..f84a005fb0 100644 --- a/packages/node_modules/@node-red/editor-client/src/images/deploy-reload.svg +++ b/packages/node_modules/@node-red/editor-client/src/images/deploy-reload.svg @@ -1 +1,47 @@ - \ No newline at end of file + + + + + + + + + diff --git a/packages/node_modules/@node-red/editor-client/src/images/node-red.svg b/packages/node_modules/@node-red/editor-client/src/images/node-red.svg index b74a46a4c3..3cd3cc8ee5 100644 --- a/packages/node_modules/@node-red/editor-client/src/images/node-red.svg +++ b/packages/node_modules/@node-red/editor-client/src/images/node-red.svg @@ -1,20 +1,77 @@ - - - - - image/svg+xml - - - - - - - - - - + + + + + + + + image/svg+xml + + + + + + + + + + - diff --git a/packages/node_modules/@node-red/editor-client/src/js/red.js b/packages/node_modules/@node-red/editor-client/src/js/red.js index d05dc1eaed..65b7d3bea0 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/red.js +++ b/packages/node_modules/@node-red/editor-client/src/js/red.js @@ -910,7 +910,6 @@ var RED = (function() { '
                  '+ '
                  '+ '
                  '+ - // '
                  '+ '
                  ').appendTo(options.target); // Don't use the `hide` class on this container, as the show reverts it to block rather @@ -920,6 +919,7 @@ var RED = (function() { $('
                  ').appendTo(options.target); $('
                  ').appendTo(options.target); $('
                  ').appendTo(options.target); + $('
                  ').appendTo(options.target); loader.init().appendTo("#red-ui-main-container"); loader.start("...",0); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js b/packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js index 4ec773d395..739d39d19a 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/actionList.js @@ -43,7 +43,7 @@ RED.actionList = (function() { } function createDialog() { - dialog = $("
                  ",{id:"red-ui-actionList",class:"red-ui-search"}).appendTo("#red-ui-main-container"); + dialog = $("
                  ",{id:"red-ui-actionList",class:"red-ui-search"}).appendTo("#red-ui-global-dialog-container"); var searchDiv = $("
                  ",{class:"red-ui-search-container"}).appendTo(dialog); searchInput = $('').appendTo(searchDiv).searchBox({ change: function() { @@ -151,10 +151,8 @@ RED.actionList = (function() { } if (!visible) { previousActiveElement = document.activeElement; - $("#red-ui-header-shade").show(); - $("#red-ui-editor-shade").show(); - $("#red-ui-palette-shade").show(); - $(".red-ui-sidebar-shade").show(); + RED.notifications.shade.show(); + $("#red-ui-full-shade").one('mousedown.red-ui-actionList', hide) if (dialog === null) { createDialog(); } @@ -185,10 +183,9 @@ RED.actionList = (function() { function hide() { if (visible) { visible = false; - $("#red-ui-header-shade").hide(); - $("#red-ui-editor-shade").hide(); - $("#red-ui-palette-shade").hide(); - $(".red-ui-sidebar-shade").hide(); + RED.notifications.shade.hide(); + $("#red-ui-full-shade").off('mousedown.red-ui-actionList') + if (dialog !== null) { dialog.slideUp(200,function() { searchInput.searchBox('value',''); @@ -215,12 +212,6 @@ RED.actionList = (function() { RED.events.on("type-search:close",function() { disabled = false; }); RED.keyboard.add("red-ui-actionList","escape",function(){hide()}); - - - $("#red-ui-header-shade").on('mousedown',hide); - $("#red-ui-editor-shade").on('mousedown',hide); - $("#red-ui-palette-shade").on('mousedown',hide); - $(".red-ui-sidebar-shade").on('mousedown',hide); } return { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js b/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js index 4fd9df6eea..606d0faa35 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/deploy.js @@ -310,16 +310,10 @@ RED.deploy = (function() { } function shadeShow() { - $("#red-ui-header-shade").show(); - $("#red-ui-editor-shade").show(); - $("#red-ui-palette-shade").show(); - $(".red-ui-sidebar-shade").show(); + RED.notifications.shade.show(); } function shadeHide() { - $("#red-ui-header-shade").hide(); - $("#red-ui-editor-shade").hide(); - $("#red-ui-palette-shade").hide(); - $(".red-ui-sidebar-shade").hide(); + RED.notifications.shade.hide(); } function deployButtonSetBusy(){ $(".red-ui-deploy-button-content").css('opacity',0); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/notifications.js b/packages/node_modules/@node-red/editor-client/src/js/ui/notifications.js index d68d03d3f6..33727e2ae4 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/notifications.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/notifications.js @@ -43,10 +43,10 @@ RED.notifications = (function() { }); */ - var persistentNotifications = {}; + const persistentNotifications = {}; - var shade = (function() { - var shadeUsers = 0; + const shade = (function() { + let shadeUsers = 0; return { show: function() { shadeUsers++; @@ -324,6 +324,7 @@ RED.notifications = (function() { showPersistent(); }) }, - notify: notify + notify: notify, + shade: shade } })(); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js index d1b0479d88..44dec1f741 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js @@ -630,7 +630,6 @@ RED.palette = (function() { $('').appendTo("#red-ui-palette"); $('').appendTo("#red-ui-palette"); $('
                  ').appendTo("#red-ui-palette"); - // $('
                  ').appendTo("#red-ui-palette"); $("#red-ui-palette > .red-ui-palette-spinner").show(); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js index f2b4aa8621..54c9ba62b9 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/search.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/search.js @@ -267,7 +267,7 @@ RED.search = (function() { } function createDialog() { - dialog = $("
                  ",{id:"red-ui-search",class:"red-ui-search"}).appendTo("#red-ui-main-container"); + dialog = $("
                  ",{id:"red-ui-search",class:"red-ui-search"}).appendTo("#red-ui-global-dialog-container"); var searchDiv = $("
                  ",{class:"red-ui-search-container"}).appendTo(dialog); searchInput = $('').appendTo(searchDiv).searchBox({ delay: 200, @@ -521,10 +521,8 @@ RED.search = (function() { } if (!visible) { previousActiveElement = document.activeElement; - $("#red-ui-header-shade").show(); - $("#red-ui-editor-shade").show(); - $("#red-ui-palette-shade").show(); - $(".red-ui-sidebar-shade").show(); + RED.notifications.shade.show(); + $("#red-ui-full-shade").one('mousedown.red-ui-actionList', hide) if (dialog === null) { createDialog(); @@ -545,10 +543,8 @@ RED.search = (function() { function hide(el, keepSearchToolbar) { if (visible) { visible = false; - $("#red-ui-header-shade").hide(); - $("#red-ui-editor-shade").hide(); - $("#red-ui-palette-shade").hide(); - $(".red-ui-sidebar-shade").hide(); + RED.notifications.shade.hide(); + $("#red-ui-full-shade").off('mousedown.red-ui-actionList') if (dialog !== null) { dialog.slideUp(200,function() { searchInput.searchBox('value',''); @@ -579,7 +575,7 @@ RED.search = (function() { result: (currentIndex + 1), count: activeResults.length } - $("#red-ui-view-searchtools-counter").text(RED._('actions.search-counter', i18nSearchCounterData)); + $("#red-ui-view-searchtools-counter-label").text(RED._('actions.search-counter', i18nSearchCounterData)); $("#view-search-tools > :not(:first-child)").show(); //show other tools } else { clearActiveSearch(); @@ -645,11 +641,6 @@ RED.search = (function() { updateSearchToolbar(); }); - $("#red-ui-header-shade").on('mousedown',hide); - $("#red-ui-editor-shade").on('mousedown',hide); - $("#red-ui-palette-shade").on('mousedown',hide); - $(".red-ui-sidebar-shade").on('mousedown',hide); - $("#red-ui-view-searchtools-close").on("click", function close() { clearActiveSearch(); updateSearchToolbar(); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tray.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tray.js index 278c7126be..224bfdb4e2 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tray.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tray.js @@ -121,7 +121,6 @@ function finishBuild() { $("#red-ui-header-shade").show(); $("#red-ui-editor-shade").show(); - $("#red-ui-palette-shade").show(); $(".red-ui-sidebar-shade").show(); tray.preferredWidth = Math.max(el.width(),500); if (!options.maximized) { @@ -241,7 +240,6 @@ tray.tray.css({right:0}); $("#red-ui-header-shade").show(); $("#red-ui-editor-shade").show(); - $("#red-ui-palette-shade").show(); $(".red-ui-sidebar-shade").show(); stackHidden = false; } @@ -278,7 +276,6 @@ }); $("#red-ui-header-shade").hide(); $("#red-ui-editor-shade").hide(); - $("#red-ui-palette-shade").hide(); $(".red-ui-sidebar-shade").hide(); stackHidden = true; } @@ -322,7 +319,6 @@ if (stack.length === 0) { $("#red-ui-header-shade").hide(); $("#red-ui-editor-shade").hide(); - $("#red-ui-palette-shade").hide(); $(".red-ui-sidebar-shade").hide(); RED.events.emit("editor:close"); RED.view.focus(); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js index b117f2c2d9..bd22a01d69 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js @@ -131,8 +131,8 @@ RED.view.navigator = (function() { RED.actions.add("core:toggle-navigator",toggle); navContainer = $('
                  ').css({ "position":"absolute", - "bottom":$("#red-ui-workspace-footer").height() + 2, - "right": 4, + "bottom":$("#red-ui-workspace-footer").height() + 12, + "right": 16, zIndex: 1 }).addClass('red-ui-navigator-container').appendTo("#red-ui-workspace").hide(); navBox = d3.select(navContainer[0]) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index d3c1c05939..0b034b618b 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -971,8 +971,8 @@ RED.view = (function() { element: $(''+ '' + '' + - '' + - '? of ?' + + '' + + '? of ?' + '' + '' + '' + @@ -7797,7 +7797,6 @@ RED.view = (function() { }, selectNodes: function(options) { $("#red-ui-workspace-tabs-shade").show(); - $("#red-ui-palette-shade").show(); $(".red-ui-sidebar-shade").show(); $("#red-ui-header-shade").show(); $("#red-ui-workspace").addClass("red-ui-workspace-select-mode"); @@ -7819,7 +7818,6 @@ RED.view = (function() { var closeNotification = function() { clearSelection(); $("#red-ui-workspace-tabs-shade").hide(); - $("#red-ui-palette-shade").hide(); $(".red-ui-sidebar-shade").hide(); $("#red-ui-header-shade").hide(); $("#red-ui-workspace").removeClass("red-ui-workspace-select-mode"); diff --git a/packages/node_modules/@node-red/editor-client/src/sass/base.scss b/packages/node_modules/@node-red/editor-client/src/sass/base.scss index 17b283b653..552c2d9ae1 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/base.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/base.scss @@ -48,7 +48,7 @@ html, body { flex-direction: row; } -#red-ui-palette-shade, #red-ui-editor-shade, #red-ui-header-shade, .red-ui-sidebar-shade { +#red-ui-editor-shade, #red-ui-header-shade, .red-ui-sidebar-shade { @include mixins.shade; z-index: 5; } diff --git a/packages/node_modules/@node-red/editor-client/src/sass/colors.scss b/packages/node_modules/@node-red/editor-client/src/sass/colors.scss index b5ce5404c8..dd3444b678 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/colors.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/colors.scss @@ -137,12 +137,11 @@ $workspace-button-color-active: $secondary-text-color-active; $workspace-button-color-selected: $secondary-text-color-selected; $workspace-button-color-primary: #eee; -$workspace-button-background-primary: #AD1625; -$workspace-button-background-primary-hover: #6E0A1E; - +$workspace-button-background-primary: #bb0000; +$workspace-button-background-primary-hover: #920f0f; $workspace-button-color-focus-outline: $form-input-focus-color; -$shade-color: rgba(0,0,0,0.2); +$shade-color: rgba(0,0,0,0.05); $popover-background: #333; $popover-border: $popover-background; @@ -267,11 +266,11 @@ $deploy-button-color: #eee; $deploy-button-color-active: #ccc; $deploy-button-color-disabled: $secondary-text-color-disabled; $deploy-button-border-color: $header-button-border; -$deploy-button-background: #8C101C; -$deploy-button-background-hover: #6E0A1E; +$deploy-button-background: #bb0000; +$deploy-button-background-hover: #920f0f; $deploy-button-background-active: #4C0A17; -$deploy-button-background-disabled: $header-background; -$deploy-button-background-disabled-hover: $secondary-background-hover; +$deploy-button-background-disabled: #ddd; +$deploy-button-background-disabled-hover: #d3d3d3; $vcCommitShaColor: #c38888; @@ -319,7 +318,7 @@ $spinner-color: #999; $tab-icon-color: #dedede; // Anonymous User Colors - +$user-profile-text-color: #eee; $user-profile-colors: ( 1: #822e81, 2: #955e42, diff --git a/packages/node_modules/@node-red/editor-client/src/sass/header.scss b/packages/node_modules/@node-red/editor-client/src/sass/header.scss index 0bc7899742..849e13ed7f 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/header.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/header.scss @@ -50,7 +50,7 @@ } } img { - height: 28px; + height: 22px; } a { @@ -179,8 +179,8 @@ padding: 3px 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; - border-left: none; border-color: var(--red-ui-deploy-button-background); + border-left: none; } .red-ui-deploy-button-content>img { @@ -303,7 +303,7 @@ .red-ui-user-profile { background-color: var(--red-ui-header-background); border: 1px solid var(--red-ui-header-button-border); - border-radius: 30px; + border-radius: 4px; overflow: hidden; padding: 3px; background-position: center center; @@ -318,18 +318,23 @@ font-size: 14px; &.red-ui-user-profile-color-1 { + color: var(--red-ui-user-profile-text-color); background-color: var(--red-ui-user-profile-colors-1); } &.red-ui-user-profile-color-2 { + color: var(--red-ui-user-profile-text-color); background-color: var(--red-ui-user-profile-colors-2); } &.red-ui-user-profile-color-3 { + color: var(--red-ui-user-profile-text-color); background-color: var(--red-ui-user-profile-colors-3); } &.red-ui-user-profile-color-4 { + color: var(--red-ui-user-profile-text-color); background-color: var(--red-ui-user-profile-colors-4); } &.red-ui-user-profile-color-5 { + color: var(--red-ui-user-profile-text-color); background-color: var(--red-ui-user-profile-colors-5); } } diff --git a/packages/node_modules/@node-red/editor-client/src/sass/jquery.scss b/packages/node_modules/@node-red/editor-client/src/sass/jquery.scss index ca3651c61b..5ae22586e1 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/jquery.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/jquery.scss @@ -53,7 +53,7 @@ } .ui-dialog { - border-radius: 1px; + border-radius: 6px; background: var(--red-ui-secondary-background); padding: 0; @include mixins.component-shadow; @@ -69,14 +69,19 @@ background: var(--red-ui-primary-background); border: none; border-bottom: 1px solid var(--red-ui-primary-border-color); - border-radius: 0; + border-top-left-radius: 6px; + border-top-right-radius: 6px; + border-bottom-left-radius: 0px; + border-bottom-right-radius: 0px; } .ui-dialog .ui-dialog-buttonpane.ui-widget-content { background: var(--red-ui-tertiary-background); + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; } .ui-corner-all { - border-radius: 1px; + border-radius: 6px; } .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { background: var(--red-ui-primary-background); diff --git a/packages/node_modules/@node-red/editor-client/src/sass/multiplayer.scss b/packages/node_modules/@node-red/editor-client/src/sass/multiplayer.scss index 4aaab86b14..ce5431cf08 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/multiplayer.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/multiplayer.scss @@ -52,7 +52,7 @@ } $multiplayer-user-icon-background: var(--red-ui-primary-background); $multiplayer-user-icon-border: var(--red-ui-view-background); -$multiplayer-user-icon-text-color: var(--red-ui-header-menu-color); +$multiplayer-user-icon-text-color: var(--red-ui-user-profile-text-color); $multiplayer-user-icon-count-text-color: var(--red-ui-primary-color); $multiplayer-user-icon-shadow: 0px 0px 4px var(--red-ui-shadow); .red-ui-multiplayer-user-location { diff --git a/packages/node_modules/@node-red/editor-client/src/sass/notifications.scss b/packages/node_modules/@node-red/editor-client/src/sass/notifications.scss index c0e87b7ba3..a5438bd164 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/notifications.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/notifications.scss @@ -27,6 +27,7 @@ position: relative; padding: 8px 18px 0px; margin-bottom: 4px; + border-radius: 4px; box-shadow: 0 1px 1px 1px var(--red-ui-shadow); background-color: var(--red-ui-secondary-background); color: var(--red-ui-primary-text-color); diff --git a/packages/node_modules/@node-red/editor-client/src/sass/palette.scss b/packages/node_modules/@node-red/editor-client/src/sass/palette.scss index 2a509ef6b2..f53a36db94 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/palette.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/palette.scss @@ -138,7 +138,7 @@ // display: inline-block; cursor: move; background: var(--red-ui-secondary-background); - margin: 5px 0; + margin: 5px auto; height: 25px; border-radius: 5px; border: 1px solid var(--red-ui-node-border); diff --git a/packages/node_modules/@node-red/editor-client/src/sass/search.scss b/packages/node_modules/@node-red/editor-client/src/sass/search.scss index 3532e40496..a63844b39d 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/search.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/search.scss @@ -21,11 +21,12 @@ width: 500px; left: 50%; margin-left: -250px; - top: 0px; + top: 5px; overflow: hidden; border: 1px solid var(--red-ui-primary-border-color); box-shadow: 0 0 10px var(--red-ui-shadow); background: var(--red-ui-secondary-background); + border-radius: 6px; border-bottom-left-radius: 6px; border-bottom-right-radius: 6px; diff --git a/packages/node_modules/@node-red/editor-client/src/sass/variables.scss b/packages/node_modules/@node-red/editor-client/src/sass/variables.scss index 56379bdedd..fca7d05dba 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/variables.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/variables.scss @@ -308,4 +308,5 @@ @each $current-color in 1 2 3 4 5 { --red-ui-user-profile-colors-#{"" + $current-color}: #{map.get(colors.$user-profile-colors, $current-color)}; } + --red-ui-user-profile-text-color: #{colors.$user-profile-text-color}; } diff --git a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss index 22bea1b704..6391292db9 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss @@ -44,13 +44,13 @@ border-right: 1px solid var(--red-ui-secondary-border-color); // border-top-right-radius: px; -// Hide scrollbars - scrollbar-width: none; /* Firefox */ - -ms-overflow-style: none; /* Internet Explorer 10+ */ - &::-webkit-scrollbar { /* WebKit */ - width: 0; - height: 0; - } +// // Hide scrollbars +// scrollbar-width: none; /* Firefox */ +// -ms-overflow-style: none; /* Internet Explorer 10+ */ +// &::-webkit-scrollbar { /* WebKit */ +// width: 0; +// height: 0; +// } // Reset SVG default margins > svg { @@ -178,7 +178,8 @@ #red-ui-workspace-footer { border: none; background: none; - bottom: 4px; + bottom: 14px; + right: 12px; padding: 0; } .red-ui-component-footer { @@ -191,11 +192,12 @@ } } - .search-counter { + .red-ui-view-searchtools-counter { display: inline-block; font-size: smaller; font-weight: 600; white-space: nowrap; + background: var(--red-ui-view-background); } } From 6d96c998fa6c213757585eb8d89f94efd9491c2c Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 20 Jan 2026 16:51:21 +0000 Subject: [PATCH 102/160] Fix restoring last selected sidebars --- .../editor-client/src/js/ui/sidebar.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js index 190c7a2253..74607ee70a 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js @@ -571,11 +571,13 @@ RED.sidebar = (function() { // Show the last selected tab for each sidebar Object.keys(sidebars).forEach(function(sidebarKey) { const sidebar = sidebars[sidebarKey]; - let lastTabId = lastSessionSelectedTabs[sidebarKey]; - if (!lastTabId) { - lastTabId = sidebar.tabBars.top.container.children('button').first().attr('data-tab-id'); - } - showSidebar(lastTabId, true) + ['top','bottom'].forEach(function(position) { + let lastTabId = lastSessionSelectedTabs[sidebarKey + '-' + position]; + if (!lastTabId) { + lastTabId = sidebar.tabBars[position].container.children('button').first().attr('data-tab-id'); + } + showSidebar(lastTabId, true) + }) }) return } @@ -596,7 +598,7 @@ RED.sidebar = (function() { } else { targetSidebar.sections[targetSection].footer.hide(); } - RED.settings.setLocal("last-sidebar-tab-" + targetSidebar.id, tabOptions.id) + RED.settings.setLocal("last-sidebar-tab-" + targetSidebar.id+'-'+targetSection, tabOptions.id) // TODO: find which tabBar the button is in targetSidebar.tabBars[targetSection].clearSelected() targetSidebar.tabBars[targetSection].container.find('button[data-tab-id="'+id+'"]').addClass('selected') @@ -729,7 +731,8 @@ RED.sidebar = (function() { // Remember the last selected tab for each sidebar before // the tabs are readded causing the state to get updated Object.keys(sidebars).forEach(function(sidebarKey) { - lastSessionSelectedTabs[sidebarKey] = RED.settings.getLocal("last-sidebar-tab-" + sidebarKey) + lastSessionSelectedTabs[sidebarKey + '-top'] = RED.settings.getLocal("last-sidebar-tab-" + sidebarKey + '-top'); + lastSessionSelectedTabs[sidebarKey + '-bottom'] = RED.settings.getLocal("last-sidebar-tab-" + sidebarKey + '-bottom'); }) } From 02ad709d8b4b81f2cd73769f11a3381ce6e1669b Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 20 Jan 2026 16:51:44 +0000 Subject: [PATCH 103/160] Switch to different NR icon --- packages/node_modules/@node-red/editor-api/lib/editor/theme.js | 2 +- .../node_modules/@node-red/editor-client/src/sass/header.scss | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/theme.js b/packages/node_modules/@node-red/editor-api/lib/editor/theme.js index 1917b55fdc..cca6080378 100644 --- a/packages/node_modules/@node-red/editor-api/lib/editor/theme.js +++ b/packages/node_modules/@node-red/editor-api/lib/editor/theme.js @@ -31,7 +31,7 @@ var defaultContext = { }, header: { title: "Node-RED", - image: "red/images/node-red.svg" + image: "red/images/node-red-icon.svg" }, asset: { red: "red/red.min.js", diff --git a/packages/node_modules/@node-red/editor-client/src/sass/header.scss b/packages/node_modules/@node-red/editor-client/src/sass/header.scss index 849e13ed7f..3cc83622e6 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/header.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/header.scss @@ -50,7 +50,7 @@ } } img { - height: 22px; + height: 26px; } a { From 62d393c9dfce5e9347e9bf492c9f4b9f1f93aeb9 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 20 Jan 2026 16:52:29 +0000 Subject: [PATCH 104/160] Fix linting --- .../node_modules/@node-red/editor-client/src/js/ui/sidebar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js index 74607ee70a..3f61fd2935 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js @@ -291,7 +291,7 @@ RED.sidebar = (function() { // sidebar.tabBars.top.container.css('flex-grow', '') // sidebar.tabBars[position].container.css('flex-grow', '') // sidebar.tabBars[position].container.css('height', '') - sidebar.tabBars[position].active + // sidebar.tabBars[position].active sidebar.tabBars[position].container.find('button[data-tab-id="'+sidebar.tabBars[position].active+'"]').addClass('selected') sidebar.resizeSidebar() From a86692c2a8e5f5c917bf354e2862ad8c62dd07c8 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 20 Jan 2026 18:13:19 +0000 Subject: [PATCH 105/160] Fix test for icon change --- test/unit/@node-red/editor-api/lib/editor/theme_spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/unit/@node-red/editor-api/lib/editor/theme_spec.js b/test/unit/@node-red/editor-api/lib/editor/theme_spec.js index 2c660415f5..995662de35 100644 --- a/test/unit/@node-red/editor-api/lib/editor/theme_spec.js +++ b/test/unit/@node-red/editor-api/lib/editor/theme_spec.js @@ -47,7 +47,7 @@ describe("api/editor/theme", function () { context.page.tabicon.should.have.a.property("colour", "#8f0000"); context.should.have.a.property("header"); context.header.should.have.a.property("title", "Node-RED"); - context.header.should.have.a.property("image", "red/images/node-red.svg"); + context.header.should.have.a.property("image", "red/images/node-red-icon.svg"); context.should.have.a.property("asset"); context.asset.should.have.a.property("red", "red/red.min.js"); context.asset.should.have.a.property("main", "red/main.min.js"); From 09f7733ac669ccc880d6ce6f7b29815099752676 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 20 Jan 2026 18:28:22 +0000 Subject: [PATCH 106/160] Fix simple deploy button border --- .../@node-red/editor-client/src/sass/header.scss | 6 +++++- .../@node-red/editor-client/src/sass/notifications.scss | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/sass/header.scss b/packages/node_modules/@node-red/editor-client/src/sass/header.scss index 3cc83622e6..171033756a 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/header.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/header.scss @@ -154,7 +154,11 @@ border-bottom-left-radius: 4px; border-right: none; border-color: var(--red-ui-deploy-button-background); - + &:last-child { + border-right: 1px solid var(--red-ui-deploy-button-border-color); + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + } &.disabled { cursor: default; background: var(--red-ui-deploy-button-background-disabled); diff --git a/packages/node_modules/@node-red/editor-client/src/sass/notifications.scss b/packages/node_modules/@node-red/editor-client/src/sass/notifications.scss index a5438bd164..4903cff3d4 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/notifications.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/notifications.scss @@ -20,7 +20,7 @@ margin-left: -250px; left: 50%; position: absolute; - top: 1px; + top: 5px; } .red-ui-notification { box-sizing: border-box; From 764731efa6d61efddc6e5366b251a0c938435cab Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 21 Jan 2026 11:19:31 +0000 Subject: [PATCH 107/160] Add inline debug paused message --- .../editor-client/src/sass/debug.scss | 6 +++++ .../core/common/lib/debug/debug-utils.js | 23 ++++++++++++++++++- .../nodes/locales/en-US/messages.json | 4 +++- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/sass/debug.scss b/packages/node_modules/@node-red/editor-client/src/sass/debug.scss index eb550c6f53..909ca3d36a 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/debug.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/debug.scss @@ -168,6 +168,12 @@ border-left-color: var(--red-ui-debug-message-border-error); border-right-color: var(--red-ui-debug-message-border-error); } + +.red-ui-debug-msg-paused { + border-left-color: var(--red-ui-debug-message-border-warning); + border-right-color: var(--red-ui-debug-message-border-warning); +} + .red-ui-debug-msg-object-entry { position: relative; padding-left: 15px; diff --git a/packages/node_modules/@node-red/nodes/core/common/lib/debug/debug-utils.js b/packages/node_modules/@node-red/nodes/core/common/lib/debug/debug-utils.js index b24c5d4856..4074985af9 100644 --- a/packages/node_modules/@node-red/nodes/core/common/lib/debug/debug-utils.js +++ b/packages/node_modules/@node-red/nodes/core/common/lib/debug/debug-utils.js @@ -33,6 +33,8 @@ RED.debug = (function() { var debugNodeTreeList; var debugPaused = false; + let debugPausedMessage + let debugPausedMessageCount = 0 function init(_config) { config = _config; @@ -40,7 +42,7 @@ RED.debug = (function() { var content = $("
                  ").css({"position":"relative","height":"100%"}); var toolbar = $('
                  '+ ''+ - ''+ + ''+ ''+ ''+ ' '+ @@ -198,6 +200,19 @@ RED.debug = (function() { function toggleDebugflow() { debugPaused = !debugPaused; if (debugPaused) { + debugPausedMessageCount = 0 + debugPausedMessage = $('
                  ') + $(`
                  + ${getTimestamp()} + ${RED._('node-red:debug.sidebar.paused')} +
                  `).appendTo(debugPausedMessage); + $('
                   
                  ').appendTo(debugPausedMessage); + const atBottom = (sbc.scrollHeight-messageList.height()-sbc.scrollTop) < 5; + messageList.append(debugPausedMessage); + if (atBottom) { + messageList.scrollTop(sbc.scrollHeight); + } + $("#red-ui-sidebar-debug-pause i").removeClass("fa-pause").addClass("fa-play"); pauseTooltip.setAction("core:resume-debug-messages"); pauseTooltip.setContent(RED._('node-red:debug.sidebar.resume')) @@ -425,6 +440,9 @@ RED.debug = (function() { }, 15); // every 15mS = 66 times a second if (stack.length > numMessages) { stack = stack.splice(-numMessages); } } + } else { + debugPausedMessageCount++ + debugPausedMessage.find('.red-ui-debug-msg-name').last().text(RED._("node-red:debug.sidebar.messagesDropped",{count:debugPausedMessageCount})); } } @@ -625,6 +643,9 @@ RED.debug = (function() { } else { $(".red-ui-debug-msg:not(.hide)").remove(); } + if (debugPaused) { + messageList.append(debugPausedMessage); + } config.clear(); if (!!clearFilter) { clearFilterSettings(); diff --git a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json index 9dc7651a92..5651689da1 100644 --- a/packages/node_modules/@node-red/nodes/locales/en-US/messages.json +++ b/packages/node_modules/@node-red/nodes/locales/en-US/messages.json @@ -169,7 +169,9 @@ "filtered": "filtered", "pause": "pause", "paused": "Paused", - "resume": "resume" + "resume": "resume", + "messagesDropped": "__count__ message dropped", + "messagesDropped_plural": "__count__ messages dropped" }, "messageMenu": { "collapseAll": "Collapse all paths", From 3eb6ce9dd2b5c631e7116ea60c428ac82a6f05d9 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 21 Jan 2026 12:42:58 +0000 Subject: [PATCH 108/160] Reset sidebar state for beta.2 --- .../@node-red/editor-client/src/js/ui/common/treeList.js | 4 +--- .../@node-red/editor-client/src/js/ui/sidebar.js | 8 +++++--- .../editor-client/src/js/ui/tab-info-outliner.js | 3 +++ 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js index 0059c3bbc0..138728b675 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/treeList.js @@ -622,7 +622,6 @@ } $('').toggleClass("hide",item.collapsible === false).appendTo(treeListIcon); treeListIcon.on("click.red-ui-treeList-expand", function(e) { - console.log('click expand icon') e.stopPropagation(); e.preventDefault(); if (container.hasClass("expanded")) { @@ -633,13 +632,12 @@ }); // $('').appendTo(label); label.on("click.red-ui-treeList-expand", function(e) { - if (that.options.expandOnLabel !== false) { + if (that.options.expandOnLabel !== false || item.expandOnLabel === true) { if (container.hasClass("expanded")) { if (item.hasOwnProperty('selected') || label.hasClass("selected")) { item.treeList.collapse(); } } else { - console.log('click on label expand') item.treeList.expand(); } } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js index 3f61fd2935..a1f73e13de 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/sidebar.js @@ -14,6 +14,7 @@ * limitations under the License. **/ RED.sidebar = (function() { + const sidebarLayoutVersion = 1 const sidebars = { primary: { id: 'primary', @@ -45,7 +46,8 @@ RED.sidebar = (function() { function exportSidebarState () { const state = { primary: [[], []], - secondary: [[], []] + secondary: [[], []], + v: sidebarLayoutVersion } function getTabButtons(tabBar) { const result = [] @@ -94,8 +96,8 @@ RED.sidebar = (function() { // Check the saved sidebar state to see if this tab should be added to the primary or secondary sidebar let savedState = RED.settings.get('editor.sidebar.state', defaultSidebarConfiguration) - if (typeof savedState.primary[0] === 'string' || typeof savedState.secondary[0] === 'string') { - // This is a beta.0 format. Reset it for beta.1 + if (typeof savedState.primary[0] === 'string' || typeof savedState.secondary[0] === 'string' || savedState.v === undefined) { + // This is a beta.0/1 format. Reset it for beta.2 savedState = defaultSidebarConfiguration RED.settings.set('editor.sidebar.state', savedState) } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js index 18d5b06d97..f48e8568a7 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info-outliner.js @@ -19,11 +19,13 @@ RED.sidebar.info.outliner = (function() { { label: RED._("menu.label.flows"), expanded: true, + expandOnLabel: true, children: [] }, { id: "__subflow__", label: RED._("menu.label.subflows"), + expandOnLabel: true, children: [ getEmptyItem("__subflow__") ] @@ -32,6 +34,7 @@ RED.sidebar.info.outliner = (function() { id: "__global__", flow: "__global__", label: RED._("sidebar.info.globalConfig"), + expandOnLabel: true, types: {}, children: [ getEmptyItem("__global__") From 28f04f38460a3208feb77d135beb10f640d33f39 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 21 Jan 2026 14:04:19 +0000 Subject: [PATCH 109/160] Bump for 5beta2 --- package-lock.json | 32 +++--------- package.json | 4 +- .../@node-red/editor-api/package.json | 6 +-- .../@node-red/editor-client/package.json | 2 +- .../src/tours/images/debug-pause.png | Bin 0 -> 68845 bytes .../src/tours/images/missing-modules.png | Bin 47386 -> 0 bytes .../src/tours/images/node-docs.png | Bin 7524 -> 0 bytes .../src/tours/images/update-notification.png | Bin 24604 -> 0 bytes .../editor-client/src/tours/welcome.js | 47 ++++++++++++------ .../node_modules/@node-red/nodes/package.json | 2 +- .../@node-red/registry/package.json | 6 +-- .../@node-red/runtime/package.json | 6 +-- .../node_modules/@node-red/util/package.json | 2 +- packages/node_modules/node-red/package.json | 10 ++-- 14 files changed, 60 insertions(+), 57 deletions(-) create mode 100644 packages/node_modules/@node-red/editor-client/src/tours/images/debug-pause.png delete mode 100644 packages/node_modules/@node-red/editor-client/src/tours/images/missing-modules.png delete mode 100644 packages/node_modules/@node-red/editor-client/src/tours/images/node-docs.png delete mode 100644 packages/node_modules/@node-red/editor-client/src/tours/images/update-notification.png diff --git a/package-lock.json b/package-lock.json index 155f837e6f..4b56396a84 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "node-red", - "version": "4.1.3", + "version": "5.0.0-beta.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "node-red", - "version": "4.1.3", + "version": "5.0.0-beta.2", "license": "Apache-2.0", "dependencies": { "acorn": "8.15.0", @@ -59,7 +59,7 @@ "raw-body": "3.0.0", "rfdc": "^1.3.1", "semver": "7.7.1", - "tar": "7.4.3", + "tar": "7.5.6", "tough-cookie": "5.1.2", "uglify-js": "3.19.3", "uuid": "9.0.1", @@ -10996,16 +10996,15 @@ "dev": true }, "node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "license": "ISC", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.6.tgz", + "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", + "minizlib": "^3.1.0", "yallist": "^5.0.0" }, "engines": { @@ -11066,21 +11065,6 @@ "ieee754": "^1.1.13" } }, - "node_modules/tar/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/tar/node_modules/yallist": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", diff --git a/package.json b/package.json index 2ffc0c090f..2735160554 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "5.0.0-beta.1", + "version": "5.0.0-beta.2", "description": "Low-code programming for event-driven applications", "homepage": "https://nodered.org", "license": "Apache-2.0", @@ -76,7 +76,7 @@ "raw-body": "3.0.0", "rfdc": "^1.3.1", "semver": "7.7.1", - "tar": "7.4.3", + "tar": "7.5.6", "tough-cookie": "5.1.2", "uglify-js": "3.19.3", "uuid": "9.0.1", diff --git a/packages/node_modules/@node-red/editor-api/package.json b/packages/node_modules/@node-red/editor-api/package.json index 59c73dbe34..5ae7bf3a97 100644 --- a/packages/node_modules/@node-red/editor-api/package.json +++ b/packages/node_modules/@node-red/editor-api/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/editor-api", - "version": "5.0.0-beta.1", + "version": "5.0.0-beta.2", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/util": "5.0.0-beta.1", - "@node-red/editor-client": "5.0.0-beta.1", + "@node-red/util": "5.0.0-beta.2", + "@node-red/editor-client": "5.0.0-beta.2", "bcryptjs": "3.0.2", "body-parser": "1.20.4", "clone": "2.1.2", diff --git a/packages/node_modules/@node-red/editor-client/package.json b/packages/node_modules/@node-red/editor-client/package.json index d1d423c504..df0b585a94 100644 --- a/packages/node_modules/@node-red/editor-client/package.json +++ b/packages/node_modules/@node-red/editor-client/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/editor-client", - "version": "5.0.0-beta.1", + "version": "5.0.0-beta.2", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/editor-client/src/tours/images/debug-pause.png b/packages/node_modules/@node-red/editor-client/src/tours/images/debug-pause.png new file mode 100644 index 0000000000000000000000000000000000000000..d1c40c699f7a475c83432d0a1f34a6254d503cd9 GIT binary patch literal 68845 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⩔PnF&5R|zl(CWA@`c}rf7dop^&uknwUjBRp1u1 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 diff --git a/packages/node_modules/@node-red/editor-client/src/tours/images/update-notification.png b/packages/node_modules/@node-red/editor-client/src/tours/images/update-notification.png deleted file mode 100644 index 4e4b610e787e6e24af4f02870d95825780ee229f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24604 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

                  )SC(KkOSHwVyfwaZzU-Bcwh;n`ZR}ad97O0zrZ8V?M<^`bPJ;Uu%nbnvXh* zWuSTP-9Nu0r3|2S#}TO(sm?T;@EDU&@~(5r15wz)FBA36xpwyiS7~1CDZnA(Scn_| zI9&fH*`x&{$32C=R;`}4R4^D7C4z6|n35wb45Z42>b-=vFQ^Bd>@OO#_K=?GYg6;r zlzL#9LQ=q5nrqnlE=so1GL*&{zxGZe4lW^jq5 z)E?KauetL$&*1%9^Bb+wmE;wI$8%Q;L=yK?Ge1lzDGee~*DB{-+?%zG@>IE%MHTH+ z?|0JVsMKTMT9sHc+nm2lbm-n?uWR%gmfk&)%)RYB+gG_vYw}{NEobPw+?~ZR-iV8y@?>d?}95wEmw!_Dh-l$CiLVGLn%)~$Vk{|ch! zP7R8qf#VUbSt8%kf|g^&DulPfs(I!R+>gGPUQD`70c)|H_XCQyL?%?@-ib;;ePjq1 zn%Jt$YF!0Bue#lK@}kH1A}xj^g1iq)3<6ZGYXzb$>!-s~t%bxADVC6$e6Hs(g6sGS$FtLZhs= zXda7tpO4R4-|Z9ZGPa$Mhs$ZCY}9;Xwo5*aeO&wXmVy4S_1@ZO6s|n&g9A{f#nkS0 z!5?cQ{7B;a8v~#HcXf^h=4;K3j6a0VXU2!@8pf`C=K8C|zwrcEQ7hB)`G<$~L(Uys ze1}cs(n+j|On;!m_D7RknV(cp;!Uh^35fKkPu#OOZ}ICJ(N^@yx=Gh0m{0`?-=A#{Jz}Jji(tX?W`0NJqTOM>O;;Lu zg^_|%R4HszS3X_uK?S=HiD+CFvl8j~S-jJqfAsWd4tne@HgYZT533|LDUd0rH%%Ij zCfu0$q4lsjyU0!X!8#xqwAjSMF^{!~q;PeC+F@z zqq&udQk=rhjSW9_9~qJ}u)t8#>PN1I-Uk>?6%7+^t3A4LEiZkh#Gq=Y2r2{~ zdmfDks*B1pGVj*&Q4#K8Y;&OJ3?tzQ_?6S)uvGt#Fu)eykw@AOi>Utkpx4JJ#k#pS zLm|m^SX?V4TA|$Cv%xNB)!q11Qk>dNsskbTy<+{FO3|tZmhQ8<0(odRJ~h>xx46)} zo`lz8KTbtCwWqcCi~)f*aKyqE_W2sTzdE0ALv z)s$xA7RQ#s)m%|KmeH*IL(4#L29d|9M;pAgt@The sidebars can now be split vertically, allowing you to have multiple panels showing at once.

                  -

                  The Info sidebar has been split into two panels; the Explorer panel gives you an overview of your flows and nodes, whilst the Info panel -shows information about the currently selected node or flow.

                  -

                  The default layout has been updated to have the Explorer and Palette sidebars on the left, and for the Debug sidebar to be shown in the lower half -of the right-hand sidebar. Not showing the palette by default is an open question at this point - your feedback is welcome.

                  -

                  +

                  We're continuing to work towards the new theme for Node-RED - with the redesigned header being the most visible change in this release.

                  +

                  We've had useful feedback on the new sidebar designs; this is an area we'll continue to work on in the following betas.

                  `, } }, - { + { title: { - "en-US": "What's next?", + "en-US": "Pausing Debug", + }, + image: 'images/debug-pause.png', + description: { + "en-US": ` +

                  One new feature in this release is the ability to pause the debug sidebar. Whilst paused, incoming messages are discarded until the sidebar is unpaused.

                  +`, + } + }, + { + title: { + "en-US": "Rate Limiting - burst mode", }, description: { "en-US": ` -

                  The next beta will include a number of improvements to the individual sidebars; particularly the new Explorer panel to make navigation easier.

                  -

                  We're also going to take a hard look at the header of the editor with a number of layout improvements coming.

                  +

                  The Delay node has a new rate-limiting mode where, rather than spread out messages, it will let messages through as they arrive until the limit is reached, and then block +until the next interval starts.

                  `, } + }, + { + title: { + "en-US": "What's next?", + }, + description: { + "en-US": ` +

                  We're continuing to work on the new editor design. The sidebar functionality continues to be a focus area, with some more improvements to come.

                  +

                  We'll be adding a built-in dark theme as well to compliment the existing light theme.

                  +

                  As always, we welcome your feedback on the new design and features - please join us on the forum or GitHub to let us know your thoughts!

                  + ` + } } ] } diff --git a/packages/node_modules/@node-red/nodes/package.json b/packages/node_modules/@node-red/nodes/package.json index 836e25a675..38a5a38688 100644 --- a/packages/node_modules/@node-red/nodes/package.json +++ b/packages/node_modules/@node-red/nodes/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/nodes", - "version": "5.0.0-beta.1", + "version": "5.0.0-beta.2", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/registry/package.json b/packages/node_modules/@node-red/registry/package.json index 553a5d0899..6ba0f2fcb7 100644 --- a/packages/node_modules/@node-red/registry/package.json +++ b/packages/node_modules/@node-red/registry/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/registry", - "version": "5.0.0-beta.1", + "version": "5.0.0-beta.2", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,11 +16,11 @@ } ], "dependencies": { - "@node-red/util": "5.0.0-beta.1", + "@node-red/util": "5.0.0-beta.2", "clone": "2.1.2", "fs-extra": "11.3.0", "semver": "7.7.1", - "tar": "7.4.3", + "tar": "7.5.6", "uglify-js": "3.19.3" } } diff --git a/packages/node_modules/@node-red/runtime/package.json b/packages/node_modules/@node-red/runtime/package.json index 22bd210c10..3060b6726b 100644 --- a/packages/node_modules/@node-red/runtime/package.json +++ b/packages/node_modules/@node-red/runtime/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/runtime", - "version": "5.0.0-beta.1", + "version": "5.0.0-beta.2", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/registry": "5.0.0-beta.1", - "@node-red/util": "5.0.0-beta.1", + "@node-red/registry": "5.0.0-beta.2", + "@node-red/util": "5.0.0-beta.2", "async-mutex": "0.5.0", "clone": "2.1.2", "cronosjs": "1.7.1", diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json index fd8ebbddcd..8edbb1654f 100644 --- a/packages/node_modules/@node-red/util/package.json +++ b/packages/node_modules/@node-red/util/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/util", - "version": "5.0.0-beta.1", + "version": "5.0.0-beta.2", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/node-red/package.json b/packages/node_modules/node-red/package.json index fb1b8a4696..fe8ab518e4 100644 --- a/packages/node_modules/node-red/package.json +++ b/packages/node_modules/node-red/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "5.0.0-beta.1", + "version": "5.0.0-beta.2", "description": "Low-code programming for event-driven applications", "homepage": "https://nodered.org", "license": "Apache-2.0", @@ -31,10 +31,10 @@ "flow" ], "dependencies": { - "@node-red/editor-api": "5.0.0-beta.1", - "@node-red/runtime": "5.0.0-beta.1", - "@node-red/util": "5.0.0-beta.1", - "@node-red/nodes": "5.0.0-beta.1", + "@node-red/editor-api": "5.0.0-beta.2", + "@node-red/runtime": "5.0.0-beta.2", + "@node-red/util": "5.0.0-beta.2", + "@node-red/nodes": "5.0.0-beta.2", "basic-auth": "2.0.1", "bcryptjs": "3.0.2", "cors": "2.8.5", From 2050824a9f6f9a57a4a81a5f6862ed45637eece2 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 21 Jan 2026 14:06:16 +0000 Subject: [PATCH 110/160] Add changelog --- CHANGELOG.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b788f02694..ad2e0bcc3a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +#### 5.0.0-beta.2: Beta Release + +Editor + + - UX updates for next beta (#5444) @knolleary + +Nodes + + - Add pause button to debug sidebar (#5390) @dceejay + - Add burst mode to delay node (#5391) @dceejay + - Add TLS certs/keys from Env Vars (#5376) @hardillb + #### 5.0.0-beta.1: Beta Release Editor From d0cabaf740fe67ac1cba3d77021705e9af3b440c Mon Sep 17 00:00:00 2001 From: Dennis-SEG Date: Sat, 24 Jan 2026 23:00:46 +0100 Subject: [PATCH 111/160] fix: prevent race condition in delay node idList splice Check indexOf result before splicing to prevent removing wrong element when clearDelayList() runs between timeout registration and execution. If indexOf returns -1 (id already removed), splice(-1, 1) would incorrectly remove the last element. Now we skip the splice if id is not found. Fixes: Dennis-SEG/node-red#3 --- .../@node-red/nodes/core/function/89-delay.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/function/89-delay.js b/packages/node_modules/@node-red/nodes/core/function/89-delay.js index c44fa06c5f..c4adb1f077 100644 --- a/packages/node_modules/@node-red/nodes/core/function/89-delay.js +++ b/packages/node_modules/@node-red/nodes/core/function/89-delay.js @@ -159,7 +159,8 @@ module.exports = function(RED) { if (node.pauseType === "delay") { node.on("input", function(msg, send, done) { var id = ourTimeout(function() { - node.idList.splice(node.idList.indexOf(id),1); + var idx = node.idList.indexOf(id); + if (idx !== -1) { node.idList.splice(idx, 1); } if (node.timeout > 1000) { node.status({fill:"blue",shape:"dot",text:node.idList.length}); } @@ -184,7 +185,8 @@ module.exports = function(RED) { } if (delayvar < 0) { delayvar = 0; } var id = ourTimeout(function() { - node.idList.splice(node.idList.indexOf(id),1); + var idx = node.idList.indexOf(id); + if (idx !== -1) { node.idList.splice(idx, 1); } if (node.idList.length === 0) { node.status({}); } send(msg); if (delayvar >= 0) { @@ -207,7 +209,8 @@ module.exports = function(RED) { node.on("input", function(msg, send, done) { var wait = node.randomFirst + (node.diff * Math.random()); var id = ourTimeout(function() { - node.idList.splice(node.idList.indexOf(id),1); + var idx = node.idList.indexOf(id); + if (idx !== -1) { node.idList.splice(idx, 1); } send(msg); if (node.timeout >= 1000) { node.status({fill:"blue",shape:"dot",text:node.idList.length}); From 97e70a225b3dca43d73897c58b3dce9e6db66db3 Mon Sep 17 00:00:00 2001 From: Dennis-SEG Date: Sat, 24 Jan 2026 23:20:52 +0100 Subject: [PATCH 112/160] fix: prevent double resolve in node close callback --- .../node_modules/@node-red/runtime/lib/nodes/Node.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/runtime/lib/nodes/Node.js b/packages/node_modules/@node-red/runtime/lib/nodes/Node.js index 0b1ed349be..f31504214e 100644 --- a/packages/node_modules/@node-red/runtime/lib/nodes/Node.js +++ b/packages/node_modules/@node-red/runtime/lib/nodes/Node.js @@ -322,6 +322,7 @@ Node.prototype.close = function(removed) { // The callback takes a 'done' callback and (maybe) the removed flag promises.push( new Promise((resolve) => { + var resolved = false; try { var args = []; if (callback.length === 2) { @@ -329,13 +330,19 @@ Node.prototype.close = function(removed) { args.push(!!removed); } args.push(() => { - resolve(); + if (!resolved) { + resolved = true; + resolve(); + } }); callback.apply(node, args); } catch(err) { // TODO: error thrown in node async close callback // We've never logged this properly. - resolve(); + if (!resolved) { + resolved = true; + resolve(); + } } }) ); From ca01aa9148440b8b18a9bb5e41282f37447739b3 Mon Sep 17 00:00:00 2001 From: Dennis-SEG Date: Sat, 24 Jan 2026 23:38:49 +0100 Subject: [PATCH 113/160] fix: prevent race condition in localfilesystem context storage during close --- .../lib/nodes/context/localfilesystem.js | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/packages/node_modules/@node-red/runtime/lib/nodes/context/localfilesystem.js b/packages/node_modules/@node-red/runtime/lib/nodes/context/localfilesystem.js index ef499f0f91..5697f329d4 100644 --- a/packages/node_modules/@node-red/runtime/lib/nodes/context/localfilesystem.js +++ b/packages/node_modules/@node-red/runtime/lib/nodes/context/localfilesystem.js @@ -155,6 +155,7 @@ function LocalFileSystem(config){ } this.pendingWrites = {}; this.knownCircularRefs = {}; + this.closing = false; if (config.hasOwnProperty('flushInterval')) { this.flushInterval = Math.max(0,config.flushInterval) * 1000; @@ -233,16 +234,19 @@ LocalFileSystem.prototype.open = function(){ LocalFileSystem.prototype.close = function(){ var self = this; - if (this.cache && this._pendingWriteTimeout) { - clearTimeout(this._pendingWriteTimeout); - delete this._pendingWriteTimeout; + this.closing = true; + if (this.cache) { + if (this._pendingWriteTimeout) { + clearTimeout(this._pendingWriteTimeout); + delete this._pendingWriteTimeout; + } this.flushInterval = 0; + // Always flush pending writes on close, even if no timeout was pending self.writePromise = self.writePromise.then(function(){ return self._flushPendingWrites.call(self).catch(function(err) { log.error(log._("context.localfilesystem.error-write",{message:err.toString()})); }); }); - } return this.writePromise; } @@ -298,8 +302,9 @@ LocalFileSystem.prototype.set = function(scope, key, value, callback) { if (this.cache) { this.cache.set(scope,key,value,callback); this.pendingWrites[scope] = true; - if (this._pendingWriteTimeout) { - // there's a pending write which will handle this + if (this._pendingWriteTimeout || this.closing) { + // there's a pending write which will handle this, + // or we're closing and the close() flush will handle it return; } else { this._pendingWriteTimeout = setTimeout(function() { From 39e4d85a0d157c5d018763544044d75ff9256bee Mon Sep 17 00:00:00 2001 From: yuan-cloud Date: Sun, 25 Jan 2026 16:46:53 -0500 Subject: [PATCH 114/160] registry: fix importModule base dir for exports subpaths --- .../@node-red/registry/lib/externalModules.js | 2 +- .../registry/lib/externalModules_spec.js | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/registry/lib/externalModules.js b/packages/node_modules/@node-red/registry/lib/externalModules.js index bec93491ca..0f4fbf0093 100644 --- a/packages/node_modules/@node-red/registry/lib/externalModules.js +++ b/packages/node_modules/@node-red/registry/lib/externalModules.js @@ -122,7 +122,7 @@ function importModule(module) { throw e; } const externalModuleDir = getInstallDir(); - const moduleDir = path.join(externalModuleDir,"node_modules",module); + const moduleDir = path.join(externalModuleDir,"node_modules",parsedModule.module); // To handle both CJS and ESM we need to resolve the module to the // specific file that is loaded when the module is required/imported // As this won't be on the natural module search path, we use createRequire diff --git a/test/unit/@node-red/registry/lib/externalModules_spec.js b/test/unit/@node-red/registry/lib/externalModules_spec.js index 2158f93f7c..3a04d954f8 100644 --- a/test/unit/@node-red/registry/lib/externalModules_spec.js +++ b/test/unit/@node-red/registry/lib/externalModules_spec.js @@ -344,6 +344,36 @@ describe("externalModules api", function() { should.exist(result); should.exist(result.existsSync); }) + it("imports external modules using export aliasing", async function() { + const externalModulesDir = path.join(homeDir,"externalModules"); + await fs.ensureDir(externalModulesDir); + externalModules.init({userDir: externalModulesDir, get:()=>{}, set:()=>{}}); + + await fs.writeFile(path.join(externalModulesDir,"package.json"),`{ +"name": "Node-RED-External-Modules", +"description": "These modules are automatically installed by Node-RED to use in Function nodes.", +"version": "1.0.0", +"private": true, +"dependencies": {"fake-pkg":"1.0.0"} +}`) + + const packageDir = path.join(externalModulesDir,"node_modules","fake-pkg"); + await fs.ensureDir(path.join(packageDir,"dist")); + await fs.writeFile(path.join(packageDir,"package.json"),`{ +"name": "fake-pkg", +"version": "1.0.0", +"exports": { + "./M.js": "./dist/M.js" +} +}`) + await fs.writeFile(path.join(packageDir,"dist","M.js"),"module.exports = 42;\n"); + + await externalModules.checkFlowDependencies([]); + + const importedValue = await externalModules.import("fake-pkg/M.js") + const normalizedValue = importedValue && importedValue.default !== undefined ? importedValue.default : importedValue; + normalizedValue.should.equal(42); + }) it("rejects unknown modules", async function() { externalModules.init({userDir: homeDir, get:()=>{}, set:()=>{}}); try { From b8d0233d1d11ae725384012416f0e836963b4f4e Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 26 Jan 2026 10:28:22 +0000 Subject: [PATCH 115/160] Revert overflow fix in editableList --- .../@node-red/editor-client/src/sass/ui/common/editableList.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/sass/ui/common/editableList.scss b/packages/node_modules/@node-red/editor-client/src/sass/ui/common/editableList.scss index 4b8873feeb..00b79b54a7 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/ui/common/editableList.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/ui/common/editableList.scss @@ -21,7 +21,6 @@ padding: 2px 16px 2px 4px; font-size: 0.9em; } - overflow-x: hidden; } .red-ui-editableList-container { padding: 5px; From 12c575b5a5b0a9e757a735a63dd212914d766ffa Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 26 Jan 2026 10:32:12 +0000 Subject: [PATCH 116/160] Bump dependencies and version --- package-lock.json | 32 +++++-------------- package.json | 4 +-- .../@node-red/editor-api/package.json | 6 ++-- .../@node-red/editor-client/package.json | 2 +- .../node_modules/@node-red/nodes/package.json | 2 +- .../@node-red/registry/package.json | 6 ++-- .../@node-red/runtime/package.json | 6 ++-- .../node_modules/@node-red/util/package.json | 2 +- packages/node_modules/node-red/package.json | 10 +++--- 9 files changed, 27 insertions(+), 43 deletions(-) diff --git a/package-lock.json b/package-lock.json index 155f837e6f..038b2dc8e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "node-red", - "version": "4.1.3", + "version": "4.1.4", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "node-red", - "version": "4.1.3", + "version": "4.1.4", "license": "Apache-2.0", "dependencies": { "acorn": "8.15.0", @@ -59,7 +59,7 @@ "raw-body": "3.0.0", "rfdc": "^1.3.1", "semver": "7.7.1", - "tar": "7.4.3", + "tar": "7.5.6", "tough-cookie": "5.1.2", "uglify-js": "3.19.3", "uuid": "9.0.1", @@ -10996,16 +10996,15 @@ "dev": true }, "node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "license": "ISC", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.6.tgz", + "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", + "minizlib": "^3.1.0", "yallist": "^5.0.0" }, "engines": { @@ -11066,21 +11065,6 @@ "ieee754": "^1.1.13" } }, - "node_modules/tar/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/tar/node_modules/yallist": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", diff --git a/package.json b/package.json index 9f06f871a5..cba7fbfeb1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "4.1.3", + "version": "4.1.4", "description": "Low-code programming for event-driven applications", "homepage": "https://nodered.org", "license": "Apache-2.0", @@ -76,7 +76,7 @@ "raw-body": "3.0.0", "rfdc": "^1.3.1", "semver": "7.7.1", - "tar": "7.4.3", + "tar": "7.5.6", "tough-cookie": "5.1.2", "uglify-js": "3.19.3", "uuid": "9.0.1", diff --git a/packages/node_modules/@node-red/editor-api/package.json b/packages/node_modules/@node-red/editor-api/package.json index 587b6e2259..28b717bc43 100644 --- a/packages/node_modules/@node-red/editor-api/package.json +++ b/packages/node_modules/@node-red/editor-api/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/editor-api", - "version": "4.1.3", + "version": "4.1.4", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/util": "4.1.3", - "@node-red/editor-client": "4.1.3", + "@node-red/util": "4.1.4", + "@node-red/editor-client": "4.1.4", "bcryptjs": "3.0.2", "body-parser": "1.20.4", "clone": "2.1.2", diff --git a/packages/node_modules/@node-red/editor-client/package.json b/packages/node_modules/@node-red/editor-client/package.json index 848603ffd1..1e4a2d8f87 100644 --- a/packages/node_modules/@node-red/editor-client/package.json +++ b/packages/node_modules/@node-red/editor-client/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/editor-client", - "version": "4.1.3", + "version": "4.1.4", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/nodes/package.json b/packages/node_modules/@node-red/nodes/package.json index 298cddcc8b..6fe1b00ab4 100644 --- a/packages/node_modules/@node-red/nodes/package.json +++ b/packages/node_modules/@node-red/nodes/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/nodes", - "version": "4.1.3", + "version": "4.1.4", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/registry/package.json b/packages/node_modules/@node-red/registry/package.json index 95269f530c..8695734248 100644 --- a/packages/node_modules/@node-red/registry/package.json +++ b/packages/node_modules/@node-red/registry/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/registry", - "version": "4.1.3", + "version": "4.1.4", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,11 +16,11 @@ } ], "dependencies": { - "@node-red/util": "4.1.3", + "@node-red/util": "4.1.4", "clone": "2.1.2", "fs-extra": "11.3.0", "semver": "7.7.1", - "tar": "7.4.3", + "tar": "7.5.6", "uglify-js": "3.19.3" } } diff --git a/packages/node_modules/@node-red/runtime/package.json b/packages/node_modules/@node-red/runtime/package.json index ccf2c55ad3..20e07ff1b0 100644 --- a/packages/node_modules/@node-red/runtime/package.json +++ b/packages/node_modules/@node-red/runtime/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/runtime", - "version": "4.1.3", + "version": "4.1.4", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/registry": "4.1.3", - "@node-red/util": "4.1.3", + "@node-red/registry": "4.1.4", + "@node-red/util": "4.1.4", "async-mutex": "0.5.0", "clone": "2.1.2", "cronosjs": "1.7.1", diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json index 13c20261e1..322a990546 100644 --- a/packages/node_modules/@node-red/util/package.json +++ b/packages/node_modules/@node-red/util/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/util", - "version": "4.1.3", + "version": "4.1.4", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/node-red/package.json b/packages/node_modules/node-red/package.json index 82c944518c..027a8609ad 100644 --- a/packages/node_modules/node-red/package.json +++ b/packages/node_modules/node-red/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "4.1.3", + "version": "4.1.4", "description": "Low-code programming for event-driven applications", "homepage": "https://nodered.org", "license": "Apache-2.0", @@ -31,10 +31,10 @@ "flow" ], "dependencies": { - "@node-red/editor-api": "4.1.3", - "@node-red/runtime": "4.1.3", - "@node-red/util": "4.1.3", - "@node-red/nodes": "4.1.3", + "@node-red/editor-api": "4.1.4", + "@node-red/runtime": "4.1.4", + "@node-red/util": "4.1.4", + "@node-red/nodes": "4.1.4", "basic-auth": "2.0.1", "bcryptjs": "3.0.2", "cors": "2.8.5", From 866d2b036c96e9561177bb499051c4992ce0ed15 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Mon, 26 Jan 2026 10:38:44 +0000 Subject: [PATCH 117/160] Update changelog --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd7de14658..39079b1fcf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +#### 4.1.4: Maintenance Releas + + - Update tar dependency @knolleary + - Revert overflow fix in editableList (#5467) @knolleary + - registry: fix importModule base dir for exports subpaths (#5465) @yuan-cloud + - fix: prevent race condition in localfilesystem context store during shutdown (#5462) @Dennis-SEG + - fix: prevent double resolve in node close callback (#5461) @Dennis-SEG + - fix: prevent incorrect array modification in delay node (#5457) @Dennis-SEG + - fix: prevent uncaught exceptions in core node event handlers (#5438) @Dennis-SEG + #### 4.1.3: Maintenance Release Editor From c2f2e57b7f0268500c9143f31ecbeac725a05379 Mon Sep 17 00:00:00 2001 From: bryopsida <8363252+bryopsida@users.noreply.github.com> Date: Sat, 31 Jan 2026 07:46:55 -0600 Subject: [PATCH 118/160] chore: bump tar to 7.5.7 Signed-off-by: bryopsida <8363252+bryopsida@users.noreply.github.com> --- package-lock.json | 12 ++++++------ package.json | 4 ++-- packages/node_modules/@node-red/nodes/package.json | 2 +- .../node_modules/@node-red/registry/package.json | 6 +++--- packages/node_modules/@node-red/util/package.json | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 038b2dc8e9..f480614067 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "node-red", - "version": "4.1.4", + "version": "4.1.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "node-red", - "version": "4.1.4", + "version": "4.1.5", "license": "Apache-2.0", "dependencies": { "acorn": "8.15.0", @@ -59,7 +59,7 @@ "raw-body": "3.0.0", "rfdc": "^1.3.1", "semver": "7.7.1", - "tar": "7.5.6", + "tar": "7.5.7", "tough-cookie": "5.1.2", "uglify-js": "3.19.3", "uuid": "9.0.1", @@ -10996,9 +10996,9 @@ "dev": true }, "node_modules/tar": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.6.tgz", - "integrity": "sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", + "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", diff --git a/package.json b/package.json index cba7fbfeb1..86acd5f6cf 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "4.1.4", + "version": "4.1.5", "description": "Low-code programming for event-driven applications", "homepage": "https://nodered.org", "license": "Apache-2.0", @@ -76,7 +76,7 @@ "raw-body": "3.0.0", "rfdc": "^1.3.1", "semver": "7.7.1", - "tar": "7.5.6", + "tar": "7.5.7", "tough-cookie": "5.1.2", "uglify-js": "3.19.3", "uuid": "9.0.1", diff --git a/packages/node_modules/@node-red/nodes/package.json b/packages/node_modules/@node-red/nodes/package.json index 6fe1b00ab4..f5df3c5444 100644 --- a/packages/node_modules/@node-red/nodes/package.json +++ b/packages/node_modules/@node-red/nodes/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/nodes", - "version": "4.1.4", + "version": "4.1.5", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/registry/package.json b/packages/node_modules/@node-red/registry/package.json index 8695734248..c864aa7635 100644 --- a/packages/node_modules/@node-red/registry/package.json +++ b/packages/node_modules/@node-red/registry/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/registry", - "version": "4.1.4", + "version": "4.1.5", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,11 +16,11 @@ } ], "dependencies": { - "@node-red/util": "4.1.4", + "@node-red/util": "4.1.5", "clone": "2.1.2", "fs-extra": "11.3.0", "semver": "7.7.1", - "tar": "7.5.6", + "tar": "7.5.7", "uglify-js": "3.19.3" } } diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json index 322a990546..907dd3baf9 100644 --- a/packages/node_modules/@node-red/util/package.json +++ b/packages/node_modules/@node-red/util/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/util", - "version": "4.1.4", + "version": "4.1.5", "license": "Apache-2.0", "repository": { "type": "git", From dadf7a3d71950cc6472477662ff08ad33aae85a5 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 11 Feb 2026 09:44:32 +0000 Subject: [PATCH 119/160] Update for 4.1.5 release --- CHANGELOG.md | 7 +++- package-lock.json | 36 +++++++++++++++------ package.json | 2 +- packages/node_modules/node-red/package.json | 2 +- 4 files changed, 34 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 39079b1fcf..07c157944c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,9 @@ -#### 4.1.4: Maintenance Releas +#### 4.1.5: Maintenance Release + + - chore: bump tar to 7.5.7 (#5472) @bryopsida + - Update node-red-admin dependency @knolleary + +#### 4.1.4: Maintenance Release - Update tar dependency @knolleary - Revert overflow fix in editableList (#5467) @knolleary diff --git a/package-lock.json b/package-lock.json index f480614067..893944b5d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -48,7 +48,7 @@ "mqtt": "5.11.0", "multer": "2.0.2", "mustache": "4.2.0", - "node-red-admin": "^4.1.2", + "node-red-admin": "^4.1.3", "node-watch": "0.7.4", "nopt": "5.0.0", "oauth2orize": "1.12.0", @@ -1767,16 +1767,32 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", - "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", + "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -8028,13 +8044,13 @@ } }, "node_modules/node-red-admin": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/node-red-admin/-/node-red-admin-4.1.2.tgz", - "integrity": "sha512-Yqe3dREfZZmc/BqT3Ntg0DEXivbP3HBNYCbjDkUaakkIIrapNR8TK1vj3RgkSW6FMtpfcVXBcLGI4cA0I1zbOw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/node-red-admin/-/node-red-admin-4.1.3.tgz", + "integrity": "sha512-Kb3uF59389eZh78SmhN8eiUT1uUMCoH2dC60KOQKsHx3R9qHGBpJu0nozi9E4odnCJMLFOe+n4ENjEeRF+etwQ==", "license": "Apache-2.0", "dependencies": { "ansi-colors": "^4.1.3", - "axios": "1.12.2", + "axios": "^1.13.5", "bcryptjs": "3.0.2", "cli-table": "^0.3.11", "enquirer": "^2.3.6", diff --git a/package.json b/package.json index 86acd5f6cf..7495077521 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ "mqtt": "5.11.0", "multer": "2.0.2", "mustache": "4.2.0", - "node-red-admin": "^4.1.2", + "node-red-admin": "^4.1.3", "node-watch": "0.7.4", "nopt": "5.0.0", "oauth2orize": "1.12.0", diff --git a/packages/node_modules/node-red/package.json b/packages/node_modules/node-red/package.json index 027a8609ad..71c4de6721 100644 --- a/packages/node_modules/node-red/package.json +++ b/packages/node_modules/node-red/package.json @@ -40,7 +40,7 @@ "cors": "2.8.5", "express": "4.22.1", "fs-extra": "11.3.0", - "node-red-admin": "^4.1.2", + "node-red-admin": "^4.1.3", "nopt": "5.0.0", "semver": "7.7.1" }, From df96cfab11cf304bca2d418ab06595c0809c03a4 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 11 Feb 2026 10:14:54 +0000 Subject: [PATCH 120/160] Fix package versions --- .../node_modules/@node-red/editor-api/package.json | 6 +++--- .../node_modules/@node-red/editor-client/package.json | 2 +- packages/node_modules/@node-red/runtime/package.json | 6 +++--- packages/node_modules/node-red/package.json | 10 +++++----- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/node_modules/@node-red/editor-api/package.json b/packages/node_modules/@node-red/editor-api/package.json index 28b717bc43..ae3e71997e 100644 --- a/packages/node_modules/@node-red/editor-api/package.json +++ b/packages/node_modules/@node-red/editor-api/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/editor-api", - "version": "4.1.4", + "version": "4.1.5", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/util": "4.1.4", - "@node-red/editor-client": "4.1.4", + "@node-red/util": "4.1.5", + "@node-red/editor-client": "4.1.5", "bcryptjs": "3.0.2", "body-parser": "1.20.4", "clone": "2.1.2", diff --git a/packages/node_modules/@node-red/editor-client/package.json b/packages/node_modules/@node-red/editor-client/package.json index 1e4a2d8f87..f0f4886347 100644 --- a/packages/node_modules/@node-red/editor-client/package.json +++ b/packages/node_modules/@node-red/editor-client/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/editor-client", - "version": "4.1.4", + "version": "4.1.5", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/runtime/package.json b/packages/node_modules/@node-red/runtime/package.json index 20e07ff1b0..b0094b491a 100644 --- a/packages/node_modules/@node-red/runtime/package.json +++ b/packages/node_modules/@node-red/runtime/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/runtime", - "version": "4.1.4", + "version": "4.1.5", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/registry": "4.1.4", - "@node-red/util": "4.1.4", + "@node-red/registry": "4.1.5", + "@node-red/util": "4.1.5", "async-mutex": "0.5.0", "clone": "2.1.2", "cronosjs": "1.7.1", diff --git a/packages/node_modules/node-red/package.json b/packages/node_modules/node-red/package.json index 71c4de6721..c2ba1aba5e 100644 --- a/packages/node_modules/node-red/package.json +++ b/packages/node_modules/node-red/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "4.1.4", + "version": "4.1.5", "description": "Low-code programming for event-driven applications", "homepage": "https://nodered.org", "license": "Apache-2.0", @@ -31,10 +31,10 @@ "flow" ], "dependencies": { - "@node-red/editor-api": "4.1.4", - "@node-red/runtime": "4.1.4", - "@node-red/util": "4.1.4", - "@node-red/nodes": "4.1.4", + "@node-red/editor-api": "4.1.5", + "@node-red/runtime": "4.1.5", + "@node-red/util": "4.1.5", + "@node-red/nodes": "4.1.5", "basic-auth": "2.0.1", "bcryptjs": "3.0.2", "cors": "2.8.5", From f48f623a832ced4d7d921a7aed24c8e96c63dd78 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 11 Feb 2026 11:03:47 +0000 Subject: [PATCH 121/160] Fixup lock file --- package-lock.json | 261 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 261 insertions(+) diff --git a/package-lock.json b/package-lock.json index 85a2874851..6f0d28cd89 100644 --- a/package-lock.json +++ b/package-lock.json @@ -359,6 +359,37 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/@emnapi/core": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@iconify/types": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", @@ -482,6 +513,18 @@ "langium": "3.3.1" } }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, "node_modules/@noble/hashes": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", @@ -525,6 +568,38 @@ "@node-rs/bcrypt-win32-x64-msvc": "1.10.7" } }, + "node_modules/@node-rs/bcrypt-android-arm-eabi": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-android-arm-eabi/-/bcrypt-android-arm-eabi-1.10.7.tgz", + "integrity": "sha512-8dO6/PcbeMZXS3VXGEtct9pDYdShp2WBOWlDvSbcRwVqyB580aCBh0BEFmKYtXLzLvUK8Wf+CG3U6sCdILW1lA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-android-arm64": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-android-arm64/-/bcrypt-android-arm64-1.10.7.tgz", + "integrity": "sha512-UASFBS/CucEMHiCtL/2YYsAY01ZqVR1N7vSb94EOvG5iwW7BQO06kXXCTgj+Xbek9azxixrCUmo3WJnkJZ0hTQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@node-rs/bcrypt-darwin-arm64": { "version": "1.10.7", "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-darwin-arm64/-/bcrypt-darwin-arm64-1.10.7.tgz", @@ -541,6 +616,182 @@ "node": ">= 10" } }, + "node_modules/@node-rs/bcrypt-darwin-x64": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-darwin-x64/-/bcrypt-darwin-x64-1.10.7.tgz", + "integrity": "sha512-SPWVfQ6sxSokoUWAKWD0EJauvPHqOGQTd7CxmYatcsUgJ/bruvEHxZ4bIwX1iDceC3FkOtmeHO0cPwR480n/xA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-freebsd-x64": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-freebsd-x64/-/bcrypt-freebsd-x64-1.10.7.tgz", + "integrity": "sha512-gpa+Ixs6GwEx6U6ehBpsQetzUpuAGuAFbOiuLB2oo4N58yU4AZz1VIcWyWAHrSWRs92O0SHtmo2YPrMrwfBbSw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-linux-arm-gnueabihf": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-arm-gnueabihf/-/bcrypt-linux-arm-gnueabihf-1.10.7.tgz", + "integrity": "sha512-kYgJnTnpxrzl9sxYqzflobvMp90qoAlaX1oDL7nhNTj8OYJVDIk0jQgblj0bIkjmoPbBed53OJY/iu4uTS+wig==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-linux-arm64-gnu": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-arm64-gnu/-/bcrypt-linux-arm64-gnu-1.10.7.tgz", + "integrity": "sha512-7cEkK2RA+gBCj2tCVEI1rDSJV40oLbSq7bQ+PNMHNI6jCoXGmj9Uzo7mg7ZRbNZ7piIyNH5zlJqutjo8hh/tmA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-linux-arm64-musl": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-arm64-musl/-/bcrypt-linux-arm64-musl-1.10.7.tgz", + "integrity": "sha512-X7DRVjshhwxUqzdUKDlF55cwzh+wqWJ2E/tILvZPboO3xaNO07Um568Vf+8cmKcz+tiZCGP7CBmKbBqjvKN/Pw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-linux-x64-gnu": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-x64-gnu/-/bcrypt-linux-x64-gnu-1.10.7.tgz", + "integrity": "sha512-LXRZsvG65NggPD12hn6YxVgH0W3VR5fsE/o1/o2D5X0nxKcNQGeLWnRzs5cP8KpoFOuk1ilctXQJn8/wq+Gn/Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-linux-x64-musl": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-x64-musl/-/bcrypt-linux-x64-musl-1.10.7.tgz", + "integrity": "sha512-tCjHmct79OfcO3g5q21ME7CNzLzpw1MAsUXCLHLGWH+V6pp/xTvMbIcLwzkDj6TI3mxK6kehTn40SEjBkZ3Rog==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-wasm32-wasi": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-wasm32-wasi/-/bcrypt-wasm32-wasi-1.10.7.tgz", + "integrity": "sha512-4qXSihIKeVXYglfXZEq/QPtYtBUvR8d3S85k15Lilv3z5B6NSGQ9mYiNleZ7QHVLN2gEc5gmi7jM353DMH9GkA==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.5" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@node-rs/bcrypt-win32-arm64-msvc": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-win32-arm64-msvc/-/bcrypt-win32-arm64-msvc-1.10.7.tgz", + "integrity": "sha512-FdfUQrqmDfvC5jFhntMBkk8EI+fCJTx/I1v7Rj+Ezlr9rez1j1FmuUnywbBj2Cg15/0BDhwYdbyZ5GCMFli2aQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-win32-ia32-msvc": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-win32-ia32-msvc/-/bcrypt-win32-ia32-msvc-1.10.7.tgz", + "integrity": "sha512-lZLf4Cx+bShIhU071p5BZft4OvP4PGhyp542EEsb3zk34U5GLsGIyCjOafcF/2DGewZL6u8/aqoxbSuROkgFXg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-win32-x64-msvc": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-win32-x64-msvc/-/bcrypt-win32-x64-msvc-1.10.7.tgz", + "integrity": "sha512-hdw7tGmN1DxVAMTzICLdaHpXjy+4rxaxnBMgI8seG1JL5e3VcRGsd1/1vVDogVp2cbsmgq+6d6yAY+D9lW/DCg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -672,6 +923,16 @@ "node": ">=14.16" } }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@types/d3": { "version": "7.4.3", "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", From a11ff510ed0e18dc6ac2e4130bebaf8f8c325f62 Mon Sep 17 00:00:00 2001 From: Gerrit Riessen Date: Wed, 11 Feb 2026 18:37:44 +0100 Subject: [PATCH 122/160] =?UTF-8?q?Add=20=C2=A7=20as=20shortcut=20meta-key?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../node_modules/@node-red/editor-client/src/js/ui/keyboard.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js b/packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js index 4311974584..de5c788ac6 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/keyboard.js @@ -43,6 +43,7 @@ RED.keyboard = (function() { "-":189, ".":190, "/":191, + "§":192, // <- top left key MacOS "\\":220, "'":222, "?":191, // <- QWERTY specific From 3d64c2f01195028f5203948c52b2fd83d742cee9 Mon Sep 17 00:00:00 2001 From: Kazuhito Yokoi Date: Sun, 15 Feb 2026 11:29:36 +0900 Subject: [PATCH 123/160] Support ctrl key to select configuration nodes --- .../@node-red/editor-client/src/js/ui/tab-config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-config.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-config.js index 9af711e098..912f0e06fc 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-config.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-config.js @@ -218,7 +218,7 @@ RED.sidebar.config = (function() { nodeDiv.on('click',function(e) { e.stopPropagation(); RED.view.select(false); - if (e.metaKey) { + if (e.metaKey || e.ctrlKey) { $(this).toggleClass("selected"); } else { $(content).find(".red-ui-palette-node").removeClass("selected"); From 8ceacdb565f1798b9c2546bc19359949f74785f0 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Mon, 23 Feb 2026 11:25:34 +0000 Subject: [PATCH 124/160] Update FE hooks to be promise chainable --- .../@node-red/editor-client/src/js/hooks.js | 259 ++++++++++++------ 1 file changed, 179 insertions(+), 80 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/hooks.js b/packages/node_modules/@node-red/editor-client/src/js/hooks.js index 096c8e5b59..d7a3c1a97a 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/hooks.js +++ b/packages/node_modules/@node-red/editor-client/src/js/hooks.js @@ -1,135 +1,206 @@ -RED.hooks = (function() { +RED.hooks = (function () { + // At the time of writing this PR, VALID_HOOKS were not enforced. There may be a good reason for this + // so the below flag has been added to permit this behaviour. If desired, this can be set to false to + // enforce that only known hooks can be added/triggered. + const knownHooksOnly = false - var VALID_HOOKS = [ + const VALID_HOOKS = Object.freeze({ + viewRemoveNode: true, + viewAddNode: true, + viewRemovePort: true, + viewAddPort: true, + viewRedrawNode: true, + debugPreProcessMessage: true, + debugPostProcessMessage: true + }) - ] + /** + * @typedef {keyof typeof VALID_HOOKS} HookId - A string literal type representing a hook identifier (sans label). + * + * @typedef {Object} HookItem - An item in the linked list of hooks for a given HookId + * @property {function} cb - The callback function to be called when the hook is triggered + * @property {HookItem|null} previousHook - The previous hook in the linked list + * @property {HookItem|null} nextHook - The next hook in the linked list + * @property {boolean} removed - Flag indicating if the hook has been removed + * + * @typedef {Record} Hooks - A mapping of HookIds to the head of their linked list of HookItems + */ - var hooks = { } - var labelledHooks = { } + + /** @type {Hooks} - A mapping of HookIds to the head of their linked list of HookItems */ + let hooks = {} + + /** @type {Record>} - A mapping of labels to their hooks */ + let labelledHooks = {} function add(hookId, callback) { - var parts = hookId.split("."); - var id = parts[0], label = parts[1]; + const { label, id } = parseLabelledHook(hookId) - // if (VALID_HOOKS.indexOf(id) === -1) { - // throw new Error("Invalid hook '"+id+"'"); - // } + if (knownHooksOnly && !isKnownHook(id)) { + throw new Error("Invalid hook '" + id + "'") + } if (label && labelledHooks[label] && labelledHooks[label][id]) { - throw new Error("Hook "+hookId+" already registered") + throw new Error("Hook " + hookId + " already registered") + } + if (typeof callback !== "function") { + throw new Error("Invalid hook '" + hookId + "'. Callback must be a function") } - var hookItem = {cb:callback, previousHook: null, nextHook: null } - var tailItem = hooks[id]; + /** @type {HookItem} */ + const hookItem = { cb: callback, previousHook: null, nextHook: null } + + let tailItem = hooks[id] if (tailItem === undefined) { - hooks[id] = hookItem; + hooks[id] = hookItem } else { - while(tailItem.nextHook !== null) { + while (tailItem.nextHook !== null) { tailItem = tailItem.nextHook } - tailItem.nextHook = hookItem; - hookItem.previousHook = tailItem; + tailItem.nextHook = hookItem + hookItem.previousHook = tailItem } if (label) { - labelledHooks[label] = labelledHooks[label]||{}; - labelledHooks[label][id] = hookItem; + labelledHooks[label] = labelledHooks[label] || {} + labelledHooks[label][id] = hookItem } } + function remove(hookId) { - var parts = hookId.split("."); - var id = parts[0], label = parts[1]; - if ( !label) { - throw new Error("Cannot remove hook without label: "+hookId) + const { label, id } = parseLabelledHook(hookId) + if (!label) { + throw new Error("Cannot remove hook without label: " + hookId) } if (labelledHooks[label]) { if (id === "*") { // Remove all hooks for this label - var hookList = Object.keys(labelledHooks[label]); - for (var i=0;i { + invokeStack(hookItem, payload, function (err) { + if (err !== undefined && err !== false) { + if (!(err instanceof Error)) { + err = new Error(err) + } + err.hook = id + reject(err) + } else { + resolve(err) + } + }) + }) + } else { + invokeStack(hookItem, payload, done) + } + } + + /** + * @private + */ + function invokeStack(hookItem, payload, done) { function callNextHook(err) { if (!hookItem || err) { - if (done) { done(err) } - return err; + done(err) + return } if (hookItem.removed) { - hookItem = hookItem.nextHook; - return callNextHook(); + hookItem = hookItem.nextHook + callNextHook() + return } - var callback = hookItem.cb; + const callback = hookItem.cb if (callback.length === 1) { try { - let result = callback(payload); + let result = callback(payload) if (result === false) { // Halting the flow - if (done) { done(false) } - return result; + done(false) + return } - hookItem = hookItem.nextHook; - return callNextHook(); - } catch(e) { - console.warn(e); - if (done) { done(e);} - return e; + if (result && typeof result.then === 'function') { + result.then(handleResolve, callNextHook) + return + } + hookItem = hookItem.nextHook + callNextHook() + } catch (e) { + done(e) + return } } else { - // There is a done callback try { - callback(payload,function(result) { - if (result === undefined) { - hookItem = hookItem.nextHook; - callNextHook(); - } else { - if (done) { done(result)} - } - }) - } catch(e) { - console.warn(e); - if (done) { done(e) } - return e; + callback(payload, handleResolve) + } catch (e) { + done(e) + return } } } - - return callNextHook(); + function handleResolve(result) { + if (result === undefined) { + hookItem = hookItem.nextHook + callNextHook() + } else { + done(result) + } + } + callNextHook() } function clear() { @@ -137,20 +208,48 @@ RED.hooks = (function() { labelledHooks = {} } + /** + * Check if a hook with the given id exists + * @param {string} hookId The hook identifier, which may include a label (e.g. "viewAddNode.myLabel") + * @returns {boolean} + */ function has(hookId) { - var parts = hookId.split("."); - var id = parts[0], label = parts[1]; + const { label, id } = parseLabelledHook(hookId) if (label) { return !!(labelledHooks[label] && labelledHooks[label][id]) } return !!hooks[id] } + function isKnownHook(hookId) { + const { id } = parseLabelledHook(hookId) + return !!VALID_HOOKS[id] + } + + /** + * Split a hook identifier into its id and label components. + * @param {*} hookId A hook identifier, which may include a label (e.g. "viewAddNode.myLabel") + * @returns {{label: string, id: HookId}} + * @private + */ + function parseLabelledHook(hookId) { + if (typeof hookId !== "string") { + return { label: '', id: '' } + } + const parts = hookId.split(".") + const id = parts[0] + const label = parts[1] + return { label, id } + } + + VALID_HOOKS['all'] = true // Special wildcard to allow hooks to indicate they should be triggered for all ids + return { - has: has, - clear: clear, - add: add, - remove: remove, - trigger: trigger + has, + clear, + add, + remove, + trigger, + isKnownHook } -})(); +})() From 7ab239a50d19eec5775cead9afa84c36d3f1e124 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Mon, 23 Feb 2026 11:25:59 +0000 Subject: [PATCH 125/160] Add debug message pre and post hooks --- .../core/common/lib/debug/debug-utils.js | 42 +++++++++++++++---- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/packages/node_modules/@node-red/nodes/core/common/lib/debug/debug-utils.js b/packages/node_modules/@node-red/nodes/core/common/lib/debug/debug-utils.js index c4931c2853..3dba416541 100644 --- a/packages/node_modules/@node-red/nodes/core/common/lib/debug/debug-utils.js +++ b/packages/node_modules/@node-red/nodes/core/common/lib/debug/debug-utils.js @@ -392,12 +392,28 @@ RED.debug = (function() { if (o) { stack.push(o); } if (!busy && (stack.length > 0)) { busy = true; - processDebugMessage(stack.shift()); - setTimeout(function() { - busy = false; - handleDebugMessage(); - }, 15); // every 15mS = 66 times a second - if (stack.length > numMessages) { stack = stack.splice(-numMessages); } + const message = stack.shift() + // call any preDebugLog hooks, allowing them to modify the message or block it from being displayed + RED.hooks.trigger('debugPreProcessMessage', { message }).then(result => { + if (result === false) { + return false; // A hook returned false - halt processing of this message + } + return processDebugMessage(message); + }).then(processArtifacts => { + if (processArtifacts === false) { + return false; // A hook returned false - halt processing of this message + } + const { message, element, payload } = processArtifacts || {}; + return RED.hooks.trigger('debugPostProcessMessage', { message, element, payload }); + }).catch(err => { + console.error("Error in debug process message hooks", err); + }).finally(() => { + setTimeout(function() { + busy = false; + handleDebugMessage(); + }, 15); // every 15mS = 66 times a second + if (stack.length > numMessages) { stack = stack.splice(-numMessages); } + }) } } @@ -519,10 +535,13 @@ RED.debug = (function() { sourceId: sourceNode && sourceNode.id, rootPath: path, nodeSelector: config.messageSourceClick, - enablePinning: true + enablePinning: true, + tools: o.tools // permit preDebugLog hooks to add extra tools to the element }); // Do this in a separate step so the element functions aren't stripped debugMessage.appendTo(el); + // add the meta row tools container, even if there are no tools, so that the postProcessDebugMessage hook can add tools + const tools = $('').appendTo(metaRow) // NOTE: relying on function error to have a "type" that all other msgs don't if (o.hasOwnProperty("type") && (o.type === "function")) { var errorLvlType = 'error'; @@ -534,7 +553,6 @@ RED.debug = (function() { msg.addClass('red-ui-debug-msg-level-' + errorLvl); $('function : (' + errorLvlType + ')').appendTo(metaRow); } else { - var tools = $('').appendTo(metaRow); var filterMessage = $('').appendTo(tools); filterMessage.on("click", function(e) { e.preventDefault(); @@ -590,6 +608,14 @@ RED.debug = (function() { if (atBottom) { messageList.scrollTop(sbc.scrollHeight); } + + // return artifacts to permit postProcessDebugMessage hooks to modify the message element, access the + // processed payload or otherwise modify the message after it has been generated. + return { + message: o, // original debug message object, useful for any hook that might have tagged additional info onto it + element: msg, // the top-level element for this debug message + payload // the reconstructed debug message + } } function clearMessageList(clearFilter, filteredOnly) { From 38f733d643ceb1eb11f04dde3e801e8b2ea50d43 Mon Sep 17 00:00:00 2001 From: lklivingstone Date: Mon, 23 Feb 2026 19:27:48 +0530 Subject: [PATCH 126/160] Fix: allow middle-click panning over links and ports --- .../node_modules/@node-red/editor-client/src/js/ui/view.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 53be89fb05..c5ef6f5d30 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -3226,7 +3226,7 @@ RED.view = (function() { clearSuggestedFlow(); RED.contextMenu.hide(); evt = evt || d3.event; - if (evt === 1) { + if (evt.button !== 0) { return; } if (mouse_mode === RED.state.SELECTING_NODE) { @@ -4082,7 +4082,7 @@ RED.view = (function() { d3.event.stopPropagation(); return; } - if (d3.event.button === 2) { + if (d3.event.button !== 0) { return } mousedown_link = d; From a312dbd87821a7a16d22b5035995b3309a426a58 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Wed, 25 Feb 2026 08:57:10 +0000 Subject: [PATCH 127/160] Move declarations before use & alongside other declarations --- .../@node-red/editor-client/src/js/ui/palette-editor.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js index e2773f4f65..cba3f4ba60 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js @@ -40,6 +40,12 @@ RED.palette.editor = (function() { // Install tab - search input let searchInput; + // Core and Package Updates + /** @type {Array<{package: string, current: string, available: string}>} */ + const moduleUpdates = [] + const updateStatusState = { version: null, moduleCount: 0 } + + const SMALL_CATALOGUE_SIZE = 40 const typesInUse = {}; @@ -1825,8 +1831,6 @@ RED.palette.editor = (function() { const updateStatusWidget = $(''); let updateStatusWidgetPopover; - const updateStatusState = { moduleCount: 0 } - let updateAvailable = []; function addUpdateInfoToStatusBar() { updateStatusWidgetPopover = RED.popover.create({ From a8422099ba73c1ceaa2eb272e2d4a2deea732dfe Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Wed, 25 Feb 2026 09:13:33 +0000 Subject: [PATCH 128/160] Add RED.palette.editor.updates prop and event registry:updates-available --- .../editor-client/src/js/ui/palette-editor.js | 40 +++++++++++++------ 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js index cba3f4ba60..0546c315ee 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js @@ -1839,7 +1839,7 @@ RED.palette.editor = (function() { interactive: true, direction: "bottom", content: function () { - const count = updateAvailable.length || 0; + const count = moduleUpdates.length || 0 const content = $('
                  '); if (updateStatusState.version) { $(`
                  ${RED._("telemetry.updateAvailableDesc", updateStatusState)}`).appendTo(content) @@ -1849,7 +1849,7 @@ RED.palette.editor = (function() { updateStatusWidgetPopover.close() RED.actions.invoke("core:manage-palette", { view: "nodes", - filter: '"' + updateAvailable.join('", "') + '"' + filter: '"' + moduleUpdates.map(u => u.package).join('", "') + '"' }); }).appendTo(content) } @@ -1871,7 +1871,7 @@ RED.palette.editor = (function() { function refreshUpdateStatus() { clearTimeout(pendingRefreshTimeout) pendingRefreshTimeout = setTimeout(() => { - updateAvailable = []; + moduleUpdates.length = 0 for (const module of Object.keys(nodeEntries)) { if (loadedIndex.hasOwnProperty(module)) { const moduleInfo = nodeEntries[module].info; @@ -1879,35 +1879,49 @@ RED.palette.editor = (function() { // Module updated continue; } + const current = moduleInfo.version + const latest = loadedIndex[module].version if (updateAllowed && - semVerCompare(loadedIndex[module].version, moduleInfo.version) > 0 && + semVerCompare(latest, current) > 0 && RED.utils.checkModuleAllowed(module, null, updateAllowList, updateDenyList) ) { - updateAvailable.push(module); + moduleUpdates.push({ package: module, current, latest }) } } } - updateStatusState.moduleCount = updateAvailable.length; + updateStatusState.moduleCount = moduleUpdates.length updateStatus(); }, 200) } function updateStatus() { - if (updateStatusState.moduleCount || updateStatusState.version) { + const updates = RED.palette.editor.updates + if (updates.count > 0) { updateStatusWidget.empty(); - let count = updateStatusState.moduleCount || 0; - if (updateStatusState.version) { - count ++ - } - $(` ${RED._("telemetry.updateAvailable", { count: count })}`).appendTo(updateStatusWidget); + $(` ${RED._("telemetry.updateAvailable", { count: updates.count })}`).appendTo(updateStatusWidget); RED.statusBar.show("red-ui-status-package-update"); } else { RED.statusBar.hide("red-ui-status-package-update"); } + RED.events.emit("registry:updates-available", updates) } return { init: init, - install: install + install: install, + get updates() { + const palette = [...moduleUpdates] + let core = null + let count = palette.length + if (updateStatusState.version) { + core = { current: RED.settings.version, latest: updateStatusState.version } + count ++ + } + return { + count, + core, + palette + } + } } })(); From 65d68d27cade47883a1941d42eaf82cd77c38961 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 25 Feb 2026 14:37:01 +0000 Subject: [PATCH 129/160] Allow palette.theme to be set via theme plugin and include icons --- .../editor-api/lib/admin/settings.js | 4 +- .../@node-red/editor-api/lib/editor/theme.js | 219 ++++++++++-------- .../editor-client/src/js/ui/utils.js | 106 +++++---- .../editor-api/lib/editor/theme_spec.js | 8 +- 4 files changed, 196 insertions(+), 141 deletions(-) diff --git a/packages/node_modules/@node-red/editor-api/lib/admin/settings.js b/packages/node_modules/@node-red/editor-api/lib/admin/settings.js index 425d42415e..6939fdfd10 100644 --- a/packages/node_modules/@node-red/editor-api/lib/admin/settings.js +++ b/packages/node_modules/@node-red/editor-api/lib/admin/settings.js @@ -53,10 +53,10 @@ module.exports = { var opts = { user: req.user } - runtimeAPI.settings.getRuntimeSettings(opts).then(function(result) { + runtimeAPI.settings.getRuntimeSettings(opts).then(async function(result) { if (!settings.disableEditor) { result.editorTheme = result.editorTheme||{}; - var themeSettings = theme.settings(); + const themeSettings = await theme.settings(); if (themeSettings) { // result.editorTheme may already exist with the palette // disabled. Need to merge that into the receive settings diff --git a/packages/node_modules/@node-red/editor-api/lib/editor/theme.js b/packages/node_modules/@node-red/editor-api/lib/editor/theme.js index 1917b55fdc..05f4a90539 100644 --- a/packages/node_modules/@node-red/editor-api/lib/editor/theme.js +++ b/packages/node_modules/@node-red/editor-api/lib/editor/theme.js @@ -42,7 +42,13 @@ var defaultContext = { var settings; var theme = null; +/** + * themeContext is an object passed to the mustache template to generate the editor index.html. +*/ var themeContext = clone(defaultContext); +/** + * themeSettings is an object passed to the editor client as the "editorTheme" property of the settings object + */ var themeSettings = null; var activeTheme = null; @@ -91,6 +97,119 @@ function serveFilesFromTheme(themeValue, themeApp, directory, baseDirectory) { return result } +/** + * Check if a theme is enabled and load its settings. + * This is done lazily as it has to happen after the plugins have been loaded, but before the editor is served. + */ +async function loadThemePlugin () { + if (activeTheme && !activeThemeInitialised) { + const themePlugin = await runtimeAPI.plugins.getPlugin({ + id:activeTheme + }); + if (themePlugin) { + if (themePlugin.css) { + const cssFiles = serveFilesFromTheme( + themePlugin.css, + themeApp, + "/css/", + themePlugin.path + ); + themeContext.page.css = cssFiles.concat(themeContext.page.css || []) + // Mutating `theme` is not ideal, but currently necessary as debug (packages/node_modules/@node-red/nodes/core/common/21-debug.js) + // accesses RED.settings.editorTheme.page._.css directly to apply theme to the debug pop-out window. + theme.page = theme.page || {_:{}} + theme.page._.css = cssFiles.concat(theme.page._.css || []) + } + if (themePlugin.scripts) { + const scriptFiles = serveFilesFromTheme( + themePlugin.scripts, + themeApp, + "/scripts/", + themePlugin.path + ) + themeContext.page.scripts = scriptFiles.concat(themeContext.page.scripts || []) + theme.page = theme.page || {_:{}} + theme.page._.scripts = scriptFiles.concat(theme.page._.scripts || []) + } + // check and load page settings from theme + if (themePlugin.page) { + if (themePlugin.page.favicon && !theme.page.favicon) { + const result = serveFilesFromTheme( + [themePlugin.page.favicon], + themeApp, + "/", + themePlugin.path + ) + if(result && result.length > 0) { + // update themeContext page favicon + themeContext.page.favicon = result[0] + } + } + if (themePlugin.page.tabicon && themePlugin.page.tabicon.icon && !theme.page.tabicon) { + const result = serveFilesFromTheme( + [themePlugin.page.tabicon.icon], + themeApp, + "/page/", + themePlugin.path + ) + if(result && result.length > 0) { + // update themeContext page tabicon + themeContext.page.tabicon.icon = result[0] + themeContext.page.tabicon.colour = themeContext.page.tabicon.colour || themeContext.page.tabicon.colour + } + } + // if the plugin has a title AND the users settings.js does NOT + if (themePlugin.page.title && !theme.page.title) { + themeContext.page.title = themePlugin.page.title || themeContext.page.title + } + } + // check and load header settings from theme + if (themePlugin.header) { + if (themePlugin.header.image && !theme.header.image) { + const result = serveFilesFromTheme( + [themePlugin.header.image], + themeApp, + "/header/", + themePlugin.path + ) + if(result && result.length > 0) { + // update themeContext header image + themeContext.header.image = result[0] + } + } + // if the plugin has a title AND the users settings.js does NOT have a title + if (themePlugin.header.title && !theme.header.title) { + themeContext.header.title = themePlugin.header.title || themeContext.header.title + } + // if the plugin has a header url AND the users settings.js does NOT + if (themePlugin.header.url && !theme.header.url) { + themeContext.header.url = themePlugin.header.url || themeContext.header.url + } + } + + if (Array.isArray(themePlugin.palette?.theme)) { + themeSettings.palette = themeSettings.palette || {}; + themeSettings.palette.theme = themePlugin.palette.theme; + // The theme is providing its own palette theme. It *might* include icons that need namespacing + // to the theme plugin module. + themePlugin.palette.theme.forEach(themeRule => { + if (themeRule.icon && themeRule.icon.indexOf("/") === -1) { + themeRule.icon = `${themePlugin.module}/${themeRule.icon}`; + } + }) + } + + // These settings are not exposed under `editorTheme`, so we don't have a merge strategy for them + // If they're defined in the theme plugin, they replace any settings.js values. + // But, this direct manipulation of `theme` is not ideal and relies on mutating a passed-in object + theme.codeEditor = theme.codeEditor || {} + theme.codeEditor.options = Object.assign({}, themePlugin.monacoOptions, theme.codeEditor.options); + theme.mermaid = Object.assign({}, themePlugin.mermaid, theme.mermaid) + } + activeThemeInitialised = true; + } +} + module.exports = { init: function(_settings, _runtimeAPI) { settings = _settings; @@ -232,6 +351,7 @@ module.exports = { res.json(themeContext); }) + // Copy the settings that need passing to the editor into themeSettings. if (theme.hasOwnProperty("menu")) { themeSettings.menu = theme.menu; } @@ -263,104 +383,11 @@ module.exports = { return themeApp; }, context: async function() { - if (activeTheme && !activeThemeInitialised) { - const themePlugin = await runtimeAPI.plugins.getPlugin({ - id:activeTheme - }); - if (themePlugin) { - if (themePlugin.css) { - const cssFiles = serveFilesFromTheme( - themePlugin.css, - themeApp, - "/css/", - themePlugin.path - ); - themeContext.page.css = cssFiles.concat(themeContext.page.css || []) - theme.page = theme.page || {_:{}} - theme.page._.css = cssFiles.concat(theme.page._.css || []) - } - if (themePlugin.scripts) { - const scriptFiles = serveFilesFromTheme( - themePlugin.scripts, - themeApp, - "/scripts/", - themePlugin.path - ) - themeContext.page.scripts = scriptFiles.concat(themeContext.page.scripts || []) - theme.page = theme.page || {_:{}} - theme.page._.scripts = scriptFiles.concat(theme.page._.scripts || []) - } - // check and load page settings from theme - if (themePlugin.page) { - if (themePlugin.page.favicon && !theme.page.favicon) { - const result = serveFilesFromTheme( - [themePlugin.page.favicon], - themeApp, - "/", - themePlugin.path - ) - if(result && result.length > 0) { - // update themeContext page favicon - themeContext.page.favicon = result[0] - theme.page = theme.page || {_:{}} - theme.page._.favicon = result[0] - } - } - if (themePlugin.page.tabicon && themePlugin.page.tabicon.icon && !theme.page.tabicon) { - const result = serveFilesFromTheme( - [themePlugin.page.tabicon.icon], - themeApp, - "/page/", - themePlugin.path - ) - if(result && result.length > 0) { - // update themeContext page tabicon - themeContext.page.tabicon.icon = result[0] - themeContext.page.tabicon.colour = themeContext.page.tabicon.colour || themeContext.page.tabicon.colour - theme.page = theme.page || {_:{}} - theme.page._.tabicon = theme.page._.tabicon || {} - theme.page._.tabicon.icon = themeContext.page.tabicon.icon - theme.page._.tabicon.colour = themeContext.page.tabicon.colour - } - } - // if the plugin has a title AND the users settings.js does NOT - if (themePlugin.page.title && !theme.page.title) { - themeContext.page.title = themePlugin.page.title || themeContext.page.title - } - } - // check and load header settings from theme - if (themePlugin.header) { - if (themePlugin.header.image && !theme.header.image) { - const result = serveFilesFromTheme( - [themePlugin.header.image], - themeApp, - "/header/", - themePlugin.path - ) - if(result && result.length > 0) { - // update themeContext header image - themeContext.header.image = result[0] - } - } - // if the plugin has a title AND the users settings.js does NOT have a title - if (themePlugin.header.title && !theme.header.title) { - themeContext.header.title = themePlugin.header.title || themeContext.header.title - } - // if the plugin has a header url AND the users settings.js does NOT - if (themePlugin.header.url && !theme.header.url) { - themeContext.header.url = themePlugin.header.url || themeContext.header.url - } - } - theme.codeEditor = theme.codeEditor || {} - theme.codeEditor.options = Object.assign({}, themePlugin.monacoOptions, theme.codeEditor.options); - - theme.mermaid = Object.assign({}, themePlugin.mermaid, theme.mermaid) - } - activeThemeInitialised = true; - } + await loadThemePlugin(); return themeContext; }, - settings: function() { + settings: async function() { + await loadThemePlugin(); return themeSettings; }, serveFile: function(baseUrl,file) { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js b/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js index fa91059db0..436cd3221a 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/utils.js @@ -1110,20 +1110,36 @@ RED.utils = (function() { return result; } + /** + * Get the default icon for a given node based on its definition. + * @param {*} def + * @param {*} node + * @returns + */ function getDefaultNodeIcon(def,node) { def = def || {}; var icon_url; if (node && node.type === "subflow") { icon_url = "node-red/subflow.svg"; - } else if (typeof def.icon === "function") { - try { - icon_url = def.icon.call(node); - } catch(err) { - console.log("Definition error: "+def.type+".icon",err); - icon_url = "arrow-in.svg"; - } } else { - icon_url = def.icon; + let themeRule = nodeIconCache[def.type] + if (themeRule === undefined) { + // If undefined, we've not checked the theme yet + nodeIconCache[def.type] = getThemeOverrideForNode(def, 'icon') || null; + themeRule = nodeIconCache[def.type]; + } + if (themeRule) { + icon_url = themeRule.icon; + } else if (typeof def.icon === "function") { + try { + icon_url = def.icon.call(node); + } catch(err) { + console.log("Definition error: "+def.type+".icon",err); + icon_url = "arrow-in.svg"; + } + } else { + icon_url = def.icon; + } } var iconPath = separateIconPath(icon_url); @@ -1249,48 +1265,60 @@ RED.utils = (function() { return label } - var nodeColorCache = {}; + let nodeColorCache = {}; + let nodeIconCache = {} function clearNodeColorCache() { nodeColorCache = {}; } - function getNodeColor(type, def) { - def = def || {}; - var result = def.color; - var paletteTheme = RED.settings.theme('palette.theme') || []; + /** + * Checks if there is a theme override for the given node definition and property + * @param {*} def node definition + * @param {*} property either 'color' or 'icon' + * @returns the theme override value if there is a match, otherwise null + */ + function getThemeOverrideForNode(def, property) { + const paletteTheme = RED.settings.theme('palette.theme') || []; if (paletteTheme.length > 0) { - if (!nodeColorCache.hasOwnProperty(type)) { - nodeColorCache[type] = def.color; - var l = paletteTheme.length; - for (var i = 0; i < l; i++ ){ - var themeRule = paletteTheme[i]; - if (themeRule.hasOwnProperty('category')) { - if (!themeRule.hasOwnProperty('_category')) { - themeRule._category = new RegExp(themeRule.category); - } - if (!themeRule._category.test(def.category)) { - continue; - } + for (let i = 0; i < paletteTheme.length; i++ ){ + const themeRule = paletteTheme[i]; + if (themeRule.hasOwnProperty('category')) { + if (!themeRule.hasOwnProperty('_category')) { + themeRule._category = new RegExp(themeRule.category); } - if (themeRule.hasOwnProperty('type')) { - if (!themeRule.hasOwnProperty('_type')) { - themeRule._type = new RegExp(themeRule.type); - } - if (!themeRule._type.test(type)) { - continue; - } + if (!themeRule._category.test(def.category)) { + continue; + } + } + if (themeRule.hasOwnProperty('type')) { + if (!themeRule.hasOwnProperty('_type')) { + themeRule._type = new RegExp(themeRule.type); + } + if (!themeRule._type.test(def.type)) { + continue; } - nodeColorCache[type] = themeRule.color || def.color; - break; + } + // We have found a rule that matches - now see if it provides the requested property + if (themeRule.hasOwnProperty(property)) { + return themeRule; } } - result = nodeColorCache[type]; } - if (result) { - return result; - } else { - return "#ddd"; + return null; + } + + function getNodeColor(type, def) { + def = def || {}; + if (!nodeColorCache.hasOwnProperty(type)) { + const paletteTheme = RED.settings.theme('palette.theme') || []; + if (paletteTheme.length > 0) { + const themeRule = getThemeOverrideForNode(def, 'color'); + nodeColorCache[type] = themeRule?.color || def.color; + } else { + nodeColorCache[type] = def.color; + } } + return nodeColorCache[type] || "#ddd"; } function addSpinnerOverlay(container,contain) { diff --git a/test/unit/@node-red/editor-api/lib/editor/theme_spec.js b/test/unit/@node-red/editor-api/lib/editor/theme_spec.js index 2c660415f5..a578cd20bb 100644 --- a/test/unit/@node-red/editor-api/lib/editor/theme_spec.js +++ b/test/unit/@node-red/editor-api/lib/editor/theme_spec.js @@ -53,7 +53,7 @@ describe("api/editor/theme", function () { context.asset.should.have.a.property("main", "red/main.min.js"); context.asset.should.have.a.property("vendorMonaco", "vendor/monaco/monaco-bootstrap.js"); - should.not.exist(theme.settings()); + should.not.exist(await theme.settings()); }); it("uses non-minified js files when in dev mode", async function () { @@ -158,7 +158,7 @@ describe("api/editor/theme", function () { context.should.have.a.property("login"); context.login.should.have.a.property("image", "theme/login/image"); - var settings = theme.settings(); + var settings = await theme.settings(); settings.should.have.a.property("deployButton"); settings.deployButton.should.have.a.property("type", "simple"); settings.deployButton.should.have.a.property("label", "Save"); @@ -199,7 +199,7 @@ describe("api/editor/theme", function () { }); - it("test explicit userMenu set to true in theme setting", function () { + it("test explicit userMenu set to true in theme setting", async function () { theme.init({ editorTheme: { userMenu: true, @@ -208,7 +208,7 @@ describe("api/editor/theme", function () { theme.app(); - var settings = theme.settings(); + var settings = await theme.settings(); settings.should.have.a.property("userMenu"); settings.userMenu.should.be.eql(true); From 5b3eb78103c33b139a6a6bab864789328b8a66b6 Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Wed, 25 Feb 2026 15:46:55 +0000 Subject: [PATCH 130/160] Change getter to explicit function: `getAvailableUpdates` --- .../editor-client/src/js/ui/palette-editor.js | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js index 0546c315ee..1a34d1927b 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette-editor.js @@ -1895,7 +1895,7 @@ RED.palette.editor = (function() { } function updateStatus() { - const updates = RED.palette.editor.updates + const updates = RED.palette.editor.getAvailableUpdates() if (updates.count > 0) { updateStatusWidget.empty(); $(` ${RED._("telemetry.updateAvailable", { count: updates.count })}`).appendTo(updateStatusWidget); @@ -1906,22 +1906,24 @@ RED.palette.editor = (function() { RED.events.emit("registry:updates-available", updates) } - return { - init: init, - install: install, - get updates() { - const palette = [...moduleUpdates] - let core = null - let count = palette.length - if (updateStatusState.version) { - core = { current: RED.settings.version, latest: updateStatusState.version } - count ++ - } - return { - count, - core, - palette - } + function getAvailableUpdates () { + const palette = [...moduleUpdates] + let core = null + let count = palette.length + if (updateStatusState.version) { + core = { current: RED.settings.version, latest: updateStatusState.version } + count ++ + } + return { + count, + core, + palette } } + + return { + init, + install, + getAvailableUpdates + } })(); From 97f9ed476a52886c8b2918f2e9f397377b514c8a Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 25 Feb 2026 15:50:40 +0000 Subject: [PATCH 131/160] Ensure config sidebar tooltip handles html content --- .../@node-red/editor-client/src/js/ui/tab-config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-config.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-config.js index 912f0e06fc..22ade35c90 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-config.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-config.js @@ -210,7 +210,7 @@ RED.sidebar.config = (function() { nodeDiv.addClass("red-ui-palette-node-config-invalid"); RED.popover.tooltip(nodeDivAnnotations, function () { if (node.validationErrors && node.validationErrors.length > 0) { - return RED._("editor.errors.invalidProperties") + "
                  - " + node.validationErrors.join("
                  - "); + return $('' + RED._("editor.errors.invalidProperties") + "
                  - " + node.validationErrors.join("
                  - ") + '
                  '); } }) } From 35e3034378ff6b00fcc79668d5900ab8275c668e Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 25 Feb 2026 17:38:53 +0000 Subject: [PATCH 132/160] Bump dependencies --- package-lock.json | 571 ++++++++---------- package.json | 20 +- .../@node-red/editor-api/package.json | 2 +- .../node_modules/@node-red/nodes/package.json | 8 +- .../@node-red/registry/package.json | 4 +- .../@node-red/runtime/package.json | 4 +- packages/node_modules/node-red/package.json | 4 +- 7 files changed, 271 insertions(+), 342 deletions(-) diff --git a/package-lock.json b/package-lock.json index 893944b5d7..dd62113ddc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,12 +9,12 @@ "version": "4.1.5", "license": "Apache-2.0", "dependencies": { - "acorn": "8.15.0", - "acorn-walk": "8.3.4", - "ajv": "8.17.1", + "acorn": "8.16.0", + "acorn-walk": "8.3.5", + "ajv": "8.18.0", "async-mutex": "0.5.0", "basic-auth": "2.0.1", - "bcryptjs": "3.0.2", + "bcryptjs": "3.0.3", "body-parser": "1.20.4", "chalk": "^4.1.2", "cheerio": "1.0.0-rc.10", @@ -45,7 +45,7 @@ "mime": "3.0.0", "moment": "2.30.1", "moment-timezone": "0.5.48", - "mqtt": "5.11.0", + "mqtt": "5.15.0", "multer": "2.0.2", "mustache": "4.2.0", "node-red-admin": "^4.1.3", @@ -57,9 +57,9 @@ "passport-http-bearer": "1.0.1", "passport-oauth2-client-password": "0.1.2", "raw-body": "3.0.0", - "rfdc": "^1.3.1", - "semver": "7.7.1", - "tar": "7.5.7", + "rfdc": "1.4.1", + "semver": "7.7.4", + "tar": "7.5.9", "tough-cookie": "5.1.2", "uglify-js": "3.19.3", "uuid": "9.0.1", @@ -91,11 +91,11 @@ "jquery-i18next": "1.2.1", "jsdoc-nr-template": "github:node-red/jsdoc-nr-template", "marked": "4.3.0", - "mermaid": "11.9.0", + "mermaid": "11.12.3", "minami": "1.2.3", "mocha": "9.2.2", "node-red-node-test-helper": "^0.3.3", - "nodemon": "3.1.9", + "nodemon": "3.1.14", "proxy": "^1.0.2", "sass": "1.62.1", "should": "13.2.3", @@ -124,16 +124,6 @@ "url": "https://github.com/sponsors/antfu" } }, - "node_modules/@antfu/utils": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-8.1.1.tgz", - "integrity": "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -213,9 +203,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", - "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -302,60 +292,46 @@ "license": "MIT" }, "node_modules/@chevrotain/cst-dts-gen": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", - "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.1.1.tgz", + "integrity": "sha512-fRHyv6/f542qQqiRGalrfJl/evD39mAvbJLCekPazhiextEatq1Jx1K/i9gSd5NNO0ds03ek0Cbo/4uVKmOBcw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@chevrotain/gast": "11.0.3", - "@chevrotain/types": "11.0.3", - "lodash-es": "4.17.21" + "@chevrotain/gast": "11.1.1", + "@chevrotain/types": "11.1.1", + "lodash-es": "4.17.23" } }, - "node_modules/@chevrotain/cst-dts-gen/node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true, - "license": "MIT" - }, "node_modules/@chevrotain/gast": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", - "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.1.1.tgz", + "integrity": "sha512-Ko/5vPEYy1vn5CbCjjvnSO4U7GgxyGm+dfUZZJIWTlQFkXkyym0jFYrWEU10hyCjrA7rQtiHtBr0EaZqvHFZvg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@chevrotain/types": "11.0.3", - "lodash-es": "4.17.21" + "@chevrotain/types": "11.1.1", + "lodash-es": "4.17.23" } }, - "node_modules/@chevrotain/gast/node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true, - "license": "MIT" - }, "node_modules/@chevrotain/regexp-to-ast": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", - "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.1.1.tgz", + "integrity": "sha512-ctRw1OKSXkOrR8VTvOxrQ5USEc4sNrfwXHa1NuTcR7wre4YbjPcKw+82C2uylg/TEwFRgwLmbhlln4qkmDyteg==", "dev": true, "license": "Apache-2.0" }, "node_modules/@chevrotain/types": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", - "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.1.1.tgz", + "integrity": "sha512-wb2ToxG8LkgPYnKe9FH8oGn3TMCBdnwiuNC5l5y+CtlaVRbCytU0kbVsk6CGrqTL4ZN4ksJa0TXOYbxpbthtqw==", "dev": true, "license": "Apache-2.0" }, "node_modules/@chevrotain/utils": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", - "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.1.1.tgz", + "integrity": "sha512-71eTYMzYXYSFPrbg/ZwftSaSDld7UYlS8OQa3lNnn9jzNtpFbaReRRyghzqS7rI3CDaorqpPJJcXGHK+FE1TVQ==", "dev": true, "license": "Apache-2.0" }, @@ -398,47 +374,17 @@ "license": "MIT" }, "node_modules/@iconify/utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.3.0.tgz", - "integrity": "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.0.tgz", + "integrity": "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==", "dev": true, "license": "MIT", "dependencies": { - "@antfu/install-pkg": "^1.0.0", - "@antfu/utils": "^8.1.0", + "@antfu/install-pkg": "^1.1.0", "@iconify/types": "^2.0.0", - "debug": "^4.4.0", - "globals": "^15.14.0", - "kolorist": "^1.8.0", - "local-pkg": "^1.0.0", - "mlly": "^1.7.4" - } - }, - "node_modules/@iconify/utils/node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "mlly": "^1.8.0" } }, - "node_modules/@iconify/utils/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, "node_modules/@isaacs/fs-minipass": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", @@ -504,13 +450,13 @@ } }, "node_modules/@mermaid-js/parser": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.6.3.tgz", - "integrity": "sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.0.0.tgz", + "integrity": "sha512-vvK0Hi/VWndxoh03Mmz6wa1KDriSPjS2XMZL/1l19HFwygiObEEoEwSDxOqyLzzAI6J2PU3261JjTMTO7x+BPw==", "dev": true, "license": "MIT", "dependencies": { - "langium": "3.3.1" + "langium": "^4.0.0" } }, "node_modules/@napi-rs/wasm-runtime": { @@ -860,6 +806,23 @@ "node": ">= 14" } }, + "node_modules/@prantlf/jsonlint/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/@sindresorhus/is": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", @@ -1329,9 +1292,9 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -1341,9 +1304,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", "license": "MIT", "dependencies": { "acorn": "^8.11.0" @@ -1398,9 +1361,9 @@ "license": "MIT" }, "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", @@ -1839,9 +1802,9 @@ "dev": true }, "node_modules/bcryptjs": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.2.tgz", - "integrity": "sha512-k38b3XOZKv60C4E2hVsXTolJWfkGRMbILBIe2IBITXciy5bOsTKot5kDrf3ZfufQtQOUN5mXceUEpU1rTl9Uog==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.3.tgz", + "integrity": "sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==", "license": "BSD-3-Clause", "bin": { "bcrypt": "bin/bcrypt" @@ -2016,6 +1979,18 @@ "node": ">=8" } }, + "node_modules/broker-factory": { + "version": "3.1.13", + "resolved": "https://registry.npmjs.org/broker-factory/-/broker-factory-3.1.13.tgz", + "integrity": "sha512-H2VALe31mEtO/SRcNp4cUU5BAm1biwhc/JaF77AigUuni/1YT0FLCJfbUxwIEs9y6Kssjk2fmXgf+Y9ALvmKlw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "fast-unique-numbers": "^9.0.26", + "tslib": "^2.8.1", + "worker-factory": "^7.0.48" + } + }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -2267,18 +2242,18 @@ } }, "node_modules/chevrotain": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", - "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.1.1.tgz", + "integrity": "sha512-f0yv5CPKaFxfsPTBzX7vGuim4oIC1/gcS7LUGdBSwl2dU6+FON6LVUksdOo1qJjoUvXNn45urgh8C+0a24pACQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@chevrotain/cst-dts-gen": "11.0.3", - "@chevrotain/gast": "11.0.3", - "@chevrotain/regexp-to-ast": "11.0.3", - "@chevrotain/types": "11.0.3", - "@chevrotain/utils": "11.0.3", - "lodash-es": "4.17.21" + "@chevrotain/cst-dts-gen": "11.1.1", + "@chevrotain/gast": "11.1.1", + "@chevrotain/regexp-to-ast": "11.1.1", + "@chevrotain/types": "11.1.1", + "@chevrotain/utils": "11.1.1", + "lodash-es": "4.17.23" } }, "node_modules/chevrotain-allstar": { @@ -2294,13 +2269,6 @@ "chevrotain": "^11.0.0" } }, - "node_modules/chevrotain/node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true, - "license": "MIT" - }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -2624,9 +2592,9 @@ } }, "node_modules/confbox": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", - "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", "dev": true, "license": "MIT" }, @@ -3184,9 +3152,9 @@ } }, "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", "dev": true, "license": "ISC", "engines": { @@ -3442,9 +3410,9 @@ } }, "node_modules/dagre-d3-es": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.11.tgz", - "integrity": "sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.13.tgz", + "integrity": "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==", "dev": true, "license": "MIT", "dependencies": { @@ -4125,13 +4093,6 @@ ], "license": "MIT" }, - "node_modules/exsolve": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", - "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", - "dev": true, - "license": "MIT" - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -4170,16 +4131,16 @@ "license": "MIT" }, "node_modules/fast-unique-numbers": { - "version": "8.0.13", - "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-8.0.13.tgz", - "integrity": "sha512-7OnTFAVPefgw2eBJ1xj2PGGR9FwYzSUso9decayHgCDX4sJkHLdcsYTytTg+tYv+wKF3U8gJuSBz2jJpQV4u/g==", + "version": "9.0.26", + "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-9.0.26.tgz", + "integrity": "sha512-3Mtq8p1zQinjGyWfKeuBunbuFoixG72AUkk4VvzbX4ykCW9Q4FzRaNyIlfQhUjnKw2ARVP+/CKnoyr6wfHftig==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.23.8", - "tslib": "^2.6.2" + "@babel/runtime": "^7.28.6", + "tslib": "^2.8.1" }, "engines": { - "node": ">=16.1.0" + "node": ">=18.2.0" } }, "node_modules/fast-uri": { @@ -4777,19 +4738,6 @@ "which": "bin/which" } }, - "node_modules/globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globule": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", @@ -6399,9 +6347,9 @@ } }, "node_modules/jsdoc-api/node_modules/markdown-it": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", - "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", "dev": true, "license": "MIT", "dependencies": { @@ -6772,28 +6720,22 @@ "graceful-fs": "^4.1.9" } }, - "node_modules/kolorist": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", - "dev": true, - "license": "MIT" - }, "node_modules/langium": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz", - "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/langium/-/langium-4.2.1.tgz", + "integrity": "sha512-zu9QWmjpzJcomzdJQAHgDVhLGq5bLosVak1KVa40NzQHXfqr4eAHupvnPOVXEoLkg6Ocefvf/93d//SB7du4YQ==", "dev": true, "license": "MIT", "dependencies": { - "chevrotain": "~11.0.3", - "chevrotain-allstar": "~0.3.0", + "chevrotain": "~11.1.1", + "chevrotain-allstar": "~0.3.1", "vscode-languageserver": "~9.0.1", "vscode-languageserver-textdocument": "~1.0.11", - "vscode-uri": "~3.0.8" + "vscode-uri": "~3.1.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=20.10.0", + "npm": ">=10.2.3" } }, "node_modules/layout-base": { @@ -6952,24 +6894,6 @@ "node": ">=4" } }, - "node_modules/local-pkg": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", - "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", - "dev": true, - "license": "MIT", - "dependencies": { - "mlly": "^1.7.4", - "pkg-types": "^2.3.0", - "quansync": "^0.2.11" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -6987,16 +6911,16 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", "dev": true, "license": "MIT" }, "node_modules/lodash-es": { - "version": "4.17.22", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.22.tgz", - "integrity": "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", "dev": true, "license": "MIT" }, @@ -7327,28 +7251,28 @@ } }, "node_modules/mermaid": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.9.0.tgz", - "integrity": "sha512-YdPXn9slEwO0omQfQIsW6vS84weVQftIyyTGAZCwM//MGhPzL1+l6vO6bkf0wnP4tHigH1alZ5Ooy3HXI2gOag==", + "version": "11.12.3", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.12.3.tgz", + "integrity": "sha512-wN5ZSgJQIC+CHJut9xaKWsknLxaFBwCPwPkGTSUYrTiHORWvpT8RxGk849HPnpUAQ+/9BPRqYb80jTpearrHzQ==", "dev": true, "license": "MIT", "dependencies": { - "@braintree/sanitize-url": "^7.0.4", - "@iconify/utils": "^2.1.33", - "@mermaid-js/parser": "^0.6.2", + "@braintree/sanitize-url": "^7.1.1", + "@iconify/utils": "^3.0.1", + "@mermaid-js/parser": "^1.0.0", "@types/d3": "^7.4.3", "cytoscape": "^3.29.3", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.2.0", "d3": "^7.9.0", "d3-sankey": "^0.12.3", - "dagre-d3-es": "7.0.11", - "dayjs": "^1.11.13", + "dagre-d3-es": "7.0.13", + "dayjs": "^1.11.18", "dompurify": "^3.2.5", "katex": "^0.16.22", "khroma": "^2.1.0", - "lodash-es": "^4.17.21", - "marked": "^16.0.0", + "lodash-es": "^4.17.23", + "marked": "^16.2.1", "roughjs": "^4.6.6", "stylis": "^4.3.6", "ts-dedent": "^2.2.0", @@ -7532,25 +7456,6 @@ "ufo": "^1.6.1" } }, - "node_modules/mlly/node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/mlly/node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, "node_modules/mocha": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", @@ -7666,9 +7571,9 @@ } }, "node_modules/mocha/node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -7749,28 +7654,27 @@ } }, "node_modules/mqtt": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-5.11.0.tgz", - "integrity": "sha512-VDqfADTNvohwcY02NgxPb7OojIeDrNQ1q62r/DcM+bnIWY8LBi3nMTvdEaFEp6Bu4ejBIpHjJVthUEgnvGLemA==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-5.15.0.tgz", + "integrity": "sha512-KC+wAssYk83Qu5bT8YDzDYgUJxPhbLeVsDvpY2QvL28PnXYJzC2WkKruyMUgBAZaQ7h9lo9k2g4neRNUUxzgMw==", "license": "MIT", "dependencies": { - "@types/readable-stream": "^4.0.18", - "@types/ws": "^8.5.14", + "@types/readable-stream": "^4.0.21", + "@types/ws": "^8.18.1", "commist": "^3.2.0", "concat-stream": "^2.0.0", - "debug": "^4.4.0", + "debug": "^4.4.1", "help-me": "^5.0.0", "lru-cache": "^10.4.3", "minimist": "^1.2.8", "mqtt-packet": "^9.0.2", "number-allocator": "^1.0.14", "readable-stream": "^4.7.0", - "reinterval": "^1.1.0", "rfdc": "^1.4.1", - "socks": "^2.8.3", + "socks": "^2.8.6", "split2": "^4.2.0", - "worker-timers": "^7.1.8", - "ws": "^8.18.0" + "worker-timers": "^8.0.23", + "ws": "^8.18.3" }, "bin": { "mqtt": "build/bin/mqtt.js", @@ -8077,6 +7981,15 @@ "node": ">=6" } }, + "node_modules/node-red-admin/node_modules/bcryptjs": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.2.tgz", + "integrity": "sha512-k38b3XOZKv60C4E2hVsXTolJWfkGRMbILBIe2IBITXciy5bOsTKot5kDrf3ZfufQtQOUN5mXceUEpU1rTl9Uog==", + "license": "BSD-3-Clause", + "bin": { + "bcrypt": "bin/bcrypt" + } + }, "node_modules/node-red-node-test-helper": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/node-red-node-test-helper/-/node-red-node-test-helper-0.3.5.tgz", @@ -8226,16 +8139,16 @@ } }, "node_modules/nodemon": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.9.tgz", - "integrity": "sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==", + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.14.tgz", + "integrity": "sha512-jakjZi93UtB3jHMWsXL68FXSAosbLfY0In5gtKq3niLSkrWznrVBzXFNOEMJUfc9+Ke7SHWoAZsiMkNP3vq6Jw==", "dev": true, "license": "MIT", "dependencies": { "chokidar": "^3.5.2", "debug": "^4", "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", + "minimatch": "^10.2.1", "pstree.remy": "^1.1.8", "semver": "^7.5.3", "simple-update-notifier": "^2.0.0", @@ -8254,6 +8167,29 @@ "url": "https://opencollective.com/nodemon" } }, + "node_modules/nodemon/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/nodemon/node_modules/brace-expansion": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/nodemon/node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -8283,16 +8219,19 @@ } }, "node_modules/nodemon/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.3.tgz", + "integrity": "sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^5.0.2" }, "engines": { - "node": "*" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/nodemon/node_modules/ms": { @@ -9348,15 +9287,15 @@ } }, "node_modules/pkg-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", - "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", "dev": true, "license": "MIT", "dependencies": { - "confbox": "^0.2.2", - "exsolve": "^1.0.7", - "pathe": "^2.0.3" + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" } }, "node_modules/points-on-curve": { @@ -9511,9 +9450,9 @@ } }, "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -9525,23 +9464,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/quansync": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", - "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/antfu" - }, - { - "type": "individual", - "url": "https://github.com/sponsors/sxzz" - } - ], - "license": "MIT" - }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -9785,9 +9707,9 @@ } }, "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, "license": "ISC", "dependencies": { @@ -9883,12 +9805,6 @@ "node": ">=0.10.0" } }, - "node_modules/reinterval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", - "integrity": "sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==", - "license": "MIT" - }, "node_modules/release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -10129,9 +10045,9 @@ "license": "BlueOak-1.0.0" }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -11012,9 +10928,9 @@ "dev": true }, "node_modules/tar": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.7.tgz", - "integrity": "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==", + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz", + "integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==", "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", @@ -11357,9 +11273,9 @@ "license": "MIT" }, "node_modules/ufo": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.2.tgz", - "integrity": "sha512-heMioaxBcG9+Znsda5Q8sQbWnLJSl98AFDXTO80wELWEzX3hordXsTdxrIfMQoO9IY1MEnoGoPjpoKpMj+Yx0Q==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", "dev": true, "license": "MIT" }, @@ -11572,9 +11488,9 @@ "license": "MIT" }, "node_modules/vscode-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", - "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", "dev": true, "license": "MIT" }, @@ -11685,38 +11601,51 @@ "node": ">=0.10.0" } }, + "node_modules/worker-factory": { + "version": "7.0.48", + "resolved": "https://registry.npmjs.org/worker-factory/-/worker-factory-7.0.48.tgz", + "integrity": "sha512-CGmBy3tJvpBPjUvb0t4PrpKubUsfkI1Ohg0/GGFU2RvA9j/tiVYwKU8O7yu7gH06YtzbeJLzdUR29lmZKn5pag==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "fast-unique-numbers": "^9.0.26", + "tslib": "^2.8.1" + } + }, "node_modules/worker-timers": { - "version": "7.1.8", - "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-7.1.8.tgz", - "integrity": "sha512-R54psRKYVLuzff7c1OTFcq/4Hue5Vlz4bFtNEIarpSiCYhpifHU3aIQI29S84o1j87ePCYqbmEJPqwBTf+3sfw==", + "version": "8.0.30", + "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-8.0.30.tgz", + "integrity": "sha512-8P7YoMHWN0Tz7mg+9oEhuZdjBIn2z6gfjlJqFcHiDd9no/oLnMGCARCDkV1LR3ccQus62ZdtIp7t3aTKrMLHOg==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.24.5", - "tslib": "^2.6.2", - "worker-timers-broker": "^6.1.8", - "worker-timers-worker": "^7.0.71" + "@babel/runtime": "^7.28.6", + "tslib": "^2.8.1", + "worker-timers-broker": "^8.0.15", + "worker-timers-worker": "^9.0.13" } }, "node_modules/worker-timers-broker": { - "version": "6.1.8", - "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-6.1.8.tgz", - "integrity": "sha512-FUCJu9jlK3A8WqLTKXM9E6kAmI/dR1vAJ8dHYLMisLNB/n3GuaFIjJ7pn16ZcD1zCOf7P6H62lWIEBi+yz/zQQ==", + "version": "8.0.15", + "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-8.0.15.tgz", + "integrity": "sha512-Te+EiVUMzG5TtHdmaBZvBrZSFNauym6ImDaCAnzQUxvjnw+oGjMT2idmAOgDy30vOZMLejd0bcsc90Axu6XPWA==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.24.5", - "fast-unique-numbers": "^8.0.13", - "tslib": "^2.6.2", - "worker-timers-worker": "^7.0.71" + "@babel/runtime": "^7.28.6", + "broker-factory": "^3.1.13", + "fast-unique-numbers": "^9.0.26", + "tslib": "^2.8.1", + "worker-timers-worker": "^9.0.13" } }, "node_modules/worker-timers-worker": { - "version": "7.0.71", - "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-7.0.71.tgz", - "integrity": "sha512-ks/5YKwZsto1c2vmljroppOKCivB/ma97g9y77MAAz2TBBjPPgpoOiS1qYQKIgvGTr2QYPT3XhJWIB6Rj2MVPQ==", + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-9.0.13.tgz", + "integrity": "sha512-qjn18szGb1kjcmh2traAdki1eiIS5ikFo+L90nfMOvSRpuDw1hAcR1nzkP2+Hkdqz5thIRnfuWx7QSpsEUsA6Q==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.24.5", - "tslib": "^2.6.2" + "@babel/runtime": "^7.28.6", + "tslib": "^2.8.1", + "worker-factory": "^7.0.48" } }, "node_modules/workerpool": { @@ -11969,9 +11898,9 @@ } }, "node_modules/zip-stream/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index 7495077521..0fcd2e643f 100644 --- a/package.json +++ b/package.json @@ -26,12 +26,12 @@ } ], "dependencies": { - "acorn": "8.15.0", - "acorn-walk": "8.3.4", - "ajv": "8.17.1", + "acorn": "8.16.0", + "acorn-walk": "8.3.5", + "ajv": "8.18.0", "async-mutex": "0.5.0", "basic-auth": "2.0.1", - "bcryptjs": "3.0.2", + "bcryptjs": "3.0.3", "body-parser": "1.20.4", "chalk": "^4.1.2", "cheerio": "1.0.0-rc.10", @@ -62,7 +62,7 @@ "mime": "3.0.0", "moment": "2.30.1", "moment-timezone": "0.5.48", - "mqtt": "5.11.0", + "mqtt": "5.15.0", "multer": "2.0.2", "mustache": "4.2.0", "node-red-admin": "^4.1.3", @@ -74,9 +74,9 @@ "passport-http-bearer": "1.0.1", "passport-oauth2-client-password": "0.1.2", "raw-body": "3.0.0", - "rfdc": "^1.3.1", - "semver": "7.7.1", - "tar": "7.5.7", + "rfdc": "1.4.1", + "semver": "7.7.4", + "tar": "7.5.9", "tough-cookie": "5.1.2", "uglify-js": "3.19.3", "uuid": "9.0.1", @@ -111,11 +111,11 @@ "jquery-i18next": "1.2.1", "jsdoc-nr-template": "github:node-red/jsdoc-nr-template", "marked": "4.3.0", - "mermaid": "11.9.0", + "mermaid": "11.12.3", "minami": "1.2.3", "mocha": "9.2.2", "node-red-node-test-helper": "^0.3.3", - "nodemon": "3.1.9", + "nodemon": "3.1.14", "proxy": "^1.0.2", "sass": "1.62.1", "should": "13.2.3", diff --git a/packages/node_modules/@node-red/editor-api/package.json b/packages/node_modules/@node-red/editor-api/package.json index ae3e71997e..12fae085e2 100644 --- a/packages/node_modules/@node-red/editor-api/package.json +++ b/packages/node_modules/@node-red/editor-api/package.json @@ -18,7 +18,7 @@ "dependencies": { "@node-red/util": "4.1.5", "@node-red/editor-client": "4.1.5", - "bcryptjs": "3.0.2", + "bcryptjs": "3.0.3", "body-parser": "1.20.4", "clone": "2.1.2", "cors": "2.8.5", diff --git a/packages/node_modules/@node-red/nodes/package.json b/packages/node_modules/@node-red/nodes/package.json index f5df3c5444..a04eeb0a8f 100644 --- a/packages/node_modules/@node-red/nodes/package.json +++ b/packages/node_modules/@node-red/nodes/package.json @@ -15,9 +15,9 @@ } ], "dependencies": { - "acorn": "8.15.0", - "acorn-walk": "8.3.4", - "ajv": "8.17.1", + "acorn": "8.16.0", + "acorn-walk": "8.3.5", + "ajv": "8.18.0", "body-parser": "1.20.4", "cheerio": "1.0.0-rc.10", "content-type": "1.0.5", @@ -35,7 +35,7 @@ "is-utf8": "0.2.1", "js-yaml": "4.1.1", "media-typer": "1.1.0", - "mqtt": "5.11.0", + "mqtt": "5.15.0", "multer": "2.0.2", "mustache": "4.2.0", "node-watch": "0.7.4", diff --git a/packages/node_modules/@node-red/registry/package.json b/packages/node_modules/@node-red/registry/package.json index c864aa7635..45fb1c2f83 100644 --- a/packages/node_modules/@node-red/registry/package.json +++ b/packages/node_modules/@node-red/registry/package.json @@ -19,8 +19,8 @@ "@node-red/util": "4.1.5", "clone": "2.1.2", "fs-extra": "11.3.0", - "semver": "7.7.1", - "tar": "7.5.7", + "semver": "7.7.4", + "tar": "7.5.9", "uglify-js": "3.19.3" } } diff --git a/packages/node_modules/@node-red/runtime/package.json b/packages/node_modules/@node-red/runtime/package.json index b0094b491a..885037fe55 100644 --- a/packages/node_modules/@node-red/runtime/package.json +++ b/packages/node_modules/@node-red/runtime/package.json @@ -25,7 +25,7 @@ "fs-extra": "11.3.0", "got": "12.6.1", "json-stringify-safe": "5.0.1", - "rfdc": "^1.3.1", - "semver": "7.7.1" + "rfdc": "1.4.1", + "semver": "7.7.4" } } diff --git a/packages/node_modules/node-red/package.json b/packages/node_modules/node-red/package.json index c2ba1aba5e..f9704be62b 100644 --- a/packages/node_modules/node-red/package.json +++ b/packages/node_modules/node-red/package.json @@ -36,13 +36,13 @@ "@node-red/util": "4.1.5", "@node-red/nodes": "4.1.5", "basic-auth": "2.0.1", - "bcryptjs": "3.0.2", + "bcryptjs": "3.0.3", "cors": "2.8.5", "express": "4.22.1", "fs-extra": "11.3.0", "node-red-admin": "^4.1.3", "nopt": "5.0.0", - "semver": "7.7.1" + "semver": "7.7.4" }, "optionalDependencies": { "@node-rs/bcrypt": "1.10.7" From b671813459e803d9f982305d219ac0cb5279ef66 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 25 Feb 2026 17:44:41 +0000 Subject: [PATCH 133/160] Bump for 4.1.6 release --- CHANGELOG.md | 11 +++++++++++ package-lock.json | 4 ++-- package.json | 2 +- .../node_modules/@node-red/editor-api/package.json | 6 +++--- .../node_modules/@node-red/editor-client/package.json | 2 +- packages/node_modules/@node-red/nodes/package.json | 2 +- packages/node_modules/@node-red/registry/package.json | 4 ++-- packages/node_modules/@node-red/runtime/package.json | 6 +++--- packages/node_modules/@node-red/util/package.json | 2 +- packages/node_modules/node-red/package.json | 10 +++++----- 10 files changed, 30 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 07c157944c..48b1d684f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +#### 4.1.6: Maintenance Release + + - Allow palette.theme to be set via theme plugin and include icons (#5500) @knolleary + - Ensure config sidebar tooltip handles html content (#5501) @knolleary + - Allow node-red integrator access to available updates (#5499) @Steve-Mcl + - Add frontend pre and post debug message hooks (#5495) @Steve-Mcl + - Fix: allow middle-click panning over links and ports (#5496) @lklivingstone + - Support ctrl key to select configuration nodes (#5486) @kazuhitoyokoi + - Add § as shortcut meta-key (#5482) @gorenje + - Update dependencies (#5502) @knolleary + #### 4.1.5: Maintenance Release - chore: bump tar to 7.5.7 (#5472) @bryopsida diff --git a/package-lock.json b/package-lock.json index dd62113ddc..28a2951ccb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "node-red", - "version": "4.1.5", + "version": "4.1.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "node-red", - "version": "4.1.5", + "version": "4.1.6", "license": "Apache-2.0", "dependencies": { "acorn": "8.16.0", diff --git a/package.json b/package.json index 0fcd2e643f..644ac4fbde 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "4.1.5", + "version": "4.1.6", "description": "Low-code programming for event-driven applications", "homepage": "https://nodered.org", "license": "Apache-2.0", diff --git a/packages/node_modules/@node-red/editor-api/package.json b/packages/node_modules/@node-red/editor-api/package.json index 12fae085e2..8ecd4de831 100644 --- a/packages/node_modules/@node-red/editor-api/package.json +++ b/packages/node_modules/@node-red/editor-api/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/editor-api", - "version": "4.1.5", + "version": "4.1.6", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/util": "4.1.5", - "@node-red/editor-client": "4.1.5", + "@node-red/util": "4.1.6", + "@node-red/editor-client": "4.1.6", "bcryptjs": "3.0.3", "body-parser": "1.20.4", "clone": "2.1.2", diff --git a/packages/node_modules/@node-red/editor-client/package.json b/packages/node_modules/@node-red/editor-client/package.json index f0f4886347..e1ad698678 100644 --- a/packages/node_modules/@node-red/editor-client/package.json +++ b/packages/node_modules/@node-red/editor-client/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/editor-client", - "version": "4.1.5", + "version": "4.1.6", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/nodes/package.json b/packages/node_modules/@node-red/nodes/package.json index a04eeb0a8f..2abf14d3f6 100644 --- a/packages/node_modules/@node-red/nodes/package.json +++ b/packages/node_modules/@node-red/nodes/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/nodes", - "version": "4.1.5", + "version": "4.1.6", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/@node-red/registry/package.json b/packages/node_modules/@node-red/registry/package.json index 45fb1c2f83..e48b00a758 100644 --- a/packages/node_modules/@node-red/registry/package.json +++ b/packages/node_modules/@node-red/registry/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/registry", - "version": "4.1.5", + "version": "4.1.6", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,7 +16,7 @@ } ], "dependencies": { - "@node-red/util": "4.1.5", + "@node-red/util": "4.1.6", "clone": "2.1.2", "fs-extra": "11.3.0", "semver": "7.7.4", diff --git a/packages/node_modules/@node-red/runtime/package.json b/packages/node_modules/@node-red/runtime/package.json index 885037fe55..f9e30ee7d8 100644 --- a/packages/node_modules/@node-red/runtime/package.json +++ b/packages/node_modules/@node-red/runtime/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/runtime", - "version": "4.1.5", + "version": "4.1.6", "license": "Apache-2.0", "main": "./lib/index.js", "repository": { @@ -16,8 +16,8 @@ } ], "dependencies": { - "@node-red/registry": "4.1.5", - "@node-red/util": "4.1.5", + "@node-red/registry": "4.1.6", + "@node-red/util": "4.1.6", "async-mutex": "0.5.0", "clone": "2.1.2", "cronosjs": "1.7.1", diff --git a/packages/node_modules/@node-red/util/package.json b/packages/node_modules/@node-red/util/package.json index 907dd3baf9..574381ac44 100644 --- a/packages/node_modules/@node-red/util/package.json +++ b/packages/node_modules/@node-red/util/package.json @@ -1,6 +1,6 @@ { "name": "@node-red/util", - "version": "4.1.5", + "version": "4.1.6", "license": "Apache-2.0", "repository": { "type": "git", diff --git a/packages/node_modules/node-red/package.json b/packages/node_modules/node-red/package.json index f9704be62b..c68daf52cf 100644 --- a/packages/node_modules/node-red/package.json +++ b/packages/node_modules/node-red/package.json @@ -1,6 +1,6 @@ { "name": "node-red", - "version": "4.1.5", + "version": "4.1.6", "description": "Low-code programming for event-driven applications", "homepage": "https://nodered.org", "license": "Apache-2.0", @@ -31,10 +31,10 @@ "flow" ], "dependencies": { - "@node-red/editor-api": "4.1.5", - "@node-red/runtime": "4.1.5", - "@node-red/util": "4.1.5", - "@node-red/nodes": "4.1.5", + "@node-red/editor-api": "4.1.6", + "@node-red/runtime": "4.1.6", + "@node-red/util": "4.1.6", + "@node-red/nodes": "4.1.6", "basic-auth": "2.0.1", "bcryptjs": "3.0.3", "cors": "2.8.5", From 0b82546ae0da85f375ae13eaa31f9a46517668d6 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 26 Feb 2026 10:24:54 +0000 Subject: [PATCH 134/160] Add lock file back --- package-lock.json | 11915 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 11915 insertions(+) create mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..5eaf54d217 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,11915 @@ +{ + "name": "node-red", + "version": "5.0.0-beta.2", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "node-red", + "version": "5.0.0-beta.2", + "license": "Apache-2.0", + "dependencies": { + "@node-rs/bcrypt": "^1.10.7", + "acorn": "8.16.0", + "acorn-walk": "8.3.5", + "ajv": "8.18.0", + "async-mutex": "0.5.0", + "basic-auth": "2.0.1", + "bcryptjs": "3.0.3", + "body-parser": "1.20.4", + "chalk": "^4.1.2", + "cheerio": "1.0.0-rc.10", + "clone": "2.1.2", + "content-type": "1.0.5", + "cookie": "0.7.2", + "cookie-parser": "1.4.7", + "cors": "2.8.5", + "cronosjs": "1.7.1", + "denque": "2.1.0", + "express": "4.22.1", + "express-session": "1.18.2", + "form-data": "4.0.4", + "fs-extra": "11.3.0", + "got": "12.6.1", + "hash-sum": "2.0.0", + "hpagent": "1.2.0", + "https-proxy-agent": "5.0.1", + "i18next": "24.2.3", + "iconv-lite": "0.6.3", + "is-utf8": "0.2.1", + "js-yaml": "4.1.1", + "json-stringify-safe": "5.0.1", + "jsonata": "2.0.6", + "lodash.clonedeep": "^4.5.0", + "media-typer": "1.1.0", + "memorystore": "1.6.7", + "mime": "3.0.0", + "moment": "2.30.1", + "moment-timezone": "0.5.48", + "mqtt": "5.15.0", + "multer": "2.0.2", + "mustache": "4.2.0", + "node-red-admin": "^4.1.3", + "node-watch": "0.7.4", + "nopt": "5.0.0", + "oauth2orize": "1.12.0", + "on-headers": "1.1.0", + "passport": "0.7.0", + "passport-http-bearer": "1.0.1", + "passport-oauth2-client-password": "0.1.2", + "raw-body": "3.0.0", + "rfdc": "1.4.1", + "semver": "7.7.4", + "tar": "7.5.9", + "tough-cookie": "5.1.2", + "uglify-js": "3.19.3", + "uuid": "9.0.1", + "ws": "7.5.10", + "xml2js": "0.6.2" + }, + "devDependencies": { + "dompurify": "3.2.6", + "grunt": "1.6.1", + "grunt-chmod": "~1.1.1", + "grunt-cli": "~1.5.0", + "grunt-concurrent": "3.0.0", + "grunt-contrib-clean": "2.0.1", + "grunt-contrib-compress": "2.0.0", + "grunt-contrib-concat": "2.1.0", + "grunt-contrib-copy": "1.0.0", + "grunt-contrib-jshint": "3.2.0", + "grunt-contrib-uglify": "5.2.2", + "grunt-contrib-watch": "1.1.0", + "grunt-jsdoc": "2.4.1", + "grunt-jsdoc-to-markdown": "6.0.0", + "grunt-jsonlint": "3.0.0", + "grunt-mkdir": "~1.1.0", + "grunt-npm-command": "~0.1.2", + "grunt-sass": "~3.1.0", + "grunt-simple-mocha": "~0.4.1", + "grunt-simple-nyc": "^3.0.1", + "i18next-http-backend": "1.4.1", + "jquery-i18next": "1.2.1", + "jsdoc-nr-template": "github:node-red/jsdoc-nr-template", + "marked": "4.3.0", + "mermaid": "11.12.3", + "minami": "1.2.3", + "mocha": "9.2.2", + "node-red-node-test-helper": "^0.3.3", + "nodemon": "3.1.14", + "proxy": "^1.0.2", + "sass": "1.62.1", + "should": "13.2.3", + "sinon": "11.1.2", + "stoppable": "^1.1.0", + "supertest": "6.3.3" + }, + "engines": { + "node": ">=18.5" + }, + "optionalDependencies": { + "@node-rs/bcrypt": "^1.10.7" + } + }, + "node_modules/@antfu/install-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz", + "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@babel/traverse/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.1.tgz", + "integrity": "sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@chevrotain/cst-dts-gen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.1.1.tgz", + "integrity": "sha512-fRHyv6/f542qQqiRGalrfJl/evD39mAvbJLCekPazhiextEatq1Jx1K/i9gSd5NNO0ds03ek0Cbo/4uVKmOBcw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/gast": "11.1.1", + "@chevrotain/types": "11.1.1", + "lodash-es": "4.17.23" + } + }, + "node_modules/@chevrotain/gast": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.1.1.tgz", + "integrity": "sha512-Ko/5vPEYy1vn5CbCjjvnSO4U7GgxyGm+dfUZZJIWTlQFkXkyym0jFYrWEU10hyCjrA7rQtiHtBr0EaZqvHFZvg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/types": "11.1.1", + "lodash-es": "4.17.23" + } + }, + "node_modules/@chevrotain/regexp-to-ast": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.1.1.tgz", + "integrity": "sha512-ctRw1OKSXkOrR8VTvOxrQ5USEc4sNrfwXHa1NuTcR7wre4YbjPcKw+82C2uylg/TEwFRgwLmbhlln4qkmDyteg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/types": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.1.1.tgz", + "integrity": "sha512-wb2ToxG8LkgPYnKe9FH8oGn3TMCBdnwiuNC5l5y+CtlaVRbCytU0kbVsk6CGrqTL4ZN4ksJa0TXOYbxpbthtqw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@chevrotain/utils": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.1.1.tgz", + "integrity": "sha512-71eTYMzYXYSFPrbg/ZwftSaSDld7UYlS8OQa3lNnn9jzNtpFbaReRRyghzqS7rI3CDaorqpPJJcXGHK+FE1TVQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@emnapi/core": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz", + "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.0.tgz", + "integrity": "sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@antfu/install-pkg": "^1.1.0", + "@iconify/types": "^2.0.0", + "mlly": "^1.8.0" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsdoc/salty": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@jsdoc/salty/-/salty-0.2.9.tgz", + "integrity": "sha512-yYxMVH7Dqw6nO0d5NIV8OQWnitU8k6vXH8NtgqAfIa/IUqRMxRv/NUJJ08VEKbAakwxlgBl5PJdrU0dMPStsnw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=v12.0.0" + } + }, + "node_modules/@mermaid-js/parser": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-1.0.0.tgz", + "integrity": "sha512-vvK0Hi/VWndxoh03Mmz6wa1KDriSPjS2XMZL/1l19HFwygiObEEoEwSDxOqyLzzAI6J2PU3261JjTMTO7x+BPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "langium": "^4.0.0" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@node-rs/bcrypt": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt/-/bcrypt-1.10.7.tgz", + "integrity": "sha512-1wk0gHsUQC/ap0j6SJa2K34qNhomxXRcEe3T8cI5s+g6fgHBgLTN7U9LzWTG/HE6G4+2tWWLeCabk1wiYGEQSA==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@node-rs/bcrypt-android-arm-eabi": "1.10.7", + "@node-rs/bcrypt-android-arm64": "1.10.7", + "@node-rs/bcrypt-darwin-arm64": "1.10.7", + "@node-rs/bcrypt-darwin-x64": "1.10.7", + "@node-rs/bcrypt-freebsd-x64": "1.10.7", + "@node-rs/bcrypt-linux-arm-gnueabihf": "1.10.7", + "@node-rs/bcrypt-linux-arm64-gnu": "1.10.7", + "@node-rs/bcrypt-linux-arm64-musl": "1.10.7", + "@node-rs/bcrypt-linux-x64-gnu": "1.10.7", + "@node-rs/bcrypt-linux-x64-musl": "1.10.7", + "@node-rs/bcrypt-wasm32-wasi": "1.10.7", + "@node-rs/bcrypt-win32-arm64-msvc": "1.10.7", + "@node-rs/bcrypt-win32-ia32-msvc": "1.10.7", + "@node-rs/bcrypt-win32-x64-msvc": "1.10.7" + } + }, + "node_modules/@node-rs/bcrypt-android-arm-eabi": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-android-arm-eabi/-/bcrypt-android-arm-eabi-1.10.7.tgz", + "integrity": "sha512-8dO6/PcbeMZXS3VXGEtct9pDYdShp2WBOWlDvSbcRwVqyB580aCBh0BEFmKYtXLzLvUK8Wf+CG3U6sCdILW1lA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-android-arm64": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-android-arm64/-/bcrypt-android-arm64-1.10.7.tgz", + "integrity": "sha512-UASFBS/CucEMHiCtL/2YYsAY01ZqVR1N7vSb94EOvG5iwW7BQO06kXXCTgj+Xbek9azxixrCUmo3WJnkJZ0hTQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-darwin-arm64": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-darwin-arm64/-/bcrypt-darwin-arm64-1.10.7.tgz", + "integrity": "sha512-DgzFdAt455KTuiJ/zYIyJcKFobjNDR/hnf9OS7pK5NRS13Nq4gLcSIIyzsgHwZHxsJWbLpHmFc1H23Y7IQoQBw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-darwin-x64": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-darwin-x64/-/bcrypt-darwin-x64-1.10.7.tgz", + "integrity": "sha512-SPWVfQ6sxSokoUWAKWD0EJauvPHqOGQTd7CxmYatcsUgJ/bruvEHxZ4bIwX1iDceC3FkOtmeHO0cPwR480n/xA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-freebsd-x64": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-freebsd-x64/-/bcrypt-freebsd-x64-1.10.7.tgz", + "integrity": "sha512-gpa+Ixs6GwEx6U6ehBpsQetzUpuAGuAFbOiuLB2oo4N58yU4AZz1VIcWyWAHrSWRs92O0SHtmo2YPrMrwfBbSw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-linux-arm-gnueabihf": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-arm-gnueabihf/-/bcrypt-linux-arm-gnueabihf-1.10.7.tgz", + "integrity": "sha512-kYgJnTnpxrzl9sxYqzflobvMp90qoAlaX1oDL7nhNTj8OYJVDIk0jQgblj0bIkjmoPbBed53OJY/iu4uTS+wig==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-linux-arm64-gnu": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-arm64-gnu/-/bcrypt-linux-arm64-gnu-1.10.7.tgz", + "integrity": "sha512-7cEkK2RA+gBCj2tCVEI1rDSJV40oLbSq7bQ+PNMHNI6jCoXGmj9Uzo7mg7ZRbNZ7piIyNH5zlJqutjo8hh/tmA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-linux-arm64-musl": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-arm64-musl/-/bcrypt-linux-arm64-musl-1.10.7.tgz", + "integrity": "sha512-X7DRVjshhwxUqzdUKDlF55cwzh+wqWJ2E/tILvZPboO3xaNO07Um568Vf+8cmKcz+tiZCGP7CBmKbBqjvKN/Pw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-linux-x64-gnu": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-x64-gnu/-/bcrypt-linux-x64-gnu-1.10.7.tgz", + "integrity": "sha512-LXRZsvG65NggPD12hn6YxVgH0W3VR5fsE/o1/o2D5X0nxKcNQGeLWnRzs5cP8KpoFOuk1ilctXQJn8/wq+Gn/Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-linux-x64-musl": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-linux-x64-musl/-/bcrypt-linux-x64-musl-1.10.7.tgz", + "integrity": "sha512-tCjHmct79OfcO3g5q21ME7CNzLzpw1MAsUXCLHLGWH+V6pp/xTvMbIcLwzkDj6TI3mxK6kehTn40SEjBkZ3Rog==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-wasm32-wasi": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-wasm32-wasi/-/bcrypt-wasm32-wasi-1.10.7.tgz", + "integrity": "sha512-4qXSihIKeVXYglfXZEq/QPtYtBUvR8d3S85k15Lilv3z5B6NSGQ9mYiNleZ7QHVLN2gEc5gmi7jM353DMH9GkA==", + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.5" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@node-rs/bcrypt-win32-arm64-msvc": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-win32-arm64-msvc/-/bcrypt-win32-arm64-msvc-1.10.7.tgz", + "integrity": "sha512-FdfUQrqmDfvC5jFhntMBkk8EI+fCJTx/I1v7Rj+Ezlr9rez1j1FmuUnywbBj2Cg15/0BDhwYdbyZ5GCMFli2aQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-win32-ia32-msvc": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-win32-ia32-msvc/-/bcrypt-win32-ia32-msvc-1.10.7.tgz", + "integrity": "sha512-lZLf4Cx+bShIhU071p5BZft4OvP4PGhyp542EEsb3zk34U5GLsGIyCjOafcF/2DGewZL6u8/aqoxbSuROkgFXg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@node-rs/bcrypt-win32-x64-msvc": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@node-rs/bcrypt-win32-x64-msvc/-/bcrypt-win32-x64-msvc-1.10.7.tgz", + "integrity": "sha512-hdw7tGmN1DxVAMTzICLdaHpXjy+4rxaxnBMgI8seG1JL5e3VcRGsd1/1vVDogVp2cbsmgq+6d6yAY+D9lW/DCg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", + "integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, + "node_modules/@prantlf/jsonlint": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/@prantlf/jsonlint/-/jsonlint-14.1.0.tgz", + "integrity": "sha512-4OBJHQmFbvL+VWeI0dzN2ugXD+L0ZAKSfLn5kpsNjhCo39eEId/ftiJXWwVifKVYwATbqaLaXhQBhHwvAOaanw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.17.1", + "ajv-draft-04": "1.0.0", + "cosmiconfig": "9.0.0", + "diff": "5.2.0", + "fast-glob": "3.3.2" + }, + "bin": { + "jsonlint": "lib/cli.js" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@prantlf/jsonlint/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz", + "integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.3.tgz", + "integrity": "sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", + "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", + "dev": true, + "license": "(Unlicense OR Apache-2.0)" + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-format": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", + "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "license": "MIT" + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "12.2.3", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz", + "integrity": "sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "25.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz", + "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/readable-stream": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.23.tgz", + "integrity": "sha512-wwXrtQvbMHxCbBgjHaMGEmImFTQxxpfMOR/ZoQnXxB1woqkUbdLGFDgauo00Py9IudiaqSeiBiulSV9i6XIPig==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "license": "ISC" + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/adm-zip": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz", + "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/agent-base/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escape-sequences": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.1.0.tgz", + "integrity": "sha512-dzW9kHxH011uBsidTXd14JXgzye/YLb2LzeKZ4bsgl/Knwx8AtbSFkkGxagdNOoh0DlqHCmfiEjWKBaqjOanVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/ansi-escape-sequences/node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", + "license": "MIT" + }, + "node_modules/append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-require-extensions": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/archiver": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", + "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "archiver-utils": "^2.1.0", + "async": "^3.2.4", + "buffer-crc32": "^0.2.1", + "readable-stream": "^3.6.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^2.2.0", + "zip-stream": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/archiver-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^2.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/archiver-utils/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/args": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/args/-/args-5.0.1.tgz", + "integrity": "sha512-1kqmFCFsPffavQFGt8OxJdIcETti99kySRUPMpOhaGjL6mRJn8HFU1OxKY5bMqfZKUwTQc1mZkAjmGYaVOHFtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "5.0.0", + "chalk": "2.4.2", + "leven": "2.1.0", + "mri": "1.1.4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/args/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/args/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/args/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/args/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/args/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/args/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/args/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/array-back": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-6.2.2.tgz", + "integrity": "sha512-gUAZ7HPyb4SJczXAMUXMGAvI976JoK3qEx9v1FTmeYuJj0IBiaKttG1ydtGKdkfqWkIkouke7nG8ufGy77+Cvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-mutex": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz", + "integrity": "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", + "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/basic-auth-parser": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/basic-auth-parser/-/basic-auth-parser-0.0.2.tgz", + "integrity": "sha512-Y7OBvWn+JnW45JWHLY6ybYub2k9cXCMrtCyO1Hds2s6eqClqWhPnOQpgXUPjAiMHj+A8TEPIQQ1dYENnJoBOHQ==", + "dev": true + }, + "node_modules/bcryptjs": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.3.tgz", + "integrity": "sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g==", + "license": "BSD-3-Clause", + "bin": { + "bcrypt": "bin/bcrypt" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/bl/-/bl-6.1.6.tgz", + "integrity": "sha512-jLsPgN/YSvPUg9UX0Kd73CXpm2Psg9FxMeCSXnk3WBO3CMT10JMwijubhGfHCnFu6TPn1ei3b975dxv7K2pWVg==", + "license": "MIT", + "dependencies": { + "@types/readable-stream": "^4.0.0", + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^4.2.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/body": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", + "integrity": "sha512-chUsBxGRtuElD6fmw1gHLpvnKdVLK302peeFa9ZqAEk8TyzZ3fygLyUEDDPTJvL9+Bor0dIwn6ePOsRM2y0zQQ==", + "dev": true, + "dependencies": { + "continuable-cache": "^0.3.1", + "error": "^7.0.0", + "raw-body": "~1.1.0", + "safe-json-parse": "~1.0.1" + } + }, + "node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body/node_modules/bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==", + "dev": true + }, + "node_modules/body/node_modules/raw-body": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", + "integrity": "sha512-WmJJU2e9Y6M5UzTOkHaM7xJGAPQD8PNzx3bAd2+uhZAim6wDk6dAZxPVYLF67XhbR4hmKGh33Lpmh4XWrCH5Mg==", + "deprecated": "No longer maintained. Please upgrade to a stable version.", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "1", + "string_decoder": "0.10" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/body/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/broker-factory": { + "version": "3.1.13", + "resolved": "https://registry.npmjs.org/broker-factory/-/broker-factory-3.1.13.tgz", + "integrity": "sha512-H2VALe31mEtO/SRcNp4cUU5BAm1biwhc/JaF77AigUuni/1YT0FLCJfbUxwIEs9y6Kssjk2fmXgf+Y9ALvmKlw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "fast-unique-numbers": "^9.0.26", + "tslib": "^2.8.1", + "worker-factory": "^7.0.48" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC" + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cache-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cache-point/-/cache-point-2.0.0.tgz", + "integrity": "sha512-4gkeHlFpSKgm3vm2gJN5sPqfmijYRFYCQ6tv5cLw0xVmT6r1z1vd4FNnpuOREco3cBs1G709sZ72LdgddKvL5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^4.0.1", + "fs-then-native": "^2.0.0", + "mkdirp2": "^1.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cache-point/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/caching-transform": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", + "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasha": "^3.0.0", + "make-dir": "^2.0.0", + "package-hash": "^3.0.0", + "write-file-atomic": "^2.4.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", + "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/catharsis": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", + "integrity": "sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", + "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^1.5.0", + "dom-serializer": "^1.3.2", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz", + "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==", + "license": "BSD-2-Clause", + "dependencies": { + "css-select": "^4.3.0", + "css-what": "^6.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.3.1", + "domutils": "^2.8.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chevrotain": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.1.1.tgz", + "integrity": "sha512-f0yv5CPKaFxfsPTBzX7vGuim4oIC1/gcS7LUGdBSwl2dU6+FON6LVUksdOo1qJjoUvXNn45urgh8C+0a24pACQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@chevrotain/cst-dts-gen": "11.1.1", + "@chevrotain/gast": "11.1.1", + "@chevrotain/regexp-to-ast": "11.1.1", + "@chevrotain/types": "11.1.1", + "@chevrotain/utils": "11.1.1", + "lodash-es": "4.17.23" + } + }, + "node_modules/chevrotain-allstar": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", + "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash-es": "^4.17.21" + }, + "peerDependencies": { + "chevrotain": "^11.0.0" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "exit": "0.1.2", + "glob": "^7.1.1" + }, + "engines": { + "node": ">=0.2.5" + } + }, + "node_modules/cli-table": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", + "integrity": "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==", + "dependencies": { + "colors": "1.0.3" + }, + "engines": { + "node": ">= 0.2.0" + } + }, + "node_modules/cli-table/node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/collect-all": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/collect-all/-/collect-all-1.0.4.tgz", + "integrity": "sha512-RKZhRwJtJEP5FWul+gkSMEnaK6H3AGPTTWOiRimCcs+rc/OmQE3Yhy1Q7A7KsdkG3ZXVdZq68Y6ONSdvkeEcKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "stream-connect": "^1.0.2", + "stream-via": "^1.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-args/node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/command-line-args/node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/command-line-tool": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/command-line-tool/-/command-line-tool-0.8.0.tgz", + "integrity": "sha512-Xw18HVx/QzQV3Sc5k1vy3kgtOeGmsKIqwtFFoyjI4bbcpSgnw2CWVULvtakyw4s6fhyAdI6soQQhXc2OzJy62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escape-sequences": "^4.0.0", + "array-back": "^2.0.0", + "command-line-args": "^5.0.0", + "command-line-usage": "^4.1.0", + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-tool/node_modules/array-back": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", + "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-4.1.0.tgz", + "integrity": "sha512-MxS8Ad995KpdAC0Jopo/ovGIroV/m0KHwzKfXxKag6FHOkGsH8/lv5yjgablcRxCJJC0oJeUMuO/gmaq+Wq46g==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escape-sequences": "^4.0.0", + "array-back": "^2.0.0", + "table-layout": "^0.4.2", + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", + "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/commist": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/commist/-/commist-3.2.0.tgz", + "integrity": "sha512-4PIMoPniho+LqXmpS5d3NuGYncG6XWlkBSVGiWycL22dd42OYdUGil2CWuzklaJoNxyxUSpO4MKIBU94viWNAw==", + "license": "MIT" + }, + "node_modules/common-sequence": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/common-sequence/-/common-sequence-2.0.2.tgz", + "integrity": "sha512-jAg09gkdkrDO9EWTdXfv80WWH3yeZl5oT69fGfedBNS9pXUKYInVJ1bJ+/ht2+Moeei48TmSbQDYMc8EOx9G0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/compress-commons": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", + "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "^0.2.13", + "crc32-stream": "^4.0.2", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/config-master": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/config-master/-/config-master-3.1.0.tgz", + "integrity": "sha512-n7LBL1zBzYdTpF1mx5DNcZnZn05CWIdsdvtPL4MosvqbBUK3Rq6VWEtGUuF3Y0s9/CIhMejezqlSkP6TnCJ/9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "walk-back": "^2.0.1" + } + }, + "node_modules/config-master/node_modules/walk-back": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-2.0.1.tgz", + "integrity": "sha512-Nb6GvBR8UWX1D+Le+xUq0+Q1kFmRBIWVrfLnQAOmcpEzA9oAxwJ9gIr36t9TWYfzvWRvuMtjHiVsJYEkXWaTAQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha512-duS7VP5pvfsNLDvL1O4VOEbw37AI3A4ZUQYemvDlnpGrNu9tprR7BYWpDYwC0Xia0Zxz5ZupdiIrUp0GH1aXfg==", + "dev": true, + "dependencies": { + "date-now": "^0.1.4" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/continuable-cache": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", + "integrity": "sha512-TF30kpKhTH8AGCG3dut0rdd/19B7Z+qCnrMoBLpyQu/2drZdNrrpcjPEoJeSVsQM+8KmWG5O56oPDjSSUsuTyA==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-parser": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", + "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", + "license": "MIT", + "dependencies": { + "cookie": "0.7.2", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "dev": true, + "license": "MIT", + "dependencies": { + "layout-base": "^1.0.0" + } + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cp-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", + "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "make-dir": "^2.0.0", + "nested-error-stacks": "^2.0.0", + "pify": "^4.0.1", + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", + "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^3.4.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cronosjs": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/cronosjs/-/cronosjs-1.7.1.tgz", + "integrity": "sha512-d6S6+ep7dJxsAG8OQQCdKuByI/S/AV64d9OF5mtmcykOyPu92cAkAnF3Tbc9s5oOaLQBYYQmTNvjqYRkPJ/u5Q==", + "license": "ISC", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cytoscape": { + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.33.1.tgz", + "integrity": "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "dev": true, + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dev": true, + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/d3-sankey/node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "dev": true, + "license": "ISC" + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dev": true, + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.13.tgz", + "integrity": "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "d3": "^7.9.0", + "lodash-es": "^4.17.21" + } + }, + "node_modules/date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha512-AsElvov3LoNB7tf5k37H2jYSB+ZZPMT5sG2QjJCcdlV5chIv6htBUBUui2IKRjgtKAKtCBN7Zbwa+MtwLjSeNw==", + "dev": true + }, + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/dayjs": { + "version": "1.11.19", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", + "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha512-B0n2zDIXpzLzKeoEozorDSa1cHc1t0NjmxP0zuAxbizNU2MBqYJJKYXrrFdKuQliojXynrxgd7l4ahfg/+aA5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "dev": true, + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dev": true, + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "node_modules/diff": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dmd": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/dmd/-/dmd-6.2.3.tgz", + "integrity": "sha512-SIEkjrG7cZ9GWZQYk/mH+mWtcRPly/3ibVuXO/tP/MFoWz6KiRK77tSMq6YQBPl7RljPtXPQ/JhxbNuCdi1bNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^6.2.2", + "cache-point": "^2.0.0", + "common-sequence": "^2.0.2", + "file-set": "^4.0.2", + "handlebars": "^4.7.8", + "marked": "^4.3.0", + "object-get": "^2.1.1", + "reduce-flatten": "^3.0.1", + "reduce-unique": "^2.0.1", + "reduce-without": "^1.0.1", + "test-value": "^3.0.0", + "walk-back": "^5.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dompurify": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.6.tgz", + "integrity": "sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==", + "dev": true, + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true, + "license": "MIT" + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/duplexify/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz", + "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", + "dev": true, + "dependencies": { + "string-template": "~0.2.1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-session": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.18.2.tgz", + "integrity": "sha512-SZjssGQC7TzTs9rpPDuUrR23GNZ9+2+IkA/+IJWmvQilTr5OSliEHGF+D9scbIpdC6yGtTI0/VhaHoVes2AN/A==", + "license": "MIT", + "dependencies": { + "cookie": "0.7.2", + "cookie-signature": "1.0.7", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.1.0", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.1", + "uid-safe": "~2.1.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express-session/node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/express-session/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-unique-numbers": { + "version": "9.0.26", + "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-9.0.26.tgz", + "integrity": "sha512-3Mtq8p1zQinjGyWfKeuBunbuFoixG72AUkk4VvzbX4ykCW9Q4FzRaNyIlfQhUjnKw2ARVP+/CKnoyr6wfHftig==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=18.2.0" + } + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-set": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/file-set/-/file-set-4.0.2.tgz", + "integrity": "sha512-fuxEgzk4L8waGXaAkd8cMr73Pm0FxOVkn8hztzUW7BAHhOGH90viQNXbiOsnecCWmfInqU6YmAMwxRMdKETceQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^5.0.0", + "glob": "^7.1.6" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/file-set/node_modules/array-back": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-5.0.0.tgz", + "integrity": "sha512-kgVWwJReZWmVuWOQKEOohXKJX+nD02JAZ54D1RRWlv8L0NebauKAaFxACKzB74RTclt1+WNz5KHaLRDAPZbDEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/file-sync-cmp": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", + "integrity": "sha512-0k45oWBokCqh2MOexeYKpyqmGKG+8mQ2Wd8iawx+uWd/weWJQAZ6SoPybagdCI4xFisag8iAR77WPm4h3pTfxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/find-replace/node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/findup-sync": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dev": true, + "license": "MIT", + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/foreground-child": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha512-3TOY+4TKV0Ml83PXJQY+JFQaHNV38lzQDIzzXYg1kWdBLenGgoZhAs0CKgzI31vi2pWEpQMq/Yi4bpKwCPkw7g==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^4", + "signal-exit": "^3.0.0" + } + }, + "node_modules/foreground-child/node_modules/cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha512-yAXz/pA1tD8Gtg2S98Ekf/sewp3Lcp3YoFKJ4Hkp5h5yLWnKVTDU0kwjKJ8NDCYcfTLfyGkzTikst+jWypT1iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "node_modules/foreground-child/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "license": "MIT", + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/formidable": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.5.tgz", + "integrity": "sha512-Oz5Hwvwak/DCaXVVUtPn4oLMLLy1CdclLKO1LFgU7XzDpVMUU5UjlSLpGMocyQNNk8F6IJW9M/YdooSn2MRI+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0", + "qs": "^6.11.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-then-native": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fs-then-native/-/fs-then-native-2.0.0.tgz", + "integrity": "sha512-X712jAOaWXkemQCAmWeg5rOT2i+KOpWz1Z/txk/cW0qlOu2oQ9H61vc5w3X/iyuUEfq/OyaFJ78/cZAQD1/bgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "globule": "^1.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/getobject": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", + "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globule": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", + "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "~7.1.1", + "lodash": "^4.17.21", + "minimatch": "~3.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.x" + } + }, + "node_modules/grunt": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.6.1.tgz", + "integrity": "sha512-/ABUy3gYWu5iBmrUSRBP97JLpQUm0GgVveDCp6t3yRNIoltIYw7rEj3g5y1o2PGPR2vfTRGa7WC/LZHLTXnEzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dateformat": "~4.6.2", + "eventemitter2": "~0.4.13", + "exit": "~0.1.2", + "findup-sync": "~5.0.0", + "glob": "~7.1.6", + "grunt-cli": "~1.4.3", + "grunt-known-options": "~2.0.0", + "grunt-legacy-log": "~3.0.0", + "grunt-legacy-util": "~2.0.1", + "iconv-lite": "~0.6.3", + "js-yaml": "~3.14.0", + "minimatch": "~3.0.4", + "nopt": "~3.0.6" + }, + "bin": { + "grunt": "bin/grunt" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/grunt-chmod": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/grunt-chmod/-/grunt-chmod-1.1.1.tgz", + "integrity": "sha512-f807W/VOIhhaOW85JyeRd4DgB0RcbsGQV/4IvtcKctOWGvPJns4AqN7xW73PG9+RwDnSGxApS+6Xov5L2LeNXg==", + "dev": true, + "dependencies": { + "shelljs": "^0.5.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/grunt-cli": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.5.0.tgz", + "integrity": "sha512-rILKAFoU0dzlf22SUfDtq2R1fosChXXlJM5j7wI6uoW8gwmXDXzbUvirlKZSYCdXl3LXFbR+8xyS+WFo+b6vlA==", + "dev": true, + "license": "MIT", + "dependencies": { + "grunt-known-options": "~2.0.0", + "interpret": "~1.1.0", + "liftup": "~3.0.1", + "nopt": "~5.0.0", + "v8flags": "^4.0.1" + }, + "bin": { + "grunt": "bin/grunt" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-concurrent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/grunt-concurrent/-/grunt-concurrent-3.0.0.tgz", + "integrity": "sha512-AgXtjUJESHEGeGX8neL3nmXBTHSj1QC48ABQ3ng2/vjuSBpDD8gKcVHSlXP71pFkIR8TQHf+eomOx6OSYSgfrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "arrify": "^2.0.1", + "async": "^3.1.0", + "indent-string": "^4.0.0", + "pad-stream": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "grunt": ">=1" + } + }, + "node_modules/grunt-contrib-clean": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-2.0.1.tgz", + "integrity": "sha512-uRvnXfhiZt8akb/ZRDHJpQQtkkVkqc/opWO4Po/9ehC2hPxgptB9S6JHDC/Nxswo4CJSM0iFPT/Iym3cEMWzKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^3.2.3", + "rimraf": "^2.6.2" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "grunt": ">=0.4.5" + } + }, + "node_modules/grunt-contrib-compress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-compress/-/grunt-contrib-compress-2.0.0.tgz", + "integrity": "sha512-r/dAGx4qG+rmBFF4lb/hTktW2huGMGxkSLf9msh3PPtq0+cdQRQerZJ30UKevX3BLQsohwLzO0p1z/LrH6aKXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "adm-zip": "^0.5.1", + "archiver": "^5.1.0", + "chalk": "^4.1.0", + "lodash": "^4.17.20", + "pretty-bytes": "^5.4.1", + "stream-buffers": "^3.0.2" + }, + "engines": { + "node": ">=10.16" + } + }, + "node_modules/grunt-contrib-concat": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-2.1.0.tgz", + "integrity": "sha512-Vnl95JIOxfhEN7bnYIlCgQz41kkbi7tsZ/9a4usZmxNxi1S2YAIOy8ysFmO8u4MN26Apal1O106BwARdaNxXQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "source-map": "^0.5.3" + }, + "engines": { + "node": ">=0.12.0" + }, + "peerDependencies": { + "grunt": ">=1.4.1" + } + }, + "node_modules/grunt-contrib-copy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz", + "integrity": "sha512-gFRFUB0ZbLcjKb67Magz1yOHGBkyU6uL29hiEW1tdQ9gQt72NuMKIy/kS6dsCbV0cZ0maNCb0s6y+uT1FKU7jA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^1.1.1", + "file-sync-cmp": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-contrib-copy/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-contrib-copy/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-contrib-copy/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-contrib-copy/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/grunt-contrib-copy/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-contrib-copy/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/grunt-contrib-jshint": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-3.2.0.tgz", + "integrity": "sha512-pcXWCSZWfoMSvcV4BwH21TUtLtcX0Ms8IGuOPIcLeXK3fud9KclY7iqMKY94jFx8TxZzh028YYtpR+io8DiEaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "~4.1.2", + "hooker": "^0.2.3", + "jshint": "~2.13.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-contrib-uglify": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-5.2.2.tgz", + "integrity": "sha512-ITxiWxrjjP+RZu/aJ5GLvdele+sxlznh+6fK9Qckio5ma8f7Iv8woZjRkGfafvpuygxNefOJNc+hfjjBayRn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "maxmin": "^3.0.0", + "uglify-js": "^3.16.1", + "uri-path": "^1.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/grunt-contrib-watch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz", + "integrity": "sha512-yGweN+0DW5yM+oo58fRu/XIRrPcn3r4tQx+nL7eMRwjpvk+rQY6R8o94BPK0i2UhTg9FN21hS+m8vR8v9vXfeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^2.6.0", + "gaze": "^1.1.0", + "lodash": "^4.17.10", + "tiny-lr": "^1.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-contrib-watch/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/grunt-jsdoc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/grunt-jsdoc/-/grunt-jsdoc-2.4.1.tgz", + "integrity": "sha512-S0zxU0wDewRu7z+vijEItOWe/UttxWVmvz0qz2ZVcAYR2GpXjsiski2CAVN0b18t2qeVLdmxZkJaEWCOsKzcAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1", + "jsdoc": "^3.6.3" + }, + "bin": { + "grunt-jsdoc": "bin/grunt-jsdoc" + }, + "engines": { + "node": ">= 8.12.0" + } + }, + "node_modules/grunt-jsdoc-to-markdown": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/grunt-jsdoc-to-markdown/-/grunt-jsdoc-to-markdown-6.0.0.tgz", + "integrity": "sha512-vvanKUErp6CHl4MuLQ9vwJewpMu8Fi7z09lr4OwMLr+GBu3nG5lRNZuu5mkWY8qv1aU8WkX97/rJaVs3A1Wx8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsdoc-to-markdown": "^7.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "grunt": ">=1.3.0" + } + }, + "node_modules/grunt-jsonlint": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/grunt-jsonlint/-/grunt-jsonlint-3.0.0.tgz", + "integrity": "sha512-IvEm98y8esduXHj8gtMd+HygnoHLWj2F1tP77ki6K7fRd1YXIN13Y+WqtfHyeCYg8s+bPDZPy4IXJhZhIbCIhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@prantlf/jsonlint": "^14.0.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/grunt-known-options": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", + "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-legacy-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", + "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "colors": "~1.1.2", + "grunt-legacy-log-utils": "~2.1.0", + "hooker": "~0.2.3", + "lodash": "~4.17.19" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/grunt-legacy-log-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", + "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "~4.1.0", + "lodash": "~4.17.19" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-legacy-util": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", + "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "~3.2.0", + "exit": "~0.1.2", + "getobject": "~1.0.0", + "hooker": "~0.2.3", + "lodash": "~4.17.21", + "underscore.string": "~3.3.5", + "which": "~2.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-mkdir": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-mkdir/-/grunt-mkdir-1.1.0.tgz", + "integrity": "sha512-FRE17OYVveNbVJFX8GPGa5bzH2ZiAdBx3q0Kwk2Dg6l+TzLGaTdufUxiUWUbS2MERFacnmXZwDDOR5ZbYW0o+Q==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + }, + "peerDependencies": { + "grunt": ">=0.4.0" + } + }, + "node_modules/grunt-npm-command": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/grunt-npm-command/-/grunt-npm-command-0.1.2.tgz", + "integrity": "sha512-QsGLL8Pp+tzeIkCqohIbOtVopOhINErRVpxKY+SnvSEE3BXOKKSanlIh9cd1mliajO57sXG2ZC4R8L3v2NSPTQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "grunt": ">=0.4.0" + } + }, + "node_modules/grunt-sass": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/grunt-sass/-/grunt-sass-3.1.0.tgz", + "integrity": "sha512-90s27H7FoCDcA8C8+R0GwC+ntYD3lG6S/jqcavWm3bn9RiJTmSfOvfbFa1PXx4NbBWuiGQMLfQTj/JvvqT5w6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "grunt": ">=1" + } + }, + "node_modules/grunt-simple-mocha": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/grunt-simple-mocha/-/grunt-simple-mocha-0.4.1.tgz", + "integrity": "sha512-EibTuZVvyLd9v/9An+5sL+XLoArs1QkFSTUcOG/AbBzeCYemZppcO9YSEspWUwU/T/NNtAyzB+x7B6zAmKQqkA==", + "dev": true, + "dependencies": { + "mocha": "*" + }, + "bin": { + "grunt-simple-mocha": "bin/grunt-simple-mocha" + }, + "engines": { + "node": "*" + } + }, + "node_modules/grunt-simple-nyc": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/grunt-simple-nyc/-/grunt-simple-nyc-3.0.1.tgz", + "integrity": "sha512-/YLY+jNI6gBuVO3xu07zwvDN+orTAFS50W00yb/2ncvc2PFO4pR+oU7TyiHhe8a6O3KuQDHsyCE0iE+rqJagQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15", + "nyc": "^14.1.0", + "simple-cli": "^5.0.3" + } + }, + "node_modules/grunt/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/grunt/node_modules/grunt-cli": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", + "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "grunt-known-options": "~2.0.0", + "interpret": "~1.1.0", + "liftup": "~3.0.1", + "nopt": "~4.0.1", + "v8flags": "~3.2.0" + }, + "bin": { + "grunt": "bin/grunt" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt/node_modules/grunt-cli/node_modules/nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/grunt/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/grunt/node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/grunt/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/grunt/node_modules/v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/hachure-fill": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", + "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "dev": true, + "license": "MIT" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "license": "MIT" + }, + "node_modules/hasha": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", + "integrity": "sha512-w0Kz8lJFBoyaurBiNrIvxPqr/gJ6fOfSkpAPOepN3oECqGJag37xPbOv57izi/KP8auHgNYxn5fXtAb+1LsJ6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-stream": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/help-me": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", + "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==", + "license": "MIT" + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "license": "ISC" + }, + "node_modules/hpagent": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", + "integrity": "sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/i18next": { + "version": "24.2.3", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-24.2.3.tgz", + "integrity": "sha512-lfbf80OzkocvX7nmZtu7nSTNbrTYR52sLWxPtlXX1zAhVw8WEnFk4puUkCR4B1dNQwbSpEHHHemcZu//7EcB7A==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.10" + }, + "peerDependencies": { + "typescript": "^5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/i18next-http-backend": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-1.4.1.tgz", + "integrity": "sha512-s4Q9hK2jS29iyhniMP82z+yYY8riGTrWbnyvsSzi5TaF7Le4E7b5deTmtuaRuab9fdDcYXtcwdBgawZG+JCEjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-fetch": "3.1.5" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true, + "license": "ISC" + }, + "node_modules/immutable": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ip-address": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.1.0.tgz", + "integrity": "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "license": "MIT" + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "append-transform": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jquery-i18next": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jquery-i18next/-/jquery-i18next-1.2.1.tgz", + "integrity": "sha512-UNcw3rgxoKjGEg4w23FEn2h3OlPJU7rPzsgDuXDBZktIzeiVbJohs9Cv9hj8oP8KNfBRKOoErL/OVxg2FaAR4g==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-sdsl": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/js2xmlparser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", + "integrity": "sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "xmlcreate": "^2.0.4" + } + }, + "node_modules/jsdoc": { + "version": "3.6.11", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.11.tgz", + "integrity": "sha512-8UCU0TYeIYD9KeLzEcAu2q8N/mx9O3phAGl32nmHlE0LpaJL71mMkP4d+QE5zWfNt50qheHtOZ0qoxVrsX5TUg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/parser": "^7.9.4", + "@types/markdown-it": "^12.2.3", + "bluebird": "^3.7.2", + "catharsis": "^0.9.0", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.2", + "klaw": "^3.0.0", + "markdown-it": "^12.3.2", + "markdown-it-anchor": "^8.4.1", + "marked": "^4.0.10", + "mkdirp": "^1.0.4", + "requizzle": "^0.2.3", + "strip-json-comments": "^3.1.0", + "taffydb": "2.6.2", + "underscore": "~1.13.2" + }, + "bin": { + "jsdoc": "jsdoc.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsdoc-api": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/jsdoc-api/-/jsdoc-api-7.2.0.tgz", + "integrity": "sha512-93YDnlm/OYTlLOFeNs4qAv0RBCJ0kGj67xQaWy8wrbk97Rw1EySitoOTHsTHXPEs3uyx2IStPKGrbE7LTnZXbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^6.2.2", + "cache-point": "^2.0.0", + "collect-all": "^1.0.4", + "file-set": "^4.0.2", + "fs-then-native": "^2.0.0", + "jsdoc": "^4.0.0", + "object-to-spawn-args": "^2.0.1", + "temp-path": "^1.0.0", + "walk-back": "^5.1.0" + }, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/jsdoc-api/node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/jsdoc-api/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/jsdoc-api/node_modules/jsdoc": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-4.0.5.tgz", + "integrity": "sha512-P4C6MWP9yIlMiK8nwoZvxN84vb6MsnXcHuy7XzVOvQoCizWX5JFCBsWIIWKXBltpoRZXddUOVQmCTOZt9yDj9g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/parser": "^7.20.15", + "@jsdoc/salty": "^0.2.1", + "@types/markdown-it": "^14.1.1", + "bluebird": "^3.7.2", + "catharsis": "^0.9.0", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.2", + "klaw": "^3.0.0", + "markdown-it": "^14.1.0", + "markdown-it-anchor": "^8.6.7", + "marked": "^4.0.10", + "mkdirp": "^1.0.4", + "requizzle": "^0.2.3", + "strip-json-comments": "^3.1.0", + "underscore": "~1.13.2" + }, + "bin": { + "jsdoc": "jsdoc.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsdoc-api/node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/jsdoc-api/node_modules/markdown-it": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", + "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/jsdoc-api/node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsdoc-api/node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsdoc-nr-template": { + "version": "1.0.0", + "resolved": "git+ssh://git@github.com/node-red/jsdoc-nr-template.git#3c7c8f96d585c7c5918a2e63519310e1297e162d", + "dev": true + }, + "node_modules/jsdoc-parse": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/jsdoc-parse/-/jsdoc-parse-6.2.5.tgz", + "integrity": "sha512-8JaSNjPLr2IuEY4Das1KM6Z4oLHZYUnjRrr27hKSa78Cj0i5Lur3DzNnCkz+DfrKBDoljGMoWOiBVQbtUZJBPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^6.2.2", + "find-replace": "^5.0.1", + "sort-array": "^5.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/jsdoc-parse/node_modules/find-replace": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-5.0.2.tgz", + "integrity": "sha512-Y45BAiE3mz2QsrN2fb5QEtO4qb44NcS7en/0y9PEVsg351HsLeVclP8QPMH79Le9sH3rs5RSwJu99W0WPZO43Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@75lb/nature": "latest" + }, + "peerDependenciesMeta": { + "@75lb/nature": { + "optional": true + } + } + }, + "node_modules/jsdoc-to-markdown": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/jsdoc-to-markdown/-/jsdoc-to-markdown-7.1.1.tgz", + "integrity": "sha512-CI86d63xAVNO+ENumWwmJ034lYe5iGU5GwjtTA11EuphP9tpnoi4hrKgR/J8uME0D+o4KUpVfwX1fjZhc8dEtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^6.2.2", + "command-line-tool": "^0.8.0", + "config-master": "^3.1.0", + "dmd": "^6.1.0", + "jsdoc-api": "^7.1.1", + "jsdoc-parse": "^6.1.0", + "walk-back": "^5.1.0" + }, + "bin": { + "jsdoc2md": "bin/cli.js" + }, + "engines": { + "node": ">=12.17" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jshint": { + "version": "2.13.6", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.6.tgz", + "integrity": "sha512-IVdB4G0NTTeQZrBoM8C5JFVLjV2KtZ9APgybDA1MK73xb09qFs0jCXyQLnCOp1cSZZZbvhq/6mfXHUTaDkffuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli": "~1.0.0", + "console-browserify": "1.1.x", + "exit": "0.1.x", + "htmlparser2": "3.8.x", + "lodash": "~4.17.21", + "minimatch": "~3.0.2", + "strip-json-comments": "1.0.x" + }, + "bin": { + "jshint": "bin/jshint" + } + }, + "node_modules/jshint/node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/jshint/node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/jshint/node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/jshint/node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/jshint/node_modules/domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/jshint/node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/jshint/node_modules/entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==", + "dev": true, + "license": "BSD-like" + }, + "node_modules/jshint/node_modules/htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + } + }, + "node_modules/jshint/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jshint/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/jshint/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jshint/node_modules/strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==", + "dev": true, + "license": "MIT", + "bin": { + "strip-json-comments": "cli.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "license": "MIT" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "license": "ISC" + }, + "node_modules/jsonata": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/jsonata/-/jsonata-2.0.6.tgz", + "integrity": "sha512-WhQB5tXQ32qjkx2GYHFw2XbL90u+LLzjofAYwi+86g6SyZeXHz9F1Q0amy3dWRYczshOC3Haok9J4pOCgHtwyQ==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/just-extend": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", + "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/katex": { + "version": "0.16.27", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.27.tgz", + "integrity": "sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw==", + "dev": true, + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/key-list": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/key-list/-/key-list-0.1.4.tgz", + "integrity": "sha512-DMGLZAmEoKRUHPlc772EW0i92P/WY12/oWYc2pQZb5MVGOSjYmF0BEQXbOLjbou1+/PqZ+CivwfyjaUwmyl4CQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/khroma": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", + "integrity": "sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.9" + } + }, + "node_modules/langium": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/langium/-/langium-4.2.1.tgz", + "integrity": "sha512-zu9QWmjpzJcomzdJQAHgDVhLGq5bLosVak1KVa40NzQHXfqr4eAHupvnPOVXEoLkg6Ocefvf/93d//SB7du4YQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chevrotain": "~11.1.1", + "chevrotain-allstar": "~0.3.1", + "vscode-languageserver": "~9.0.1", + "vscode-languageserver-textdocument": "~1.0.11", + "vscode-uri": "~3.1.0" + }, + "engines": { + "node": ">=20.10.0", + "npm": ">=10.2.3" + } + }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/liftup": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", + "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend": "^3.0.2", + "findup-sync": "^4.0.0", + "fined": "^1.2.0", + "flagged-respawn": "^1.0.1", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.1", + "rechoir": "^0.7.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/liftup/node_modules/findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", + "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/livereload-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", + "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", + "dev": true, + "license": "MIT" + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "license": "MIT" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.difference": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.padend": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", + "integrity": "sha512-sOQs2aqGpbl27tmCS1QNZA09Uqp01ZzWfDUoD+xzTii0E7dSQfRKcRetFwa+uXaxaqL+TKm7CgD2JdKP7aZBSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "license": "ISC", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/markdown-it": { + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz", + "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it-anchor": { + "version": "8.6.7", + "resolved": "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz", + "integrity": "sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==", + "dev": true, + "license": "Unlicense", + "peerDependencies": { + "@types/markdown-it": "*", + "markdown-it": "*" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true, + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/maxmin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-3.0.0.tgz", + "integrity": "sha512-wcahMInmGtg/7c6a75fr21Ch/Ks1Tb+Jtoan5Ft4bAI0ZvJqyOw8kkM7e7p8hDSzY805vmxwHT50KcjGwKyJ0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "figures": "^3.2.0", + "gzip-size": "^5.1.1", + "pretty-bytes": "^5.3.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "dev": true, + "license": "MIT" + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/memorystore": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/memorystore/-/memorystore-1.6.7.tgz", + "integrity": "sha512-OZnmNY/NDrKohPQ+hxp0muBcBKrzKNtHr55DbqSx9hLsYVNnomSAMRAtI7R64t3gf3ID7tHQA7mG4oL3Hu9hdw==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.0", + "lru-cache": "^4.0.3" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/memorystore/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/memorystore/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/merge-source-map/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/mermaid": { + "version": "11.12.3", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.12.3.tgz", + "integrity": "sha512-wN5ZSgJQIC+CHJut9xaKWsknLxaFBwCPwPkGTSUYrTiHORWvpT8RxGk849HPnpUAQ+/9BPRqYb80jTpearrHzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@braintree/sanitize-url": "^7.1.1", + "@iconify/utils": "^3.0.1", + "@mermaid-js/parser": "^1.0.0", + "@types/d3": "^7.4.3", + "cytoscape": "^3.29.3", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.2.0", + "d3": "^7.9.0", + "d3-sankey": "^0.12.3", + "dagre-d3-es": "7.0.13", + "dayjs": "^1.11.18", + "dompurify": "^3.2.5", + "katex": "^0.16.22", + "khroma": "^2.1.0", + "lodash-es": "^4.17.23", + "marked": "^16.2.1", + "roughjs": "^4.6.6", + "stylis": "^4.3.6", + "ts-dedent": "^2.2.0", + "uuid": "^11.1.0" + } + }, + "node_modules/mermaid/node_modules/marked": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.4.2.tgz", + "integrity": "sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==", + "dev": true, + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/mermaid/node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minami": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/minami/-/minami-1.2.3.tgz", + "integrity": "sha512-3f2QqqbUC1usVux0FkQMFYB73yd9JIxmHSn1dWQacizL6hOUaNu6mA3KxZ9SfiCc4qgcgq+5XP59+hP7URa1Dw==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp2": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/mkdirp2/-/mkdirp2-1.0.5.tgz", + "integrity": "sha512-xOE9xbICroUDmG1ye2h4bZ8WBie9EGmACaco8K8cx6RlkJJrxGIqjGqztAI+NMhexXBcdGbSEzI6N3EJPevxZw==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/mocha": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", + "ms": "2.1.3", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mocha/node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/glob/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.48.tgz", + "integrity": "sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==", + "license": "MIT", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mqtt": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-5.15.0.tgz", + "integrity": "sha512-KC+wAssYk83Qu5bT8YDzDYgUJxPhbLeVsDvpY2QvL28PnXYJzC2WkKruyMUgBAZaQ7h9lo9k2g4neRNUUxzgMw==", + "license": "MIT", + "dependencies": { + "@types/readable-stream": "^4.0.21", + "@types/ws": "^8.18.1", + "commist": "^3.2.0", + "concat-stream": "^2.0.0", + "debug": "^4.4.1", + "help-me": "^5.0.0", + "lru-cache": "^10.4.3", + "minimist": "^1.2.8", + "mqtt-packet": "^9.0.2", + "number-allocator": "^1.0.14", + "readable-stream": "^4.7.0", + "rfdc": "^1.4.1", + "socks": "^2.8.6", + "split2": "^4.2.0", + "worker-timers": "^8.0.23", + "ws": "^8.18.3" + }, + "bin": { + "mqtt": "build/bin/mqtt.js", + "mqtt_pub": "build/bin/pub.js", + "mqtt_sub": "build/bin/sub.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/mqtt-packet": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-9.0.2.tgz", + "integrity": "sha512-MvIY0B8/qjq7bKxdN1eD+nrljoeaai+qjLJgfRn3TiMuz0pamsIWY2bFODPZMSNmabsLANXsLl4EMoWvlaTZWA==", + "license": "MIT", + "dependencies": { + "bl": "^6.0.8", + "debug": "^4.3.4", + "process-nextick-args": "^2.0.1" + } + }, + "node_modules/mqtt-packet/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mqtt-packet/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mqtt/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mqtt/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" + }, + "node_modules/mqtt/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/mqtt/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", + "license": "MIT", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/mqtt/node_modules/ws": { + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", + "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/mri": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.4.tgz", + "integrity": "sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/multer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", + "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", + "license": "MIT", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.6.0", + "concat-stream": "^2.0.0", + "mkdirp": "^0.5.6", + "object-assign": "^4.1.1", + "type-is": "^1.6.18", + "xtend": "^4.0.2" + }, + "engines": { + "node": ">= 10.16.0" + } + }, + "node_modules/multer/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "license": "MIT", + "bin": { + "mustache": "bin/mustache" + } + }, + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "dev": true, + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nested-error-stacks": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", + "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nise": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.9.tgz", + "integrity": "sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/text-encoding": "^0.7.2", + "just-extend": "^6.2.0", + "path-to-regexp": "^6.2.1" + } + }, + "node_modules/nise/node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/nise/node_modules/@sinonjs/fake-timers": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.3.1.tgz", + "integrity": "sha512-EVJO7nW5M/F5Tur0Rf2z/QoMo+1Ia963RiMtapiQrEWvY0iBUvADo8Beegwjpnle5BHkyHuoxSTW3jF43H1XRA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/nise/node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-red-admin": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/node-red-admin/-/node-red-admin-4.1.3.tgz", + "integrity": "sha512-Kb3uF59389eZh78SmhN8eiUT1uUMCoH2dC60KOQKsHx3R9qHGBpJu0nozi9E4odnCJMLFOe+n4ENjEeRF+etwQ==", + "license": "Apache-2.0", + "dependencies": { + "ansi-colors": "^4.1.3", + "axios": "^1.13.5", + "bcryptjs": "3.0.2", + "cli-table": "^0.3.11", + "enquirer": "^2.3.6", + "minimist": "^1.2.8", + "mustache": "^4.2.0", + "read": "^3.0.1" + }, + "bin": { + "node-red-admin": "node-red-admin.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@node-rs/bcrypt": "1.10.7" + } + }, + "node_modules/node-red-admin/node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/node-red-admin/node_modules/bcryptjs": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-3.0.2.tgz", + "integrity": "sha512-k38b3XOZKv60C4E2hVsXTolJWfkGRMbILBIe2IBITXciy5bOsTKot5kDrf3ZfufQtQOUN5mXceUEpU1rTl9Uog==", + "license": "BSD-3-Clause", + "bin": { + "bcrypt": "bin/bcrypt" + } + }, + "node_modules/node-red-node-test-helper": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/node-red-node-test-helper/-/node-red-node-test-helper-0.3.5.tgz", + "integrity": "sha512-sUsg++CoO19UguqlK6j9q2VmluS7kpYgs45o+U3SAv4wW6BSoXwtuO7pJ+9KVQVmd27zwojw6uaeyLsDsRpL3Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "body-parser": "^1.20.3", + "express": "^4.21.0", + "semver": "^7.5.4", + "should": "^13.2.3", + "should-sinon": "^0.0.6", + "sinon": "^11.1.2", + "stoppable": "^1.1.0", + "supertest": "^7.1.4" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/node-red-node-test-helper/node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/node-red-node-test-helper/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/node-red-node-test-helper/node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/node-red-node-test-helper/node_modules/formidable": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", + "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/node-red-node-test-helper/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/node-red-node-test-helper/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-red-node-test-helper/node_modules/superagent": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.3.0.tgz", + "integrity": "sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "^1.3.1", + "cookiejar": "^2.1.4", + "debug": "^4.3.7", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.5", + "formidable": "^3.5.4", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.14.1" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/node-red-node-test-helper/node_modules/supertest": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.2.2.tgz", + "integrity": "sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cookie-signature": "^1.2.2", + "methods": "^1.1.2", + "superagent": "^10.3.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/node-watch": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.4.tgz", + "integrity": "sha512-RinNxoz4W1cep1b928fuFhvAQ5ag/+1UlMDV7rbyGthBIgsiEouS4kvRayvvboxii4m8eolKOIBo3OjDqbc+uQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/nodemon": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.14.tgz", + "integrity": "sha512-jakjZi93UtB3jHMWsXL68FXSAosbLfY0In5gtKq3niLSkrWznrVBzXFNOEMJUfc9+Ke7SHWoAZsiMkNP3vq6Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^10.2.1", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/nodemon/node_modules/brace-expansion": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", + "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/nodemon/node_modules/minimatch": { + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.3.tgz", + "integrity": "sha512-Rwi3pnapEqirPSbWbrZaa6N3nmqq4Xer/2XooiOKyV3q12ML06f7MOuc5DVH8ONZIFhwIYQ3yzPH4nt7iWHaTg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nodemon/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "license": "ISC", + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.1.1.tgz", + "integrity": "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/number-allocator": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.14.tgz", + "integrity": "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.1", + "js-sdsl": "4.3.0" + } + }, + "node_modules/number-allocator/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/number-allocator/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/nyc": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", + "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", + "dev": true, + "license": "ISC", + "dependencies": { + "archy": "^1.0.0", + "caching-transform": "^3.0.2", + "convert-source-map": "^1.6.0", + "cp-file": "^6.2.0", + "find-cache-dir": "^2.1.0", + "find-up": "^3.0.0", + "foreground-child": "^1.5.6", + "glob": "^7.1.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "merge-source-map": "^1.1.0", + "resolve-from": "^4.0.0", + "rimraf": "^2.6.3", + "signal-exit": "^3.0.2", + "spawn-wrap": "^1.4.2", + "test-exclude": "^5.2.3", + "uuid": "^3.3.2", + "yargs": "^13.2.2", + "yargs-parser": "^13.0.0" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/nyc/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/nyc/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/nyc/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/nyc/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nyc/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nyc/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nyc/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/nyc/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/nyc/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nyc/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/nyc/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/nyc/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/nyc/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/oauth2orize": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/oauth2orize/-/oauth2orize-1.12.0.tgz", + "integrity": "sha512-j4XtFDQUBsvUHPjUmvmNDUDMYed2MphMIJBhyxVVe8hGCjkuYnjIsW+D9qk8c5ciXRdnk6x6tEbiO6PLeOZdCQ==", + "license": "MIT", + "dependencies": { + "debug": "2.x.x", + "uid2": "0.0.x", + "utils-merge": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-get": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-get/-/object-get-2.1.1.tgz", + "integrity": "sha512-7n4IpLMzGGcLEMiQKsNR7vCe+N5E9LORFrtNUVy4sO3dj9a3HedZCxEL2T7QuLhcHN1NBuBsMOKaOsAYI9IIvg==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-to-spawn-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object-to-spawn-args/-/object-to-spawn-args-2.0.1.tgz", + "integrity": "sha512-6FuKFQ39cOID+BMZ3QaphcC8Y4cw6LXBLyIgPU+OhIYwviJamPAn+4mITapnSBQrejB+NNp+FMskhD8Cq+Ys3w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/opted": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/opted/-/opted-1.0.2.tgz", + "integrity": "sha512-uEvunmdmKcSFiBSmnY2E9E/HbghO5yc1J0yNmq7T18YkAJeWNlo33e6VYKkRK4eudVrpvvlLdemAeAuL6rZxjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", + "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^3.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-manager-detector": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz", + "integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==", + "dev": true, + "license": "MIT" + }, + "node_modules/pad-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pad-stream/-/pad-stream-2.0.0.tgz", + "integrity": "sha512-3QeQw19K48BQzUGZ9dEf/slX5Jbfy5ZeBTma2XICketO7kFNK7omF00riVcecOKN+DSiJZcK2em1eYKaVOeXKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pumpify": "^1.3.3", + "split2": "^2.1.1", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pad-stream/node_modules/split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "dev": true, + "license": "ISC", + "dependencies": { + "through2": "^2.0.2" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "license": "MIT" + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "license": "MIT", + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/passport": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz", + "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==", + "license": "MIT", + "dependencies": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/passport-http-bearer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/passport-http-bearer/-/passport-http-bearer-1.0.1.tgz", + "integrity": "sha512-SELQM+dOTuMigr9yu8Wo4Fm3ciFfkMq5h/ZQ8ffi4ELgZrX1xh9PlglqZdcUZ1upzJD/whVyt+YWF62s3U6Ipw==", + "dependencies": { + "passport-strategy": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/passport-oauth2-client-password": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/passport-oauth2-client-password/-/passport-oauth2-client-password-0.1.2.tgz", + "integrity": "sha512-GHQH4UtaEZvCLulAxGKHYoSsPRoPRmGsdmaZtMh5nmz80yMLQbdMA9Bg2sp4/UW3PIxJH/143hVjPTiXaNngTQ==", + "dependencies": { + "passport-strategy": "1.x.x" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/path-data-parser": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", + "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-type/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/points-on-curve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", + "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "dev": true, + "license": "MIT" + }, + "node_modules/points-on-path": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", + "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-data-parser": "0.1.0", + "points-on-curve": "0.2.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/proxy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/proxy/-/proxy-1.0.2.tgz", + "integrity": "sha512-KNac2ueWRpjbUh77OAFPZuNdfEqNynm9DD4xHT14CccGpW8wKZwEkN0yjlb7X9G9Z9F55N0Q+1z+WfgAhwYdzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "args": "5.0.1", + "basic-auth-parser": "0.0.2", + "debug": "^4.1.1" + }, + "bin": { + "proxy": "bin/proxy.js" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/proxy/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/proxy/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "license": "ISC" + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", + "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.6.3", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/read/-/read-3.0.1.tgz", + "integrity": "sha512-SLBrDU/Srs/9EoWhU5GdbAoxG1GzpQHo/6qiGItaoLJ1thmYpcNIM1qISEUvyHBzfGlWIyd6p2DNi1oV1VmAuw==", + "license": "ISC", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/reduce-flatten": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-3.0.1.tgz", + "integrity": "sha512-bYo+97BmUUOzg09XwfkwALt4PQH1M5L0wzKerBt6WLm3Fhdd43mMS89HiT1B9pJIqko/6lWx3OnV4J9f2Kqp5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/reduce-unique": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/reduce-unique/-/reduce-unique-2.0.1.tgz", + "integrity": "sha512-x4jH/8L1eyZGR785WY+ePtyMNhycl1N2XOLxhCbzZFaqF4AXjLzqSxa2UHgJ2ZVR/HHyPOvl1L7xRnW8ye5MdA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/reduce-without": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/reduce-without/-/reduce-without-1.0.1.tgz", + "integrity": "sha512-zQv5y/cf85sxvdrKPlfcRzlDn/OqKFThNimYmsS3flmkioKvkUGn2Qg9cJVoQiEvdxFGLE0MQER/9fZ9sUqdxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "test-value": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/reduce-without/node_modules/array-back": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", + "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "typical": "^2.6.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/reduce-without/node_modules/test-value": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz", + "integrity": "sha512-+1epbAxtKeXttkGFMTX9H42oqzOTufR1ceCF+GYA5aOmvaPq9wd4PUS8329fn2RRLGNeUkgRLnVpycjx8DsO2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^1.0.3", + "typical": "^2.6.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "license": "ISC", + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true, + "license": "ISC" + }, + "node_modules/requizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", + "integrity": "sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "dev": true, + "license": "Unlicense" + }, + "node_modules/roughjs": { + "version": "4.6.6", + "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", + "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hachure-fill": "^0.5.2", + "path-data-parser": "^0.1.0", + "points-on-curve": "^0.2.0", + "points-on-path": "^0.2.1" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/safe-json-parse": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", + "integrity": "sha512-o0JmTu17WGUaUOHa1l0FPGXKBfijbxK6qoHzlkihsDXxzBHvJcA7zgviKR92Xs841rX9pK16unfphLq0/KqX7A==", + "dev": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.62.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.62.1.tgz", + "integrity": "sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sax": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.3.tgz", + "integrity": "sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==", + "license": "BlueOak-1.0.0" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shelljs": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.5.3.tgz", + "integrity": "sha512-C2FisSSW8S6TIYHHiMHN0NqzdjWfTekdMpA2FJTbRWnQMLO1RRIXEB9eVZYOlofYmjZA7fY3ChoFu09MeI3wlQ==", + "dev": true, + "license": "BSD*", + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/should": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", + "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "should-equal": "^2.0.0", + "should-format": "^3.0.3", + "should-type": "^1.4.0", + "should-type-adaptors": "^1.0.1", + "should-util": "^1.0.0" + } + }, + "node_modules/should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "should-type": "^1.4.0" + } + }, + "node_modules/should-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", + "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" + } + }, + "node_modules/should-sinon": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/should-sinon/-/should-sinon-0.0.6.tgz", + "integrity": "sha512-ScBOH5uW5QVFaONmUnIXANSR6z5B8IKzEmBP3HE5sPOCDuZ88oTMdUdnKoCVQdLcCIrRrhRLPS5YT+7H40a04g==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "should": ">= 8.x" + } + }, + "node_modules/should-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", + "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/should-type-adaptors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", + "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "should-type": "^1.3.0", + "should-util": "^1.0.0" + } + }, + "node_modules/should-util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", + "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-cli": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/simple-cli/-/simple-cli-5.0.5.tgz", + "integrity": "sha512-Er2FhsIayL/sktxg6fOCdNQJBTXhlf/fswNFsdmks88xsHzQ/IXGwxYgSSKeXBq4yqn83/iD4Sg8yjagwysUgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "async": "^3.1.0", + "chalk": "^2.4.2", + "cross-spawn": "^7.0.0", + "key-list": "^0.1.4", + "lodash": "^4.17.15", + "opted": "^1.0.0" + } + }, + "node_modules/simple-cli/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/simple-cli/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/simple-cli/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/simple-cli/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "license": "MIT" + }, + "node_modules/simple-cli/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/simple-cli/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/simple-cli/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sinon": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.2.tgz", + "integrity": "sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==", + "deprecated": "16.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^7.1.2", + "@sinonjs/samsam": "^6.0.2", + "diff": "^5.0.0", + "nise": "^5.1.0", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.7", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.7.tgz", + "integrity": "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==", + "license": "MIT", + "dependencies": { + "ip-address": "^10.0.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/sort-array": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/sort-array/-/sort-array-5.1.1.tgz", + "integrity": "sha512-EltS7AIsNlAFIM9cayrgKrM6XP94ATWwXP4LCL4IQbvbYhELSt2hZTrixg+AaQwnWFs/JGJgqU3rxMcNNWxGAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^6.2.2", + "typical": "^7.1.1" + }, + "engines": { + "node": ">=12.17" + }, + "peerDependencies": { + "@75lb/nature": "^0.1.1" + }, + "peerDependenciesMeta": { + "@75lb/nature": { + "optional": true + } + } + }, + "node_modules/sort-array/node_modules/typical": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-7.3.0.tgz", + "integrity": "sha512-ya4mg/30vm+DOWfBg4YK3j2WD6TWtRkCbasOJr40CseYENzCUby/7rIvXA99JGsQHeNxLbnXdyLLxKSv3tauFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spawn-wrap": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.3.tgz", + "integrity": "sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" + } + }, + "node_modules/spawn-wrap/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/spawn-wrap/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "license": "ISC", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stoppable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4", + "npm": ">=6" + } + }, + "node_modules/stream-buffers": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.3.tgz", + "integrity": "sha512-pqMqwQCso0PBJt2PQmDO0cFj0lyqmiwOMiMSkVtRokl7e+ZTRYgDHKnuZNbqjiJXgsg4nuqtD/zxuo9KqTp0Yw==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/stream-connect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-connect/-/stream-connect-1.0.2.tgz", + "integrity": "sha512-68Kl+79cE0RGKemKkhxTSg8+6AGrqBt+cbZAXevg2iJ6Y3zX4JhA/sZeGzLpxW9cXhmqAcE7KnJCisUmIUfnFQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-connect/node_modules/array-back": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz", + "integrity": "sha512-1WxbZvrmyhkNoeYcizokbmh5oiOCIfyvGtcqbK3Ls1v1fKcquzxnQSceOx6tzq7jmai2kFLWIpGND2cLhH6TPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "typical": "^2.6.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/stream-via": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/stream-via/-/stream-via-1.0.4.tgz", + "integrity": "sha512-DBp0lSvX5G9KGRDTkR/R+a29H+Wk2xItOF+MpZLLNDWbEV9tGPnqLPxHEYjmiz8xGtJHRIqmI+hCjmNzqoA4nQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==", + "dev": true + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/superagent": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.1.2.tgz", + "integrity": "sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==", + "deprecated": "Please upgrade to superagent v10.2.2+, see release notes at https://github.com/forwardemail/superagent/releases/tag/v10.2.2 - maintenance is supported by Forward Email @ https://forwardemail.net", + "dev": true, + "license": "MIT", + "dependencies": { + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.4", + "debug": "^4.3.4", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.0", + "formidable": "^2.1.2", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=6.4.0 <13 || >=14" + } + }, + "node_modules/superagent/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/superagent/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/superagent/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/supertest": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.3.3.tgz", + "integrity": "sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==", + "deprecated": "Please upgrade to supertest v7.1.3+, see release notes at https://github.com/forwardemail/supertest/releases/tag/v7.1.3 - maintenance is supported by Forward Email @ https://forwardemail.net", + "dev": true, + "license": "MIT", + "dependencies": { + "methods": "^1.1.2", + "superagent": "^8.0.5" + }, + "engines": { + "node": ">=6.4.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/table-layout": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-0.4.5.tgz", + "integrity": "sha512-zTvf0mcggrGeTe/2jJ6ECkJHAQPIYEwDoqsiqBjI24mvRmQbInK5jq33fyypaCBxX08hMkfmdOqj6haT33EqWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^2.0.0", + "deep-extend": "~0.6.0", + "lodash.padend": "^4.6.1", + "typical": "^2.6.1", + "wordwrapjs": "^3.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", + "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/taffydb": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz", + "integrity": "sha512-y3JaeRSplks6NYQuCOj3ZFMO3j60rTwbuKCvZxsAraGYH2epusatvZ0baZYA01WsGqJBq/Dl6vOrMUJqyMj8kA==", + "dev": true + }, + "node_modules/tar": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz", + "integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-stream/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/tar-stream/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/temp-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-path/-/temp-path-1.0.0.tgz", + "integrity": "sha512-TvmyH7kC6ZVTYkqCODjJIbgvu0FKiwQpZ4D1aknE7xpcDf/qEOB8KZEK5ef2pfbVoiBhNWs3yx4y+ESMtNYmlg==", + "dev": true, + "license": "MIT" + }, + "node_modules/test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/test-value": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz", + "integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-back": "^2.0.0", + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/test-value/node_modules/array-back": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz", + "integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/tiny-lr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz", + "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "body": "^5.1.0", + "debug": "^3.1.0", + "faye-websocket": "~0.10.0", + "livereload-js": "^2.3.0", + "object-assign": "^4.1.0", + "qs": "^6.4.0" + } + }, + "node_modules/tiny-lr/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/tiny-lr/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", + "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.86" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "license": "MIT" + }, + "node_modules/typical": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz", + "integrity": "sha512-ofhi8kjIje6npGozTip9Fr8iecmYfEbS06i0JnIg+rh51KakryWF4+jX8lLKZVhy6N+ID45WYSFCxPOdTWCzNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "license": "BSD-2-Clause", + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "license": "MIT", + "dependencies": { + "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uid2": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz", + "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==", + "license": "MIT" + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/underscore": { + "version": "1.13.7", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz", + "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==", + "dev": true, + "license": "MIT" + }, + "node_modules/underscore.string": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", + "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "^1.1.1", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", + "integrity": "sha512-8pMuAn4KacYdGMkFaoQARicp4HSw24/DHOVKWqVRJ8LhhAwPPFpdGvdL9184JVmUwe7vz7Z9n6IqI6t5n2ELdg==", + "dev": true, + "license": "WTFPL OR MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8flags": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-4.0.1.tgz", + "integrity": "sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", + "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", + "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "vscode-languageserver-protocol": "3.17.5" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", + "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "dev": true, + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "8.2.0", + "vscode-languageserver-types": "3.17.5" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", + "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.5", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", + "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/walk-back": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-5.1.1.tgz", + "integrity": "sha512-e/FRLDVdZQWFrAzU6Hdvpm7D7m2ina833gIKLptQykRK49mmCYHLHq7UqjPDbxbKLZkTkW1rFqbengdE3sLfdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wordwrapjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-3.0.0.tgz", + "integrity": "sha512-mO8XtqyPvykVCsrwj5MlOVWvSnCdT+C+QVbm6blradR7JExAhbkZ7hZ9A+9NUtwzSqrlUo9a67ws0EiILrvRpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "reduce-flatten": "^1.0.1", + "typical": "^2.6.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/wordwrapjs/node_modules/reduce-flatten": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz", + "integrity": "sha512-j5WfFJfc9CoXv/WbwVLHq74i/hdTUpy+iNC534LxczMRP67vJeK3V9JOdnL0N1cIRbn9mYhE2yVjvvKXDxvNXQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/worker-factory": { + "version": "7.0.48", + "resolved": "https://registry.npmjs.org/worker-factory/-/worker-factory-7.0.48.tgz", + "integrity": "sha512-CGmBy3tJvpBPjUvb0t4PrpKubUsfkI1Ohg0/GGFU2RvA9j/tiVYwKU8O7yu7gH06YtzbeJLzdUR29lmZKn5pag==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "fast-unique-numbers": "^9.0.26", + "tslib": "^2.8.1" + } + }, + "node_modules/worker-timers": { + "version": "8.0.30", + "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-8.0.30.tgz", + "integrity": "sha512-8P7YoMHWN0Tz7mg+9oEhuZdjBIn2z6gfjlJqFcHiDd9no/oLnMGCARCDkV1LR3ccQus62ZdtIp7t3aTKrMLHOg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "tslib": "^2.8.1", + "worker-timers-broker": "^8.0.15", + "worker-timers-worker": "^9.0.13" + } + }, + "node_modules/worker-timers-broker": { + "version": "8.0.15", + "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-8.0.15.tgz", + "integrity": "sha512-Te+EiVUMzG5TtHdmaBZvBrZSFNauym6ImDaCAnzQUxvjnw+oGjMT2idmAOgDy30vOZMLejd0bcsc90Axu6XPWA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "broker-factory": "^3.1.13", + "fast-unique-numbers": "^9.0.26", + "tslib": "^2.8.1", + "worker-timers-worker": "^9.0.13" + } + }, + "node_modules/worker-timers-worker": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-9.0.13.tgz", + "integrity": "sha512-qjn18szGb1kjcmh2traAdki1eiIS5ikFo+L90nfMOvSRpuDw1hAcR1nzkP2+Hkdqz5thIRnfuWx7QSpsEUsA6Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "tslib": "^2.8.1", + "worker-factory": "^7.0.48" + } + }, + "node_modules/workerpool": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "license": "MIT", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlcreate": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", + "integrity": "sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "license": "ISC" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zip-stream": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", + "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "archiver-utils": "^3.0.4", + "compress-commons": "^4.1.2", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/archiver-utils": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", + "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^7.2.3", + "graceful-fs": "^4.2.0", + "lazystream": "^1.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/zip-stream/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/zip-stream/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + } + } +} From 282db370d79d907269e6d417d832c0b7b9cb3ebb Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 24 Feb 2026 11:23:19 +0000 Subject: [PATCH 135/160] UX updates for beta 3 --- .../@node-red/editor-client/src/js/red.js | 14 ++- .../editor-client/src/js/ui/common/tabs.js | 84 ++++++------- .../editor-client/src/js/ui/subflow.js | 4 +- .../editor-client/src/js/ui/view-navigator.js | 20 ++-- .../@node-red/editor-client/src/js/ui/view.js | 26 ++++- .../editor-client/src/js/ui/workspaces.js | 110 +++++++++++++++++- .../editor-client/src/sass/colors.scss | 2 + .../editor-client/src/sass/editor.scss | 2 +- .../editor-client/src/sass/header.scss | 32 ++--- .../editor-client/src/sass/sidebar.scss | 26 ++--- .../editor-client/src/sass/sizes.scss | 2 +- .../editor-client/src/sass/tabs.scss | 82 ++++++++++--- .../editor-client/src/sass/variables.scss | 3 + .../editor-client/src/sass/workspace.scss | 106 ++++++++++++----- .../src/sass/workspaceToolbar.scss | 11 +- 15 files changed, 390 insertions(+), 134 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/red.js b/packages/node_modules/@node-red/editor-client/src/js/red.js index 65b7d3bea0..15227c7ca8 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/red.js +++ b/packages/node_modules/@node-red/editor-client/src/js/red.js @@ -669,12 +669,12 @@ var RED = (function() { RED.eventLog.log(id,payload); }); - $(".red-ui-header-toolbar").show(); + loader.end(); + $(".red-ui-header-toolbar").removeClass('hide'); RED.sidebar.show(":first", true); setTimeout(function() { - loader.end(); checkTelemetry(function () { checkFirstRun(function() { if (showProjectWelcome) { @@ -893,6 +893,7 @@ var RED = (function() { RED.comms.connect(); $("#red-ui-main-container").show(); + setTimeout(() => $("#red-ui-header-tabs").show(), 100) RED.events.emit("sidebar:resize") loadPluginList(); @@ -901,14 +902,17 @@ var RED = (function() { function buildEditor(options) { - var header = $('
                  ').appendTo(options.target); - var logo = $('').appendTo(header); + const header = $('
                  ').appendTo(options.target); + const logo = $('').appendTo(header); + $('
                  ').appendTo(header); $('
                    ').appendTo(header); $('
                    ').appendTo(header); $('
                    '+ '
                    '+ '
                    '+ - '
                    '+ + '
                    '+ + '
                    '+ + '
                    '+ '
                    '+ '
                    ').appendTo(options.target); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/common/tabs.js b/packages/node_modules/@node-red/editor-client/src/js/ui/common/tabs.js index 8f0b705ed8..af8ccd5246 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/common/tabs.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/common/tabs.js @@ -30,6 +30,7 @@ RED.tabs = (function() { var currentActiveTabWidth = 0; var collapsibleMenu; var mousedownTab; + var mouseclickTab; var preferredOrder = options.order; var ul = options.element || $("#"+options.id); var wrapper = ul.wrap( "
                    " ).parent(); @@ -39,6 +40,34 @@ RED.tabs = (function() { wrapper.addClass("red-ui-tabs-vertical"); } + var scrollLeft; + var scrollRight; + + if (options.scrollable) { + wrapper.addClass("red-ui-tabs-scrollable"); + scrollContainer.addClass("red-ui-tabs-scroll-container"); + scrollContainer.on("scroll",function(evt) { + // Generated by trackpads - not mousewheel + updateScroll(evt); + }); + scrollContainer.on("wheel", function(evt) { + if (evt.originalEvent.deltaX === 0) { + // Prevent the scroll event from firing + evt.preventDefault(); + + // Assume this is wheel event which might not trigger + // the scroll event, so do things manually + var sl = scrollContainer.scrollLeft(); + sl += evt.originalEvent.deltaY; + scrollContainer.scrollLeft(sl); + } + }) + scrollLeft = $('').prependTo(wrapper).find("a"); + scrollLeft.on('mousedown',function(evt) {scrollEventHandler(evt, evt.shiftKey?('-='+scrollContainer.scrollLeft()):'-=150') }).on('click',function(evt){ evt.preventDefault();}); + scrollRight = $('
                    ').appendTo(wrapper).find("a"); + scrollRight.on('mousedown',function(evt) { scrollEventHandler(evt,evt.shiftKey?('+='+(scrollContainer[0].scrollWidth - scrollContainer.width()-scrollContainer.scrollLeft())):'+=150') }).on('click',function(evt){ evt.preventDefault();}); + } + if (options.addButton) { wrapper.addClass("red-ui-tabs-add"); var addButton = $('
                    ').appendTo(wrapper); @@ -165,34 +194,6 @@ RED.tabs = (function() { }) } - var scrollLeft; - var scrollRight; - - if (options.scrollable) { - wrapper.addClass("red-ui-tabs-scrollable"); - scrollContainer.addClass("red-ui-tabs-scroll-container"); - scrollContainer.on("scroll",function(evt) { - // Generated by trackpads - not mousewheel - updateScroll(evt); - }); - scrollContainer.on("wheel", function(evt) { - if (evt.originalEvent.deltaX === 0) { - // Prevent the scroll event from firing - evt.preventDefault(); - - // Assume this is wheel event which might not trigger - // the scroll event, so do things manually - var sl = scrollContainer.scrollLeft(); - sl += evt.originalEvent.deltaY; - scrollContainer.scrollLeft(sl); - } - }) - scrollLeft = $('
                    ').appendTo(wrapper).find("a"); - scrollLeft.on('mousedown',function(evt) {scrollEventHandler(evt, evt.shiftKey?('-='+scrollContainer.scrollLeft()):'-=150') }).on('click',function(evt){ evt.preventDefault();}); - scrollRight = $('
                    ').appendTo(wrapper).find("a"); - scrollRight.on('mousedown',function(evt) { scrollEventHandler(evt,evt.shiftKey?('+='+(scrollContainer[0].scrollWidth - scrollContainer.width()-scrollContainer.scrollLeft())):'+=150') }).on('click',function(evt){ evt.preventDefault();}); - } - if (options.collapsible) { // var dropDown = $('
                    ',{class:"red-ui-tabs-select"}).appendTo(wrapper); // ul.hide(); @@ -299,11 +300,12 @@ RED.tabs = (function() { return; } mousedownTab = null; - if (dblClickTime && Date.now()-dblClickTime < 400) { + if (dblClickTime && Date.now()-dblClickTime < 400 && evt.currentTarget === mouseclickTab) { dblClickTime = 0; dblClickArmed = true; return onTabDblClick.call(this,evt); } + mouseclickTab = evt.currentTarget dblClickTime = Date.now(); var currentTab = ul.find("li.red-ui-tab.active"); @@ -382,11 +384,12 @@ RED.tabs = (function() { var scWidth = scrollContainer.width(); var ulWidth = ul.width(); if (sl === 0) { - scrollLeft.hide(); + // We use the parent of the LH button so it doesn't take up space when hidden + scrollLeft.parent().hide(); } else { - scrollLeft.show(); + scrollLeft.parent().show(); } - if (sl === ulWidth-scWidth) { + if (Math.abs(sl - Math.round(ulWidth-scWidth)) < 5) { scrollRight.hide(); } else { scrollRight.show(); @@ -403,7 +406,6 @@ RED.tabs = (function() { } return false; } - function activateTab(link) { if (typeof link === "string") { link = ul.find("a[href='#"+link+"']"); @@ -418,6 +420,7 @@ RED.tabs = (function() { } } if (!link.parent().hasClass("active")) { + updateTabWidths(); ul.children().removeClass("active"); ul.children().css({"transition": "width 100ms"}); link.parent().addClass("active"); @@ -425,6 +428,8 @@ RED.tabs = (function() { wrapper.find(".red-ui-tab-link-button").removeClass("active selected"); $("#"+parentId+"-link-button").addClass("active selected"); if (options.scrollable) { + window.sc = scrollContainer; + window.at = link var pos = link.parent().position().left; if (pos-21 < 0) { scrollContainer.animate( { scrollLeft: '+='+(pos-50) }, 300); @@ -435,7 +440,6 @@ RED.tabs = (function() { if (options.onchange) { options.onchange(tabs[link.attr('href').slice(1)]); } - updateTabWidths(); setTimeout(function() { ul.children().css({"transition": ""}); },100); @@ -467,7 +471,7 @@ RED.tabs = (function() { var allTabs = ul.find("li.red-ui-tab"); var tabs = allTabs.filter(":not(.hide-tab)"); var hiddenTabs = allTabs.filter(".hide-tab"); - var width = wrapper.width(); + var width = options.scrollable ? scrollContainer.width() : wrapper.width(); var tabCount = tabs.length; var tabWidth; @@ -509,20 +513,20 @@ RED.tabs = (function() { tabs.css({width:tabWidth}); } else { - var tabWidth = (width-12-(tabCount*6))/tabCount; + var tabWidth = Math.round((width-12-(tabCount*6))/tabCount); currentTabWidth = (100*tabWidth/width)+"%"; currentActiveTabWidth = currentTabWidth+"%"; if (options.scrollable) { tabWidth = Math.max(tabWidth,140); currentTabWidth = tabWidth+"px"; currentActiveTabWidth = 0; - var listWidth = Math.max(wrapper.width(),12+(tabWidth+6)*tabCount); + var listWidth = Math.max(scrollContainer.width(),12+(tabWidth+6)*tabCount); ul.width(listWidth); updateScroll(); } else if (options.hasOwnProperty("minimumActiveTabWidth")) { if (tabWidth < options.minimumActiveTabWidth) { tabCount -= 1; - tabWidth = (width-12-options.minimumActiveTabWidth-(tabCount*6))/tabCount; + tabWidth = Math.round((width-12-options.minimumActiveTabWidth-(tabCount*6))/tabCount); currentTabWidth = (100*tabWidth/width)+"%"; currentActiveTabWidth = options.minimumActiveTabWidth+"px"; } else { @@ -964,7 +968,9 @@ RED.tabs = (function() { activateTab: activateTab, nextTab: activateNextTab, previousTab: activatePreviousTab, - resize: updateTabWidths, + resize: function () { + updateTabWidths() + }, count: function() { return ul.find("li.red-ui-tab:not(.hide)").length; }, diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js b/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js index 3e1b9a4105..7d825e6c98 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/subflow.js @@ -446,13 +446,13 @@ RED.subflow = (function() { refreshToolbar(activeSubflow); - $("#red-ui-workspace-chart").css({"margin-top": "40px"}); + $("#red-ui-workspace-chart").addClass('red-ui-workspace-toolbar-active'); $("#red-ui-workspace-toolbar").show(); } function hideWorkspaceToolbar() { $("#red-ui-workspace-toolbar").hide().empty(); - $("#red-ui-workspace-chart").css({"margin-top": "0"}); + $("#red-ui-workspace-chart").removeClass('red-ui-workspace-toolbar-active'); } function deleteSubflow(id) { const subflow = RED.nodes.subflow(id || RED.workspaces.active()); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js index bd22a01d69..e2f0e96b24 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view-navigator.js @@ -129,12 +129,19 @@ RED.view.navigator = (function() { $(window).on("resize", resizeNavBorder); RED.events.on("sidebar:resize",resizeNavBorder); RED.actions.add("core:toggle-navigator",toggle); + + RED.statusBar.add({ + id: "view-navigator", + align: "right", + element: $('') + }) + navContainer = $('
                    ').css({ "position":"absolute", - "bottom":$("#red-ui-workspace-footer").height() + 12, - "right": 16, + "bottom": 25, + "right": 0, zIndex: 1 - }).addClass('red-ui-navigator-container').appendTo("#red-ui-workspace").hide(); + }).addClass('red-ui-navigator-container').appendTo("#red-ui-view-navigator-widget").hide(); navBox = d3.select(navContainer[0]) .append("svg:svg") .attr("width", nav_width) @@ -169,6 +176,7 @@ RED.view.navigator = (function() { navBorder.attr('x',newX).attr('y',newY); $("#red-ui-workspace-chart").scrollLeft(newX*nav_scale*scaleFactor); $("#red-ui-workspace-chart").scrollTop(newY*nav_scale*scaleFactor); + RED.events.emit("view:navigate"); }).on("mouseup", function() { isDragging = false; }).on("mouseenter", function () { @@ -183,11 +191,7 @@ RED.view.navigator = (function() { } }) navBorder = navBox.append("rect").attr("class","red-ui-navigator-border") - RED.statusBar.add({ - id: "view-navigator", - align: "right", - element: $('') - }) + $("#red-ui-view-navigate").on("click", function(evt) { evt.preventDefault(); diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 937dd28dec..9009da165b 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -738,6 +738,7 @@ RED.view = (function() { chart.scrollLeft(0); chart.scrollTop(0); } + RED.events.emit("view:navigate"); var scrollDeltaLeft = chart.scrollLeft() - scrollStartLeft; var scrollDeltaTop = chart.scrollTop() - scrollStartTop; if (mouse_position != null) { @@ -824,7 +825,6 @@ RED.view = (function() { if (evt.ctrlKey || evt.altKey || spacebarPressed) { evt.preventDefault(); evt.stopPropagation(); - var currentTime = Date.now(); var timeSinceLastEvent = currentTime - lastWheelEventTime; @@ -845,7 +845,6 @@ RED.view = (function() { var minZoom = calculateMinZoom(); var newScale = Math.min(RED.view.zoomConstants.MAX_ZOOM, Math.max(minZoom, scaleFactor + scaleDelta)); - // Session-based gesture tracking: // - If no active gesture OR gap > gestureEndThreshold, start new gesture // - If gap < wheelEventContinuityThreshold, continue current gesture @@ -869,6 +868,10 @@ RED.view = (function() { var currentScrollPos = [chart.scrollLeft(), chart.scrollTop()]; var focalPoint = RED.view.zoomAnimator.getGestureFocalPoint(currentScrollPos, scaleFactor); zoomView(newScale, focalPoint); // Direct call, no animation + } else { + // At a limit - force a refresh to ensure UI elements are correctly updated + _redraw() + RED.events.emit("view:navigate"); } // Update last event time for continuity tracking @@ -913,6 +916,11 @@ RED.view = (function() { var currentScrollPos = [chart.scrollLeft(), chart.scrollTop()]; var focalPoint = RED.view.zoomAnimator.getGestureFocalPoint(currentScrollPos, scaleFactor); zoomView(newScale, focalPoint); + } else { + // At a limit - force a refresh to ensure UI elements are correctly updated + _redraw() + RED.events.emit("view:navigate"); + } // Update last event time for continuity tracking @@ -2960,6 +2968,8 @@ RED.view = (function() { } animatedZoomView(Math.max(scaleFactor - RED.view.zoomConstants.ZOOM_STEP, minZoom), useFocalPoint, buttonZoomWorkspaceCenter); + } else { + // RED.events.emit("view:navigate"); // Ensure UI updates to reflect zoom limit reached } } function zoomZero() { @@ -3063,6 +3073,7 @@ RED.view = (function() { onStep: function(values) { chart.scrollLeft(values.scrollLeft); chart.scrollTop(values.scrollTop); + RED.events.emit("view:navigate"); }, onStart: function() { RED.events.emit("view:navigate"); @@ -3089,7 +3100,6 @@ RED.view = (function() { factor = 1 } - console.log(factor) var screenSize = [chart.width(),chart.height()]; var scrollPos = [chart.scrollLeft(),chart.scrollTop()]; var oldScaleFactor = scaleFactor; @@ -3144,6 +3154,7 @@ RED.view = (function() { // If we're already at the target, no need to animate // Use a more tolerant threshold to account for floating-point precision if (Math.abs(scaleFactor - targetFactor) < 0.01) { + RED.events.emit("view:navigate"); return; } // Make scale 1 'sticky' @@ -3217,6 +3228,8 @@ RED.view = (function() { eventLayer.attr("transform", "scale(" + scaleFactor + ")"); outer.attr("width", space_width * scaleFactor).attr("height", space_height * scaleFactor); RED.view.navigator.resize(); + _redraw() + RED.events.emit("view:navigate"); }, onStart: function() { // Show minimap when zoom animation starts @@ -3227,15 +3240,18 @@ RED.view = (function() { // Ensure scaleFactor is exactly the target to prevent precision issues scaleFactor = targetFactor; // Full redraw at the end to ensure everything is correct - redraw(); + _redraw(); if (RED.settings.get("editor.view.view-store-zoom")) { RED.settings.setLocal('zoom-level', targetFactor.toFixed(1)); } + RED.events.emit("view:navigate"); }, onCancel: function() { cancelInProgressAnimation = null; // Ensure scaleFactor is set to current target on cancel scaleFactor = targetFactor; + _redraw(); + RED.events.emit("view:navigate"); } }); } @@ -3287,6 +3303,7 @@ RED.view = (function() { // Apply new scroll position chart.scrollLeft(newScrollX); chart.scrollTop(newScrollY); + RED.events.emit("view:navigate"); // Stop if velocity is too small if (Math.abs(scrollVelocity.x) < MIN_VELOCITY && Math.abs(scrollVelocity.y) < MIN_VELOCITY) { @@ -7870,6 +7887,7 @@ RED.view = (function() { if (x !== undefined && y !== undefined) { chart.scrollLeft(chart.scrollLeft()+x); chart.scrollTop(chart.scrollTop()+y) + RED.events.emit("view:navigate"); } else { return [chart.scrollLeft(), chart.scrollTop()] } diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js b/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js index 78e1399cd5..38b8203258 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/workspaces.js @@ -497,17 +497,116 @@ RED.workspaces = (function() { $("#red-ui-workspace-footer").children().hide() } + const scrollbars = {} + function updateScrollbars() { + const scaleFactor = RED.view.scale(); + const chartWindowSize = [ $("#red-ui-workspace-chart").width(), $("#red-ui-workspace-chart").height()]; + const chartSize = [ $("#red-ui-workspace-scroll-spacer").width(), $("#red-ui-workspace-scroll-spacer").height()]; + const scrollPos = [$("#red-ui-workspace-chart").scrollLeft(), $("#red-ui-workspace-chart").scrollTop()]; + const scrollRatio = [scrollPos[0]/(chartSize[0] - chartWindowSize[0]), scrollPos[1]/(chartSize[1] - chartWindowSize[1]) ]; + const scrollbarSize = [scrollbars.h.bar.width(), scrollbars.v.bar.height()] + // Set the height of the handles to be the same ratio of chartWindowSize to chartSize, with a minimum size to ensure they are always draggable + + scrollbars.v.handle.height(Math.max(40, scrollbarSize[1] * chartWindowSize[1] / chartSize[1])) + scrollbars.h.handle.width(Math.max(40, scrollbarSize[0] * chartWindowSize[0] / chartSize[0])) + if (isNaN(scrollRatio[0])) { + scrollbars.h.bar.hide() + } else { + scrollbars.h.bar.show() + const sbhWidth = scrollbars.h.bar.width() - scrollbars.h.handle.width() + scrollbars.h.handle.css({ left: sbhWidth * scrollRatio[0] }) + } + if (isNaN(scrollRatio[1])) { + scrollbars.v.bar.hide() + } else { + scrollbars.v.bar.show() + const sbvHeight = scrollbars.v.bar.height() - scrollbars.v.handle.height() + scrollbars.v.handle.css({ top: sbvHeight * scrollRatio[1] }) + } + } + + function setupScrollbar(scrollbar, direction) { + // direction: 'h' | 'v' + let isDragging = false; + let dragStartPos = 0; + let handleStartPos = 0; + function cancelScroll () { + isDragging = false; + $(document).off('mousemove.red-ui-workspace-scrollbar'); + $(document).off('mouseup.red-ui-workspace-scrollbar'); + } + // Update the following event handlers to also handle touch events + scrollbar.handle.on('mousedown', function(evt) { + isDragging = true; + dragStartPos = (direction === 'h' ? evt.pageX : evt.pageY); + handleStartPos = parseInt(scrollbar.handle.css(direction === 'h' ? 'left' : 'top')) || 0; + evt.preventDefault(); + $(document).on('mousemove.red-ui-workspace-scrollbar', function(evt) { + if (isDragging) { + const delta = (direction === 'h' ? evt.pageX : evt.pageY) - dragStartPos; + const newHandlePos = handleStartPos + delta; + const barSize = (direction === 'h' ? scrollbar.bar.width() : scrollbar.bar.height()) - (direction === 'h' ? scrollbar.handle.width() : scrollbar.handle.height()); + const clampedHandlePos = Math.max(0, Math.min(newHandlePos, barSize)); + const scrollRatio = clampedHandlePos / barSize; + const chartWindowSize = [ $("#red-ui-workspace-chart").width(), $("#red-ui-workspace-chart").height()]; + const chartSize = [ $("#red-ui-workspace-scroll-spacer").width(), $("#red-ui-workspace-scroll-spacer").height()]; + if (direction === 'h') { + const newScrollLeft = scrollRatio * (chartSize[0] - chartWindowSize[0]); + $("#red-ui-workspace-chart").scrollLeft(newScrollLeft); + } else { + const newScrollTop = scrollRatio * (chartSize[1] - chartWindowSize[1]); + $("#red-ui-workspace-chart").scrollTop(newScrollTop); + } + updateScrollbars() + } else { + $(document).off('mousemove.red-ui-workspace-scrollbar'); + } + }) + $(document).on('mouseup.red-ui-workspace-scrollbar', function(evt) { + cancelScroll() + }) + }); + } + function init() { - $('
                      ').appendTo("#red-ui-workspace"); - $('
                      ').appendTo("#red-ui-workspace"); + $('
                        ').appendTo("#red-ui-header-tabs"); + $('
                        ').appendTo("#red-ui-header-tabs"); $('
                        ').appendTo("#red-ui-workspace"); $('
                        ').appendTo("#red-ui-workspace"); $('').appendTo("#red-ui-workspace"); - $('
                        ').appendTo("#red-ui-workspace"); + scrollbars.v = { bar: $('
                        ').appendTo("#red-ui-workspace") } + scrollbars.v.handle = scrollbars.v.bar.children().first(); + setupScrollbar(scrollbars.v, 'v') + scrollbars.h = { bar: $('
                        ').appendTo("#red-ui-workspace") } + scrollbars.h.handle = scrollbars.h.bar.children().first(); + setupScrollbar(scrollbars.h, 'h') + + $('
                        ').appendTo("#red-ui-workspace"); createWorkspaceTabs(); - RED.events.on("sidebar:resize",workspace_tabs.resize); + RED.events.on("view:navigate", function () { + updateScrollbars() + }) + RED.events.on("sidebar:resize",function () { + workspace_tabs.resize(); + let sidebarWidth = $("#red-ui-sidebar-container").width() + const workspaceTargetWidth = $("#red-ui-workspace").width() - sidebarWidth - 10 + // $("#red-ui-workspace-toolbar").width(workspaceTargetWidth) + $("#red-ui-workspace-footer").width(workspaceTargetWidth) + $("#red-ui-workspace-scroll-v").css({ right: sidebarWidth + 2}) + $("#red-ui-workspace-scroll-h").css({ width: workspaceTargetWidth - 4 }) + + // const workspacePosition = $("#red-ui-workspace").position() + // $("#red-ui-header-tabs").css({ left: workspacePosition.left, width: workspaceTargetWidth }) + updateScrollbars() + }); + + RED.events.on("workspace:change", function(event) { + setTimeout(() => { + updateScrollbars() + }, 100) + }); RED.events.on("workspace:clear", () => { // Reset the index used to generate new flow names @@ -534,7 +633,8 @@ RED.workspaces = (function() { }); $(window).on("resize", function() { - workspace_tabs.resize(); + // workspace_tabs.resize(); + updateScrollbars() }); if (RED.settings.theme("menu.menu-item-workspace-add", true)) { RED.actions.add("core:add-flow",function(opts) { addWorkspace(undefined,undefined,opts?opts.index:undefined)}); diff --git a/packages/node_modules/@node-red/editor-client/src/sass/colors.scss b/packages/node_modules/@node-red/editor-client/src/sass/colors.scss index dd3444b678..38af324262 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/colors.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/colors.scss @@ -248,6 +248,8 @@ $clipboard-textarea-background: #F3E7E7; $header-background: $primary-background; $header-button-border: $primary-border-color; +$header-button-background: $header-background; +$header-button-background-hover: #ddd; $header-button-background-active: $workspace-button-background-active; $header-accent: $primary-background; diff --git a/packages/node_modules/@node-red/editor-client/src/sass/editor.scss b/packages/node_modules/@node-red/editor-client/src/sass/editor.scss index 0a0693abaa..90c1199262 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/editor.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/editor.scss @@ -50,7 +50,7 @@ background: var(--red-ui-secondary-background); border: 1px solid var(--red-ui-primary-border-color); overflow: hidden; - box-shadow: -2px 0 6px var(--red-ui-shadow); + // box-shadow: -2px 0 6px var(--red-ui-shadow); } diff --git a/packages/node_modules/@node-red/editor-client/src/sass/header.scss b/packages/node_modules/@node-red/editor-client/src/sass/header.scss index 171033756a..dbba356cf9 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/header.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/header.scss @@ -34,10 +34,9 @@ display: flex; justify-content: space-between; align-items: center; - padding-top: 6px; span.red-ui-header-logo { - float: left; + min-width: 235px; margin-left: 8px; text-decoration: none; white-space: nowrap; @@ -63,12 +62,15 @@ } .red-ui-header-toolbar { - display: flex; + flex: 1 0 auto; + &:not(.hide) { + display: flex; + } align-items: stretch; padding: 0; - margin: 0 10px 0 0; + margin: 0 10px 0 20px; list-style: none; - gap: 15px; + gap: 10px; > li { display: inline-flex; @@ -80,26 +82,27 @@ } .button { - height: 24px; + height: 30px; display: inline-flex; align-items: center; justify-content: center; - min-width: 24px; + min-width: 32px; text-align: center; font-size: 16px; padding: 0px; text-decoration: none; color: var(--red-ui-header-menu-color); - margin: auto 0; vertical-align: middle; mask-size: contain; + border-radius: 4px; + box-sizing: border-box; &:active, &.active { background: var(--red-ui-header-button-background-active); } - &:focus { - outline: none; - } + &:hover { + background: var(--red-ui-header-button-background-hover); + } } .button-group { @@ -109,7 +112,6 @@ & > a { display: inline-block; position: relative; - float: left; line-height: 22px; font-size: 14px; text-decoration: none; @@ -303,11 +305,13 @@ } } - -.red-ui-user-profile { +#red-ui-header-button-user { background-color: var(--red-ui-header-background); border: 1px solid var(--red-ui-header-button-border); border-radius: 4px; +} + +.red-ui-user-profile { overflow: hidden; padding: 3px; background-position: center center; diff --git a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss index 822bf6438d..ce63461d03 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss @@ -16,16 +16,20 @@ * limitations under the License. **/ + #red-ui-sidebar-container { + position: absolute; + top: 0; + bottom: 0; + right: 0; + display: flex; + flex-direction: row; + } .red-ui-sidebar { position: relative; flex-grow: 0; flex-shrink: 0; width: 315px; margin: 4px 0; - @include mixins.component-border; - border-left: none; - border-right: none; - background: var(--red-ui-secondary-background); box-sizing: border-box; z-index: 12; display: flex; @@ -61,6 +65,7 @@ border-radius: 6px; border: 1px solid var(--red-ui-secondary-border-color); overflow: hidden; + &:first-child { margin-top: 0; } &.red-ui-sidebar-section-bottom { flex-grow: 1; flex-shrink: 1; @@ -127,31 +132,27 @@ } .red-ui-sidebar-tab-bar { - background-color: var(--red-ui-secondary-background); flex: 0 0 auto; display: flex; flex-direction: column; align-items: center; - margin: 4px; - @include mixins.component-border; + margin: 0 4px 4px; z-index: 12; overflow: hidden; - // border: 1px solid var(--red-ui-primary-border-color); &.red-ui-sidebar-left { z-index: 10; - border: none; margin-right: 0; margin-left: 0; background: var(--red-ui-primary-background); } &.red-ui-sidebar-right { - border-top-right-radius: 8px; - border-bottom-right-radius: 8px; margin-left: 0; // Account for the RH sidebar having an extra top margin padding-top: 4px; - border-left: none; + margin-right: 0; + margin-bottom: 0; + border-bottom: none; } button { @@ -165,7 +166,6 @@ height: 22px; width: 22px; &:not(.selected):not(:hover) { - border: none; i { opacity: 0.7; } diff --git a/packages/node_modules/@node-red/editor-client/src/sass/sizes.scss b/packages/node_modules/@node-red/editor-client/src/sass/sizes.scss index ecefc02947..449819d453 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/sizes.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/sizes.scss @@ -14,4 +14,4 @@ * limitations under the License. **/ - $header-height: 36px; \ No newline at end of file + $header-height: 40px; \ No newline at end of file diff --git a/packages/node_modules/@node-red/editor-client/src/sass/tabs.scss b/packages/node_modules/@node-red/editor-client/src/sass/tabs.scss index 3b7d655d15..4c7dbc125b 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/tabs.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/tabs.scss @@ -230,7 +230,6 @@ left: 0; right: 0; opacity: 0.4; - background: red; } } .red-ui-tab-button { @@ -284,9 +283,8 @@ width: 21px; top: 0; a { - height: 35px; + // height: 35px; width: 21px; - display: block; color: var(--red-ui-workspace-button-color); font-size: 22px; text-align: center; @@ -295,7 +293,6 @@ border-right: none; border-top: none; border-bottom: 1px solid var(--red-ui-primary-border-color); - line-height: 34px; } } .red-ui-tab-scroll-left { @@ -435,19 +432,74 @@ i.red-ui-tab-icon { } } -ul#red-ui-workspace-tabs { - border-color: var(--red-ui-secondary-border-color); - li { - border-color: var(--red-ui-secondary-border-color); - border-top-left-radius: 4px; - border-top-right-radius: 4px; +#red-ui-header-tabs { + flex: 1 1 100%; + + .red-ui-tabs { + background: var(--red-ui-header-background); + border: none; + display: flex; + padding: 0; + .red-ui-tabs-scroll-container { + min-width:0; + width: 0; + flex: 1 1 0; + } + .red-ui-tab-button { + position: static; + background: var(--red-ui-header-background); + border: var(--red-ui-header-button-border); + a { + background: var(--red-ui-header-background); + border: var(--red-ui-header-button-border); + &:hover { + background: var(--red-ui-header-button-background-hover); + } + } + } + .red-ui-tab-button.red-ui-tab-scroll { + background: none; + border: none; + z-index:10; + border-radius: 0; + } + .red-ui-tab-button.red-ui-tab-scroll a { + border: none; + background: none; + border-radius: 0; + box-shadow: 0 0 8px rgba(0,0,0,0.3); + height: 100%; + display: flex; + align-items: center; + justify-content: center; + } + .red-ui-tab-button.red-ui-tab-scroll.red-ui-tab-scroll-left a { + border: none; + clip-path: inset(0 -8px 0 0); + } + .red-ui-tab-button.red-ui-tab-scroll.red-ui-tab-scroll-right a { + border: none; + clip-path: inset(0 0 0 -8px); + } + } + ul { + display: flex; + align-items: center; + border: none; + li { + min-width: 60px; + max-width: 150px; + flex: 1 1 100%; + border-color: var(--red-ui-header-button-border); + border-radius: 4px; + margin-top: 0; + } } } -#red-ui-workspace > .red-ui-tabs > .red-ui-tab-button { - border-color: var(--red-ui-secondary-border-color); +#red-ui-header-tabs > .red-ui-tabs > .red-ui-tab-button { + border-color: var(--red-ui-header-button-border); } -#red-ui-workspace > .red-ui-tabs > .red-ui-tab-scroll a { - border-color: var(--red-ui-secondary-border-color); - border-radius: 0; +#red-ui-header-tabs > .red-ui-tabs > .red-ui-tab-scroll a { + border-color: var(--red-ui-header-button-border); } diff --git a/packages/node_modules/@node-red/editor-client/src/sass/variables.scss b/packages/node_modules/@node-red/editor-client/src/sass/variables.scss index fca7d05dba..4e9459add1 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/variables.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/variables.scss @@ -249,7 +249,10 @@ --red-ui-header-background: #{colors.$header-background}; --red-ui-header-accent: #{colors.$header-accent}; + --red-ui-header-button-background: #{colors.$header-background}; + --red-ui-header-button-background-hover: #{colors.$header-button-background-hover}; --red-ui-header-button-background-active: #{colors.$header-button-background-active}; + --red-ui-header-button-border: #{colors.$header-button-border}; --red-ui-header-menu-color: #{colors.$header-menu-color}; --red-ui-header-menu-color-disabled: #{colors.$header-menu-color-disabled}; diff --git a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss index 6391292db9..69b1e7760f 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss @@ -21,36 +21,36 @@ overflow: hidden; @include mixins.component-border; border-top-left-radius: 8px; - border-bottom-left-radius: 8px; border-right: none; - margin: 4px 0 4px; + border-bottom: none; transition: left 0.1s ease-in-out; position: relative; flex-grow: 1; + .red-ui-workspace-toolbar-active { + top: 40px; + } } #red-ui-workspace-chart { - overflow: auto; - position: absolute; - bottom:0; - top: 35px; - left:0px; - right:0px; - box-sizing:border-box; - transition: right 0.2s ease; - touch-action: none; - padding: 0; - margin: 0; - border-right: 1px solid var(--red-ui-secondary-border-color); -// border-top-right-radius: px; + overflow: auto; + position: absolute; + bottom:0; + top: 0px; + left:0px; + right:0px; + box-sizing:border-box; + transition: right 0.2s ease; + touch-action: none; + padding: 0; + margin: 0; -// // Hide scrollbars -// scrollbar-width: none; /* Firefox */ -// -ms-overflow-style: none; /* Internet Explorer 10+ */ -// &::-webkit-scrollbar { /* WebKit */ -// width: 0; -// height: 0; -// } + // Hide scrollbars + scrollbar-width: none; /* Firefox */ + -ms-overflow-style: none; /* Internet Explorer 10+ */ + &::-webkit-scrollbar { /* WebKit */ + width: 0; + height: 0; + } // Reset SVG default margins > svg { @@ -88,9 +88,9 @@ } } -#red-ui-workspace-tabs:not(.red-ui-workspace-focussed) { - opacity:0.8; -} +// #red-ui-workspace-tabs:not(.red-ui-workspace-focussed) { +// opacity:0.8; +// } .red-ui-workspace-disabled-icon { display: none; } @@ -179,7 +179,7 @@ border: none; background: none; bottom: 14px; - right: 12px; + right: 200px; padding: 0; } .red-ui-component-footer { @@ -277,3 +277,57 @@ button.red-ui-footer-button-toggle { font-size: 13px; margin-bottom: 2px; } +:root { + --red-ui-scrollbar-width: 12px; + --red-ui-scrollbar-handle-size: 40px; + --red-ui-scrollbar-handle-background: rgb(128,128,128); +} + +.red-ui-workspace-scrollbar { + position: absolute; +} +.red-ui-workspace-scrollbar-handle { + position: absolute; + background: var(--red-ui-scrollbar-handle-background); + opacity: 0.7; + border-radius: 4px; + box-sizing: border-box; + border: 1px solid rgba(255,255,255,1); + cursor: pointer; + overflow: visible; + &:hover { + opacity: 1; + } + .red-ui-workspace-scrollbar-handle-target { + position: absolute; + top: -5px; + left: -5px; + right: -5px; + bottom: -5px; + } +} +#red-ui-workspace-scroll-v { + top: 2px; + bottom: 14px; + right: 0; + width: var(--red-ui-scrollbar-width); + .red-ui-workspace-scrollbar-handle { + top: 0; + left: 2px; + width: 8px; + height: var(--red-ui-scrollbar-handle-size); + } +} +#red-ui-workspace-scroll-h { + left: 2px; + right: 0; + bottom: 2px; + height: var(--red-ui-scrollbar-width); + .red-ui-workspace-scrollbar-handle { + left: 0; + top: 2px; + height: 8px; + width: var(--red-ui-scrollbar-handle-size); + } + // background: var(--red-ui-scrollbar-background); +} \ No newline at end of file diff --git a/packages/node_modules/@node-red/editor-client/src/sass/workspaceToolbar.scss b/packages/node_modules/@node-red/editor-client/src/sass/workspaceToolbar.scss index 7bc79f35a0..c72fc2b0c8 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/workspaceToolbar.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/workspaceToolbar.scss @@ -23,7 +23,7 @@ font-size: 12px; line-height: 18px; position: absolute; - top: 35px; + top: 0; left:0; right: 0; padding: 7px; @@ -53,6 +53,15 @@ .button-group { @include mixins.disable-selection; + .button:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .button:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .button:first-child { margin-right: 0; } From c3915a6c4d92bc2a485b73d596581f641a8bec49 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Tue, 24 Feb 2026 12:47:21 +0000 Subject: [PATCH 136/160] Fix lint --- packages/node_modules/@node-red/editor-client/src/js/red.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/red.js b/packages/node_modules/@node-red/editor-client/src/js/red.js index 15227c7ca8..902662ac7a 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/red.js +++ b/packages/node_modules/@node-red/editor-client/src/js/red.js @@ -538,7 +538,7 @@ var RED = (function() { node.dirty = true; RED.view.redrawStatus(node); } - }); + }) RED.comms.subscribe("notification/plugin/#",function(topic,msg) { if (topic == "notification/plugin/added") { RED.settings.refreshSettings(function(err, data) { @@ -903,7 +903,7 @@ var RED = (function() { function buildEditor(options) { const header = $('
                        ').appendTo(options.target); - const logo = $('').appendTo(header); + let logo = $('').appendTo(header); $('
                        ').appendTo(header); $('
                          ').appendTo(header); $('
                          ').appendTo(header); From 6a74428edd4740e4b8a164848f065aa4f579b194 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 25 Feb 2026 09:58:46 +0000 Subject: [PATCH 137/160] Various CSS tidy-ups --- .../editor-client/src/js/ui/tab-info.js | 31 ++++++----------- .../editor-client/src/sass/mixins.scss | 2 +- .../editor-client/src/sass/palette.scss | 1 - .../editor-client/src/sass/sidebar.scss | 34 +++++++++++++------ .../editor-client/src/sass/tab-info.scss | 24 ++++--------- .../editor-client/src/sass/workspace.scss | 2 +- .../core/common/lib/debug/debug-utils.js | 6 ++-- 7 files changed, 45 insertions(+), 55 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js index 1daf8abc1a..6fd3ef682c 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/tab-info.js @@ -58,47 +58,36 @@ RED.sidebar.info = (function() { "display": "flex", "flex-direction": "column" }).appendTo(stackContainer); - propertiesPanelHeader = $("
                          ", {class:"red-ui-palette-header red-ui-info-header"}).css({ + propertiesPanelHeader = $("
                          ", {class:"red-ui-sidebar-header"}).css({ "flex":"0 0 auto" }).appendTo(propertiesPanel); - propertiesPanelHeaderIcon = $("").appendTo(propertiesPanelHeader); - propertiesPanelHeaderLabel = $("").appendTo(propertiesPanelHeader); + propertiesPanelHeaderIcon = $('').appendTo(propertiesPanelHeader); + propertiesPanelHeaderLabel = $('').appendTo(propertiesPanelHeader); - propertiesPanelHeaderCopyLink = $('').css({ - position: 'absolute', - top: '6px', - right: '32px' - }).on("click", function(evt) { + const buttons = $('').appendTo(propertiesPanelHeader); + propertiesPanelHeaderCopyLink = $('').on("click", function(evt) { RED.actions.invoke('core:copy-item-url',selectedObject) - }).appendTo(propertiesPanelHeader); + }).appendTo(buttons); RED.popover.tooltip(propertiesPanelHeaderCopyLink,RED._("sidebar.info.copyItemUrl")); - propertiesPanelHeaderHelp = $('').css({ - position: 'absolute', - top: '6px', - right: '56px' - }).on("click", function(evt) { + propertiesPanelHeaderHelp = $('').on("click", function(evt) { evt.preventDefault(); evt.stopPropagation(); if (selectedObject) { RED.sidebar.help.show(selectedObject.type); } - }).appendTo(propertiesPanelHeader); + }).appendTo(buttons); RED.popover.tooltip(propertiesPanelHeaderHelp,RED._("sidebar.help.showHelp")); - propertiesPanelHeaderReveal = $('').css({ - position: 'absolute', - top: '6px', - right: '8px' - }).on("click", function(evt) { + propertiesPanelHeaderReveal = $('').on("click", function(evt) { evt.preventDefault(); evt.stopPropagation(); if (selectedObject) { RED.sidebar.info.outliner.reveal(selectedObject); RED.view.reveal(selectedObject.id); } - }).appendTo(propertiesPanelHeader); + }).appendTo(buttons); RED.popover.tooltip(propertiesPanelHeaderReveal,RED._("sidebar.help.showInOutline")); diff --git a/packages/node_modules/@node-red/editor-client/src/sass/mixins.scss b/packages/node_modules/@node-red/editor-client/src/sass/mixins.scss index 28eeba3c27..8bdcdc1fcd 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/mixins.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/mixins.scss @@ -140,7 +140,7 @@ vertical-align: middle; } .button-group:not(:last-child) { - margin-right: 10px; + margin-right: 4px; } diff --git a/packages/node_modules/@node-red/editor-client/src/sass/palette.scss b/packages/node_modules/@node-red/editor-client/src/sass/palette.scss index f53a36db94..864f6225ec 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/palette.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/palette.scss @@ -263,7 +263,6 @@ width: 24px; height: 20px; line-height: 20px; - margin-top: 1px; // width: 30px; // height: 25px; border-radius: 3px; diff --git a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss index ce63461d03..491e4a1814 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/sidebar.scss @@ -63,7 +63,7 @@ flex-grow: 0; flex-shrink: 0; border-radius: 6px; - border: 1px solid var(--red-ui-secondary-border-color); + border: 1px solid var(--red-ui-primary-border-color); overflow: hidden; &:first-child { margin-top: 0; } &.red-ui-sidebar-section-bottom { @@ -73,10 +73,9 @@ } .red-ui-sidebar-left .red-ui-sidebar-section { margin-left: 0; - border-color: var(--red-ui-primary-border-color); } .red-ui-sidebar-right .red-ui-sidebar-section { - margin-right: 0 + margin-right: 0; } @@ -215,14 +214,27 @@ padding: 2px 8px; } +.red-ui-sidebar-banner { /* Currently unused... */ + background: var(--red-ui-primary-background); + color: var(--red-ui-primary-text-color); + font-size: 8px; + padding: 0 3px; + text-align: right; + user-select: none; + cursor: grab; +} .sidebar-header, /* Deprecated -> red-ui-sidebar-header */ .red-ui-sidebar-header { + font-size: 13px; color: var(--red-ui-primary-text-color); - text-align: right; - padding: 8px 10px; + padding: 4px; background: var(--red-ui-primary-background); border-bottom: 1px solid var(--red-ui-secondary-border-color); white-space: nowrap; + display: flex; + justify-content: end; + align-items: center; + gap: 3px; } /* Deprecated -> red-ui-footer-button */ @@ -239,9 +251,9 @@ button.sidebar-header-button, /* Deprecated -> red-ui-sidebar-header-button */ a.red-ui-sidebar-header-button, button.red-ui-sidebar-header-button { @include mixins.workspace-button; - font-size: 13px; - line-height: 13px; - padding: 5px 8px; + font-size: 11px; + line-height: 11px; + padding: 3px 5px; &.toggle { @include mixins.workspace-button-toggle; } @@ -252,9 +264,9 @@ button.sidebar-header-button-toggle, /* Deprecated -> red-ui-sidebar-header-butt a.red-ui-sidebar-header-button-toggle, button.red-ui-sidebar-header-button-toggle { @include mixins.workspace-button-toggle; - font-size: 13px; - line-height: 13px; - padding: 5px 8px; + font-size: 11px; + line-height: 11px; + padding: 3px 5px; } .sidebar-header-button:not(:first-child), /* Deprecated -> red-ui-sidebar-header-button */ diff --git a/packages/node_modules/@node-red/editor-client/src/sass/tab-info.scss b/packages/node_modules/@node-red/editor-client/src/sass/tab-info.scss index 5af00579f0..8cbf8b0d3d 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/tab-info.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/tab-info.scss @@ -23,27 +23,17 @@ .red-ui-sidebar-info hr { margin: 10px 0; } -.red-ui-info-header { - padding-left: 9px; - line-height: 21px; - cursor: default; - border-bottom: 1px solid var(--red-ui-secondary-border-color); - > * { - vertical-align: middle - } - > span { - display: inline-block; - margin-left: 5px; - overflow-wrap: anywhere; - } -} + table.red-ui-info-table { - font-size: 14px; + font-size: 13px; margin: 0 0 10px; width: 100%; } table.red-ui-info-table tr:not(.blank) { - border-top: 1px solid var(--red-ui-secondary-border-color); + &:not(:first-child) { + border-top: 1px solid var(--red-ui-secondary-border-color); + } + line-height: 23px; border-bottom: 1px solid var(--red-ui-secondary-border-color); } .red-ui-help-property-expand { @@ -360,7 +350,7 @@ div.red-ui-info-table { .red-ui-info-outline-item { display: inline-flex; padding: 0; - font-size: 13px; + font-size: 12px; border: none; &:not(.red-ui-node-list-item) .red-ui-palette-icon-fa { position: relative; diff --git a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss index 69b1e7760f..efc7cfb9c0 100644 --- a/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss +++ b/packages/node_modules/@node-red/editor-client/src/sass/workspace.scss @@ -20,7 +20,7 @@ margin: 0; overflow: hidden; @include mixins.component-border; - border-top-left-radius: 8px; + border-top-left-radius: 6px; border-right: none; border-bottom: none; transition: left 0.1s ease-in-out; diff --git a/packages/node_modules/@node-red/nodes/core/common/lib/debug/debug-utils.js b/packages/node_modules/@node-red/nodes/core/common/lib/debug/debug-utils.js index 20a62ea5c5..fe99395f45 100644 --- a/packages/node_modules/@node-red/nodes/core/common/lib/debug/debug-utils.js +++ b/packages/node_modules/@node-red/nodes/core/common/lib/debug/debug-utils.js @@ -45,11 +45,11 @@ RED.debug = (function() { ''+ ''+ ''+ - ' '+ + ' '+ ''+ ''+ - ' all' + - ''+ + ' all' + + ''+ '
                          ').appendTo(content); var footerToolbar = $('
                          '+ From a99cfaf65378ed1f1a96d4851bffe8eb725b5f3a Mon Sep 17 00:00:00 2001 From: Steve-Mcl Date: Sat, 28 Feb 2026 21:04:13 +0000 Subject: [PATCH 138/160] upgrade monaco to latest 0.55.1 --- .../monaco/dist/4c354c82c52ca6cc2543.ttf | Bin 0 -> 121972 bytes .../src/vendor/monaco/dist/css.worker.js | 3 +- .../monaco/dist/css.worker.js.LICENSE.txt | 6 - .../src/vendor/monaco/dist/editor.js | 2 +- .../vendor/monaco/dist/editor.js.LICENSE.txt | 11 +- .../src/vendor/monaco/dist/editor.worker.js | 2 +- .../src/vendor/monaco/dist/html.worker.js | 2 +- .../monaco/dist/html.worker.js.LICENSE.txt | 6 - .../src/vendor/monaco/dist/json.worker.js | 3 +- .../monaco/dist/json.worker.js.LICENSE.txt | 6 - .../src/vendor/monaco/dist/locale/cs.js | 2348 +---------------- .../monaco/dist/locale/cs.js.LICENSE.txt | 6 + .../src/vendor/monaco/dist/locale/de.js | 2348 +---------------- .../monaco/dist/locale/de.js.LICENSE.txt | 6 + .../src/vendor/monaco/dist/locale/es.js | 2348 +---------------- .../monaco/dist/locale/es.js.LICENSE.txt | 6 + .../src/vendor/monaco/dist/locale/fr.js | 2348 +---------------- .../monaco/dist/locale/fr.js.LICENSE.txt | 6 + .../src/vendor/monaco/dist/locale/it.js | 2348 +---------------- .../monaco/dist/locale/it.js.LICENSE.txt | 6 + .../src/vendor/monaco/dist/locale/ja.js | 2348 +---------------- .../monaco/dist/locale/ja.js.LICENSE.txt | 6 + .../src/vendor/monaco/dist/locale/ko.js | 2348 +---------------- .../monaco/dist/locale/ko.js.LICENSE.txt | 6 + .../src/vendor/monaco/dist/locale/pl.js | 2348 +---------------- .../monaco/dist/locale/pl.js.LICENSE.txt | 6 + .../src/vendor/monaco/dist/locale/pt-br.js | 2348 +---------------- .../monaco/dist/locale/pt-br.js.LICENSE.txt | 6 + .../src/vendor/monaco/dist/locale/ru.js | 2348 +---------------- .../monaco/dist/locale/ru.js.LICENSE.txt | 6 + .../src/vendor/monaco/dist/locale/tr.js | 2348 +---------------- .../monaco/dist/locale/tr.js.LICENSE.txt | 6 + .../src/vendor/monaco/dist/locale/zh-cn.js | 2 + .../monaco/dist/locale/zh-cn.js.LICENSE.txt | 6 + .../src/vendor/monaco/dist/locale/zh-tw.js | 2 + .../monaco/dist/locale/zh-tw.js.LICENSE.txt | 6 + .../src/vendor/monaco/dist/ts.worker.js | 7 +- 37 files changed, 117 insertions(+), 25841 deletions(-) create mode 100644 packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/4c354c82c52ca6cc2543.ttf delete mode 100644 packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/css.worker.js.LICENSE.txt delete mode 100644 packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/html.worker.js.LICENSE.txt delete mode 100644 packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/json.worker.js.LICENSE.txt create mode 100644 packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/locale/cs.js.LICENSE.txt create mode 100644 packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/locale/de.js.LICENSE.txt create mode 100644 packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/locale/es.js.LICENSE.txt create mode 100644 packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/locale/fr.js.LICENSE.txt create mode 100644 packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/locale/it.js.LICENSE.txt create mode 100644 packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/locale/ja.js.LICENSE.txt create mode 100644 packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/locale/ko.js.LICENSE.txt create mode 100644 packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/locale/pl.js.LICENSE.txt create mode 100644 packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/locale/pt-br.js.LICENSE.txt create mode 100644 packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/locale/ru.js.LICENSE.txt create mode 100644 packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/locale/tr.js.LICENSE.txt create mode 100644 packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/locale/zh-cn.js create mode 100644 packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/locale/zh-cn.js.LICENSE.txt create mode 100644 packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/locale/zh-tw.js create mode 100644 packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/locale/zh-tw.js.LICENSE.txt diff --git a/packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/4c354c82c52ca6cc2543.ttf b/packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/4c354c82c52ca6cc2543.ttf new file mode 100644 index 0000000000000000000000000000000000000000..82acfd5de340e358fcfe36e76373c1bd12a66763 GIT binary patch literal 121972 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
                          YQNW;^`-i0`i=S{`cI6!vD~=MxW{$oi6oj)u8 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

                          S+UXQT=35Vvv&?;=R2yqr8 z{{q?4bnY3;x1UzoL<9$u1dh+C1Q7&%0vn^3f{#x`@dL^3FI$CPp45o3NIZ+u63(93 zjk7TcpU5U_coPzysbn&m^woGN9@8Ui_6Zp2NRD25BxS?QBbM>waTtK(_#I{kSd?tVmA|^4=!WM3UBhk?o))v0xI=A2MCF44|%3$0x z9Z97k)AuC&=xS0Y9-4jVMEah4(kC7&=$V;_PDbxO5-q93X%D%;>4YjpkK7$iJ$EK~ z{FMvy58ezK4}7$28;0hPA|X?Mp=PKt`2hY4FZlHj$$QNw6R~SP$v3P#Q@$|)b{v{R zCWfK14HzVD^FbgZuo&zr!T>l{!WfYmU?Or&593Mi_S>29gmmAzHly9d|M5iF z$+(tI#t^N{%;;q7o|S0)M8tjh0rm5Du^jf|gmGyN+iA$d7&70-#}a6;vh%$rWEX^P zK;?^5Q=j6)GdGOjGl>=pw=i?hvA%cjd-^n(>dC@IHZ75f#mqva&=@@;G871ekXj)H ztEJI_WPoT^Y$u7Q!+j725L`erP``3^YAio4Y7RX4=OI-RsmxR=W8%f!luaduC(8#A zFF_g*`*(CYmwkim`@fMLNh1iu`96bpNpv_>$hyUwfQ(ErRf^_R4pT)SG?5z3Bnl$g z3w84NpW8TbhfNg2Wua7|_j&?TOmQtW>(jb`#y8vuh=Si0(`M^z8HyLth(co+pQMK@ zQy;{-{4Qvc@2POO357bMD4Jqj%OP2`gsPi(;DL$NXN0njre|_>nBCKx;9K3!em$(qpJA{mc&OM1GyvRa?IVQh{SoZe2K~-Q^gtUq-$rYHyKxjenQ^o3i07rH;*pH&j&gp|r7Gi%-{?BC{aZdWdUE9I zNMAA?`oe3%bdDAvgOZMyjiXB&FXm&h*%Jqd=uLVdOqwxSNu>9$ zoI=jW_p-y|76M3!AOI0S#~GqpavE28TdhW?jvvU6A&(~~cRDtLA#1TPxqphU{l&h* zNPYxrHi8}W#L_;KGH_%(Ta+kLl9b`Fg|y%Y9zb3humx-+R<8QbxQmUid!4)0+dqt`P{B!&X>;HaB6- zgZst3ND>GbNrn+5xi^9X1n!ty%Y%!oWIr}!N1)RmU^fE8iXlngGGB0kwf!}|Y*zWf z%o~}sk@p=1!vzR|c;=|CqHhIL+;B^oCceit5_B1a^fRLC$N5C|GhOh;Wp?)dOEOX`~3bXy=jzwqZ_)ide*}m~*_3H!@cyB}2Yh8#sXANEZo~RSbO^_Q)6ySToloIf0HWWLO zMP95$S5U@5cm!6h!a~a)3U(KE*cVQDURY!?U;~Q^2feWRC9xH~pWa{3FVb&E-}s<} zD?1*KUX8~emOugaH_yd~BhD3La1a!JUhbSAP_gSwW#nPHlbhs?kvp-XIOI6f;D~`D z8mcJ`<>p5294Ior0sk}fMI>u8CKelz56xnL1c+W+5lk5f+Cnvlm2DNhFOJSdZZRp` zhB5i4I5%qS>wl8QgJIsszD3~JFHVo7vPl0ksS)flFpCK?(~jd_$iEP_eWJb;8Rc7v z+b#B#Ga|9JYZR&17lwgSk!hm(@ z8S3w&3kKRmScihlK%5{r;B5t>#tVURt$Y#~TsvxX=(2j)`XS$m7B~khtBoD^phb4X zy=0k^v#^%R6mbG$Hi_Z*xk*zK@e`vO;-)XFkVq(G z6Ih#vu{Vhr#Yhk0M&t%-0je>Ui`G zbk(;VW;_1PYnlUZKK8^5g&U6)dc6t@%%$^{udt5Au1Dx)iP|aLn-5e2rot$dtl`@r z{~_f2fSSq>BB&hb0@7(T)1(Pnd3NkN1g-n?<>^v(WU4rO*m%>);Yk@dvs7Cc)Z9)i ziGyl#Y2Wa3QzO~ZbUDA@D|*+D5fTV?dw8R70V9yk~jZqfZ4;Fj?HOR6I8np6#Ja&W$ z>^YnCjP1d^gnkVeM9Dy985(-hlW`-Pw}zec#TMLk>7Uuh-#;lTC^4Rt(42_7BNLON zfO)lz3KBK8>E_Nr#fc~-48Gk9&L+WbdHFldlaswSx|%mK9+6vYa13y{+;+(BKs}g& zPn&~xyqi_m=U)Z%;nD^%B*BjbB_P58QueTEp|Y!|<-$?+O>{Bp9WpeZ=|ubx--e^V z{(9;0Aq`s={T1QndNugqn)ENIPeVr6gm^#$7r9O%4ag&rgOR0!!t3>F2G-vsv@g97 zz(J;9?SPEb5L~zb`yw=vq`HtiDj`L5)R+sHe4m!>oPCOgpH89JKQM9te?+%9Q;NsW z#`llt#1oo;u9%#xV+WIV*AW25N2ZuOT%;nC-ZQ0{B9@WnIdu4G-V=Eut_#!2_1Nvx zBhi@aoP+OC?gnw9r^_z3u4p+T6Cn%@ea`S1!pC1jg!Z;1nU@f{uKi_8d&UMT5Eoao z)QAjZO}%Z<6I=G2FWd0EsC+&a*o;U-K5>2{!6=K=vwV+{D~Ml;#DE1S8BQ=Dj?Ly^ zjpzgyvDy~`$ie+EU?arm67fin0s69ouHn2BO&I3Tl#RVKWQo{o8LPK|6AJZI!mAaqWLRKT;{`OZsx5yeim5(vMBvvkVgwQaULlw#8gNc1TPR zyTbC(-#O@cr$y;>5VPFV;DW^IgZv#eyPbqpBDN)=Xt(n{K(r-R%liVz3@TvKDE%U8 z{ZW{SX^eog64oo`P5bfXec9>J^mH+9cEy+{lZR}X&`9bHGF_ph$XGQ=wvnI$LA8k) zZP?jxKc9uOIBmRsjhI3bDvMVfJ6zcdak3S^h;#{>Jg^BjawctLib4p04T=ls5qcO3 zP-k62``ngF4deQUjZL;tdeg{cQdEwFBN!L5BUzZu+#rbOIXQeGoh^sAepfnQ+I#E% zKg`S*#|{$Dg%_meho{HhRM5t=kl?k%E0EfB@9NWF?TeSwaSROkO8;&Z z;st2jStx^h*ssK>sjtUR6BSMRmKHKitfW~@MO51#(}Qc2ct!bMIRai}gB5 z;@$$*7qp4wl1mfG$bBGO?B1m~I2gfwiagtK)ue zSc!126#5~Cq;(Ov_24aJdz|%UR{`3@npkK^q?e&U5SxDkkNz`(G&uUbq&#~xk-arj zR*6RwlZnGte)lMeUZS@Wn9WMI68CZG(S#~zPG#edCKBh6^xf)tuXdxSq6vfMLYa@) z`ARI%8$~kJlfmtY65ERhdQG&y0qcvWtsL!GKSpN|DfCQVAuy0*B?v4UWq%8v2;zs9 z``Q6A0EE^SGJbvBoCEhA0x#b;^cd^eu4UPHWo08NKwxH(8$)X{<63F(3tV0Js?P@b zXY)cTBoX!gEa4LUFpm!M9@4QSlY zu`kfax&N8?LSk(H&HGF93kx4V%X8yoPEs>4Zix{N^JpK@?wy1qSIz_K2^q!8L%h{@ zUX5`A;-YBec&S)Q+_L{>bzk8==Gw|k^Wdy9xceT-lQm~}6KnVi0_$ya{(ide-KroS z5TAqGkI3wkVRsoHK*pnF;(rbcoUI)$k>Kx?XmZ)lSSBIYDvAQ(eaqN8siDV66Yy9x z7UN(G_ldQpG2#n-l z*psm=zhUu%7-!=cgIzLOT=DWuC6IDRh(sYFzz{q*aP5Tknw-RY{6_MgNj zp2!=k5e#m$+1~mxdC{*QV64sr*&3jk!aZ9^5mX~0cY^XWsc%HOj7=jPieV24tZmpU zSth+Ih#ncVnfX#!SQAYfV=p#X3w?Dw{^DqG{s=}7ZT%;SUd1A@M3v~sIETsVizD`n z>9-o!_)Eg_labCKP7b7^Q;2)tQIObf?BlVkAvmR?IKVqmaSr;iMjBnS(FZmRHf!&>R55-aY#MBA@o@{t)btT7x%7M5lVDa2!JUMPDOGMWyMtR4Xo>MHDD7Y>(}4zDaNv!SgX^$E@Z z#r0;f*}NMg1hf*_)GTo>C4&i`L%7b${0dNHQg}zOHZW3v1fUuh7HY&lAd#7_#Fgv~*r_vp zyq}TrO4!)5X@oR_FwL?EK z^o%Mg;Zjk5IL1ChfL@G9AcRC*OQ!`7XgN^_BlsTEpQEQDSj=j~nw*M8mY7FGOaUdZ z6GAZ{FF^Lm*2+I*9kM;b0G^5*5fhb#nOo7!7~&P140tB69XpO+hJ(k#NzcG)`LatN zU1gU=lrv^N&ppRLrY!)woq1ilBa=wepByanLoMX~TabmWeD9RvJL(k#AOX1K8TLeD`}k zwpQpD$SoU-iQgu0g=Z3K2=ECuHBme@$Yn>C1M1jiLdXOv@a(t91sD?O#brT&PN(7mpLl5jzkDGZjktFZj}s9#R2EeR z>@eB_LDB-Z=#qK`Y-lpa&=Hg%0>$!iO$dqGBE%et;a7kv3N!<9!*mna;x+On%*tM? zeI9f10>euHj7mlpMCtHo(kiGtdM7ZKnPL1!37D)6zDP|0=mfiZiEaTt~}(Ym{~gOM+>pEr1JqK zL8H+iN0-2d;v&Z%`b7u9V0?uxySb=ns4#&F=*}D9C$m_dEkREWv6n#}0r*grvg$mm zkGGcSjeypjl6{Y@r^e@#VeF|GRjC(&)hDu5ji|EO}MZhju+Cd z?w3YlsUJ>cG`_RJ@0;i3K@kzkTdtw;*AO{Xg;(PhGh1RN~mPMog9PFFe&GRI%_}Mz1i=c!+(|1oE&W z5@DvtCH5rLkQ58v0z}L33g!!fOoeDfTtd<&m@vR`c;WEU>`9VO3Ucy6MYDfdo-Xt6 zheqUQWO;Zdj*rUHR63oga87NufX7qD%jO8|mj1lT-#O1NG;)19N(8yT$PJU>bhv7N zI?foe|0b^Ubvm!`&EtwL?;l+r&c!BYvgyR@r)DEK{lV3ybamqi8wW7Y8-?BmVh8p7Ayol9<- z=%UNLn3e&h8_EtOF4!D;`WtDjSeO}I0_`$t`4vlfiuV+J5GTUvm1h^qv(JEmTy@7> zBpEqm64|DfQ>=aP5ui2t%2AUjI&t^w;VGLW>^e9ewqgjnn ziC;+S>?mGyqv=#EHdfH1*bd?R8NV~0AtGTin<2t3Gn2>^3n_Gk5$pgHxr|)SB{hK& zF@jAMOPPe+6i;Td;&@|cs|Jmc#9MJF@HhZC6WWJ@t( zf)N=WVhS}h0E|b5lPca*Gh+aHgqP z?m^ef4o^c1?sMJy$qj!tGyLKEvq{HU#7qG$>2ahu2M|ErDGJ6~+D_KejOx@y75m=c1}?Mw(b1;AoL8_5OX_08DK z+dYf1Ve*77mZ@V%hfBl$bJq+}rZ;w5>G|_!Ex*9G4>gYl*fl^Ll{mPKTFv<1dJi{U_%*0fplY>VuUuqRrqzmBf(`6 zRkJM<$4T&v^qxLJyfPXx4DtrHrxnCu#(WL5Xuq=ZB=i}MdronrXo7DSN5;hM9l|1= z!_dB*BZ%kQW6(w@+}L_awV-tjeI#}_%3U47Ore1N5ukcZvAer7Vp}x>x#!O;Oh+$> z9omKH^uo*rbk=3T9G4-=TrnO7EntZ!Kbg^qdvcPRoIm4EBzF&>D3WAM;+lC_wKHc3 zg!(ag75cMa+_KR9`;qoYUh$Wq_eX$%LJ}>FtT-^g0Ejp~gBAT1==jnsS~fw%Vk)%~ z8dnMV&H&pH6*-XdN=$*79s8MQC}AgGJbuQXg?cQT*2PvsI1ByuYAku4GNz^_}Y z6HE<(r>w|)KAs;P&3|03N=UQB?r|eGYyN?Vt!S&1QxH z_3Y!gHMvV}KFi=#1rqFNuU4S zkT#WA1EP~WWvrr!`)N}hg&@DOB!a7Or<8RM>f!bMy0ukgT^LCat%P`Rt1HiySH+du zrd2&s7J3lFRy33GBeB)EJp~=cKY-@r*s-UM9lL<-Y@oJ`Chp}%NysYCoH;Xif_~&9 z;)dI^e;q@=a02bR*rs4mD0G6XNvmmGSz16P3E+dI#Gpd1z@A@I$Dox~P~sT+)iyl% zWb{Q^E**Jq*z!;9Y2aWl2D%hiFQ?&8A0KG<(ZJqW>~=vp#>GdPhz!p992necn{80i z0#q+ZmmNsVZsz?^fZ8h{kPyH-sqpG9<*rL)Yz_d3g2;LV3P2DHn(9pAI?@Cjl7s*w z+0!<@KX&I7R8}ZRvI7({iOGI8fJq_W2G0|CmyczO`wk&W#Xs|V<>74hI-4UP+;e43 z-2kuiT6THS1j^32VABX4H1Sam8t#Vm!i=zS7=1D>Hv#(X=}W=7U|Zu0FPIl;OHYf1 z<%QqRLe`mT8!l9=TTU=dTIGvN)pt@AwVUn8}uk}P415l+jJ1aqH_%D3|LwlK;Z?- z0bFgNRc{QvO?D)aC(x%;V&E?Oi0SKs#P0#dATeb1icyPDqW#sovO0g%7n48!v)f;D zZ@A{|N*}z}M?lNU;G4#OL6j0KEl@N0EUf+)iG*u(ysx*0130Z>b%A%X9OhNxRr&nm z=p~I&!3$q|?_L$Lyinn@z2B&%jtH_pVsy4BAPit*bQvSb=(q&MBz|w=cwz1so~|Yf zvpB&7pLdWB94pKpyVXRn9Y+UbbXR!kOY}-h+buH2Q8b_8-D3fOJ=~6t-SlPEFkF5R zQb`=}7(%2+Aw3h=%Lm%SbLDB)1>QXcYuG_-4kWVK3sc`A2u*In83q^KOya%MWn%{v zlaw-ZhL9W1oaL$c@^sTU_7WxoYDMrBYBpmN8Us_$KwDLem6w@Af&_)rympjX3b8IT ziL_AcDv+EbA19^=fU|ZyB0dnv-iZ={Tj9JhCk*ZY%*4IRUSIH+e$Y!gYg3}|m|AoE z8?=KVwZ}ok`2!Om205pey#d`)B z&(T~0Q=X&F^!3=pVn`af{w;`95E|tU=0x-ZV}LLz;-qKNoayKdgpG&-PO-6*`w&2j zRvvjuZ1Ud8SQMpoh|i0v2tL0sbam+cMmHx^xRKn+7VJ?H8ceuA#)OiU*O?wuA#8)u zKQd5q&#YLmNDLl%XCl4GJ>1US;q%D!s1RErD`9}nmlwz>>qPDc-wKwN3ZZb2 zk}D*R(fB?`CEY@7A68cJTm)yzNo=Y1T#N1lclNL46+utp3?r!__aW>~I0>{?DI~WH z*M2S`f*!y2l2Wg;5d;WhhI|VW$&+6Z0W*+9j=B8O8(QQ49aDhqTlaB||Y-OU(2Q_A;@+Lb;jz3X{eZ2EZO7Kp{ni^#HFfFlV^# z&%O>}KQeV>c2L`3cArFg@+&GKdu2)xRhcEr4>TS6jU;LPSfph_ z<>6~yeczqzoxT|TkjOCf-LU;_5546d)nfz1^q=6EA*9oH^tTL*85@R4Vm$LB7=j_B zuy_ckf1Bj0={lJ3aM!RCmd+0Y@f?Vc-f{E|p+@vR9QP2jRn^6WK6mZb($ zummv^ZgAFb-cYgO?kfzn0POt27yA({?-0;f7NSDTRU*gUmN+iPi=QIBdej6t9?r}g z3(c=1nAJRyD$5H8=gUuGu0Ig%{?55roXy(s9e29^1L7X?RCZXrm!f^Sy!7Rz)9^6kL4iM9 zfP_VJ7xf@Ho|5-G;JbI4PSVwQZ0=xx7*T@q0PnCd)W^xdVv;9NU|W{V;xeE8IhAn` zPD)bV8W|{3xB&_j{^K7Qg#p{Gm)O^V#3V1ZR}v02KS46^+~hTF$8zcazwN?V$u=MI zxi7H;hX{+nWEf-Nm)wKE^j>U>&G>)i?@T=M8=!v9yyQN3M2-;KISC0UdR7eTKv_T{ zJ%EW6y5+0&0SVjq;pGGI!i{6u$&u82M3W9fED2l+k$G{k>MgMceXqB~V)40yqc;}f z2bK@*PmN3>XF|{c8F>zJ%;3*#n|paq#@XU-Tb00R!xsL>uk_uBf*+#CUkxDGHNKZQ*Qd|1R6>j9Gu z)UsGsD6ke_A88S+C&afo2wfs!p)66+0|LX6n}aYIh6m$dZJWb&gKOc07W!lLDu61q z(0s((60a(A_A=b+_m?J8Wnxljznq#V?Ki#%RNh4FG{?QkRLm7pKak4jQxnllG)1nE zOmreu_#kg%r5Twzwi�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 zE{var e={550:(e,t,n)=>{"use strict";n.d(t,{AQ:()=>b,aZ:()=>g,l5:()=>C,lQ:()=>y,s7:()=>x,sH:()=>_,sN:()=>v,ss:()=>w,yI:()=>f,zp:()=>k});var r=n(7703),i=n(3298),s=n(4756),o=n(6996);const a=(0,s.x1A)("editor.lineHighlightBackground",null,r.kg("vs/editor/common/core/editorColorRegistry","lineHighlight","Background color for the highlight of line at the cursor position.")),l=((0,s.x1A)("editor.lineHighlightBorder",{dark:"#282828",light:"#eeeeee",hcDark:"#f38518",hcLight:s.b1q},r.kg("vs/editor/common/core/editorColorRegistry","lineHighlightBorderBox","Background color for the border around the line at the cursor position.")),(0,s.x1A)("editor.rangeHighlightBackground",{dark:"#ffffff0b",light:"#fdff0033",hcDark:null,hcLight:null},r.kg("vs/editor/common/core/editorColorRegistry","rangeHighlight","Background color of highlighted ranges, like by quick open and find features. The color must not be opaque so as not to hide underlying decorations."),!0),(0,s.x1A)("editor.rangeHighlightBorder",{dark:null,light:null,hcDark:s.buw,hcLight:s.buw},r.kg("vs/editor/common/core/editorColorRegistry","rangeHighlightBorder","Background color of the border around highlighted ranges.")),(0,s.x1A)("editor.symbolHighlightBackground",{dark:s.Ubg,light:s.Ubg,hcDark:null,hcLight:null},r.kg("vs/editor/common/core/editorColorRegistry","symbolHighlight","Background color of highlighted symbol, like for go to definition or go next/previous symbol. The color must not be opaque so as not to hide underlying decorations."),!0),(0,s.x1A)("editor.symbolHighlightBorder",{dark:null,light:null,hcDark:s.buw,hcLight:s.buw},r.kg("vs/editor/common/core/editorColorRegistry","symbolHighlightBorder","Background color of the border around highlighted symbols.")),(0,s.x1A)("editorCursor.foreground",{dark:"#AEAFAD",light:i.Q1.black,hcDark:i.Q1.white,hcLight:"#0F4A85"},r.kg("vs/editor/common/core/editorColorRegistry","caret","Color of the editor cursor."))),c=(0,s.x1A)("editorCursor.background",null,r.kg("vs/editor/common/core/editorColorRegistry","editorCursorBackground","The background color of the editor cursor. Allows customizing the color of a character overlapped by a block cursor.")),h=((0,s.x1A)("editorMultiCursor.primary.foreground",l,r.kg("vs/editor/common/core/editorColorRegistry","editorMultiCursorPrimaryForeground","Color of the primary editor cursor when multiple cursors are present.")),(0,s.x1A)("editorMultiCursor.primary.background",c,r.kg("vs/editor/common/core/editorColorRegistry","editorMultiCursorPrimaryBackground","The background color of the primary editor cursor when multiple cursors are present. Allows customizing the color of a character overlapped by a block cursor.")),(0,s.x1A)("editorMultiCursor.secondary.foreground",l,r.kg("vs/editor/common/core/editorColorRegistry","editorMultiCursorSecondaryForeground","Color of secondary editor cursors when multiple cursors are present.")),(0,s.x1A)("editorMultiCursor.secondary.background",c,r.kg("vs/editor/common/core/editorColorRegistry","editorMultiCursorSecondaryBackground","The background color of secondary editor cursors when multiple cursors are present. Allows customizing the color of a character overlapped by a block cursor.")),(0,s.x1A)("editorWhitespace.foreground",{dark:"#e3e4e229",light:"#33333333",hcDark:"#e3e4e229",hcLight:"#CCCCCC"},r.kg("vs/editor/common/core/editorColorRegistry","editorWhitespaces","Color of whitespace characters in the editor."))),d=((0,s.x1A)("editorLineNumber.foreground",{dark:"#858585",light:"#237893",hcDark:i.Q1.white,hcLight:"#292929"},r.kg("vs/editor/common/core/editorColorRegistry","editorLineNumbers","Color of editor line numbers.")),(0,s.x1A)("editorIndentGuide.background",h,r.kg("vs/editor/common/core/editorColorRegistry","editorIndentGuides","Color of the editor indentation guides."),!1,r.kg("vs/editor/common/core/editorColorRegistry","deprecatedEditorIndentGuides","'editorIndentGuide.background' is deprecated. Use 'editorIndentGuide.background1' instead."))),u=(0,s.x1A)("editorIndentGuide.activeBackground",h,r.kg("vs/editor/common/core/editorColorRegistry","editorActiveIndentGuide","Color of the active editor indentation guides."),!1,r.kg("vs/editor/common/core/editorColorRegistry","deprecatedEditorActiveIndentGuide","'editorIndentGuide.activeBackground' is deprecated. Use 'editorIndentGuide.activeBackground1' instead.")),p=((0,s.x1A)("editorIndentGuide.background1",d,r.kg("vs/editor/common/core/editorColorRegistry","editorIndentGuides1","Color of the editor indentation guides (1).")),(0,s.x1A)("editorIndentGuide.background2","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorIndentGuides2","Color of the editor indentation guides (2).")),(0,s.x1A)("editorIndentGuide.background3","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorIndentGuides3","Color of the editor indentation guides (3).")),(0,s.x1A)("editorIndentGuide.background4","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorIndentGuides4","Color of the editor indentation guides (4).")),(0,s.x1A)("editorIndentGuide.background5","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorIndentGuides5","Color of the editor indentation guides (5).")),(0,s.x1A)("editorIndentGuide.background6","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorIndentGuides6","Color of the editor indentation guides (6).")),(0,s.x1A)("editorIndentGuide.activeBackground1",u,r.kg("vs/editor/common/core/editorColorRegistry","editorActiveIndentGuide1","Color of the active editor indentation guides (1).")),(0,s.x1A)("editorIndentGuide.activeBackground2","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorActiveIndentGuide2","Color of the active editor indentation guides (2).")),(0,s.x1A)("editorIndentGuide.activeBackground3","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorActiveIndentGuide3","Color of the active editor indentation guides (3).")),(0,s.x1A)("editorIndentGuide.activeBackground4","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorActiveIndentGuide4","Color of the active editor indentation guides (4).")),(0,s.x1A)("editorIndentGuide.activeBackground5","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorActiveIndentGuide5","Color of the active editor indentation guides (5).")),(0,s.x1A)("editorIndentGuide.activeBackground6","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorActiveIndentGuide6","Color of the active editor indentation guides (6).")),(0,s.x1A)("editorActiveLineNumber.foreground",{dark:"#c6c6c6",light:"#0B216F",hcDark:s.buw,hcLight:s.buw},r.kg("vs/editor/common/core/editorColorRegistry","editorActiveLineNumber","Color of editor active line number"),!1,r.kg("vs/editor/common/core/editorColorRegistry","deprecatedEditorActiveLineNumber","Id is deprecated. Use 'editorLineNumber.activeForeground' instead."))),m=((0,s.x1A)("editorLineNumber.activeForeground",p,r.kg("vs/editor/common/core/editorColorRegistry","editorActiveLineNumber","Color of editor active line number")),(0,s.x1A)("editorLineNumber.dimmedForeground",null,r.kg("vs/editor/common/core/editorColorRegistry","editorDimmedLineNumber","Color of the final editor line when editor.renderFinalNewline is set to dimmed.")),(0,s.x1A)("editorRuler.foreground",{dark:"#5A5A5A",light:i.Q1.lightgrey,hcDark:i.Q1.white,hcLight:"#292929"},r.kg("vs/editor/common/core/editorColorRegistry","editorRuler","Color of the editor rulers.")),(0,s.x1A)("editorCodeLens.foreground",{dark:"#999999",light:"#919191",hcDark:"#999999",hcLight:"#292929"},r.kg("vs/editor/common/core/editorColorRegistry","editorCodeLensForeground","Foreground color of editor CodeLens")),(0,s.x1A)("editorBracketMatch.background",{dark:"#0064001a",light:"#0064001a",hcDark:"#0064001a",hcLight:"#0000"},r.kg("vs/editor/common/core/editorColorRegistry","editorBracketMatchBackground","Background color behind matching brackets")),(0,s.x1A)("editorBracketMatch.border",{dark:"#888",light:"#B9B9B9",hcDark:s.b1q,hcLight:s.b1q},r.kg("vs/editor/common/core/editorColorRegistry","editorBracketMatchBorder","Color for matching brackets boxes")),(0,s.x1A)("editorOverviewRuler.border",{dark:"#7f7f7f4d",light:"#7f7f7f4d",hcDark:"#7f7f7f4d",hcLight:"#666666"},r.kg("vs/editor/common/core/editorColorRegistry","editorOverviewRulerBorder","Color of the overview ruler border.")),(0,s.x1A)("editorOverviewRuler.background",null,r.kg("vs/editor/common/core/editorColorRegistry","editorOverviewRulerBackground","Background color of the editor overview ruler.")),(0,s.x1A)("editorGutter.background",s.YtV,r.kg("vs/editor/common/core/editorColorRegistry","editorGutter","Background color of the editor gutter. The gutter contains the glyph margins and the line numbers.")),(0,s.x1A)("editorUnnecessaryCode.border",{dark:null,light:null,hcDark:i.Q1.fromHex("#fff").transparent(.8),hcLight:s.b1q},r.kg("vs/editor/common/core/editorColorRegistry","unnecessaryCodeBorder","Border color of unnecessary (unused) source code in the editor.")),(0,s.x1A)("editorUnnecessaryCode.opacity",{dark:i.Q1.fromHex("#000a"),light:i.Q1.fromHex("#0007"),hcDark:null,hcLight:null},r.kg("vs/editor/common/core/editorColorRegistry","unnecessaryCodeOpacity","Opacity of unnecessary (unused) source code in the editor. For example, \"#000000c0\" will render the code with 75% opacity. For high contrast themes, use the 'editorUnnecessaryCode.border' theme color to underline unnecessary code instead of fading it out.")),(0,s.x1A)("editorGhostText.border",{dark:null,light:null,hcDark:i.Q1.fromHex("#fff").transparent(.8),hcLight:i.Q1.fromHex("#292929").transparent(.8)},r.kg("vs/editor/common/core/editorColorRegistry","editorGhostTextBorder","Border color of ghost text in the editor.")),(0,s.x1A)("editorGhostText.foreground",{dark:i.Q1.fromHex("#ffffff56"),light:i.Q1.fromHex("#0007"),hcDark:null,hcLight:null},r.kg("vs/editor/common/core/editorColorRegistry","editorGhostTextForeground","Foreground color of the ghost text in the editor.")),(0,s.x1A)("editorGhostText.background",null,r.kg("vs/editor/common/core/editorColorRegistry","editorGhostTextBackground","Background color of the ghost text in the editor.")),new i.Q1(new i.bU(0,122,204,.6))),f=((0,s.x1A)("editorOverviewRuler.rangeHighlightForeground",m,r.kg("vs/editor/common/core/editorColorRegistry","overviewRulerRangeHighlight","Overview ruler marker color for range highlights. The color must not be opaque so as not to hide underlying decorations."),!0),(0,s.x1A)("editorOverviewRuler.errorForeground",{dark:new i.Q1(new i.bU(255,18,18,.7)),light:new i.Q1(new i.bU(255,18,18,.7)),hcDark:new i.Q1(new i.bU(255,50,50,1)),hcLight:"#B5200D"},r.kg("vs/editor/common/core/editorColorRegistry","overviewRuleError","Overview ruler marker color for errors."))),g=(0,s.x1A)("editorOverviewRuler.warningForeground",{dark:s.Hng,light:s.Hng,hcDark:s.Stt,hcLight:s.Stt},r.kg("vs/editor/common/core/editorColorRegistry","overviewRuleWarning","Overview ruler marker color for warnings.")),b=(0,s.x1A)("editorOverviewRuler.infoForeground",{dark:s.pOz,light:s.pOz,hcDark:s.IIb,hcLight:s.IIb},r.kg("vs/editor/common/core/editorColorRegistry","overviewRuleInfo","Overview ruler marker color for infos.")),v=(0,s.x1A)("editorBracketHighlight.foreground1",{dark:"#FFD700",light:"#0431FAFF",hcDark:"#FFD700",hcLight:"#0431FAFF"},r.kg("vs/editor/common/core/editorColorRegistry","editorBracketHighlightForeground1","Foreground color of brackets (1). Requires enabling bracket pair colorization.")),y=(0,s.x1A)("editorBracketHighlight.foreground2",{dark:"#DA70D6",light:"#319331FF",hcDark:"#DA70D6",hcLight:"#319331FF"},r.kg("vs/editor/common/core/editorColorRegistry","editorBracketHighlightForeground2","Foreground color of brackets (2). Requires enabling bracket pair colorization.")),w=(0,s.x1A)("editorBracketHighlight.foreground3",{dark:"#179FFF",light:"#7B3814FF",hcDark:"#87CEFA",hcLight:"#7B3814FF"},r.kg("vs/editor/common/core/editorColorRegistry","editorBracketHighlightForeground3","Foreground color of brackets (3). Requires enabling bracket pair colorization.")),C=(0,s.x1A)("editorBracketHighlight.foreground4","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorBracketHighlightForeground4","Foreground color of brackets (4). Requires enabling bracket pair colorization.")),_=(0,s.x1A)("editorBracketHighlight.foreground5","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorBracketHighlightForeground5","Foreground color of brackets (5). Requires enabling bracket pair colorization.")),k=(0,s.x1A)("editorBracketHighlight.foreground6","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorBracketHighlightForeground6","Foreground color of brackets (6). Requires enabling bracket pair colorization.")),x=(0,s.x1A)("editorBracketHighlight.unexpectedBracket.foreground",{dark:new i.Q1(new i.bU(255,18,18,.8)),light:new i.Q1(new i.bU(255,18,18,.8)),hcDark:"new Color(new RGBA(255, 50, 50, 1))",hcLight:"#B5200D"},r.kg("vs/editor/common/core/editorColorRegistry","editorBracketHighlightUnexpectedBracketForeground","Foreground color of unexpected brackets."));(0,s.x1A)("editorBracketPairGuide.background1","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorBracketPairGuide.background1","Background color of inactive bracket pair guides (1). Requires enabling bracket pair guides.")),(0,s.x1A)("editorBracketPairGuide.background2","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorBracketPairGuide.background2","Background color of inactive bracket pair guides (2). Requires enabling bracket pair guides.")),(0,s.x1A)("editorBracketPairGuide.background3","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorBracketPairGuide.background3","Background color of inactive bracket pair guides (3). Requires enabling bracket pair guides.")),(0,s.x1A)("editorBracketPairGuide.background4","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorBracketPairGuide.background4","Background color of inactive bracket pair guides (4). Requires enabling bracket pair guides.")),(0,s.x1A)("editorBracketPairGuide.background5","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorBracketPairGuide.background5","Background color of inactive bracket pair guides (5). Requires enabling bracket pair guides.")),(0,s.x1A)("editorBracketPairGuide.background6","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorBracketPairGuide.background6","Background color of inactive bracket pair guides (6). Requires enabling bracket pair guides.")),(0,s.x1A)("editorBracketPairGuide.activeBackground1","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorBracketPairGuide.activeBackground1","Background color of active bracket pair guides (1). Requires enabling bracket pair guides.")),(0,s.x1A)("editorBracketPairGuide.activeBackground2","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorBracketPairGuide.activeBackground2","Background color of active bracket pair guides (2). Requires enabling bracket pair guides.")),(0,s.x1A)("editorBracketPairGuide.activeBackground3","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorBracketPairGuide.activeBackground3","Background color of active bracket pair guides (3). Requires enabling bracket pair guides.")),(0,s.x1A)("editorBracketPairGuide.activeBackground4","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorBracketPairGuide.activeBackground4","Background color of active bracket pair guides (4). Requires enabling bracket pair guides.")),(0,s.x1A)("editorBracketPairGuide.activeBackground5","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorBracketPairGuide.activeBackground5","Background color of active bracket pair guides (5). Requires enabling bracket pair guides.")),(0,s.x1A)("editorBracketPairGuide.activeBackground6","#00000000",r.kg("vs/editor/common/core/editorColorRegistry","editorBracketPairGuide.activeBackground6","Background color of active bracket pair guides (6). Requires enabling bracket pair guides.")),(0,s.x1A)("editorUnicodeHighlight.border",s.Hng,r.kg("vs/editor/common/core/editorColorRegistry","editorUnicodeHighlight.border","Border color used to highlight unicode characters.")),(0,s.x1A)("editorUnicodeHighlight.background",s.whs,r.kg("vs/editor/common/core/editorColorRegistry","editorUnicodeHighlight.background","Background color used to highlight unicode characters.")),(0,o.zy)((e,t)=>{const n=e.getColor(s.YtV),r=e.getColor(a),i=r&&!r.isTransparent()?r:n;i&&t.addRule(`.monaco-editor .inputarea.ime-input { background-color: ${i}; }`)})},579:(e,t,n)=>{"use strict";n.d(t,{rr:()=>Q,$b:()=>J}),n(2373);var r=n(6274),i=n(6206),s=n(5603),o=n(1490),a=n(7703);function l(...e){switch(e.length){case 1:return(0,a.kg)("vs/platform/contextkey/common/scanner","contextkey.scanner.hint.didYouMean1","Did you mean {0}?",e[0]);case 2:return(0,a.kg)("vs/platform/contextkey/common/scanner","contextkey.scanner.hint.didYouMean2","Did you mean {0} or {1}?",e[0],e[1]);case 3:return(0,a.kg)("vs/platform/contextkey/common/scanner","contextkey.scanner.hint.didYouMean3","Did you mean {0}, {1} or {2}?",e[0],e[1],e[2]);default:return}}const c=(0,a.kg)("vs/platform/contextkey/common/scanner","contextkey.scanner.hint.didYouForgetToOpenOrCloseQuote","Did you forget to open or close the quote?"),h=(0,a.kg)("vs/platform/contextkey/common/scanner","contextkey.scanner.hint.didYouForgetToEscapeSlash","Did you forget to escape the '/' (slash) character? Put two backslashes before it to escape, e.g., '\\\\/'.");class d{constructor(){this._input="",this._start=0,this._current=0,this._tokens=[],this._errors=[],this.stringRe=/[a-zA-Z0-9_<>\-\./\\:\*\?\+\[\]\^,#@;"%\$\p{L}-]+/uy}static getLexeme(e){switch(e.type){case 0:return"(";case 1:return")";case 2:return"!";case 3:return e.isTripleEq?"===":"==";case 4:return e.isTripleEq?"!==":"!=";case 5:return"<";case 6:return"<=";case 7:case 8:return">=";case 9:return"=~";case 10:case 17:case 18:case 19:return e.lexeme;case 11:return"true";case 12:return"false";case 13:return"in";case 14:return"not";case 15:return"&&";case 16:return"||";case 20:return"EOF";default:throw(0,o.iH)(`unhandled token type: ${JSON.stringify(e)}; have you forgotten to add a case?`)}}static{this._regexFlags=new Set(["i","g","s","m","y","u"].map(e=>e.charCodeAt(0)))}static{this._keywords=new Map([["not",14],["in",13],["false",12],["true",11]])}reset(e){return this._input=e,this._start=0,this._current=0,this._tokens=[],this._errors=[],this}scan(){for(;!this._isAtEnd();)switch(this._start=this._current,this._advance()){case 40:this._addToken(0);break;case 41:this._addToken(1);break;case 33:if(this._match(61)){const e=this._match(61);this._tokens.push({type:4,offset:this._start,isTripleEq:e})}else this._addToken(2);break;case 39:this._quotedString();break;case 47:this._regex();break;case 61:if(this._match(61)){const e=this._match(61);this._tokens.push({type:3,offset:this._start,isTripleEq:e})}else this._match(126)?this._addToken(9):this._error(l("==","=~"));break;case 60:this._addToken(this._match(61)?6:5);break;case 62:this._addToken(this._match(61)?8:7);break;case 38:this._match(38)?this._addToken(15):this._error(l("&&"));break;case 124:this._match(124)?this._addToken(16):this._error(l("||"));break;case 32:case 13:case 9:case 10:case 160:break;default:this._string()}return this._start=this._current,this._addToken(20),Array.from(this._tokens)}_match(e){return!this._isAtEnd()&&this._input.charCodeAt(this._current)===e&&(this._current++,!0)}_advance(){return this._input.charCodeAt(this._current++)}_peek(){return this._isAtEnd()?0:this._input.charCodeAt(this._current)}_addToken(e){this._tokens.push({type:e,offset:this._start})}_error(e){const t=this._start,n=this._input.substring(this._start,this._current),r={type:19,offset:this._start,lexeme:n};this._errors.push({offset:t,lexeme:n,additionalInfo:e}),this._tokens.push(r)}_string(){this.stringRe.lastIndex=this._start;const e=this.stringRe.exec(this._input);if(e){this._current=this._start+e[0].length;const t=this._input.substring(this._start,this._current),n=d._keywords.get(t);n?this._addToken(n):this._tokens.push({type:17,lexeme:t,offset:this._start})}}_quotedString(){for(;39!==this._peek()&&!this._isAtEnd();)this._advance();this._isAtEnd()?this._error(c):(this._advance(),this._tokens.push({type:18,lexeme:this._input.substring(this._start+1,this._current-1),offset:this._start+1}))}_regex(){let e=this._current,t=!1,n=!1;for(;;){if(e>=this._input.length)return this._current=e,void this._error(h);const r=this._input.charCodeAt(e);if(t)t=!1;else{if(47===r&&!n){e++;break}91===r?n=!0:92===r?t=!0:93===r&&(n=!1)}e++}for(;e=this._input.length}}var u=n(7352);const p=new Map;p.set("false",!1),p.set("true",!0),p.set("isMac",i.zx),p.set("isLinux",i.j9),p.set("isWindows",i.uF),p.set("isWeb",i.HZ),p.set("isMacNative",i.zx&&!i.HZ),p.set("isEdge",i.UP),p.set("isFirefox",i.gm),p.set("isChrome",i.H8),p.set("isSafari",i.nr);const m=Object.prototype.hasOwnProperty,f={regexParsingWithErrorRecovery:!0},g=(0,a.kg)("vs/platform/contextkey/common/contextkey","contextkey.parser.error.emptyString","Empty context key expression"),b=(0,a.kg)("vs/platform/contextkey/common/contextkey","contextkey.parser.error.emptyString.hint","Did you forget to write an expression? You can also put 'false' or 'true' to always evaluate to false or true, respectively."),v=(0,a.kg)("vs/platform/contextkey/common/contextkey","contextkey.parser.error.noInAfterNot","'in' after 'not'."),y=(0,a.kg)("vs/platform/contextkey/common/contextkey","contextkey.parser.error.closingParenthesis","closing parenthesis ')'"),w=(0,a.kg)("vs/platform/contextkey/common/contextkey","contextkey.parser.error.unexpectedToken","Unexpected token"),C=(0,a.kg)("vs/platform/contextkey/common/contextkey","contextkey.parser.error.unexpectedToken.hint","Did you forget to put && or || before the token?"),_=(0,a.kg)("vs/platform/contextkey/common/contextkey","contextkey.parser.error.unexpectedEOF","Unexpected end of expression"),k=(0,a.kg)("vs/platform/contextkey/common/contextkey","contextkey.parser.error.unexpectedEOF.hint","Did you forget to put a context key?");class x{static{this._parseError=new Error}constructor(e=f){this._config=e,this._scanner=new d,this._tokens=[],this._current=0,this._parsingErrors=[],this._flagsGYRe=/g|y/g}parse(e){if(""!==e){this._tokens=this._scanner.reset(e).scan(),this._current=0,this._parsingErrors=[];try{const e=this._expr();if(!this._isAtEnd()){const e=this._peek(),t=17===e.type?C:void 0;throw this._parsingErrors.push({message:w,offset:e.offset,lexeme:d.getLexeme(e),additionalInfo:t}),x._parseError}return e}catch(e){if(e!==x._parseError)throw e;return}}else this._parsingErrors.push({message:g,offset:0,lexeme:"",additionalInfo:b})}_expr(){return this._or()}_or(){const e=[this._and()];for(;this._matchOne(16);){const t=this._and();e.push(t)}return 1===e.length?e[0]:S.or(...e)}_and(){const e=[this._term()];for(;this._matchOne(15);){const t=this._term();e.push(t)}return 1===e.length?e[0]:S.and(...e)}_term(){if(this._matchOne(2)){const e=this._peek();switch(e.type){case 11:return this._advance(),F.INSTANCE;case 12:return this._advance(),L.INSTANCE;case 0:{this._advance();const e=this._expr();return this._consume(1,y),e?.negate()}case 17:return this._advance(),A.create(e.lexeme);default:throw this._errExpectedButGot("KEY | true | false | '(' expression ')'",e)}}return this._primary()}_primary(){const e=this._peek();switch(e.type){case 11:return this._advance(),S.true();case 12:return this._advance(),S.false();case 0:{this._advance();const e=this._expr();return this._consume(1,y),e}case 17:{const t=e.lexeme;if(this._advance(),this._matchOne(9)){const e=this._peek();if(!this._config.regexParsingWithErrorRecovery){if(this._advance(),10!==e.type)throw this._errExpectedButGot("REGEX",e);const n=e.lexeme,r=n.lastIndexOf("/"),i=r===n.length-1?void 0:this._removeFlagsGY(n.substring(r+1));let s;try{s=new RegExp(n.substring(1,r),i)}catch(t){throw this._errExpectedButGot("REGEX",e)}return W.create(t,s)}switch(e.type){case 10:case 19:{const n=[e.lexeme];this._advance();let r=this._peek(),i=0;for(let t=0;t=0){const s=n.slice(t+1,i),o="i"===n[i+1]?"i":"";try{r=new RegExp(s,o)}catch(t){throw this._errExpectedButGot("REGEX",e)}}}if(null===r)throw this._errExpectedButGot("REGEX",e);return W.create(t,r)}default:throw this._errExpectedButGot("REGEX",this._peek())}}if(this._matchOne(14)){this._consume(13,v);const e=this._value();return S.notIn(t,e)}switch(this._peek().type){case 3:{this._advance();const e=this._value();if(18===this._previous().type)return S.equals(t,e);switch(e){case"true":return S.has(t);case"false":return S.not(t);default:return S.equals(t,e)}}case 4:{this._advance();const e=this._value();if(18===this._previous().type)return S.notEquals(t,e);switch(e){case"true":return S.not(t);case"false":return S.has(t);default:return S.notEquals(t,e)}}case 5:return this._advance(),P.create(t,this._value());case 6:return this._advance(),B.create(t,this._value());case 7:return this._advance(),O.create(t,this._value());case 8:return this._advance(),z.create(t,this._value());case 13:return this._advance(),S.in(t,this._value());default:return S.has(t)}}case 20:throw this._parsingErrors.push({message:_,offset:e.offset,lexeme:"",additionalInfo:k}),x._parseError;default:throw this._errExpectedButGot("true | false | KEY \n\t| KEY '=~' REGEX \n\t| KEY ('==' | '!=' | '<' | '<=' | '>' | '>=' | 'in' | 'not' 'in') value",this._peek())}}_value(){const e=this._peek();switch(e.type){case 17:case 18:return this._advance(),e.lexeme;case 11:return this._advance(),"true";case 12:return this._advance(),"false";case 13:return this._advance(),"in";default:return""}}_removeFlagsGY(e){return e.replaceAll(this._flagsGYRe,"")}_previous(){return this._tokens[this._current-1]}_matchOne(e){return!!this._check(e)&&(this._advance(),!0)}_advance(){return this._isAtEnd()||this._current++,this._previous()}_consume(e,t){if(this._check(e))return this._advance();throw this._errExpectedButGot(t,this._peek())}_errExpectedButGot(e,t,n){const r=(0,a.kg)("vs/platform/contextkey/common/contextkey","contextkey.parser.error.expectedButGot","Expected: {0}\nReceived: '{1}'.",e,d.getLexeme(t)),i=t.offset,s=d.getLexeme(t);return this._parsingErrors.push({message:r,offset:i,lexeme:s,additionalInfo:n}),x._parseError}_check(e){return this._peek().type===e}_peek(){return this._tokens[this._current]}_isAtEnd(){return 20===this._peek().type}}class S{static false(){return F.INSTANCE}static true(){return L.INSTANCE}static has(e){return I.create(e)}static equals(e,t){return T.create(e,t)}static notEquals(e,t){return D.create(e,t)}static regex(e,t){return W.create(e,t)}static in(e,t){return N.create(e,t)}static notIn(e,t){return R.create(e,t)}static not(e){return A.create(e)}static and(...e){return $.create(e,null,!0)}static or(...e){return q.create(e,null,!0)}static{this._parser=new x({regexParsingWithErrorRecovery:!1})}static deserialize(e){if(null!=e)return this._parser.parse(e)}}function E(e,t){return e.cmp(t)}class F{static{this.INSTANCE=new F}constructor(){this.type=0}cmp(e){return this.type-e.type}equals(e){return e.type===this.type}substituteConstants(){return this}evaluate(e){return!1}serialize(){return"false"}keys(){return[]}negate(){return L.INSTANCE}}class L{static{this.INSTANCE=new L}constructor(){this.type=1}cmp(e){return this.type-e.type}equals(e){return e.type===this.type}substituteConstants(){return this}evaluate(e){return!0}serialize(){return"true"}keys(){return[]}negate(){return F.INSTANCE}}class I{static create(e,t=null){const n=p.get(e);return"boolean"==typeof n?n?L.INSTANCE:F.INSTANCE:new I(e,t)}constructor(e,t){this.key=e,this.negated=t,this.type=2}cmp(e){return e.type!==this.type?this.type-e.type:K(this.key,e.key)}equals(e){return e.type===this.type&&this.key===e.key}substituteConstants(){const e=p.get(this.key);return"boolean"==typeof e?e?L.INSTANCE:F.INSTANCE:this}evaluate(e){return!!e.getValue(this.key)}serialize(){return this.key}keys(){return[this.key]}negate(){return this.negated||(this.negated=A.create(this.key,this)),this.negated}}class T{static create(e,t,n=null){if("boolean"==typeof t)return t?I.create(e,n):A.create(e,n);const r=p.get(e);return"boolean"==typeof r?t===(r?"true":"false")?L.INSTANCE:F.INSTANCE:new T(e,t,n)}constructor(e,t,n){this.key=e,this.value=t,this.negated=n,this.type=4}cmp(e){return e.type!==this.type?this.type-e.type:H(this.key,this.value,e.key,e.value)}equals(e){return e.type===this.type&&this.key===e.key&&this.value===e.value}substituteConstants(){const e=p.get(this.key);if("boolean"==typeof e){const t=e?"true":"false";return this.value===t?L.INSTANCE:F.INSTANCE}return this}evaluate(e){return e.getValue(this.key)==this.value}serialize(){return`${this.key} == '${this.value}'`}keys(){return[this.key]}negate(){return this.negated||(this.negated=D.create(this.key,this.value,this)),this.negated}}class N{static create(e,t){return new N(e,t)}constructor(e,t){this.key=e,this.valueKey=t,this.type=10,this.negated=null}cmp(e){return e.type!==this.type?this.type-e.type:H(this.key,this.valueKey,e.key,e.valueKey)}equals(e){return e.type===this.type&&this.key===e.key&&this.valueKey===e.valueKey}substituteConstants(){return this}evaluate(e){const t=e.getValue(this.valueKey),n=e.getValue(this.key);return Array.isArray(t)?t.includes(n):"string"==typeof n&&"object"==typeof t&&null!==t&&m.call(t,n)}serialize(){return`${this.key} in '${this.valueKey}'`}keys(){return[this.key,this.valueKey]}negate(){return this.negated||(this.negated=R.create(this.key,this.valueKey)),this.negated}}class R{static create(e,t){return new R(e,t)}constructor(e,t){this.key=e,this.valueKey=t,this.type=11,this._negated=N.create(e,t)}cmp(e){return e.type!==this.type?this.type-e.type:this._negated.cmp(e._negated)}equals(e){return e.type===this.type&&this._negated.equals(e._negated)}substituteConstants(){return this}evaluate(e){return!this._negated.evaluate(e)}serialize(){return`${this.key} not in '${this.valueKey}'`}keys(){return this._negated.keys()}negate(){return this._negated}}class D{static create(e,t,n=null){if("boolean"==typeof t)return t?A.create(e,n):I.create(e,n);const r=p.get(e);return"boolean"==typeof r?t===(r?"true":"false")?F.INSTANCE:L.INSTANCE:new D(e,t,n)}constructor(e,t,n){this.key=e,this.value=t,this.negated=n,this.type=5}cmp(e){return e.type!==this.type?this.type-e.type:H(this.key,this.value,e.key,e.value)}equals(e){return e.type===this.type&&this.key===e.key&&this.value===e.value}substituteConstants(){const e=p.get(this.key);if("boolean"==typeof e){const t=e?"true":"false";return this.value===t?F.INSTANCE:L.INSTANCE}return this}evaluate(e){return e.getValue(this.key)!=this.value}serialize(){return`${this.key} != '${this.value}'`}keys(){return[this.key]}negate(){return this.negated||(this.negated=T.create(this.key,this.value,this)),this.negated}}class A{static create(e,t=null){const n=p.get(e);return"boolean"==typeof n?n?F.INSTANCE:L.INSTANCE:new A(e,t)}constructor(e,t){this.key=e,this.negated=t,this.type=3}cmp(e){return e.type!==this.type?this.type-e.type:K(this.key,e.key)}equals(e){return e.type===this.type&&this.key===e.key}substituteConstants(){const e=p.get(this.key);return"boolean"==typeof e?e?F.INSTANCE:L.INSTANCE:this}evaluate(e){return!e.getValue(this.key)}serialize(){return`!${this.key}`}keys(){return[this.key]}negate(){return this.negated||(this.negated=I.create(this.key,this)),this.negated}}function M(e,t){if("string"==typeof e){const t=parseFloat(e);isNaN(t)||(e=t)}return"string"==typeof e||"number"==typeof e?t(e):F.INSTANCE}class O{static create(e,t,n=null){return M(t,t=>new O(e,t,n))}constructor(e,t,n){this.key=e,this.value=t,this.negated=n,this.type=12}cmp(e){return e.type!==this.type?this.type-e.type:H(this.key,this.value,e.key,e.value)}equals(e){return e.type===this.type&&this.key===e.key&&this.value===e.value}substituteConstants(){return this}evaluate(e){return"string"!=typeof this.value&&parseFloat(e.getValue(this.key))>this.value}serialize(){return`${this.key} > ${this.value}`}keys(){return[this.key]}negate(){return this.negated||(this.negated=B.create(this.key,this.value,this)),this.negated}}class z{static create(e,t,n=null){return M(t,t=>new z(e,t,n))}constructor(e,t,n){this.key=e,this.value=t,this.negated=n,this.type=13}cmp(e){return e.type!==this.type?this.type-e.type:H(this.key,this.value,e.key,e.value)}equals(e){return e.type===this.type&&this.key===e.key&&this.value===e.value}substituteConstants(){return this}evaluate(e){return"string"!=typeof this.value&&parseFloat(e.getValue(this.key))>=this.value}serialize(){return`${this.key} >= ${this.value}`}keys(){return[this.key]}negate(){return this.negated||(this.negated=P.create(this.key,this.value,this)),this.negated}}class P{static create(e,t,n=null){return M(t,t=>new P(e,t,n))}constructor(e,t,n){this.key=e,this.value=t,this.negated=n,this.type=14}cmp(e){return e.type!==this.type?this.type-e.type:H(this.key,this.value,e.key,e.value)}equals(e){return e.type===this.type&&this.key===e.key&&this.value===e.value}substituteConstants(){return this}evaluate(e){return"string"!=typeof this.value&&parseFloat(e.getValue(this.key))new B(e,t,n))}constructor(e,t,n){this.key=e,this.value=t,this.negated=n,this.type=15}cmp(e){return e.type!==this.type?this.type-e.type:H(this.key,this.value,e.key,e.value)}equals(e){return e.type===this.type&&this.key===e.key&&this.value===e.value}substituteConstants(){return this}evaluate(e){return"string"!=typeof this.value&&parseFloat(e.getValue(this.key))<=this.value}serialize(){return`${this.key} <= ${this.value}`}keys(){return[this.key]}negate(){return this.negated||(this.negated=O.create(this.key,this.value,this)),this.negated}}class W{static create(e,t){return new W(e,t)}constructor(e,t){this.key=e,this.regexp=t,this.type=7,this.negated=null}cmp(e){if(e.type!==this.type)return this.type-e.type;if(this.keye.key)return 1;const t=this.regexp?this.regexp.source:"",n=e.regexp?e.regexp.source:"";return tn?1:0}equals(e){if(e.type===this.type){const t=this.regexp?this.regexp.source:"",n=e.regexp?e.regexp.source:"";return this.key===e.key&&t===n}return!1}substituteConstants(){return this}evaluate(e){const t=e.getValue(this.key);return!!this.regexp&&this.regexp.test(t)}serialize(){const e=this.regexp?`/${this.regexp.source}/${this.regexp.flags}`:"/invalid/";return`${this.key} =~ ${e}`}keys(){return[this.key]}negate(){return this.negated||(this.negated=V.create(this)),this.negated}}class V{static create(e){return new V(e)}constructor(e){this._actual=e,this.type=8}cmp(e){return e.type!==this.type?this.type-e.type:this._actual.cmp(e._actual)}equals(e){return e.type===this.type&&this._actual.equals(e._actual)}substituteConstants(){return this}evaluate(e){return!this._actual.evaluate(e)}serialize(){return`!(${this._actual.serialize()})`}keys(){return this._actual.keys()}negate(){return this._actual}}function U(e){let t=null;for(let n=0,r=e.length;ne.expr.length)return 1;for(let t=0,n=this.expr.length;t1;){const e=r[r.length-1];if(9!==e.type)break;r.pop();const t=r.pop(),i=0===r.length,s=q.create(e.expr.map(e=>$.create([e,t],null,n)),null,i);s&&(r.push(s),r.sort(E))}if(1===r.length)return r[0];if(n){for(let e=0;ee.serialize()).join(" && ")}keys(){const e=[];for(const t of this.expr)e.push(...t.keys());return e}negate(){if(!this.negated){const e=[];for(const t of this.expr)e.push(t.negate());this.negated=q.create(e,this,!0)}return this.negated}}class q{static create(e,t,n){return q._normalizeArr(e,t,n)}constructor(e,t){this.expr=e,this.negated=t,this.type=9}cmp(e){if(e.type!==this.type)return this.type-e.type;if(this.expr.lengthe.expr.length)return 1;for(let t=0,n=this.expr.length;te.serialize()).join(" || ")}keys(){const e=[];for(const t of this.expr)e.push(...t.keys());return e}negate(){if(!this.negated){const e=[];for(const t of this.expr)e.push(t.negate());for(;e.length>1;){const t=e.shift(),n=e.shift(),r=[];for(const e of G(t))for(const t of G(n))r.push($.create([e,t],null,!1));e.unshift(q.create(r,null,!1))}this.negated=q.create(e,this,!0)}return this.negated}}class j extends I{static{this._info=[]}static all(){return j._info.values()}constructor(e,t,n){super(e,null),this._defaultValue=t,"object"==typeof n?j._info.push({...n,key:e}):!0!==n&&j._info.push({key:e,description:n,type:null!=t?typeof t:void 0})}bindTo(e){return e.createKey(this.key,this._defaultValue)}getValue(e){return e.getContextKeyValue(this.key)}toNegated(){return this.negate()}isEqualTo(e){return T.create(this.key,e)}}function K(e,t){return et?1:0}function H(e,t,n,r){return en?1:tr?1:0}function G(e){return 9===e.type?e.expr:[e]}(0,u.u1)("contextKeyService");const Q=(0,u.u1)("logService");var J;!function(e){e[e.Off=0]="Off",e[e.Trace=1]="Trace",e[e.Debug=2]="Debug",e[e.Info=3]="Info",e[e.Warning=4]="Warning",e[e.Error=5]="Error"}(J||(J={})),J.Info,r.jG,new j("logLevel",function(e){switch(e){case J.Trace:return"trace";case J.Debug:return"debug";case J.Info:return"info";case J.Warning:return"warn";case J.Error:return"error";case J.Off:return"off"}}(J.Info))},695:(e,t,n)=>{"use strict";n.d(t,{I:()=>b,r:()=>d});var r=n(9130),i=n(6206);const s=/^\w[\w\d+.-]*$/,o=/^\//,a=/^\/\//,l="",c="/",h=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class d{static isUri(e){return e instanceof d||!!e&&"string"==typeof e.authority&&"string"==typeof e.fragment&&"string"==typeof e.path&&"string"==typeof e.query&&"string"==typeof e.scheme&&"string"==typeof e.fsPath&&"function"==typeof e.with&&"function"==typeof e.toString}constructor(e,t,n,r,i,h=!1){"object"==typeof e?(this.scheme=e.scheme||l,this.authority=e.authority||l,this.path=e.path||l,this.query=e.query||l,this.fragment=e.fragment||l):(this.scheme=function(e,t){return e||t?e:"file"}(e,h),this.authority=t||l,this.path=function(e,t){switch(e){case"https":case"http":case"file":t?t[0]!==c&&(t=c+t):t=c}return t}(this.scheme,n||l),this.query=r||l,this.fragment=i||l,function(e,t){if(!e.scheme&&t)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${e.authority}", path: "${e.path}", query: "${e.query}", fragment: "${e.fragment}"}`);if(e.scheme&&!s.test(e.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(e.path)if(e.authority){if(!o.test(e.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(a.test(e.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}(this,h))}get fsPath(){return b(this,!1)}with(e){if(!e)return this;let{scheme:t,authority:n,path:r,query:i,fragment:s}=e;return void 0===t?t=this.scheme:null===t&&(t=l),void 0===n?n=this.authority:null===n&&(n=l),void 0===r?r=this.path:null===r&&(r=l),void 0===i?i=this.query:null===i&&(i=l),void 0===s?s=this.fragment:null===s&&(s=l),t===this.scheme&&n===this.authority&&r===this.path&&i===this.query&&s===this.fragment?this:new p(t,n,r,i,s)}static parse(e,t=!1){const n=h.exec(e);return n?new p(n[2]||l,C(n[4]||l),C(n[5]||l),C(n[7]||l),C(n[9]||l),t):new p(l,l,l,l,l)}static file(e){let t=l;if(i.uF&&(e=e.replace(/\\/g,c)),e[0]===c&&e[1]===c){const n=e.indexOf(c,2);-1===n?(t=e.substring(2),e=c):(t=e.substring(2,n),e=e.substring(n)||c)}return new p("file",t,e,l,l)}static from(e,t){return new p(e.scheme,e.authority,e.path,e.query,e.fragment,t)}static joinPath(e,...t){if(!e.path)throw new Error("[UriError]: cannot call joinPath on URI without path");let n;return n=i.uF&&"file"===e.scheme?d.file(r.IN.join(b(e,!0),...t)).path:r.SA.join(e.path,...t),e.with({path:n})}toString(e=!1){return v(this,e)}toJSON(){return this}static revive(e){if(e){if(e instanceof d)return e;{const t=new p(e);return t._formatted=e.external??null,t._fsPath=e._sep===u?e.fsPath??null:null,t}}return e}}const u=i.uF?1:void 0;class p extends d{constructor(){super(...arguments),this._formatted=null,this._fsPath=null}get fsPath(){return this._fsPath||(this._fsPath=b(this,!1)),this._fsPath}toString(e=!1){return e?v(this,!0):(this._formatted||(this._formatted=v(this,!1)),this._formatted)}toJSON(){const e={$mid:1};return this._fsPath&&(e.fsPath=this._fsPath,e._sep=u),this._formatted&&(e.external=this._formatted),this.path&&(e.path=this.path),this.scheme&&(e.scheme=this.scheme),this.authority&&(e.authority=this.authority),this.query&&(e.query=this.query),this.fragment&&(e.fragment=this.fragment),e}}const m={58:"%3A",47:"%2F",63:"%3F",35:"%23",91:"%5B",93:"%5D",64:"%40",33:"%21",36:"%24",38:"%26",39:"%27",40:"%28",41:"%29",42:"%2A",43:"%2B",44:"%2C",59:"%3B",61:"%3D",32:"%20"};function f(e,t,n){let r,i=-1;for(let s=0;s=97&&o<=122||o>=65&&o<=90||o>=48&&o<=57||45===o||46===o||95===o||126===o||t&&47===o||n&&91===o||n&&93===o||n&&58===o)-1!==i&&(r+=encodeURIComponent(e.substring(i,s)),i=-1),void 0!==r&&(r+=e.charAt(s));else{void 0===r&&(r=e.substr(0,s));const t=m[o];void 0!==t?(-1!==i&&(r+=encodeURIComponent(e.substring(i,s)),i=-1),r+=t):-1===i&&(i=s)}}return-1!==i&&(r+=encodeURIComponent(e.substring(i))),void 0!==r?r:e}function g(e){let t;for(let n=0;n1&&"file"===e.scheme?`//${e.authority}${e.path}`:47===e.path.charCodeAt(0)&&(e.path.charCodeAt(1)>=65&&e.path.charCodeAt(1)<=90||e.path.charCodeAt(1)>=97&&e.path.charCodeAt(1)<=122)&&58===e.path.charCodeAt(2)?t?e.path.substr(1):e.path[1].toLowerCase()+e.path.substr(2):e.path,i.uF&&(n=n.replace(/\//g,"\\")),n}function v(e,t){const n=t?g:f;let r="",{scheme:i,authority:s,path:o,query:a,fragment:l}=e;if(i&&(r+=i,r+=":"),(s||"file"===i)&&(r+=c,r+=c),s){let e=s.indexOf("@");if(-1!==e){const t=s.substr(0,e);s=s.substr(e+1),e=t.lastIndexOf(":"),-1===e?r+=n(t,!1,!1):(r+=n(t.substr(0,e),!1,!1),r+=":",r+=n(t.substr(e+1),!1,!0)),r+="@"}s=s.toLowerCase(),e=s.lastIndexOf(":"),-1===e?r+=n(s,!1,!0):(r+=n(s.substr(0,e),!1,!0),r+=s.substr(e))}if(o){if(o.length>=3&&47===o.charCodeAt(0)&&58===o.charCodeAt(2)){const e=o.charCodeAt(1);e>=65&&e<=90&&(o=`/${String.fromCharCode(e+32)}:${o.substr(3)}`)}else if(o.length>=2&&58===o.charCodeAt(1)){const e=o.charCodeAt(0);e>=65&&e<=90&&(o=`${String.fromCharCode(e+32)}:${o.substr(2)}`)}r+=n(o,!0,!1)}return a&&(r+="?",r+=n(a,!1,!1)),l&&(r+="#",r+=t?l:f(l,!1,!1)),r}function y(e){try{return decodeURIComponent(e)}catch{return e.length>3?e.substr(0,3)+y(e.substr(3)):e}}const w=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function C(e){return e.match(w)?e.replace(w,e=>y(e)):e}},800:(e,t,n)=>{"use strict";n.d(t,{Q:()=>i});var r=n(8274);class i{constructor(e,t,n,r){e>n||e===n&&t>r?(this.startLineNumber=n,this.startColumn=r,this.endLineNumber=e,this.endColumn=t):(this.startLineNumber=e,this.startColumn=t,this.endLineNumber=n,this.endColumn=r)}isEmpty(){return i.isEmpty(this)}static isEmpty(e){return e.startLineNumber===e.endLineNumber&&e.startColumn===e.endColumn}containsPosition(e){return i.containsPosition(this,e)}static containsPosition(e,t){return!(t.lineNumbere.endLineNumber||t.lineNumber===e.startLineNumber&&t.columne.endColumn)}static strictContainsPosition(e,t){return!(t.lineNumbere.endLineNumber||t.lineNumber===e.startLineNumber&&t.column<=e.startColumn||t.lineNumber===e.endLineNumber&&t.column>=e.endColumn)}containsRange(e){return i.containsRange(this,e)}static containsRange(e,t){return!(t.startLineNumbere.endLineNumber||t.endLineNumber>e.endLineNumber||t.startLineNumber===e.startLineNumber&&t.startColumne.endColumn)}strictContainsRange(e){return i.strictContainsRange(this,e)}static strictContainsRange(e,t){return!(t.startLineNumbere.endLineNumber||t.endLineNumber>e.endLineNumber||t.startLineNumber===e.startLineNumber&&t.startColumn<=e.startColumn||t.endLineNumber===e.endLineNumber&&t.endColumn>=e.endColumn)}plusRange(e){return i.plusRange(this,e)}static plusRange(e,t){let n,r,s,o;return t.startLineNumbere.endLineNumber?(s=t.endLineNumber,o=t.endColumn):t.endLineNumber===e.endLineNumber?(s=t.endLineNumber,o=Math.max(t.endColumn,e.endColumn)):(s=e.endLineNumber,o=e.endColumn),new i(n,r,s,o)}intersectRanges(e){return i.intersectRanges(this,e)}static intersectRanges(e,t){let n=e.startLineNumber,r=e.startColumn,s=e.endLineNumber,o=e.endColumn;const a=t.startLineNumber,l=t.startColumn,c=t.endLineNumber,h=t.endColumn;return nc?(s=c,o=h):s===c&&(o=Math.min(o,h)),n>s||n===s&&r>o?null:new i(n,r,s,o)}equalsRange(e){return i.equalsRange(this,e)}static equalsRange(e,t){return!e&&!t||!!e&&!!t&&e.startLineNumber===t.startLineNumber&&e.startColumn===t.startColumn&&e.endLineNumber===t.endLineNumber&&e.endColumn===t.endColumn}getEndPosition(){return i.getEndPosition(this)}static getEndPosition(e){return new r.y(e.endLineNumber,e.endColumn)}getStartPosition(){return i.getStartPosition(this)}static getStartPosition(e){return new r.y(e.startLineNumber,e.startColumn)}toString(){return"["+this.startLineNumber+","+this.startColumn+" -> "+this.endLineNumber+","+this.endColumn+"]"}setEndPosition(e,t){return new i(this.startLineNumber,this.startColumn,e,t)}setStartPosition(e,t){return new i(e,t,this.endLineNumber,this.endColumn)}collapseToStart(){return i.collapseToStart(this)}static collapseToStart(e){return new i(e.startLineNumber,e.startColumn,e.startLineNumber,e.startColumn)}collapseToEnd(){return i.collapseToEnd(this)}static collapseToEnd(e){return new i(e.endLineNumber,e.endColumn,e.endLineNumber,e.endColumn)}delta(e){return new i(this.startLineNumber+e,this.startColumn,this.endLineNumber+e,this.endColumn)}static fromPositions(e,t=e){return new i(e.lineNumber,e.column,t.lineNumber,t.column)}static lift(e){return e?new i(e.startLineNumber,e.startColumn,e.endLineNumber,e.endColumn):null}static isIRange(e){return e&&"number"==typeof e.startLineNumber&&"number"==typeof e.startColumn&&"number"==typeof e.endLineNumber&&"number"==typeof e.endColumn}static areIntersectingOrTouching(e,t){return!(e.endLineNumbere.startLineNumber}toJSON(){return this}}},802:(e,t,n)=>{"use strict";n.d(t,{Mo:()=>i,pG:()=>r});const r=(0,n(7352).u1)("configurationService");function i(e){return e.replace(/[\[\]]/g,"")}},803:(e,t,n)=>{"use strict";n.r(t),n.d(t,{SemanticTokensStylingService:()=>d});var r=n(6274),i=n(6631),s=n(6996),o=n(579),a=n(7975),l=n(3182),c=n(1964),h=function(e,t){return function(n,r){t(n,r,e)}};let d=class extends r.jG{constructor(e,t,n){super(),this._themeService=e,this._logService=t,this._languageService=n,this._caches=new WeakMap,this._register(this._themeService.onDidColorThemeChange(()=>{this._caches=new WeakMap}))}getStyling(e){return this._caches.has(e)||this._caches.set(e,new a.SemanticTokensProviderStyling(e.getLegend(),this._themeService,this._languageService,this._logService)),this._caches.get(e)}};d=function(e,t,n,r){var i,s=arguments.length,o=s<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,n,r);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(o=(s<3?i(o):s>3?i(t,n,o):i(t,n))||o);return s>3&&o&&Object.defineProperty(t,n,o),o}([h(0,s.Gy),h(1,o.rr),h(2,i.L)],d),(0,c.v)(l.ISemanticTokensStylingService,d,1)},809:(e,t,n)=>{"use strict";n.d(t,{F:()=>s});var r=n(2373),i=n(5352);const s={JSONContribution:"base.contributions.json"},o=new class{constructor(){this._onDidChangeSchema=new r.vl,this.schemasById={}}registerSchema(e,t){var n;this.schemasById[(n=e,n.length>0&&"#"===n.charAt(n.length-1)?n.substring(0,n.length-1):n)]=t,this._onDidChangeSchema.fire(e)}notifySchemaChanged(e){this._onDidChangeSchema.fire(e)}};i.O.add(s.JSONContribution,o)},867:(e,t,n)=>{"use strict";n.d(t,{Ft:()=>o,Xo:()=>a,ok:()=>i,xb:()=>s});var r=n(1490);function i(e,t){if(!e)throw new Error(t?`Assertion failed (${t})`:"Assertion Failed")}function s(e,t="Unreachable"){throw new Error(t)}function o(e){e()||(e(),(0,r.dz)(new r.D7("Assertion Failed")))}function a(e,t){let n=0;for(;n{"use strict";n.r(t),n.d(t,{IModelService:()=>r});const r=(0,n(7352).u1)("modelService")},1075:(e,t,n)=>{"use strict";var r;n.d(t,{f:()=>r}),function(e){function t(e){return e&&"object"==typeof e&&"function"==typeof e[Symbol.iterator]}e.is=t;const n=Object.freeze([]);function*r(e){yield e}e.empty=function(){return n},e.single=r,e.wrap=function(e){return t(e)?e:r(e)},e.from=function(e){return e||n},e.reverse=function*(e){for(let t=e.length-1;t>=0;t--)yield e[t]},e.isEmpty=function(e){return!e||!0===e[Symbol.iterator]().next().done},e.first=function(e){return e[Symbol.iterator]().next().value},e.some=function(e,t){let n=0;for(const r of e)if(t(r,n++))return!0;return!1},e.find=function(e,t){for(const n of e)if(t(n))return n},e.filter=function*(e,t){for(const n of e)t(n)&&(yield n)},e.map=function*(e,t){let n=0;for(const r of e)yield t(r,n++)},e.flatMap=function*(e,t){let n=0;for(const r of e)yield*t(r,n++)},e.concat=function*(...e){for(const t of e)yield*t},e.reduce=function(e,t,n){let r=n;for(const n of e)r=t(r,n);return r},e.slice=function*(e,t,n=e.length){for(t<0&&(t+=e.length),n<0?n+=e.length:n>e.length&&(n=e.length);ti}]},e.asyncToArray=async function(e){const t=[];for await(const n of e)t.push(n);return Promise.resolve(t)}}(r||(r={}))},1211:(e,t,n)=>{"use strict";function r(e,t,n=(e,t)=>e===t){if(e===t)return!0;if(!e||!t)return!1;if(e.length!==t.length)return!1;for(let r=0,i=e.length;re){const n=new Set;return e.filter(e=>{const r=t(e);return!n.has(r)&&(n.add(r),!0)})}function l(e,t){return e.length>0?e[0]:t}function c(e,t,n){const r=e.slice(0,t),i=e.slice(t);return r.concat(n,i)}function h(e,t){for(const n of t)e.push(n)}var d;function u(e,t){return(n,r)=>t(e(n),e(r))}n.d(t,{E4:()=>h,Fy:()=>l,Hw:()=>m,U9:()=>p,VE:()=>u,aI:()=>r,c1:()=>g,dM:()=>a,j3:()=>f,kj:()=>o,n:()=>i,nK:()=>c,pN:()=>s}),function(e){e.isLessThan=function(e){return e<0},e.isLessThanOrEqual=function(e){return e<=0},e.isGreaterThan=function(e){return e>0},e.isNeitherLessOrGreaterThan=function(e){return 0===e},e.greaterThan=1,e.lessThan=-1,e.neitherLessOrGreaterThan=0}(d||(d={}));const p=(e,t)=>e-t;function m(e){return(t,n)=>-e(t,n)}class f{constructor(e){this.items=e,this.firstIdx=0,this.lastIdx=this.items.length-1}get length(){return this.lastIdx-this.firstIdx+1}takeWhile(e){let t=this.firstIdx;for(;t=0&&e(this.items[t]);)t--;const n=t===this.lastIdx?null:this.items.slice(t+1,this.lastIdx+1);return this.lastIdx=t,n}peek(){if(0!==this.length)return this.items[this.firstIdx]}dequeue(){const e=this.items[this.firstIdx];return this.firstIdx++,e}takeCount(e){const t=this.items.slice(this.firstIdx,this.firstIdx+e);return this.firstIdx+=e,t}}class g{static{this.empty=new g(e=>{})}constructor(e){this.iterate=e}toArray(){const e=[];return this.iterate(t=>(e.push(t),!0)),e}filter(e){return new g(t=>this.iterate(n=>!e(n)||t(n)))}map(e){return new g(t=>this.iterate(n=>t(e(n))))}findLast(e){let t;return this.iterate(n=>(e(n)&&(t=n),!0)),t}findLastMaxBy(e){let t,n=!0;return this.iterate(r=>((n||d.isGreaterThan(e(r,t)))&&(n=!1,t=r),!0)),t}}},1408:(e,t,n)=>{"use strict";n.r(t),n.d(t,{LanguageService:()=>I});var r=n(2373),i=n(6274),s=n(6506),o=n(1211),a=n(4945),l=n(4086);const c=(e,t)=>e===t;new WeakMap;class h{constructor(e,t,n){this.owner=e,this.debugNameSource=t,this.referenceFn=n}getDebugName(e){return function(e,t){const n=u.get(e);if(n)return n;const r=function(e,t){const n=u.get(e);if(n)return n;const r=t.owner?function(e){const t=m.get(e);if(t)return t;const n=function(e){const t=e.constructor;return t?t.name:"Object"}(e);let r=p.get(n)??0;r++,p.set(n,r);const i=1===r?n:`${n}#${r}`;return m.set(e,i),i}(t.owner)+".":"";let i;const s=t.debugNameSource;if(void 0!==s){if("function"!=typeof s)return r+s;if(i=s(),void 0!==i)return r+i}const o=t.referenceFn;if(void 0!==o&&(i=f(o),void 0!==i))return r+i;if(void 0!==t.owner){const n=function(e,t){for(const n in e)if(e[n]===t)return n}(t.owner,e);if(void 0!==n)return r+n}}(e,t);if(r){let t=d.get(r)??0;t++,d.set(r,t);const n=1===t?r:`${r}#${t}`;return u.set(e,n),n}}(e,this)}}const d=new Map,u=new WeakMap,p=new Map,m=new WeakMap;function f(e){const t=e.toString(),n=/\/\*\*\s*@description\s*([^*]*)\*\//.exec(t),r=n?n[1]:void 0;return r?.trim()}let g,b,v;class y{get TChange(){return null}reportChanges(){this.get()}read(e){return e?e.readObservable(this):this.get()}map(e,t){const n=void 0===t?void 0:e,r=void 0===t?e:t;return v({owner:n,debugName:()=>{const e=f(r);if(void 0!==e)return e;const t=/^\s*\(?\s*([a-zA-Z_$][a-zA-Z_$0-9]*)\s*\)?\s*=>\s*\1(?:\??)\.([a-zA-Z_$][a-zA-Z_$0-9]*)\s*$/.exec(r.toString());return t?`${this.debugName}.${t[2]}`:n?void 0:`${this.debugName} (mapped)`},debugReferenceFn:r},e=>r(this.read(e),e))}flatten(){return v({owner:void 0,debugName:()=>`${this.debugName} (flattened)`},e=>this.read(e).read(e))}recomputeInitiallyAndOnChange(e,t){return e.add(g(this,t)),this}keepObserved(e){return e.add(b(this)),this}}class w extends y{constructor(){super(...arguments),this.observers=new Set}addObserver(e){const t=this.observers.size;this.observers.add(e),0===t&&this.onFirstObserverAdded()}removeObserver(e){this.observers.delete(e)&&0===this.observers.size&&this.onLastObserverRemoved()}onFirstObserverAdded(){}onLastObserverRemoved(){}}class C{constructor(e,t){this._fn=e,this._getDebugName=t,this.updatingObservers=[]}getDebugName(){return this._getDebugName?this._getDebugName():f(this._fn)}updateObserver(e,t){this.updatingObservers.push({observer:e,observable:t}),e.beginUpdate(t)}finish(){const e=this.updatingObservers;for(let t=0;t`}beginUpdate(e){this.updateCount++;const t=1===this.updateCount;if(3===this.state&&(this.state=1,!t))for(const e of this.observers)e.handlePossibleChange(this);if(t)for(const e of this.observers)e.beginUpdate(this)}endUpdate(e){if(this.updateCount--,0===this.updateCount){const e=[...this.observers];for(const t of e)t.endUpdate(this)}(0,_.Ft)(()=>this.updateCount>=0)}handlePossibleChange(e){if(3===this.state&&this.dependencies.has(e)&&!this.dependenciesToBeRemoved.has(e)){this.state=1;for(const e of this.observers)e.handlePossibleChange(this)}}handleChange(e,t){if(this.dependencies.has(e)&&!this.dependenciesToBeRemoved.has(e)){const n=!this._handleChange||this._handleChange({changedObservable:e,change:t,didChange:t=>t===e},this.changeSummary),r=3===this.state;if(n&&(1===this.state||r)&&(this.state=2,r))for(const e of this.observers)e.handlePossibleChange(this)}}readObservable(e){e.addObserver(this);const t=e.get();return this.dependencies.add(e),this.dependenciesToBeRemoved.delete(e),t}addObserver(e){const t=!this.observers.has(e)&&this.updateCount>0;super.addObserver(e),t&&e.beginUpdate(this)}removeObserver(e){const t=this.observers.has(e)&&this.updateCount>0;super.removeObserver(e),t&&e.endUpdate(this)}}function x(e){return new S(new h(void 0,void 0,e),e,void 0,void 0)}class S{get debugName(){return this._debugNameData.getDebugName(this)??"(anonymous)"}constructor(e,t,n,r){this._debugNameData=e,this._runFn=t,this.createChangeSummary=n,this._handleChange=r,this.state=2,this.updateCount=0,this.disposed=!1,this.dependencies=new Set,this.dependenciesToBeRemoved=new Set,this.changeSummary=this.createChangeSummary?.(),this._runIfNeeded(),(0,i.Ay)(this)}dispose(){this.disposed=!0;for(const e of this.dependencies)e.removeObserver(this);this.dependencies.clear(),(0,i.VD)(this)}_runIfNeeded(){if(3===this.state)return;const e=this.dependenciesToBeRemoved;this.dependenciesToBeRemoved=this.dependencies,this.dependencies=e,this.state=3;const t=this.disposed;try{if(!t){const e=this.changeSummary;this.changeSummary=this.createChangeSummary?.(),this._runFn(this,e)}}finally{for(const e of this.dependenciesToBeRemoved)e.removeObserver(this);this.dependenciesToBeRemoved.clear()}}toString(){return`Autorun<${this.debugName}>`}beginUpdate(){3===this.state&&(this.state=1),this.updateCount++}endUpdate(){if(1===this.updateCount)do{if(1===this.state){this.state=3;for(const e of this.dependencies)if(e.reportChanges(),2===this.state)break}this._runIfNeeded()}while(3!==this.state);this.updateCount--,(0,_.Ft)(()=>this.updateCount>=0)}handlePossibleChange(e){3===this.state&&this.dependencies.has(e)&&!this.dependenciesToBeRemoved.has(e)&&(this.state=1)}handleChange(e,t){this.dependencies.has(e)&&!this.dependenciesToBeRemoved.has(e)&&(!this._handleChange||this._handleChange({changedObservable:e,change:t,didChange:t=>t===e},this.changeSummary))&&(this.state=2)}readObservable(e){if(this.disposed)return e.get();e.addObserver(this);const t=e.get();return this.dependencies.add(e),this.dependenciesToBeRemoved.delete(e),t}}function E(...e){let t,n,r;return 3===e.length?[t,n,r]=e:[n,r]=e,new F(new h(t,void 0,r),n,r,()=>F.globalTransaction,c)}(x||(x={})).Observer=S;class F extends w{constructor(e,t,n,r,i){super(),this._debugNameData=e,this.event=t,this._getValue=n,this._getTransaction=r,this._equalityComparator=i,this.hasValue=!1,this.handleEvent=e=>{const t=this._getValue(e),n=this.value,r=!this.hasValue||!this._equalityComparator(n,t);let i=!1;var s,o,a;r&&(this.value=t,this.hasValue&&(i=!0,s=this._getTransaction(),o=e=>{for(const t of this.observers)e.updateObserver(t,this),t.handleChange(this,void 0)},a=()=>{const e=this.getDebugName();return"Event fired"+(e?`: ${e}`:"")},s?o(s):function(e,t){const n=new C(e,t);try{e(n)}finally{n.finish()}}(o,a)),this.hasValue=!0)}}getDebugName(){return this._debugNameData.getDebugName(this)}get debugName(){const e=this.getDebugName();return"From Event"+(e?`: ${e}`:"")}onFirstObserverAdded(){this.subscription=this.event(this.handleEvent)}onLastObserverRemoved(){this.subscription.dispose(),this.subscription=void 0,this.hasValue=!1,this.value=void 0}get(){return this.subscription?(this.hasValue||this.handleEvent(void 0),this.value):this._getValue(void 0)}}!function(e){e.Observer=F,e.batchEventsGlobally=function(e,t){let n=!1;void 0===F.globalTransaction&&(F.globalTransaction=e,n=!0);try{t()}finally{n&&(F.globalTransaction=void 0)}}}(E||(E={})),b=function(e){const t=new L(!1,void 0);return e.addObserver(t),(0,i.s)(()=>{e.removeObserver(t)})},g=function(e,t){const n=new L(!0,t);return e.addObserver(n),t?t(e.get()):e.reportChanges(),(0,i.s)(()=>{e.removeObserver(n)})};class L{constructor(e,t){this._forceRecompute=e,this._handleValue=t,this._counter=0}beginUpdate(e){this._counter++}endUpdate(e){this._counter--,0===this._counter&&this._forceRecompute&&(this._handleValue?this._handleValue(e.get()):e.reportChanges())}handlePossibleChange(e){}handleChange(e,t){}}n(1490);class I extends i.jG{static{this.instanceCount=0}constructor(e=!1){super(),this._onDidRequestBasicLanguageFeatures=this._register(new r.vl),this.onDidRequestBasicLanguageFeatures=this._onDidRequestBasicLanguageFeatures.event,this._onDidRequestRichLanguageFeatures=this._register(new r.vl),this.onDidRequestRichLanguageFeatures=this._onDidRequestRichLanguageFeatures.event,this._onDidChange=this._register(new r.vl({leakWarningThreshold:200})),this.onDidChange=this._onDidChange.event,this._requestedBasicLanguages=new Set,this._requestedRichLanguages=new Set,I.instanceCount++,this._registry=this._register(new s.LanguagesRegistry(!0,e)),this.languageIdCodec=this._registry.languageIdCodec,this._register(this._registry.onDidChange(()=>this._onDidChange.fire()))}dispose(){I.instanceCount--,super.dispose()}isRegisteredLanguageId(e){return this._registry.isRegisteredLanguageId(e)}getLanguageIdByLanguageName(e){return this._registry.getLanguageIdByLanguageName(e)}getLanguageIdByMimeType(e){return this._registry.getLanguageIdByMimeType(e)}guessLanguageIdByFilepathOrFirstLine(e,t){const n=this._registry.guessLanguageIdByFilepathOrFirstLine(e,t);return(0,o.Fy)(n,null)}createById(e){return new T(this.onDidChange,()=>this._createAndGetLanguageIdentifier(e))}createByFilepathOrFirstLine(e,t){return new T(this.onDidChange,()=>{const n=this.guessLanguageIdByFilepathOrFirstLine(e,t);return this._createAndGetLanguageIdentifier(n)})}_createAndGetLanguageIdentifier(e){return e&&this.isRegisteredLanguageId(e)||(e=l.vH),e}requestBasicLanguageFeatures(e){this._requestedBasicLanguages.has(e)||(this._requestedBasicLanguages.add(e),this._onDidRequestBasicLanguageFeatures.fire(e))}requestRichLanguageFeatures(e){this._requestedRichLanguages.has(e)||(this._requestedRichLanguages.add(e),this.requestBasicLanguageFeatures(e),a.dG.getOrCreate(e),this._onDidRequestRichLanguageFeatures.fire(e))}}class T{constructor(e,t){this._value=E(this,e,()=>t()),this.onDidChange=r.Jh.fromObservable(this._value)}get languageId(){return this._value.get()}}},1471:(e,t,n)=>{"use strict";n.d(t,{L:()=>s});var r=n(8274),i=n(800);class s extends i.Q{constructor(e,t,n,r){super(e,t,n,r),this.selectionStartLineNumber=e,this.selectionStartColumn=t,this.positionLineNumber=n,this.positionColumn=r}toString(){return"["+this.selectionStartLineNumber+","+this.selectionStartColumn+" -> "+this.positionLineNumber+","+this.positionColumn+"]"}equalsSelection(e){return s.selectionsEqual(this,e)}static selectionsEqual(e,t){return e.selectionStartLineNumber===t.selectionStartLineNumber&&e.selectionStartColumn===t.selectionStartColumn&&e.positionLineNumber===t.positionLineNumber&&e.positionColumn===t.positionColumn}getDirection(){return this.selectionStartLineNumber===this.startLineNumber&&this.selectionStartColumn===this.startColumn?0:1}setEndPosition(e,t){return 0===this.getDirection()?new s(this.startLineNumber,this.startColumn,e,t):new s(e,t,this.startLineNumber,this.startColumn)}getPosition(){return new r.y(this.positionLineNumber,this.positionColumn)}getSelectionStart(){return new r.y(this.selectionStartLineNumber,this.selectionStartColumn)}setStartPosition(e,t){return 0===this.getDirection()?new s(e,t,this.endLineNumber,this.endColumn):new s(this.endLineNumber,this.endColumn,e,t)}static fromPositions(e,t=e){return new s(e.lineNumber,e.column,t.lineNumber,t.column)}static fromRange(e,t){return 0===t?new s(e.startLineNumber,e.startColumn,e.endLineNumber,e.endColumn):new s(e.endLineNumber,e.endColumn,e.startLineNumber,e.startColumn)}static liftSelection(e){return new s(e.selectionStartLineNumber,e.selectionStartColumn,e.positionLineNumber,e.positionColumn)}static selectionsArrEqual(e,t){if(e&&!t||!e&&t)return!1;if(!e&&!t)return!0;if(e.length!==t.length)return!1;for(let n=0,r=e.length;n{"use strict";n.d(t,{D7:()=>u,EM:()=>h,Qg:()=>l,cU:()=>s,dz:()=>i,iH:()=>c});const r=new class{constructor(){this.listeners=[],this.unexpectedErrorHandler=function(e){setTimeout(()=>{if(e.stack){if(d.isErrorNoTelemetry(e))throw new d(e.message+"\n\n"+e.stack);throw new Error(e.message+"\n\n"+e.stack)}throw e},0)}}emit(e){this.listeners.forEach(t=>{t(e)})}onUnexpectedError(e){this.unexpectedErrorHandler(e),this.emit(e)}onUnexpectedExternalError(e){this.unexpectedErrorHandler(e)}};function i(e){var t;(t=e)instanceof a||t instanceof Error&&t.name===o&&t.message===o||r.onUnexpectedError(e)}function s(e){if(e instanceof Error){const{name:t,message:n}=e;return{$isError:!0,name:t,message:n,stack:e.stacktrace||e.stack,noTelemetry:d.isErrorNoTelemetry(e)}}return e}const o="Canceled";class a extends Error{constructor(){super(o),this.name=this.message}}function l(e){return e?new Error(`Illegal argument: ${e}`):new Error("Illegal argument")}function c(e){return e?new Error(`Illegal state: ${e}`):new Error("Illegal state")}class h extends Error{constructor(e){super("NotSupported"),e&&(this.message=e)}}class d extends Error{constructor(e){super(e),this.name="CodeExpectedError"}static fromError(e){if(e instanceof d)return e;const t=new d;return t.message=e.message,t.stack=e.stack,t}static isErrorNoTelemetry(e){return"CodeExpectedError"===e.name}}class u extends Error{constructor(e){super(e||"An unexpected bug occurred."),Object.setPrototypeOf(this,u.prototype)}}},1551:(e,t,n)=>{"use strict";n.d(t,{x:()=>r});class r{static getLanguageId(e){return(255&e)>>>0}static getTokenType(e){return(768&e)>>>8}static containsBalancedBrackets(e){return!!(1024&e)}static getFontStyle(e){return(30720&e)>>>11}static getForeground(e){return(16744448&e)>>>15}static getBackground(e){return(4278190080&e)>>>24}static getClassNameFromMetadata(e){let t="mtk"+this.getForeground(e);const n=this.getFontStyle(e);return 1&n&&(t+=" mtki"),2&n&&(t+=" mtkb"),4&n&&(t+=" mtku"),8&n&&(t+=" mtks"),t}static getInlineStyleFromMetadata(e,t){const n=this.getForeground(e),r=this.getFontStyle(e);let i=`color: ${t[n]};`;1&r&&(i+="font-style: italic;"),2&r&&(i+="font-weight: bold;");let s="";return 4&r&&(s+=" underline"),8&r&&(s+=" line-through"),s&&(i+=`text-decoration:${s};`),i}static getPresentationFromMetadata(e){const t=this.getForeground(e),n=this.getFontStyle(e);return{foreground:t,italic:Boolean(1&n),bold:Boolean(2&n),underline:Boolean(4&n),strikethrough:Boolean(8&n)}}}},1732:(e,t,n)=>{"use strict";n.d(t,{w:()=>i});class r{static{this.Undefined=new r(void 0)}constructor(e){this.element=e,this.next=r.Undefined,this.prev=r.Undefined}}class i{constructor(){this._first=r.Undefined,this._last=r.Undefined,this._size=0}get size(){return this._size}isEmpty(){return this._first===r.Undefined}clear(){let e=this._first;for(;e!==r.Undefined;){const t=e.next;e.prev=r.Undefined,e.next=r.Undefined,e=t}this._first=r.Undefined,this._last=r.Undefined,this._size=0}unshift(e){return this._insert(e,!1)}push(e){return this._insert(e,!0)}_insert(e,t){const n=new r(e);if(this._first===r.Undefined)this._first=n,this._last=n;else if(t){const e=this._last;this._last=n,n.prev=e,e.next=n}else{const e=this._first;this._first=n,n.next=e,e.prev=n}this._size+=1;let i=!1;return()=>{i||(i=!0,this._remove(n))}}shift(){if(this._first!==r.Undefined){const e=this._first.element;return this._remove(this._first),e}}pop(){if(this._last!==r.Undefined){const e=this._last.element;return this._remove(this._last),e}}_remove(e){if(e.prev!==r.Undefined&&e.next!==r.Undefined){const t=e.prev;t.next=e.next,e.next.prev=t}else e.prev===r.Undefined&&e.next===r.Undefined?(this._first=r.Undefined,this._last=r.Undefined):e.next===r.Undefined?(this._last=this._last.prev,this._last.next=r.Undefined):e.prev===r.Undefined&&(this._first=this._first.next,this._first.prev=r.Undefined);this._size-=1}*[Symbol.iterator](){let e=this._first;for(;e!==r.Undefined;)yield e.element,e=e.next}}},1883:(e,t,n)=>{"use strict";function r(e){return e}n.d(t,{VV:()=>s,o5:()=>i});class i{constructor(e,t){this.lastCache=void 0,this.lastArgKey=void 0,"function"==typeof e?(this._fn=e,this._computeKey=r):(this._fn=t,this._computeKey=e.getCacheKey)}get(e){const t=this._computeKey(e);return this.lastArgKey!==t&&(this.lastArgKey=t,this.lastCache=this._fn(e)),this.lastCache}}class s{get cachedValues(){return this._map}constructor(e,t){this._map=new Map,this._map2=new Map,"function"==typeof e?(this._fn=e,this._computeKey=r):(this._fn=t,this._computeKey=e.getCacheKey)}get(e){const t=this._computeKey(e);if(this._map2.has(t))return this._map2.get(t);const n=this._fn(e);return this._map.set(e,n),this._map2.set(t,n),n}}},1905:(e,t,n)=>{"use strict";n.d(t,{TH:()=>o,Zn:()=>l,_1:()=>c,kb:()=>a});var r=n(9130),i=(n(6206),n(5603));function s(e){return 47===e||92===e}function o(e){return e.replace(/[\\/]/g,r.SA.sep)}function a(e){return-1===e.indexOf("/")&&(e=o(e)),/^[a-zA-Z]:(\/|$)/.test(e)&&(e="/"+e),e}function l(e,t=r.SA.sep){if(!e)return"";const n=e.length,i=e.charCodeAt(0);if(s(i)){if(s(e.charCodeAt(1))&&!s(e.charCodeAt(2))){let r=3;const i=r;for(;r=65&&o<=90||o>=97&&o<=122)&&58===e.charCodeAt(1))return s(e.charCodeAt(2))?e.slice(0,2)+t:e.slice(0,2);var o;let a=e.indexOf("://");if(-1!==a)for(a+=3;ae.length)return!1;if(n){if(!(0,i.ns)(e,t))return!1;if(t.length===e.length)return!0;let n=t.length;return t.charAt(t.length-1)===s&&n--,e.charAt(n)===s}return t.charAt(t.length-1)!==s&&(t+=s),0===e.indexOf(t)}},1964:(e,t,n)=>{"use strict";n.d(t,{v:()=>s});class r{constructor(e,t=[],n=!1){this.ctor=e,this.staticArguments=t,this.supportsDelayedInstantiation=n}}const i=[];function s(e,t,n){t instanceof r||(t=new r(t,[],Boolean(n))),i.push([e,t])}},2013:(e,t,n)=>{"use strict";n.r(t),n.d(t,{encodeSemanticTokensDto:()=>s});var r=n(6575),i=n(6206);function s(e){const t=new Uint32Array(function(e){let t=0;if(t+=2,"full"===e.type)t+=1+e.data.length;else{t+=1,t+=3*e.deltas.length;for(const n of e.deltas)n.data&&(t+=n.data.length)}return t}(e));let n=0;if(t[n++]=e.id,"full"===e.type)t[n++]=1,t[n++]=e.data.length,t.set(e.data,n),n+=e.data.length;else{t[n++]=2,t[n++]=e.deltas.length;for(const r of e.deltas)t[n++]=r.start,t[n++]=r.deleteCount,r.data?(t[n++]=r.data.length,t.set(r.data,n),n+=r.data.length):t[n++]=0}return function(e){const t=new Uint8Array(e.buffer,e.byteOffset,4*e.length);return i.cm()||function(e){for(let t=0,n=e.length;t{"use strict";n.d(t,{d:()=>r});class r{constructor(e){this.executor=e,this._didRun=!1}get value(){if(!this._didRun)try{this._value=this.executor()}catch(e){this._error=e}finally{this._didRun=!0}if(this._error)throw this._error;return this._value}get rawValue(){return this._value}}},2373:(e,t,n)=>{"use strict";n.d(t,{Jh:()=>r,vl:()=>p});var r,i=n(1490),s=n(6274),o=(n(1732),n(3958));!function(e){function t(e){return(t,n=null,r)=>{let i,s=!1;return i=e(e=>{if(!s)return i?i.dispose():s=!0,t.call(n,e)},null,r),s&&i.dispose(),i}}function n(e,t,n){return i((n,r=null,i)=>e(e=>n.call(r,t(e)),null,i),n)}function r(e,t,n){return i((n,r=null,i)=>e(e=>t(e)&&n.call(r,e),null,i),n)}function i(e,t){let n;const r=new p({onWillAddFirstListener(){n=e(r.fire,r)},onDidRemoveLastListener(){n?.dispose()}});return t?.add(r),r.event}function o(e,t,n=100,r=!1,i=!1,s,o){let a,l,c,h,d=0;const u=new p({leakWarningThreshold:s,onWillAddFirstListener(){a=e(e=>{d++,l=t(l,e),r&&!c&&(u.fire(l),l=void 0),h=()=>{const e=l;l=void 0,c=void 0,(!r||d>1)&&u.fire(e),d=0},"number"==typeof n?(clearTimeout(c),c=setTimeout(h,n)):void 0===c&&(c=0,queueMicrotask(h))})},onWillRemoveListener(){i&&d>0&&h?.()},onDidRemoveLastListener(){h=void 0,a.dispose()}});return o?.add(u),u.event}e.None=()=>s.jG.None,e.defer=function(e,t){return o(e,()=>{},0,void 0,!0,void 0,t)},e.once=t,e.onceIf=function(t,n){return e.once(e.filter(t,n))},e.map=n,e.forEach=function(e,t,n){return i((n,r=null,i)=>e(e=>{t(e),n.call(r,e)},null,i),n)},e.filter=r,e.signal=function(e){return e},e.any=function(...e){return(t,n=null,r)=>{return i=(0,s.qE)(...e.map(e=>e(e=>t.call(n,e)))),(o=r)instanceof Array?o.push(i):o&&o.add(i),i;var i,o}},e.reduce=function(e,t,r,i){let s=r;return n(e,e=>(s=t(s,e),s),i)},e.debounce=o,e.accumulate=function(t,n=0,r){return e.debounce(t,(e,t)=>e?(e.push(t),e):[t],n,void 0,!0,void 0,r)},e.latch=function(e,t=(e,t)=>e===t,n){let i,s=!0;return r(e,e=>{const n=s||!t(e,i);return s=!1,i=e,n},n)},e.split=function(t,n,r){return[e.filter(t,n,r),e.filter(t,e=>!n(e),r)]},e.buffer=function(e,t=!1,n=[],r){let i=n.slice(),s=e(e=>{i?i.push(e):a.fire(e)});r&&r.add(s);const o=()=>{i?.forEach(e=>a.fire(e)),i=null},a=new p({onWillAddFirstListener(){s||(s=e(e=>a.fire(e)),r&&r.add(s))},onDidAddFirstListener(){i&&(t?setTimeout(o):o())},onDidRemoveLastListener(){s&&s.dispose(),s=null}});return r&&r.add(a),a.event},e.chain=function(e,t){return(n,r,i)=>{const s=t(new l);return e(function(e){const t=s.evaluate(e);t!==a&&n.call(r,t)},void 0,i)}};const a=Symbol("HaltChainable");class l{constructor(){this.steps=[]}map(e){return this.steps.push(e),this}forEach(e){return this.steps.push(t=>(e(t),t)),this}filter(e){return this.steps.push(t=>e(t)?t:a),this}reduce(e,t){let n=t;return this.steps.push(t=>(n=e(n,t),n)),this}latch(e=(e,t)=>e===t){let t,n=!0;return this.steps.push(r=>{const i=n||!e(r,t);return n=!1,t=r,i?r:a}),this}evaluate(e){for(const t of this.steps)if((e=t(e))===a)break;return e}}e.fromNodeEventEmitter=function(e,t,n=e=>e){const r=(...e)=>i.fire(n(...e)),i=new p({onWillAddFirstListener:()=>e.on(t,r),onDidRemoveLastListener:()=>e.removeListener(t,r)});return i.event},e.fromDOMEventEmitter=function(e,t,n=e=>e){const r=(...e)=>i.fire(n(...e)),i=new p({onWillAddFirstListener:()=>e.addEventListener(t,r),onDidRemoveLastListener:()=>e.removeEventListener(t,r)});return i.event},e.toPromise=function(e){return new Promise(n=>t(e)(n))},e.fromPromise=function(e){const t=new p;return e.then(e=>{t.fire(e)},()=>{t.fire(void 0)}).finally(()=>{t.dispose()}),t.event},e.forward=function(e,t){return e(e=>t.fire(e))},e.runAndSubscribe=function(e,t,n){return t(n),e(e=>t(e))};class c{constructor(e,t){this._observable=e,this._counter=0,this._hasChanged=!1;const n={onWillAddFirstListener:()=>{e.addObserver(this),this._observable.reportChanges()},onDidRemoveLastListener:()=>{e.removeObserver(this)}};this.emitter=new p(n),t&&t.add(this.emitter)}beginUpdate(e){this._counter++}handlePossibleChange(e){}handleChange(e,t){this._hasChanged=!0}endUpdate(e){this._counter--,0===this._counter&&(this._observable.reportChanges(),this._hasChanged&&(this._hasChanged=!1,this.emitter.fire(this._observable.get())))}}e.fromObservable=function(e,t){return new c(e,t).emitter.event},e.fromObservableLight=function(e){return(t,n,r)=>{let i=0,o=!1;const a={beginUpdate(){i++},endUpdate(){i--,0===i&&(e.reportChanges(),o&&(o=!1,t.call(n)))},handlePossibleChange(){},handleChange(){o=!0}};e.addObserver(a),e.reportChanges();const l={dispose(){e.removeObserver(a)}};return r instanceof s.Cm?r.add(l):Array.isArray(r)&&r.push(l),l}}}(r||(r={}));class a{static{this.all=new Set}static{this._idPool=0}constructor(e){this.listenerCount=0,this.invocationCount=0,this.elapsedOverall=0,this.durations=[],this.name=`${e}_${a._idPool++}`,a.all.add(this)}start(e){this._stopWatch=new o.W,this.listenerCount=e}stop(){if(this._stopWatch){const e=this._stopWatch.elapsed();this.durations.push(e),this.elapsedOverall+=e,this.invocationCount+=1,this._stopWatch=void 0}}}class l{static{this._idPool=1}constructor(e,t,n=(l._idPool++).toString(16).padStart(3,"0")){this._errorHandler=e,this.threshold=t,this.name=n,this._warnCountdown=0}dispose(){this._stacks?.clear()}check(e,t){const n=this.threshold;if(n<=0||t{const t=this._stacks.get(e.value)||0;this._stacks.set(e.value,t-1)}}getMostFrequentStack(){if(!this._stacks)return;let e,t=0;for(const[n,r]of this._stacks)(!e||t{if(this._leakageMon&&this._size>this._leakageMon.threshold**2){const e=`[${this._leakageMon.name}] REFUSES to accept new listeners because it exceeded its threshold by far (${this._size} vs ${this._leakageMon.threshold})`;console.warn(e);const t=this._leakageMon.getMostFrequentStack()??["UNKNOWN stack",-1],n=new d(`${e}. HINT: Stack shows most frequent listener (${t[1]}-times)`,t[0]);return(this._options?.onListenerError||i.dz)(n),s.jG.None}if(this._disposed)return s.jG.None;t&&(e=e.bind(t));const r=new u(e);let o;this._leakageMon&&this._size>=Math.ceil(.2*this._leakageMon.threshold)&&(r.stack=c.create(),o=this._leakageMon.check(r.stack,this._size+1)),this._listeners?this._listeners instanceof u?(this._deliveryQueue??=new m,this._listeners=[this._listeners,r]):this._listeners.push(r):(this._options?.onWillAddFirstListener?.(this),this._listeners=r,this._options?.onDidAddFirstListener?.(this)),this._size++;const a=(0,s.s)(()=>{o?.(),this._removeListener(r)});return n instanceof s.Cm?n.add(a):Array.isArray(n)&&n.push(a),a},this._event}_removeListener(e){if(this._options?.onWillRemoveListener?.(this),!this._listeners)return;if(1===this._size)return this._listeners=void 0,this._options?.onDidRemoveLastListener?.(this),void(this._size=0);const t=this._listeners,n=t.indexOf(e);if(-1===n)throw console.log("disposed?",this._disposed),console.log("size?",this._size),console.log("arr?",JSON.stringify(this._listeners)),new Error("Attempted to dispose unknown listener");this._size--,t[n]=void 0;const r=this._deliveryQueue.current===this;if(2*this._size<=t.length){let e=0;for(let n=0;n0}}class m{constructor(){this.i=-1,this.end=0}enqueue(e,t,n){this.i=0,this.end=n,this.current=e,this.value=t}reset(){this.i=this.end,this.current=void 0,this.value=void 0}}},2548:(e,t,n)=>{"use strict";function r(e){return"string"==typeof e}function i(e){return!("object"!=typeof e||null===e||Array.isArray(e)||e instanceof RegExp||e instanceof Date)}function s(e){return void 0===e}function o(e){return s(e)||null===e}n.d(t,{Gv:()=>i,Kg:()=>r,b0:()=>s,z:()=>o})},2695:(e,t,n)=>{var r={"./editorBaseApi":[7317],"./editorBaseApi.js":[7317],"./editorSimpleWorker":[2803],"./editorSimpleWorker.js":[2803],"./editorWorker":[2919,792],"./editorWorker.js":[2919,792],"./editorWorkerHost":[3085],"./editorWorkerHost.js":[3085],"./findSectionHeaders":[8332],"./findSectionHeaders.js":[8332],"./getIconClasses":[8123,792],"./getIconClasses.js":[8123,792],"./languageFeatureDebounce":[9208,792],"./languageFeatureDebounce.js":[9208,792],"./languageFeatures":[6461,792],"./languageFeatures.js":[6461,792],"./languageFeaturesService":[8258,792],"./languageFeaturesService.js":[8258,792],"./languageService":[1408,792],"./languageService.js":[1408,792],"./languagesAssociations":[6357,792],"./languagesAssociations.js":[6357,792],"./languagesRegistry":[6506,792],"./languagesRegistry.js":[6506,792],"./markerDecorations":[5563,792],"./markerDecorations.js":[5563,792],"./markerDecorationsService":[8476,792],"./markerDecorationsService.js":[8476,792],"./model":[887,792],"./model.js":[887,792],"./modelService":[9796,792],"./modelService.js":[9796,792],"./resolverService":[8707,792],"./resolverService.js":[8707,792],"./semanticTokensDto":[2013,792],"./semanticTokensDto.js":[2013,792],"./semanticTokensProviderStyling":[7975,792],"./semanticTokensProviderStyling.js":[7975,792],"./semanticTokensStyling":[3182,792],"./semanticTokensStyling.js":[3182,792],"./semanticTokensStylingService":[803,792],"./semanticTokensStylingService.js":[803,792],"./textModelSync/textModelSync.impl":[9956],"./textModelSync/textModelSync.impl.js":[9956],"./textModelSync/textModelSync.protocol":[3051,792],"./textModelSync/textModelSync.protocol.js":[3051,792],"./textResourceConfiguration":[6693,792],"./textResourceConfiguration.js":[6693,792],"./treeSitterParserService":[9241,792],"./treeSitterParserService.js":[9241,792],"./treeViewsDnd":[9268,792],"./treeViewsDnd.js":[9268,792],"./treeViewsDndService":[8685,792],"./treeViewsDndService.js":[8685,792],"./unicodeTextModelHighlighter":[5050],"./unicodeTextModelHighlighter.js":[5050]};function i(e){if(!n.o(r,e))return Promise.resolve().then(()=>{var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t});var t=r[e],i=t[0];return Promise.all(t.slice(1).map(n.e)).then(()=>n(i))}i.keys=()=>Object.keys(r),i.id=2695,e.exports=i},2735:(e,t,n)=>{"use strict";n.d(t,{vb:()=>l,uC:()=>c,Qg:()=>a,$6:()=>h}),n(7542);var r=n(1490),i=n(2373),s=n(6274),o=n(6206);function a(e){return!!e&&"function"==typeof e.then}Symbol("MicrotaskDelay");class l{constructor(){this.disposable=void 0,this.isDisposed=!1}cancel(){this.disposable?.dispose(),this.disposable=void 0}cancelAndSet(e,t,n=globalThis){if(this.isDisposed)throw new r.D7("Calling 'cancelAndSet' on a disposed IntervalTimer");this.cancel();const i=n.setInterval(()=>{e()},t);this.disposable=(0,s.s)(()=>{n.clearInterval(i),this.disposable=void 0})}dispose(){this.cancel(),this.isDisposed=!0}}class c{constructor(e,t){this.timeoutToken=-1,this.runner=e,this.timeout=t,this.timeoutHandler=this.onTimeout.bind(this)}dispose(){this.cancel(),this.runner=null}cancel(){this.isScheduled()&&(clearTimeout(this.timeoutToken),this.timeoutToken=-1)}schedule(e=this.timeout){this.cancel(),this.timeoutToken=setTimeout(this.timeoutHandler,e)}get delay(){return this.timeout}set delay(e){this.timeout=e}isScheduled(){return-1!==this.timeoutToken}onTimeout(){this.timeoutToken=-1,this.runner&&this.doRun()}doRun(){this.runner?.()}}let h,d;var u;d="function"!=typeof globalThis.requestIdleCallback||"function"!=typeof globalThis.cancelIdleCallback?(e,t)=>{(0,o._p)(()=>{if(n)return;const e=Date.now()+15,r={didTimeout:!0,timeRemaining:()=>Math.max(0,e-Date.now())};t(Object.freeze(r))});let n=!1;return{dispose(){n||(n=!0)}}}:(e,t,n)=>{const r=e.requestIdleCallback(t,"number"==typeof n?{timeout:n}:void 0);let i=!1;return{dispose(){i||(i=!0,e.cancelIdleCallback(r))}}},h=e=>d(globalThis,e),function(e){e.settled=async function(e){let t;const n=await Promise.all(e.map(e=>e.then(e=>e,e=>{t||(t=e)})));if(void 0!==t)throw t;return n},e.withAsyncBody=function(e){return new Promise(async(t,n)=>{try{await e(t,n)}catch(e){n(e)}})}}(u||(u={}));class p{static fromArray(e){return new p(t=>{t.emitMany(e)})}static fromPromise(e){return new p(async t=>{t.emitMany(await e)})}static fromPromises(e){return new p(async t=>{await Promise.all(e.map(async e=>t.emitOne(await e)))})}static merge(e){return new p(async t=>{await Promise.all(e.map(async e=>{for await(const n of e)t.emitOne(n)}))})}static{this.EMPTY=p.fromArray([])}constructor(e,t){this._state=0,this._results=[],this._error=null,this._onReturn=t,this._onStateChanged=new i.vl,queueMicrotask(async()=>{const t={emitOne:e=>this.emitOne(e),emitMany:e=>this.emitMany(e),reject:e=>this.reject(e)};try{await Promise.resolve(e(t)),this.resolve()}catch(e){this.reject(e)}finally{t.emitOne=void 0,t.emitMany=void 0,t.reject=void 0}})}[Symbol.asyncIterator](){let e=0;return{next:async()=>{for(;;){if(2===this._state)throw this._error;if(e(this._onReturn?.(),{done:!0,value:void 0})}}static map(e,t){return new p(async n=>{for await(const r of e)n.emitOne(t(r))})}map(e){return p.map(this,e)}static filter(e,t){return new p(async n=>{for await(const r of e)t(r)&&n.emitOne(r)})}filter(e){return p.filter(this,e)}static coalesce(e){return p.filter(e,e=>!!e)}coalesce(){return p.coalesce(this)}static async toPromise(e){const t=[];for await(const n of e)t.push(n);return t}toPromise(){return p.toPromise(this)}emitOne(e){0===this._state&&(this._results.push(e),this._onStateChanged.fire())}emitMany(e){0===this._state&&(this._results=this._results.concat(e),this._onStateChanged.fire())}resolve(){0===this._state&&(this._state=1,this._onStateChanged.fire())}reject(e){0===this._state&&(this._state=2,this._error=e,this._onStateChanged.fire())}}},2803:(e,t,n)=>{"use strict";n.r(t),n.d(t,{BaseEditorSimpleWorker:()=>Ae,EditorSimpleWorker:()=>Me,create:()=>Oe});class r{constructor(e,t,n,r){this.originalStart=e,this.originalLength=t,this.modifiedStart=n,this.modifiedLength=r}getOriginalEnd(){return this.originalStart+this.originalLength}getModifiedEnd(){return this.modifiedStart+this.modifiedLength}}var i=n(9517);class s{constructor(e){this.source=e}getElements(){const e=this.source,t=new Int32Array(e.length);for(let n=0,r=e.length;n0||this.m_modifiedCount>0)&&this.m_changes.push(new r(this.m_originalStart,this.m_originalCount,this.m_modifiedStart,this.m_modifiedCount)),this.m_originalCount=0,this.m_modifiedCount=0,this.m_originalStart=1073741824,this.m_modifiedStart=1073741824}AddOriginalElement(e,t){this.m_originalStart=Math.min(this.m_originalStart,e),this.m_modifiedStart=Math.min(this.m_modifiedStart,t),this.m_originalCount++}AddModifiedElement(e,t){this.m_originalStart=Math.min(this.m_originalStart,e),this.m_modifiedStart=Math.min(this.m_modifiedStart,t),this.m_modifiedCount++}getChanges(){return(this.m_originalCount>0||this.m_modifiedCount>0)&&this.MarkNextChange(),this.m_changes}getReverseChanges(){return(this.m_originalCount>0||this.m_modifiedCount>0)&&this.MarkNextChange(),this.m_changes.reverse(),this.m_changes}}class h{constructor(e,t,n=null){this.ContinueProcessingPredicate=n,this._originalSequence=e,this._modifiedSequence=t;const[r,i,s]=h._getElements(e),[o,a,l]=h._getElements(t);this._hasStrings=s&&l,this._originalStringElements=r,this._originalElementsOrHash=i,this._modifiedStringElements=o,this._modifiedElementsOrHash=a,this.m_forwardHistory=[],this.m_reverseHistory=[]}static _isStringArray(e){return e.length>0&&"string"==typeof e[0]}static _getElements(e){const t=e.getElements();if(h._isStringArray(t)){const e=new Int32Array(t.length);for(let n=0,r=t.length;n=e&&i>=n&&this.ElementsAreEqual(t,i);)t--,i--;if(e>t||n>i){let s;return n<=i?(a.Assert(e===t+1,"originalStart should only be one more than originalEnd"),s=[new r(e,0,n,i-n+1)]):e<=t?(a.Assert(n===i+1,"modifiedStart should only be one more than modifiedEnd"),s=[new r(e,t-e+1,n,0)]):(a.Assert(e===t+1,"originalStart should only be one more than originalEnd"),a.Assert(n===i+1,"modifiedStart should only be one more than modifiedEnd"),s=[]),s}const o=[0],l=[0],c=this.ComputeRecursionPoint(e,t,n,i,o,l,s),h=o[0],d=l[0];if(null!==c)return c;if(!s[0]){const o=this.ComputeDiffRecursive(e,h,n,d,s);let a=[];return a=s[0]?[new r(h+1,t-(h+1)+1,d+1,i-(d+1)+1)]:this.ComputeDiffRecursive(h+1,t,d+1,i,s),this.ConcatenateChanges(o,a)}return[new r(e,t-e+1,n,i-n+1)]}WALKTRACE(e,t,n,i,s,o,a,l,h,d,u,p,m,f,g,b,v,y){let w=null,C=null,_=new c,k=t,x=n,S=m[0]-b[0]-i,E=-1073741824,F=this.m_forwardHistory.length-1;do{const t=S+e;t===k||t=0&&(e=(h=this.m_forwardHistory[F])[0],k=1,x=h.length-1)}while(--F>=-1);if(w=_.getReverseChanges(),y[0]){let e=m[0]+1,t=b[0]+1;if(null!==w&&w.length>0){const n=w[w.length-1];e=Math.max(e,n.getOriginalEnd()),t=Math.max(t,n.getModifiedEnd())}C=[new r(e,p-e+1,t,g-t+1)]}else{_=new c,k=o,x=a,S=m[0]-b[0]-l,E=1073741824,F=v?this.m_reverseHistory.length-1:this.m_reverseHistory.length-2;do{const e=S+s;e===k||e=d[e+1]?(f=(u=d[e+1]-1)-S-l,u>E&&_.MarkNextChange(),E=u+1,_.AddOriginalElement(u+1,f+1),S=e+1-s):(f=(u=d[e-1])-S-l,u>E&&_.MarkNextChange(),E=u,_.AddModifiedElement(u+1,f+1),S=e-1-s),F>=0&&(s=(d=this.m_reverseHistory[F])[0],k=1,x=d.length-1)}while(--F>=-1);C=_.getChanges()}return this.ConcatenateChanges(w,C)}ComputeRecursionPoint(e,t,n,i,s,o,a){let c=0,h=0,d=0,u=0,p=0,m=0;e--,n--,s[0]=0,o[0]=0,this.m_forwardHistory=[],this.m_reverseHistory=[];const f=t-e+(i-n),g=f+1,b=new Int32Array(g),v=new Int32Array(g),y=i-n,w=t-e,C=e-n,_=t-i,k=(w-y)%2==0;b[y]=e,v[w]=t,a[0]=!1;for(let x=1;x<=f/2+1;x++){let f=0,S=0;d=this.ClipDiagonalBound(y-x,x,y,g),u=this.ClipDiagonalBound(y+x,x,y,g);for(let e=d;e<=u;e+=2){c=e===d||ef+S&&(f=c,S=h),!k&&Math.abs(e-w)<=x-1&&c>=v[e])return s[0]=c,o[0]=h,n<=v[e]&&x<=1448?this.WALKTRACE(y,d,u,C,w,p,m,_,b,v,c,t,s,h,i,o,k,a):null}const E=(f-e+(S-n)-x)/2;if(null!==this.ContinueProcessingPredicate&&!this.ContinueProcessingPredicate(f,E))return a[0]=!0,s[0]=f,o[0]=S,E>0&&x<=1448?this.WALKTRACE(y,d,u,C,w,p,m,_,b,v,c,t,s,h,i,o,k,a):(e++,n++,[new r(e,t-e+1,n,i-n+1)]);p=this.ClipDiagonalBound(w-x,x,w,g),m=this.ClipDiagonalBound(w+x,x,w,g);for(let r=p;r<=m;r+=2){c=r===p||r=v[r+1]?v[r+1]-1:v[r-1],h=c-(r-w)-_;const l=c;for(;c>e&&h>n&&this.ElementsAreEqual(c,h);)c--,h--;if(v[r]=c,k&&Math.abs(r-y)<=x&&c<=b[r])return s[0]=c,o[0]=h,l>=b[r]&&x<=1448?this.WALKTRACE(y,d,u,C,w,p,m,_,b,v,c,t,s,h,i,o,k,a):null}if(x<=1447){let e=new Int32Array(u-d+2);e[0]=y-d+1,l.Copy2(b,d,e,1,u-d+1),this.m_forwardHistory.push(e),e=new Int32Array(m-p+2),e[0]=w-p+1,l.Copy2(v,p,e,1,m-p+1),this.m_reverseHistory.push(e)}}return this.WALKTRACE(y,d,u,C,w,p,m,_,b,v,c,t,s,h,i,o,k,a)}PrettifyChanges(e){for(let t=0;t0,o=n.modifiedLength>0;for(;n.originalStart+n.originalLength=0;t--){const n=e[t];let r=0,i=0;if(t>0){const n=e[t-1];r=n.originalStart+n.originalLength,i=n.modifiedStart+n.modifiedLength}const s=n.originalLength>0,o=n.modifiedLength>0;let a=0,l=this._boundaryScore(n.originalStart,n.originalLength,n.modifiedStart,n.modifiedLength);for(let e=1;;e++){const t=n.originalStart-e,c=n.modifiedStart-e;if(tl&&(l=h,a=e)}n.originalStart-=a,n.modifiedStart-=a;const c=[null];t>0&&this.ChangesOverlap(e[t-1],e[t],c)&&(e[t-1]=c[0],e.splice(t,1),t++)}if(this._hasStrings)for(let t=1,n=e.length;t0&&n>a&&(a=n,l=t,c=e)}return a>0?[l,c]:null}_contiguousSequenceScore(e,t,n){let r=0;for(let i=0;i=this._originalElementsOrHash.length-1||this._hasStrings&&/^\s*$/.test(this._originalStringElements[e])}_OriginalRegionIsBoundary(e,t){if(this._OriginalIsBoundary(e)||this._OriginalIsBoundary(e-1))return!0;if(t>0){const n=e+t;if(this._OriginalIsBoundary(n-1)||this._OriginalIsBoundary(n))return!0}return!1}_ModifiedIsBoundary(e){return e<=0||e>=this._modifiedElementsOrHash.length-1||this._hasStrings&&/^\s*$/.test(this._modifiedStringElements[e])}_ModifiedRegionIsBoundary(e,t){if(this._ModifiedIsBoundary(e)||this._ModifiedIsBoundary(e-1))return!0;if(t>0){const n=e+t;if(this._ModifiedIsBoundary(n-1)||this._ModifiedIsBoundary(n))return!0}return!1}_boundaryScore(e,t,n,r){return(this._OriginalRegionIsBoundary(e,t)?1:0)+(this._ModifiedRegionIsBoundary(n,r)?1:0)}ConcatenateChanges(e,t){const n=[];if(0===e.length||0===t.length)return t.length>0?t:e;if(this.ChangesOverlap(e[e.length-1],t[0],n)){const r=new Array(e.length+t.length-1);return l.Copy(e,0,r,0,e.length-1),r[e.length-1]=n[0],l.Copy(t,1,r,e.length,t.length-1),r}{const n=new Array(e.length+t.length);return l.Copy(e,0,n,0,e.length),l.Copy(t,0,n,e.length,t.length),n}}ChangesOverlap(e,t,n){if(a.Assert(e.originalStart<=t.originalStart,"Left change is not less than or equal to right change"),a.Assert(e.modifiedStart<=t.modifiedStart,"Left change is not less than or equal to right change"),e.originalStart+e.originalLength>=t.originalStart||e.modifiedStart+e.modifiedLength>=t.modifiedStart){const i=e.originalStart;let s=e.originalLength;const o=e.modifiedStart;let a=e.modifiedLength;return e.originalStart+e.originalLength>=t.originalStart&&(s=t.originalStart+t.originalLength-e.originalStart),e.modifiedStart+e.modifiedLength>=t.modifiedStart&&(a=t.modifiedStart+t.modifiedLength-e.modifiedStart),n[0]=new r(i,s,o,a),!0}return n[0]=null,!1}ClipDiagonalBound(e,t,n,r){if(e>=0&&et&&(t=s),i>n&&(n=i),o>n&&(n=o)}t++,n++;const r=new p(n,t,0);for(let t=0,n=e.length;t=this._maxCharCode?0:this._states.get(e,t)}}let f=null,g=null;class b{static _createLink(e,t,n,r,i){let s=i-1;do{const n=t.charCodeAt(s);if(2!==e.get(n))break;s--}while(s>r);if(r>0){const e=t.charCodeAt(r-1),n=t.charCodeAt(s);(40===e&&41===n||91===e&&93===n||123===e&&125===n)&&s--}return{range:{startLineNumber:n,startColumn:r+1,endLineNumber:n,endColumn:s+2},url:t.substring(r,s+1)}}static computeLinks(e,t=function(){return null===f&&(f=new m([[1,104,2],[1,72,2],[1,102,6],[1,70,6],[2,116,3],[2,84,3],[3,116,4],[3,84,4],[4,112,5],[4,80,5],[5,115,9],[5,83,9],[5,58,10],[6,105,7],[6,73,7],[7,108,8],[7,76,8],[8,101,9],[8,69,9],[9,58,10],[10,47,11],[11,47,12]])),f}()){const n=function(){if(null===g){g=new u.V(0);const e=" \t<>'\"、。。、,.:;‘〈「『〔([{「」}])〕』」〉’`~…";for(let t=0;t=0?(r+=n?1:-1,r<0?r=e.length-1:r%=e.length,e[r]):null}}var y=n(7317),w=n(3085),C=n(3958),_=n(5050);class k{constructor(e,t,n){this.changes=e,this.moves=t,this.hitTimeout=n}}class x{constructor(e,t){this.lineRangeMapping=e,this.changes=t}}var S=n(1490),E=n(6362),F=n(8274),L=n(867),I=n(6185);n(3550);class T{constructor(e,t){this.range=e,this.text=t}toSingleEditOperation(){return{range:this.range,text:this.text}}}class N{static inverse(e,t,n){const r=[];let i=1,s=1;for(const t of e){const e=new N(new E.M(i,t.original.startLineNumber),new E.M(s,t.modified.startLineNumber));e.modified.isEmpty||r.push(e),i=t.original.endLineNumberExclusive,s=t.modified.endLineNumberExclusive}const o=new N(new E.M(i,t+1),new E.M(s,n+1));return o.modified.isEmpty||r.push(o),r}static clip(e,t,n){const r=[];for(const i of e){const e=i.original.intersect(t),s=i.modified.intersect(n);e&&!e.isEmpty&&s&&!s.isEmpty&&r.push(new N(e,s))}return r}constructor(e,t){this.original=e,this.modified=t}toString(){return`{${this.original.toString()}->${this.modified.toString()}}`}flip(){return new N(this.modified,this.original)}join(e){return new N(this.original.join(e.original),this.modified.join(e.modified))}toRangeMapping(){const e=this.original.toInclusiveRange(),t=this.modified.toInclusiveRange();if(e&&t)return new M(e,t);if(1===this.original.startLineNumber||1===this.modified.startLineNumber){if(1!==this.modified.startLineNumber||1!==this.original.startLineNumber)throw new S.D7("not a valid diff");return new M(new d.Q(this.original.startLineNumber,1,this.original.endLineNumberExclusive,1),new d.Q(this.modified.startLineNumber,1,this.modified.endLineNumberExclusive,1))}return new M(new d.Q(this.original.startLineNumber-1,Number.MAX_SAFE_INTEGER,this.original.endLineNumberExclusive-1,Number.MAX_SAFE_INTEGER),new d.Q(this.modified.startLineNumber-1,Number.MAX_SAFE_INTEGER,this.modified.endLineNumberExclusive-1,Number.MAX_SAFE_INTEGER))}toRangeMapping2(e,t){if(D(this.original.endLineNumberExclusive,e)&&D(this.modified.endLineNumberExclusive,t))return new M(new d.Q(this.original.startLineNumber,1,this.original.endLineNumberExclusive,1),new d.Q(this.modified.startLineNumber,1,this.modified.endLineNumberExclusive,1));if(!this.original.isEmpty&&!this.modified.isEmpty)return new M(d.Q.fromPositions(new F.y(this.original.startLineNumber,1),R(new F.y(this.original.endLineNumberExclusive-1,Number.MAX_SAFE_INTEGER),e)),d.Q.fromPositions(new F.y(this.modified.startLineNumber,1),R(new F.y(this.modified.endLineNumberExclusive-1,Number.MAX_SAFE_INTEGER),t)));if(this.original.startLineNumber>1&&this.modified.startLineNumber>1)return new M(d.Q.fromPositions(R(new F.y(this.original.startLineNumber-1,Number.MAX_SAFE_INTEGER),e),R(new F.y(this.original.endLineNumberExclusive-1,Number.MAX_SAFE_INTEGER),e)),d.Q.fromPositions(R(new F.y(this.modified.startLineNumber-1,Number.MAX_SAFE_INTEGER),t),R(new F.y(this.modified.endLineNumberExclusive-1,Number.MAX_SAFE_INTEGER),t)));throw new S.D7}}function R(e,t){if(e.lineNumber<1)return new F.y(1,1);if(e.lineNumber>t.length)return new F.y(t.length,t[t.length-1].length+1);const n=t[e.lineNumber-1];return e.column>n.length+1?new F.y(e.lineNumber,n.length+1):e}function D(e,t){return e>=1&&e<=t.length}class A extends N{static fromRangeMappings(e){const t=E.M.join(e.map(e=>E.M.fromRangeInclusive(e.originalRange))),n=E.M.join(e.map(e=>E.M.fromRangeInclusive(e.modifiedRange)));return new A(t,n,e)}constructor(e,t,n){super(e,t),this.innerChanges=n}flip(){return new A(this.modified,this.original,this.innerChanges?.map(e=>e.flip()))}withInnerChangesFromLineRanges(){return new A(this.original,this.modified,[this.toRangeMapping()])}}class M{static assertSorted(e){for(let t=1;t${this.modifiedRange.toString()}}`}flip(){return new M(this.modifiedRange,this.originalRange)}toTextEdit(e){const t=e.getValueOfRange(this.modifiedRange);return new T(this.originalRange,t)}}var O=n(5603);class z{computeDiff(e,t,n){const r=new $(e,t,{maxComputationTime:n.maxComputationTimeMs,shouldIgnoreTrimWhitespace:n.ignoreTrimWhitespace,shouldComputeCharChanges:!0,shouldMakePrettyDiff:!0,shouldPostProcessCharChanges:!0}).computeDiff(),i=[];let s=null;for(const e of r.changes){let t,n;t=0===e.originalEndLineNumber?new E.M(e.originalStartLineNumber+1,e.originalStartLineNumber+1):new E.M(e.originalStartLineNumber,e.originalEndLineNumber+1),n=0===e.modifiedEndLineNumber?new E.M(e.modifiedStartLineNumber+1,e.modifiedStartLineNumber+1):new E.M(e.modifiedStartLineNumber,e.modifiedEndLineNumber+1);let r=new A(t,n,e.charChanges?.map(e=>new M(new d.Q(e.originalStartLineNumber,e.originalStartColumn,e.originalEndLineNumber,e.originalEndColumn),new d.Q(e.modifiedStartLineNumber,e.modifiedStartColumn,e.modifiedEndLineNumber,e.modifiedEndColumn))));s&&(s.modified.endLineNumberExclusive!==r.modified.startLineNumber&&s.original.endLineNumberExclusive!==r.original.startLineNumber||(r=new A(s.original.join(r.original),s.modified.join(r.modified),s.innerChanges&&r.innerChanges?s.innerChanges.concat(r.innerChanges):void 0),i.pop())),i.push(r),s=r}return(0,L.Ft)(()=>(0,L.Xo)(i,(e,t)=>t.original.startLineNumber-e.original.endLineNumberExclusive===t.modified.startLineNumber-e.modified.endLineNumberExclusive&&e.original.endLineNumberExclusive(10===e?"\\n":String.fromCharCode(e))+`-(${this._lineNumbers[t]},${this._columns[t]})`).join(", ")+"]"}_assertIndex(e,t){if(e<0||e>=t.length)throw new Error("Illegal index")}getElements(){return this._charCodes}getStartLineNumber(e){return e>0&&e===this._lineNumbers.length?this.getEndLineNumber(e-1):(this._assertIndex(e,this._lineNumbers),this._lineNumbers[e])}getEndLineNumber(e){return-1===e?this.getStartLineNumber(e+1):(this._assertIndex(e,this._lineNumbers),10===this._charCodes[e]?this._lineNumbers[e]+1:this._lineNumbers[e])}getStartColumn(e){return e>0&&e===this._columns.length?this.getEndColumn(e-1):(this._assertIndex(e,this._columns),this._columns[e])}getEndColumn(e){return-1===e?this.getStartColumn(e+1):(this._assertIndex(e,this._columns),10===this._charCodes[e]?1:this._columns[e]+1)}}class V{constructor(e,t,n,r,i,s,o,a){this.originalStartLineNumber=e,this.originalStartColumn=t,this.originalEndLineNumber=n,this.originalEndColumn=r,this.modifiedStartLineNumber=i,this.modifiedStartColumn=s,this.modifiedEndLineNumber=o,this.modifiedEndColumn=a}static createFromDiffChange(e,t,n){const r=t.getStartLineNumber(e.originalStart),i=t.getStartColumn(e.originalStart),s=t.getEndLineNumber(e.originalStart+e.originalLength-1),o=t.getEndColumn(e.originalStart+e.originalLength-1),a=n.getStartLineNumber(e.modifiedStart),l=n.getStartColumn(e.modifiedStart),c=n.getEndLineNumber(e.modifiedStart+e.modifiedLength-1),h=n.getEndColumn(e.modifiedStart+e.modifiedLength-1);return new V(r,i,s,o,a,l,c,h)}}class U{constructor(e,t,n,r,i){this.originalStartLineNumber=e,this.originalEndLineNumber=t,this.modifiedStartLineNumber=n,this.modifiedEndLineNumber=r,this.charChanges=i}static createFromDiffResult(e,t,n,r,i,s,o){let a,l,c,h,d;if(0===t.originalLength?(a=n.getStartLineNumber(t.originalStart)-1,l=0):(a=n.getStartLineNumber(t.originalStart),l=n.getEndLineNumber(t.originalStart+t.originalLength-1)),0===t.modifiedLength?(c=r.getStartLineNumber(t.modifiedStart)-1,h=0):(c=r.getStartLineNumber(t.modifiedStart),h=r.getEndLineNumber(t.modifiedStart+t.modifiedLength-1)),s&&t.originalLength>0&&t.originalLength<20&&t.modifiedLength>0&&t.modifiedLength<20&&i()){const s=n.createCharSequence(e,t.originalStart,t.originalStart+t.originalLength-1),a=r.createCharSequence(e,t.modifiedStart,t.modifiedStart+t.modifiedLength-1);if(s.getElements().length>0&&a.getElements().length>0){let e=P(s,a,i,!0).changes;o&&(e=function(e){if(e.length<=1)return e;const t=[e[0]];let n=t[0];for(let r=1,i=e.length;r1&&o>1&&e.charCodeAt(n-2)===t.charCodeAt(o-2);)n--,o--;(n>1||o>1)&&this._pushTrimWhitespaceCharChange(r,i+1,1,n,s+1,1,o)}{let n=j(e,1),o=j(t,1);const a=e.length+1,l=t.length+1;for(;n!0;const t=Date.now();return()=>Date.now()-t{n.push(Q.fromOffsetPairs(e?e.getEndExclusives():J.zero,r?r.getStarts():new J(t,(e?e.seq2Range.endExclusive-e.seq1Range.endExclusive:0)+t)))}),n}static fromOffsetPairs(e,t){return new Q(new I.L(e.offset1,t.offset1),new I.L(e.offset2,t.offset2))}static assertSorted(e){let t;for(const n of e){if(t&&!(t.seq1Range.endExclusive<=n.seq1Range.start&&t.seq2Range.endExclusive<=n.seq2Range.start))throw new S.D7("Sequence diffs must be sorted");t=n}}constructor(e,t){this.seq1Range=e,this.seq2Range=t}swap(){return new Q(this.seq2Range,this.seq1Range)}toString(){return`${this.seq1Range} <-> ${this.seq2Range}`}join(e){return new Q(this.seq1Range.join(e.seq1Range),this.seq2Range.join(e.seq2Range))}delta(e){return 0===e?this:new Q(this.seq1Range.delta(e),this.seq2Range.delta(e))}deltaStart(e){return 0===e?this:new Q(this.seq1Range.deltaStart(e),this.seq2Range.deltaStart(e))}deltaEnd(e){return 0===e?this:new Q(this.seq1Range.deltaEnd(e),this.seq2Range.deltaEnd(e))}intersect(e){const t=this.seq1Range.intersect(e.seq1Range),n=this.seq2Range.intersect(e.seq2Range);if(t&&n)return new Q(t,n)}getStarts(){return new J(this.seq1Range.start,this.seq2Range.start)}getEndExclusives(){return new J(this.seq1Range.endExclusive,this.seq2Range.endExclusive)}}class J{static{this.zero=new J(0,0)}static{this.max=new J(Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER)}constructor(e,t){this.offset1=e,this.offset2=t}toString(){return`${this.offset1} <-> ${this.offset2}`}delta(e){return 0===e?this:new J(this.offset1+e,this.offset2+e)}equals(e){return this.offset1===e.offset1&&this.offset2===e.offset2}}class Y{static{this.instance=new Y}isValid(){return!0}}class X{constructor(e){if(this.timeout=e,this.startTime=Date.now(),this.valid=!0,e<=0)throw new S.D7("timeout must be positive")}isValid(){return!(Date.now()-this.startTime0&&l>0&&3===s.get(a-1,l-1)&&(d+=o.get(a-1,l-1)),d+=r?r(a,l):1):d=-1;const u=Math.max(c,h,d);if(u===d){const e=a>0&&l>0?o.get(a-1,l-1):0;o.set(a,l,e+1),s.set(a,l,3)}else u===c?(o.set(a,l,0),s.set(a,l,1)):u===h&&(o.set(a,l,0),s.set(a,l,2));i.set(a,l,u)}const a=[];let l=e.length,c=t.length;function h(e,t){e+1===l&&t+1===c||a.push(new Q(new I.L(e+1,l),new I.L(t+1,c))),l=e,c=t}let d=e.length-1,u=t.length-1;for(;d>=0&&u>=0;)3===s.get(d,u)?(h(d,u),d--,u--):1===s.get(d,u)?d--:u--;return h(-1,-1),a.reverse(),new G(a,!1)}}class re{compute(e,t,n=Y.instance){if(0===e.length||0===t.length)return G.trivial(e,t);const r=e,i=t;function s(e,t){for(;er.length||u>i.length)continue;const p=s(d,u);a.set(c,p);const m=d===o?l.get(c+1):l.get(c-1);if(l.set(c,p!==d?new ie(m,d,u,p-d):m),a.get(c)===r.length&&a.get(c)-c===i.length)break e}}let h=l.get(c);const d=[];let u=r.length,p=i.length;for(;;){const e=h?h.x+h.length:0,t=h?h.y+h.length:0;if(e===u&&t===p||d.push(new Q(new I.L(e,u),new I.L(t,p))),!h)break;u=h.x,p=h.y,h=h.prev}return d.reverse(),new G(d,!1)}}class ie{constructor(e,t,n,r){this.prev=e,this.x=t,this.y=n,this.length=r}}class se{constructor(){this.positiveArr=new Int32Array(10),this.negativeArr=new Int32Array(10)}get(e){return e<0?(e=-e-1,this.negativeArr[e]):this.positiveArr[e]}set(e,t){if(e<0){if((e=-e-1)>=this.negativeArr.length){const e=this.negativeArr;this.negativeArr=new Int32Array(2*e.length),this.negativeArr.set(e)}this.negativeArr[e]=t}else{if(e>=this.positiveArr.length){const e=this.positiveArr;this.positiveArr=new Int32Array(2*e.length),this.positiveArr.set(e)}this.positiveArr[e]=t}}}class oe{constructor(){this.positiveArr=[],this.negativeArr=[]}get(e){return e<0?(e=-e-1,this.negativeArr[e]):this.positiveArr[e]}set(e,t){e<0?(e=-e-1,this.negativeArr[e]=t):this.positiveArr[e]=t}}var ae=n(8348),le=n(6303);class ce{constructor(e,t,n){this.lines=e,this.range=t,this.considerWhitespaceChanges=n,this.elements=[],this.firstElementOffsetByLineIdx=[],this.lineStartOffsets=[],this.trimmedWsLengthsByLineIdx=[],this.firstElementOffsetByLineIdx.push(0);for(let t=this.range.startLineNumber;t<=this.range.endLineNumber;t++){let r=e[t-1],i=0;t===this.range.startLineNumber&&this.range.startColumn>1&&(i=this.range.startColumn-1,r=r.substring(i)),this.lineStartOffsets.push(i);let s=0;if(!n){const e=r.trimStart();s=r.length-e.length,r=e.trimEnd()}this.trimmedWsLengthsByLineIdx.push(s);const o=t===this.range.endLineNumber?Math.min(this.range.endColumn-1-i-s,r.length):r.length;for(let e=0;eString.fromCharCode(e)).join("")}getElement(e){return this.elements[e]}get length(){return this.elements.length}getBoundaryScore(e){const t=pe(e>0?this.elements[e-1]:-1),n=pe(et<=e),r=e-this.firstElementOffsetByLineIdx[n];return new F.y(this.range.startLineNumber+n,1+this.lineStartOffsets[n]+r+(0===r&&"left"===t?0:this.trimmedWsLengthsByLineIdx[n]))}translateRange(e){const t=this.translateOffset(e.start,"right"),n=this.translateOffset(e.endExclusive,"left");return n.isBefore(t)?d.Q.fromPositions(n,n):d.Q.fromPositions(t,n)}findWordContaining(e){if(e<0||e>=this.elements.length)return;if(!he(this.elements[e]))return;let t=e;for(;t>0&&he(this.elements[t-1]);)t--;let n=e;for(;nt<=e.start)??0,n=(0,ae.XP)(this.firstElementOffsetByLineIdx,t=>e.endExclusive<=t)??this.elements.length;return new I.L(t,n)}}function he(e){return e>=97&&e<=122||e>=65&&e<=90||e>=48&&e<=57}const de={0:0,1:0,2:0,3:10,4:2,5:30,6:3,7:10,8:10};function ue(e){return de[e]}function pe(e){return 10===e?8:13===e?7:ee(e)?6:e>=97&&e<=122?0:e>=65&&e<=90?1:e>=48&&e<=57?2:-1===e?3:44===e||59===e?5:4}function me(e,t,n){if(e.trim()===t.trim())return!0;if(e.length>300&&t.length>300)return!1;const r=(new re).compute(new ce([e],new d.Q(1,1,1,e.length),!1),new ce([t],new d.Q(1,1,1,t.length),!1),n);let i=0;const s=Q.invert(r.diffs,e.length);for(const t of s)t.seq1Range.forEach(t=>{ee(e.charCodeAt(t))||i++});const o=function(t){let n=0;for(let r=0;rt.length?e:t);return i/o>.6&&o>10}function fe(e,t,n){let r=n;return r=ge(e,t,r),r=ge(e,t,r),r=function(e,t,n){if(!e.getBoundaryScore||!t.getBoundaryScore)return n;for(let r=0;r0?n[r-1]:void 0,s=n[r],o=r+10&&(o=o.delta(a))}i.push(o)}return r.length>0&&i.push(r[r.length-1]),i}function be(e,t,n,r,i){let s=1;for(;e.seq1Range.start-s>=r.start&&e.seq2Range.start-s>=i.start&&n.isStronglyEqual(e.seq2Range.start-s,e.seq2Range.endExclusive-s)&&s<100;)s++;s--;let o=0;for(;e.seq1Range.start+ol&&(l=c,a=r)}return e.delta(a)}class ve{constructor(e,t){this.trimmedHash=e,this.lines=t}getElement(e){return this.trimmedHash[e]}get length(){return this.trimmedHash.length}getBoundaryScore(e){return 1e3-((0===e?0:ye(this.lines[e-1]))+(e===this.lines.length?0:ye(this.lines[e])))}getText(e){return this.lines.slice(e.start,e.endExclusive).join("\n")}isStronglyEqual(e,t){return this.lines[e]===this.lines[t]}}function ye(e){let t=0;for(;te===t))return new k([],[],!1);if(1===e.length&&0===e[0].length||1===t.length&&0===t[0].length)return new k([new A(new E.M(1,e.length+1),new E.M(1,t.length+1),[new M(new d.Q(1,1,e.length,e[e.length-1].length+1),new d.Q(1,1,t.length,t[t.length-1].length+1))])],[],!1);const r=0===n.maxComputationTimeMs?Y.instance:new X(n.maxComputationTimeMs),i=!n.ignoreTrimWhitespace,s=new Map;function o(e){let t=s.get(e);return void 0===t&&(t=s.size,s.set(e,t)),t}const a=e.map(e=>o(e.trim())),l=t.map(e=>o(e.trim())),c=new ve(a,e),h=new ve(l,t),u=(()=>c.length+h.length<1700?this.dynamicProgrammingDiffing.compute(c,h,r,(n,r)=>e[n]===t[r]?0===t[r].length?.1:1+Math.log(1+t[r].length):.99):this.myersDiffingAlgorithm.compute(c,h,r))();let p=u.diffs,m=u.hitTimeout;p=fe(c,h,p),p=function(e,t,n){let r=n;if(0===r.length)return r;let i,s=0;do{i=!1;const o=[r[0]];for(let a=1;a5||n.seq1Range.length+n.seq2Range.length>5)}h(c,l)?(i=!0,o[o.length-1]=o[o.length-1].join(l)):o.push(l)}r=o}while(s++<10&&i);return r}(c,0,p);const f=[],g=n=>{if(i)for(let s=0;sn.seq1Range.start-b===n.seq2Range.start-v),g(n.seq1Range.start-b),b=n.seq1Range.endExclusive,v=n.seq2Range.endExclusive;const s=this.refineDiff(e,t,n,r,i);s.hitTimeout&&(m=!0);for(const e of s.mappings)f.push(e)}g(e.length-b);const y=Ce(f,e,t);let w=[];return n.computeMoves&&(w=this.computeMoves(y,e,t,a,l,r,i)),(0,L.Ft)(()=>{function n(e,t){if(e.lineNumber<1||e.lineNumber>t.length)return!1;const n=t[e.lineNumber-1];return!(e.column<1||e.column>n.length+1)}function r(e,t){return!(e.startLineNumber<1||e.startLineNumber>t.length+1||e.endLineNumberExclusive<1||e.endLineNumberExclusive>t.length+1)}for(const i of y){if(!i.innerChanges)return!1;for(const r of i.innerChanges)if(!(n(r.modifiedRange.getStartPosition(),t)&&n(r.modifiedRange.getEndPosition(),t)&&n(r.originalRange.getStartPosition(),e)&&n(r.originalRange.getEndPosition(),e)))return!1;if(!r(i.modified,t)||!r(i.original,e))return!1}return!0}),new k(y,w,m)}computeMoves(e,t,n,r,i,s,o){return function(e,t,n,r,i,s){let{moves:o,excludedChanges:a}=function(e,t,n,r){const i=[],s=e.filter(e=>e.modified.isEmpty&&e.original.length>=3).map(e=>new te(e.original,t,e)),o=new Set(e.filter(e=>e.original.isEmpty&&e.modified.length>=3).map(e=>new te(e.modified,n,e))),a=new Set;for(const e of s){let t,n=-1;for(const r of o){const i=e.computeSimilarity(r);i>n&&(n=i,t=r)}if(n>.9&&t&&(o.delete(t),i.push(new N(e.range,t.range)),a.add(e.source),a.add(t.source)),!r.isValid())return{moves:i,excludedChanges:a}}return{moves:i,excludedChanges:a}}(e,t,n,s);if(!s.isValid())return[];const l=function(e,t,n,r,i,s){const o=[],a=new le.db;for(const n of e)for(let e=n.original.startLineNumber;ee.modified.startLineNumber,H.U9));for(const t of e){let e=[];for(let r=t.modified.startLineNumber;r{for(const n of e)if(n.originalLineRange.endLineNumberExclusive+1===t.endLineNumberExclusive&&n.modifiedLineRange.endLineNumberExclusive+1===i.endLineNumberExclusive)return n.originalLineRange=new E.M(n.originalLineRange.startLineNumber,t.endLineNumberExclusive),n.modifiedLineRange=new E.M(n.modifiedLineRange.startLineNumber,i.endLineNumberExclusive),void s.push(n);const n={modifiedLineRange:i,originalLineRange:t};l.push(n),s.push(n)}),e=s}if(!s.isValid())return[]}l.sort((0,H.Hw)((0,H.VE)(e=>e.modifiedLineRange.length,H.U9)));const c=new E.S,h=new E.S;for(const e of l){const t=e.modifiedLineRange.startLineNumber-e.originalLineRange.startLineNumber,n=c.subtractFrom(e.modifiedLineRange),r=h.subtractFrom(e.originalLineRange).getWithDelta(t),i=n.getIntersection(r);for(const e of i.ranges){if(e.length<3)continue;const n=e,r=e.delta(-t);o.push(new N(r,n)),c.addRange(n),h.addRange(r)}}o.sort((0,H.VE)(e=>e.original.startLineNumber,H.U9));const d=new ae.vJ(e);for(let t=0;te.original.startLineNumber<=n.original.startLineNumber),l=(0,ae.lx)(e,e=>e.modified.startLineNumber<=n.modified.startLineNumber),u=Math.max(n.original.startLineNumber-a.original.startLineNumber,n.modified.startLineNumber-l.modified.startLineNumber),p=d.findLastMonotonous(e=>e.original.startLineNumbere.modified.startLineNumberr.length||t>i.length)break;if(c.contains(t)||h.contains(e))break;if(!me(r[e-1],i[t-1],s))break}for(g>0&&(h.addRange(new E.M(n.original.startLineNumber-g,n.original.startLineNumber)),c.addRange(new E.M(n.modified.startLineNumber-g,n.modified.startLineNumber))),b=0;br.length||t>i.length)break;if(c.contains(t)||h.contains(e))break;if(!me(r[e-1],i[t-1],s))break}b>0&&(h.addRange(new E.M(n.original.endLineNumberExclusive,n.original.endLineNumberExclusive+b)),c.addRange(new E.M(n.modified.endLineNumberExclusive,n.modified.endLineNumberExclusive+b))),(g>0||b>0)&&(o[t]=new N(new E.M(n.original.startLineNumber-g,n.original.endLineNumberExclusive+b),new E.M(n.modified.startLineNumber-g,n.modified.endLineNumberExclusive+b)))}return o}(e.filter(e=>!a.has(e)),r,i,t,n,s);return(0,H.E4)(o,l),o=function(e){if(0===e.length)return e;e.sort((0,H.VE)(e=>e.original.startLineNumber,H.U9));const t=[e[0]];for(let n=1;n=0&&o>=0&&s+o<=2?t[t.length-1]=r.join(i):t.push(i)}return t}(o),o=o.filter(e=>{const n=e.original.toOffsetRange().slice(t).map(e=>e.trim());return n.join("\n").length>=15&&function(e,t){let n=0;for(const r of e)t(r)&&n++;return n}(n,e=>e.length>=2)>=2}),o=function(e,t){const n=new ae.vJ(e);return t.filter(t=>(n.findLastMonotonous(e=>e.original.startLineNumbere.modified.startLineNumber{const r=Ce(this.refineDiff(t,n,new Q(e.original.toOffsetRange(),e.modified.toOffsetRange()),s,o).mappings,t,n,!0);return new x(e,r)})}refineDiff(e,t,n,r,i){var s;const o=(s=n,new N(new E.M(s.seq1Range.start+1,s.seq1Range.endExclusive+1),new E.M(s.seq2Range.start+1,s.seq2Range.endExclusive+1))).toRangeMapping2(e,t),a=new ce(e,o.originalRange,i),l=new ce(t,o.modifiedRange,i),c=a.length+l.length<500?this.dynamicProgrammingDiffing.compute(a,l,r):this.myersDiffingAlgorithm.compute(a,l,r);let h=c.diffs;h=fe(a,l,h),h=function(e,t,n){const r=Q.invert(n,e.length),i=[];let s=new J(0,0);function o(n,o){if(n.offset10;){const n=r[0];if(!n.seq1Range.intersects(c.seq1Range)&&!n.seq2Range.intersects(c.seq2Range))break;const i=e.findWordContaining(n.seq1Range.start),s=t.findWordContaining(n.seq2Range.start),o=new Q(i,s),a=o.intersect(n);if(d+=a.seq1Range.length,u+=a.seq2Range.length,c=c.join(o),!(c.seq1Range.endExclusive>=n.seq1Range.endExclusive))break;r.shift()}d+u<2*(c.seq1Range.length+c.seq2Range.length)/3&&i.push(c),s=c.getEndExclusives()}for(;r.length>0;){const e=r.shift();e.seq1Range.isEmpty||(o(e.getStarts(),e),o(e.getEndExclusives().delta(-1),e))}return function(e,t){const n=[];for(;e.length>0||t.length>0;){const r=e[0],i=t[0];let s;s=r&&(!i||r.seq1Range.start0&&n[n.length-1].seq1Range.endExclusive>=s.seq1Range.start?n[n.length-1]=n[n.length-1].join(s):n.push(s)}return n}(n,i)}(a,l,h),h=function(e,t,n){const r=[];for(const e of n){const t=r[r.length-1];t&&(e.seq1Range.start-t.seq1Range.endExclusive<=2||e.seq2Range.start-t.seq2Range.endExclusive<=2)?r[r.length-1]=new Q(t.seq1Range.join(e.seq1Range),t.seq2Range.join(e.seq2Range)):r.push(e)}return r}(0,0,h),h=function(e,t,n){let r=n;if(0===r.length)return r;let i,s=0;do{i=!1;const a=[r[0]];for(let l=1;l5||i.length>500)return!1;const s=e.getText(i).trim();if(s.length>20||s.split(/\r\n|\r|\n/).length>1)return!1;const o=e.countLinesIn(n.seq1Range),a=n.seq1Range.length,l=t.countLinesIn(n.seq2Range),d=n.seq2Range.length,u=e.countLinesIn(r.seq1Range),p=r.seq1Range.length,m=t.countLinesIn(r.seq2Range),f=r.seq2Range.length;function g(e){return Math.min(e,130)}return Math.pow(Math.pow(g(40*o+a),1.5)+Math.pow(g(40*l+d),1.5),1.5)+Math.pow(Math.pow(g(40*u+p),1.5)+Math.pow(g(40*m+f),1.5),1.5)>74184.96480721243}d(h,c)?(i=!0,a[a.length-1]=a[a.length-1].join(c)):a.push(c)}r=a}while(s++<10&&i);const o=[];return(0,H.kj)(r,(t,n,r)=>{let i=n;function s(e){return e.length>0&&e.trim().length<=3&&n.seq1Range.length+n.seq2Range.length>100}const a=e.extendToFullLines(n.seq1Range),l=e.getText(new I.L(a.start,n.seq1Range.start));s(l)&&(i=i.deltaStart(-l.length));const c=e.getText(new I.L(n.seq1Range.endExclusive,a.endExclusive));s(c)&&(i=i.deltaEnd(c.length));const h=Q.fromOffsetPairs(t?t.getEndExclusives():J.zero,r?r.getStarts():J.max),d=i.intersect(h);o.length>0&&d.getStarts().equals(o[o.length-1].getEndExclusives())?o[o.length-1]=o[o.length-1].join(d):o.push(d)}),o}(a,l,h);return{mappings:h.map(e=>new M(a.translateRange(e.seq1Range),l.translateRange(e.seq2Range))),hitTimeout:c.hitTimeout}}}function Ce(e,t,n,r=!1){const i=[];for(const r of(0,H.n)(e.map(e=>function(e,t,n){let r=0,i=0;1===e.modifiedRange.endColumn&&1===e.originalRange.endColumn&&e.originalRange.startLineNumber+r<=e.originalRange.endLineNumber&&e.modifiedRange.startLineNumber+r<=e.modifiedRange.endLineNumber&&(i=-1),e.modifiedRange.startColumn-1>=n[e.modifiedRange.startLineNumber-1].length&&e.originalRange.startColumn-1>=t[e.originalRange.startLineNumber-1].length&&e.originalRange.startLineNumber<=e.originalRange.endLineNumber+i&&e.modifiedRange.startLineNumber<=e.modifiedRange.endLineNumber+i&&(r=1);const s=new E.M(e.originalRange.startLineNumber+r,e.originalRange.endLineNumber+1+i),o=new E.M(e.modifiedRange.startLineNumber+r,e.modifiedRange.endLineNumber+1+i);return new A(s,o,[e])}(e,t,n)),(e,t)=>e.original.overlapOrTouch(t.original)||e.modified.overlapOrTouch(t.modified))){const e=r[0],t=r[r.length-1];i.push(new A(e.original.join(t.original),e.modified.join(t.modified),r.map(e=>e.innerChanges[0])))}return(0,L.Ft)(()=>{if(!r&&i.length>0){if(i[0].modified.startLineNumber!==i[0].original.startLineNumber)return!1;if(n.length-i[i.length-1].modified.endLineNumberExclusive!==t.length-i[i.length-1].original.endLineNumberExclusive)return!1}return(0,L.Xo)(i,(e,t)=>t.original.startLineNumber-e.original.endLineNumberExclusive===t.modified.startLineNumber-e.modified.endLineNumberExclusive&&e.original.endLineNumberExclusive[e.original.startLineNumber,e.original.endLineNumberExclusive,e.modified.startLineNumber,e.modified.endLineNumberExclusive,e.innerChanges?.map(e=>[e.originalRange.startLineNumber,e.originalRange.startColumn,e.originalRange.endLineNumber,e.originalRange.endColumn,e.modifiedRange.startLineNumber,e.modifiedRange.startColumn,e.modifiedRange.endLineNumber,e.modifiedRange.endColumn])])}return{identical:!(a.changes.length>0)&&this._modelsAreIdentical(e,t),quitEarly:a.hitTimeout,changes:l(a.changes),moves:a.moves.map(e=>[e.lineRangeMapping.original.startLineNumber,e.lineRangeMapping.original.endLineNumberExclusive,e.lineRangeMapping.modified.startLineNumber,e.lineRangeMapping.modified.endLineNumberExclusive,l(e.changes)])}}static _modelsAreIdentical(e,t){const n=e.getLineCount();if(n!==t.getLineCount())return!1;for(let r=1;r<=n;r++)if(e.getLineContent(r)!==t.getLineContent(r))return!1;return!0}static{this._diffLimit=1e5}async $computeMoreMinimalEdits(e,t,n){const r=this._getModel(e);if(!r)return t;const i=[];let s;t=t.slice(0).sort((e,t)=>e.range&&t.range?d.Q.compareRangesUsingStarts(e.range,t.range):(e.range?0:1)-(t.range?0:1));let a=0;for(let e=1;eMe._diffLimit){i.push({range:e,text:a});continue}const c=o(t,a,n),h=r.offsetAt(d.Q.lift(e).getStartPosition());for(const e of c){const t=r.positionAt(h+e.originalStart),n=r.positionAt(h+e.originalStart+e.originalLength),s={text:a.substr(e.modifiedStart,e.modifiedLength),range:{startLineNumber:t.lineNumber,startColumn:t.column,endLineNumber:n.lineNumber,endColumn:n.column}};r.getValueInRange(s.range)!==s.text&&i.push(s)}}return"number"==typeof s&&i.push({eol:s,text:"",range:{startLineNumber:0,startColumn:0,endLineNumber:0,endColumn:0}}),i}async $computeLinks(e){const t=this._getModel(e);return t?function(e){return e&&"function"==typeof e.getLineCount&&"function"==typeof e.getLineContent?b.computeLinks(e):[]}(t):null}async $computeDefaultDocumentColors(e){const t=this._getModel(e);return t?function(e){return e&&"function"==typeof e.getValue&&"function"==typeof e.positionAt?function(e){const t=[],n=Ne(e,/\b(rgb|rgba|hsl|hsla)(\([0-9\s,.\%]*\))|(#)([A-Fa-f0-9]{3})\b|(#)([A-Fa-f0-9]{4})\b|(#)([A-Fa-f0-9]{6})\b|(#)([A-Fa-f0-9]{8})\b/gm);if(n.length>0)for(const r of n){const n=r.filter(e=>void 0!==e),i=n[1],s=n[2];if(!s)continue;let o;if("rgb"===i){const t=/^\(\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*\)$/gm;o=Ie(Fe(e,r),Ne(s,t),!1)}else if("rgba"===i){const t=/^\(\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(0[.][0-9]+|[.][0-9]+|[01][.]|[01])\s*\)$/gm;o=Ie(Fe(e,r),Ne(s,t),!0)}else if("hsl"===i){const t=/^\(\s*(36[0]|3[0-5][0-9]|[12][0-9][0-9]|[1-9]?[0-9])\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*\)$/gm;o=Te(Fe(e,r),Ne(s,t),!1)}else if("hsla"===i){const t=/^\(\s*(36[0]|3[0-5][0-9]|[12][0-9][0-9]|[1-9]?[0-9])\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*,\s*(0[.][0-9]+|[.][0-9]+|[01][.]|[01])\s*\)$/gm;o=Te(Fe(e,r),Ne(s,t),!0)}else"#"===i&&(o=Le(Fe(e,r),i+s));o&&t.push(o)}return t}(e):[]}(t):null}static{this._suggestionsLimit=1e4}async $textualSuggest(e,t,n,r){const i=new C.W,s=new RegExp(n,r),o=new Set;e:for(const n of e){const e=this._getModel(n);if(e)for(const n of e.words(s))if(n!==t&&isNaN(Number(n))&&(o.add(n),o.size>Me._suggestionsLimit))break e}return{words:Array.from(o),duration:i.elapsed()}}async $computeWordRanges(e,t,n,r){const i=this._getModel(e);if(!i)return Object.create(null);const s=new RegExp(n,r),o=Object.create(null);for(let e=t.startLineNumber;ethis._host.$fhr(e,t)),getMirrorModels:()=>this._getModels()};return this._foreignModuleFactory?(this._foreignModule=this._foreignModuleFactory(i,t),Promise.resolve((0,_e.V0)(this._foreignModule))):new Promise((r,s)=>{const o=e=>{this._foreignModule=e.create(i,t),r((0,_e.V0)(this._foreignModule))};{const t=ke.zl.asBrowserUri(`${e}.js`).toString(!0);n(2695)(`${t}`).then(o).catch(s)}})}$fmr(e,t){if(!this._foreignModule||"function"!=typeof this._foreignModule[e])return Promise.reject(new Error("Missing requestHandler or method: "+e));try{return Promise.resolve(this._foreignModule[e].apply(this._foreignModule,t))}catch(e){return Promise.reject(e)}}}function Oe(e){return new Me(w.EditorWorkerHost.getChannel(e),null)}"function"==typeof importScripts&&(globalThis.monaco=(0,y.createMonacoBaseAPI)())},2919:(e,t,n)=>{"use strict";n.r(t),n.d(t,{IEditorWorkerService:()=>r});const r=(0,n(7352).u1)("editorWorkerService")},3035:(e,t,n)=>{"use strict";n.d(t,{YW:()=>I,qg:()=>T});var r=n(2735),i=n(1905),s=n(6303),o=n(9130),a=n(6206),l=n(5603);const c="**",h="/",d="[/\\\\]",u="[^/\\\\]",p=/\//g;function m(e,t){switch(e){case 0:return"";case 1:return`${u}*?`;default:return`(?:${d}|${u}+${d}${t?`|${d}${u}+`:""})*?`}}function f(e,t){if(!e)return[];const n=[];let r=!1,i=!1,s="";for(const o of e){switch(o){case t:if(!r&&!i){n.push(s),s="";continue}break;case"{":r=!0;break;case"}":r=!1;break;case"[":i=!0;break;case"]":i=!1}s+=o}return s&&n.push(s),n}function g(e){if(!e)return"";let t="";const n=f(e,h);if(n.every(e=>e===c))t=".*";else{let e=!1;n.forEach((r,i)=>{if(r===c){if(e)return;t+=m(2,i===n.length-1)}else{let e=!1,s="",o=!1,a="";for(const n of r)if("}"!==n&&e)s+=n;else{if(o&&("]"!==n||!a)){let e;e="-"===n?n:"^"!==n&&"!"!==n||a?n===h?"":(0,l.bm)(n):"^",a+=e;continue}switch(n){case"{":e=!0;continue;case"[":o=!0;continue;case"}":{const n=`(?:${f(s,",").map(e=>g(e)).join("|")})`;t+=n,e=!1,s="";break}case"]":t+="["+a+"]",o=!1,a="";break;case"?":t+=u;continue;case"*":t+=m(1);continue;default:t+=(0,l.bm)(n)}}iE(e,t)).filter(e=>e!==S),e),r=n.length;if(!r)return S;if(1===r)return n[0];const i=function(t,r){for(let i=0,s=n.length;i!!e.allBasenames);s&&(i.allBasenames=s.allBasenames);const o=n.reduce((e,t)=>t.allPaths?e.concat(t.allPaths):e,[]);return o.length&&(i.allPaths=o),i}(n,t):(s=C.exec(F(n,t)))?L(s[1].substr(1),n,!0):(s=_.exec(F(n,t)))?L(s[1],n,!1):function(e){try{const t=new RegExp(`^${g(e)}$`);return function(n){return t.lastIndex=0,"string"==typeof n&&t.test(n)?e:null}}catch(e){return S}}(n),k.set(r,c)),function(e,t){if("string"==typeof t)return e;const n=function(n,r){return(0,i._1)(n,t.base,!a.j9)?e((0,l.NB)(n.substr(t.base.length),o.Vn),r):null};return n.allBasenames=e.allBasenames,n.allPaths=e.allPaths,n.basenames=e.basenames,n.patterns=e.patterns,n}(c,e)}function F(e,t){return t.trimForExclusions&&e.endsWith("/**")?e.substr(0,e.length-2):e}function L(e,t,n){const r=o.Vn===o.SA.sep,i=r?e:e.replace(p,o.Vn),s=o.Vn+i,a=o.SA.sep+e;let l;return l=n?function(n,o){return"string"!=typeof n||n!==i&&!n.endsWith(s)&&(r||n!==e&&!n.endsWith(a))?null:t}:function(n,s){return"string"!=typeof n||n!==i&&(r||n!==e)?null:t},l.allPaths=[(n?"*/":"./")+e],l}function I(e,t,n){return!(!e||"string"!=typeof t)&&T(e)(t,void 0,n)}function T(e,t={}){if(!e)return x;if("string"==typeof e||function(e){const t=e;return!!t&&("string"==typeof t.base&&"string"==typeof t.pattern)}(e)){const n=E(e,t);if(n===S)return x;const r=function(e,t){return!!n(e,t)};return n.allBasenames&&(r.allBasenames=n.allBasenames),n.allPaths&&(r.allPaths=n.allPaths),r}return function(e,t){const n=N(Object.getOwnPropertyNames(e).map(n=>function(e,t,n){if(!1===t)return S;const i=E(e,n);if(i===S)return S;if("boolean"==typeof t)return i;if(t){const n=t.when;if("string"==typeof n){const t=(t,s,o,a)=>{if(!a||!i(t,s))return null;const l=a(n.replace("$(basename)",()=>o));return(0,r.Qg)(l)?l.then(t=>t?e:null):l?e:null};return t.requiresSiblings=!0,t}}return i}(n,e[n],t)).filter(e=>e!==S)),i=n.length;if(!i)return S;if(!n.some(e=>!!e.requiresSiblings)){if(1===i)return n[0];const e=function(e,t){let i;for(let s=0,o=n.length;s{for(const e of i){const t=await e;if("string"==typeof t)return t}return null})():null},t=n.find(e=>!!e.allBasenames);t&&(e.allBasenames=t.allBasenames);const s=n.reduce((e,t)=>t.allPaths?e.concat(t.allPaths):e,[]);return s.length&&(e.allPaths=s),e}const s=function(e,t,i){let s,a;for(let l=0,c=n.length;l{for(const e of a){const t=await e;if("string"==typeof t)return t}return null})():null},a=n.find(e=>!!e.allBasenames);a&&(s.allBasenames=a.allBasenames);const l=n.reduce((e,t)=>t.allPaths?e.concat(t.allPaths):e,[]);return l.length&&(s.allPaths=l),s}(e,t)}function N(e,t){const n=e.filter(e=>!!e.basenames);if(n.length<2)return e;const r=n.reduce((e,t)=>{const n=t.basenames;return n?e.concat(n):e},[]);let i;if(t){i=[];for(let e=0,n=r.length;e{const n=t.patterns;return n?e.concat(n):e},[]);const s=function(e,t){if("string"!=typeof e)return null;if(!t){let n;for(n=e.length;n>0;n--){const t=e.charCodeAt(n-1);if(47===t||92===t)break}t=e.substr(n)}const n=r.indexOf(t);return-1!==n?i[n]:null};s.basenames=r,s.patterns=i,s.allBasenames=r;const o=e.filter(e=>!e.basenames);return o.push(s),o}},3051:(e,t,n)=>{"use strict";n.r(t)},3085:(e,t,n)=>{"use strict";n.r(t),n.d(t,{EditorWorkerHost:()=>r});class r{static{this.CHANNEL_NAME="editorWorkerHost"}static getChannel(e){return e.getChannel(r.CHANNEL_NAME)}static setChannel(e,t){e.setChannel(r.CHANNEL_NAME,t)}}},3142:(e,t,n)=>{"use strict";n.r(t),n.d(t,{SimpleWorkerClient:()=>y,SimpleWorkerServer:()=>_,create:()=>k,logOnceWebWorkerWarning:()=>u});var r=n(1490),i=n(2373),s=n(6274),o=n(4427),a=n(6206),l=n(5603);const c="default",h="$initialize";let d=!1;function u(e){a.HZ&&(d||(d=!0,console.warn("Could not create web worker(s). Falling back to loading web worker code in main thread, which might cause UI freezes. Please see https://github.com/microsoft/monaco-editor#faq")),console.warn(e.message))}class p{constructor(e,t,n,r,i){this.vsWorker=e,this.req=t,this.channel=n,this.method=r,this.args=i,this.type=0}}class m{constructor(e,t,n,r){this.vsWorker=e,this.seq=t,this.res=n,this.err=r,this.type=1}}class f{constructor(e,t,n,r,i){this.vsWorker=e,this.req=t,this.channel=n,this.eventName=r,this.arg=i,this.type=2}}class g{constructor(e,t,n){this.vsWorker=e,this.req=t,this.event=n,this.type=3}}class b{constructor(e,t){this.vsWorker=e,this.req=t,this.type=4}}class v{constructor(e){this._workerId=-1,this._handler=e,this._lastSentReq=0,this._pendingReplies=Object.create(null),this._pendingEmitters=new Map,this._pendingEvents=new Map}setWorkerId(e){this._workerId=e}sendMessage(e,t,n){const r=String(++this._lastSentReq);return new Promise((i,s)=>{this._pendingReplies[r]={resolve:i,reject:s},this._send(new p(this._workerId,r,e,t,n))})}listen(e,t,n){let r=null;const s=new i.vl({onWillAddFirstListener:()=>{r=String(++this._lastSentReq),this._pendingEmitters.set(r,s),this._send(new f(this._workerId,r,e,t,n))},onDidRemoveLastListener:()=>{this._pendingEmitters.delete(r),this._send(new b(this._workerId,r)),r=null}});return s.event}handleMessage(e){e&&e.vsWorker&&(-1!==this._workerId&&e.vsWorker!==this._workerId||this._handleMessage(e))}createProxyToRemoteChannel(e,t){const n={get:(n,r)=>("string"!=typeof r||n[r]||(C(r)?n[r]=t=>this.listen(e,r,t):w(r)?n[r]=this.listen(e,r,void 0):36===r.charCodeAt(0)&&(n[r]=async(...n)=>(await(t?.()),this.sendMessage(e,r,n)))),n[r])};return new Proxy(Object.create(null),n)}_handleMessage(e){switch(e.type){case 1:return this._handleReplyMessage(e);case 0:return this._handleRequestMessage(e);case 2:return this._handleSubscribeEventMessage(e);case 3:return this._handleEventMessage(e);case 4:return this._handleUnsubscribeEventMessage(e)}}_handleReplyMessage(e){if(!this._pendingReplies[e.seq])return void console.warn("Got reply to unknown seq");const t=this._pendingReplies[e.seq];if(delete this._pendingReplies[e.seq],e.err){let n=e.err;return e.err.$isError&&(n=new Error,n.name=e.err.name,n.message=e.err.message,n.stack=e.err.stack),void t.reject(n)}t.resolve(e.res)}_handleRequestMessage(e){const t=e.req;this._handler.handleMessage(e.channel,e.method,e.args).then(e=>{this._send(new m(this._workerId,t,e,void 0))},e=>{e.detail instanceof Error&&(e.detail=(0,r.cU)(e.detail)),this._send(new m(this._workerId,t,void 0,(0,r.cU)(e)))})}_handleSubscribeEventMessage(e){const t=e.req,n=this._handler.handleEvent(e.channel,e.eventName,e.arg)(e=>{this._send(new g(this._workerId,t,e))});this._pendingEvents.set(t,n)}_handleEventMessage(e){this._pendingEmitters.has(e.req)?this._pendingEmitters.get(e.req).fire(e.event):console.warn("Got event for unknown req")}_handleUnsubscribeEventMessage(e){this._pendingEvents.has(e.req)?(this._pendingEvents.get(e.req).dispose(),this._pendingEvents.delete(e.req)):console.warn("Got unsubscribe for unknown req")}_send(e){const t=[];if(0===e.type)for(let n=0;n{this._protocol.handleMessage(e)},e=>{(0,r.dz)(e)})),this._protocol=new v({sendMessage:(e,t)=>{this._worker.postMessage(e,t)},handleMessage:(e,t,n)=>this._handleMessage(e,t,n),handleEvent:(e,t,n)=>this._handleEvent(e,t,n)}),this._protocol.setWorkerId(this._worker.getId());let n=null;const i=globalThis.require;void 0!==i&&"function"==typeof i.getConfig?n=i.getConfig():void 0!==globalThis.requirejs&&(n=globalThis.requirejs.s.contexts._.config),this._onModuleLoaded=this._protocol.sendMessage(c,h,[this._worker.getId(),JSON.parse(JSON.stringify(n)),t.amdModuleId]),this.proxy=this._protocol.createProxyToRemoteChannel(c,async()=>{await this._onModuleLoaded}),this._onModuleLoaded.catch(e=>{this._onError("Worker failed to load "+t.amdModuleId,e)})}_handleMessage(e,t,n){const r=this._localChannels.get(e);if(!r)return Promise.reject(new Error(`Missing channel ${e} on main thread`));if("function"!=typeof r[t])return Promise.reject(new Error(`Missing method ${t} on main thread channel ${e}`));try{return Promise.resolve(r[t].apply(r,n))}catch(e){return Promise.reject(e)}}_handleEvent(e,t,n){const r=this._localChannels.get(e);if(!r)throw new Error(`Missing channel ${e} on main thread`);if(C(t)){const i=r[t].call(r,n);if("function"!=typeof i)throw new Error(`Missing dynamic event ${t} on main thread channel ${e}.`);return i}if(w(t)){const n=r[t];if("function"!=typeof n)throw new Error(`Missing event ${t} on main thread channel ${e}.`);return n}throw new Error(`Malformed event name ${t}`)}setChannel(e,t){this._localChannels.set(e,t)}_onError(e,t){console.error(e),console.info(t)}}function w(e){return"o"===e[0]&&"n"===e[1]&&l.Wv(e.charCodeAt(2))}function C(e){return/^onDynamic/.test(e)&&l.Wv(e.charCodeAt(9))}class _{constructor(e,t){this._localChannels=new Map,this._remoteChannels=new Map,this._requestHandlerFactory=t,this._requestHandler=null,this._protocol=new v({sendMessage:(t,n)=>{e(t,n)},handleMessage:(e,t,n)=>this._handleMessage(e,t,n),handleEvent:(e,t,n)=>this._handleEvent(e,t,n)})}onmessage(e){this._protocol.handleMessage(e)}_handleMessage(e,t,n){if(e===c&&t===h)return this.initialize(n[0],n[1],n[2]);const r=e===c?this._requestHandler:this._localChannels.get(e);if(!r)return Promise.reject(new Error(`Missing channel ${e} on worker thread`));if("function"!=typeof r[t])return Promise.reject(new Error(`Missing method ${t} on worker thread channel ${e}`));try{return Promise.resolve(r[t].apply(r,n))}catch(e){return Promise.reject(e)}}_handleEvent(e,t,n){const r=e===c?this._requestHandler:this._localChannels.get(e);if(!r)throw new Error(`Missing channel ${e} on worker thread`);if(C(t)){const e=r[t].call(r,n);if("function"!=typeof e)throw new Error(`Missing dynamic event ${t} on request handler.`);return e}if(w(t)){const e=r[t];if("function"!=typeof e)throw new Error(`Missing event ${t} on request handler.`);return e}throw new Error(`Malformed event name ${t}`)}getChannel(e){if(!this._remoteChannels.has(e)){const t=this._protocol.createProxyToRemoteChannel(e);this._remoteChannels.set(e,t)}return this._remoteChannels.get(e)}async initialize(e,t,r){if(this._protocol.setWorkerId(e),!this._requestHandlerFactory){t&&(void 0!==t.baseUrl&&delete t.baseUrl,void 0!==t.paths&&void 0!==t.paths.vs&&delete t.paths.vs,void 0!==t.trustedTypesPolicy&&delete t.trustedTypesPolicy,t.catchError=!0,globalThis.require.config(t));{const e=o.zl.asBrowserUri(`${r}.js`).toString(!0);return n(6781)(`${e}`).then(e=>{if(this._requestHandler=e.create(this),!this._requestHandler)throw new Error("No RequestHandler!")})}}this._requestHandler=this._requestHandlerFactory(this)}}function k(e){return new _(e,null)}},3182:(e,t,n)=>{"use strict";n.r(t),n.d(t,{ISemanticTokensStylingService:()=>r});const r=(0,n(7352).u1)("semanticTokensStylingService")},3298:(e,t,n)=>{"use strict";function r(e,t){const n=Math.pow(10,t);return Math.round(e*n)/n}n.d(t,{Q1:()=>a,bU:()=>i,hB:()=>s});class i{constructor(e,t,n,i=1){this._rgbaBrand=void 0,this.r=0|Math.min(255,Math.max(0,e)),this.g=0|Math.min(255,Math.max(0,t)),this.b=0|Math.min(255,Math.max(0,n)),this.a=r(Math.max(Math.min(1,i),0),3)}static equals(e,t){return e.r===t.r&&e.g===t.g&&e.b===t.b&&e.a===t.a}}class s{constructor(e,t,n,i){this._hslaBrand=void 0,this.h=0|Math.max(Math.min(360,e),0),this.s=r(Math.max(Math.min(1,t),0),3),this.l=r(Math.max(Math.min(1,n),0),3),this.a=r(Math.max(Math.min(1,i),0),3)}static equals(e,t){return e.h===t.h&&e.s===t.s&&e.l===t.l&&e.a===t.a}static fromRGBA(e){const t=e.r/255,n=e.g/255,r=e.b/255,i=e.a,o=Math.max(t,n,r),a=Math.min(t,n,r);let l=0,c=0;const h=(a+o)/2,d=o-a;if(d>0){switch(c=Math.min(h<=.5?d/(2*h):d/(2-2*h),1),o){case t:l=(n-r)/d+(n1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}static toRGBA(e){const t=e.h/360,{s:n,l:r,a:o}=e;let a,l,c;if(0===n)a=l=c=r;else{const e=r<.5?r*(1+n):r+n-r*n,i=2*r-e;a=s._hue2rgb(i,e,t+1/3),l=s._hue2rgb(i,e,t),c=s._hue2rgb(i,e,t-1/3)}return new i(Math.round(255*a),Math.round(255*l),Math.round(255*c),o)}}class o{constructor(e,t,n,i){this._hsvaBrand=void 0,this.h=0|Math.max(Math.min(360,e),0),this.s=r(Math.max(Math.min(1,t),0),3),this.v=r(Math.max(Math.min(1,n),0),3),this.a=r(Math.max(Math.min(1,i),0),3)}static equals(e,t){return e.h===t.h&&e.s===t.s&&e.v===t.v&&e.a===t.a}static fromRGBA(e){const t=e.r/255,n=e.g/255,r=e.b/255,i=Math.max(t,n,r),s=i-Math.min(t,n,r),a=0===i?0:s/i;let l;return l=0===s?0:i===t?((n-r)/s%6+6)%6:i===n?(r-t)/s+2:(t-n)/s+4,new o(Math.round(60*l),a,i,e.a)}static toRGBA(e){const{h:t,s:n,v:r,a:s}=e,o=r*n,a=o*(1-Math.abs(t/60%2-1)),l=r-o;let[c,h,d]=[0,0,0];return t<60?(c=o,h=a):t<120?(c=a,h=o):t<180?(h=o,d=a):t<240?(h=a,d=o):t<300?(c=a,d=o):t<=360&&(c=o,d=a),c=Math.round(255*(c+l)),h=Math.round(255*(h+l)),d=Math.round(255*(d+l)),new i(c,h,d,s)}}class a{static fromHex(e){return a.Format.CSS.parseHex(e)||a.red}static equals(e,t){return!e&&!t||!(!e||!t)&&e.equals(t)}get hsla(){return this._hsla?this._hsla:s.fromRGBA(this.rgba)}get hsva(){return this._hsva?this._hsva:o.fromRGBA(this.rgba)}constructor(e){if(!e)throw new Error("Color needs a value");if(e instanceof i)this.rgba=e;else if(e instanceof s)this._hsla=e,this.rgba=s.toRGBA(e);else{if(!(e instanceof o))throw new Error("Invalid color ctor argument");this._hsva=e,this.rgba=o.toRGBA(e)}}equals(e){return!!e&&i.equals(this.rgba,e.rgba)&&s.equals(this.hsla,e.hsla)&&o.equals(this.hsva,e.hsva)}getRelativeLuminance(){return r(.2126*a._relativeLuminanceForComponent(this.rgba.r)+.7152*a._relativeLuminanceForComponent(this.rgba.g)+.0722*a._relativeLuminanceForComponent(this.rgba.b),4)}static _relativeLuminanceForComponent(e){const t=e/255;return t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4)}isLighter(){return(299*this.rgba.r+587*this.rgba.g+114*this.rgba.b)/1e3>=128}isLighterThan(e){return this.getRelativeLuminance()>e.getRelativeLuminance()}isDarkerThan(e){return this.getRelativeLuminance(){"use strict";n.d(t,{W:()=>s});var r=n(8274),i=n(800);class s{static{this.zero=new s(0,0)}static betweenPositions(e,t){return e.lineNumber===t.lineNumber?new s(0,t.column-e.column):new s(t.lineNumber-e.lineNumber,t.column-1)}static ofRange(e){return s.betweenPositions(e.getStartPosition(),e.getEndPosition())}static ofText(e){let t=0,n=0;for(const r of e)"\n"===r?(t++,n=0):n++;return new s(t,n)}constructor(e,t){this.lineCount=e,this.columnCount=t}isGreaterThanOrEqualTo(e){return this.lineCount!==e.lineCount?this.lineCount>e.lineCount:this.columnCount>=e.columnCount}createRange(e){return 0===this.lineCount?new i.Q(e.lineNumber,e.column,e.lineNumber,e.column+this.columnCount):new i.Q(e.lineNumber,e.column,e.lineNumber+this.lineCount,this.columnCount+1)}addToPosition(e){return 0===this.lineCount?new r.y(e.lineNumber,e.column+this.columnCount):new r.y(e.lineNumber+this.lineCount,this.columnCount+1)}toString(){return`${this.lineCount},${this.columnCount}`}}},3793:(e,t,n)=>{"use strict";n.d(t,{K:()=>r});const r=Object.freeze({text:"text/plain",binary:"application/octet-stream",unknown:"application/unknown",markdown:"text/markdown",latex:"text/latex",uriList:"text/uri-list"})},3958:(e,t,n)=>{"use strict";n.d(t,{W:()=>i});const r=globalThis.performance&&"function"==typeof globalThis.performance.now;class i{static create(e){return new i(e)}constructor(e){this._now=r&&!1===e?Date.now:globalThis.performance.now.bind(globalThis.performance),this._startTime=this._now(),this._stopTime=-1}stop(){this._stopTime=this._now()}reset(){this._startTime=this._now(),this._stopTime=-1}elapsed(){return-1!==this._stopTime?this._stopTime-this._startTime:this._now()-this._startTime}}},4086:(e,t,n)=>{"use strict";n.d(t,{W6:()=>l,vH:()=>c});var r=n(7703),i=n(2373),s=n(5352),o=n(3793),a=n(4709);const l=new class{constructor(){this._onDidChangeLanguages=new i.vl,this.onDidChangeLanguages=this._onDidChangeLanguages.event,this._languages=[]}registerLanguage(e){return this._languages.push(e),this._onDidChangeLanguages.fire(void 0),{dispose:()=>{for(let t=0,n=this._languages.length;t{"use strict";n.d(t,{ny:()=>r,v$:()=>c,zl:()=>u});var r,i=n(1490),s=n(6206),o=n(5603),a=n(695),l=n(9130);function c(e,t){return a.r.isUri(e)?(0,o.Q_)(e.scheme,t):(0,o.ns)(e,t+":")}!function(e){e.inMemory="inmemory",e.vscode="vscode",e.internal="private",e.walkThrough="walkThrough",e.walkThroughSnippet="walkThroughSnippet",e.http="http",e.https="https",e.file="file",e.mailto="mailto",e.untitled="untitled",e.data="data",e.command="command",e.vscodeRemote="vscode-remote",e.vscodeRemoteResource="vscode-remote-resource",e.vscodeManagedRemoteResource="vscode-managed-remote-resource",e.vscodeUserData="vscode-userdata",e.vscodeCustomEditor="vscode-custom-editor",e.vscodeNotebookCell="vscode-notebook-cell",e.vscodeNotebookCellMetadata="vscode-notebook-cell-metadata",e.vscodeNotebookCellMetadataDiff="vscode-notebook-cell-metadata-diff",e.vscodeNotebookCellOutput="vscode-notebook-cell-output",e.vscodeNotebookCellOutputDiff="vscode-notebook-cell-output-diff",e.vscodeNotebookMetadata="vscode-notebook-metadata",e.vscodeInteractiveInput="vscode-interactive-input",e.vscodeSettings="vscode-settings",e.vscodeWorkspaceTrust="vscode-workspace-trust",e.vscodeTerminal="vscode-terminal",e.vscodeChatCodeBlock="vscode-chat-code-block",e.vscodeChatCodeCompareBlock="vscode-chat-code-compare-block",e.vscodeChatSesssion="vscode-chat-editor",e.webviewPanel="webview-panel",e.vscodeWebview="vscode-webview",e.extension="extension",e.vscodeFileResource="vscode-file",e.tmp="tmp",e.vsls="vsls",e.vscodeSourceControl="vscode-scm",e.commentsInput="comment",e.codeSetting="code-setting",e.outputChannel="output"}(r||(r={}));const h=new class{constructor(){this._hosts=Object.create(null),this._ports=Object.create(null),this._connectionTokens=Object.create(null),this._preferredWebSchema="http",this._delegate=null,this._serverRootPath="/"}setPreferredWebSchema(e){this._preferredWebSchema=e}get _remoteResourcesPath(){return l.SA.join(this._serverRootPath,r.vscodeRemoteResource)}rewrite(e){if(this._delegate)try{return this._delegate(e)}catch(t){return i.dz(t),e}const t=e.authority;let n=this._hosts[t];n&&-1!==n.indexOf(":")&&-1===n.indexOf("[")&&(n=`[${n}]`);const o=this._ports[t],l=this._connectionTokens[t];let c=`path=${encodeURIComponent(e.path)}`;return"string"==typeof l&&(c+=`&tkn=${encodeURIComponent(l)}`),a.r.from({scheme:s.HZ?this._preferredWebSchema:r.vscodeRemoteResource,authority:`${n}:${o}`,path:this._remoteResourcesPath,query:c})}};class d{static{this.FALLBACK_AUTHORITY="vscode-app"}asBrowserUri(e){const t=this.toUri(e);return this.uriToBrowserUri(t)}uriToBrowserUri(e){return e.scheme===r.vscodeRemote?h.rewrite(e):e.scheme!==r.file||!s.ib&&s.lg!==`${r.vscodeFileResource}://${d.FALLBACK_AUTHORITY}`?e:e.with({scheme:r.vscodeFileResource,authority:e.authority||d.FALLBACK_AUTHORITY,query:null,fragment:null})}toUri(e,t){if(a.r.isUri(e))return e;if(globalThis._VSCODE_FILE_ROOT){const t=globalThis._VSCODE_FILE_ROOT;if(/^\w[\w\d+.-]*:\/\//.test(t))return a.r.joinPath(a.r.parse(t,!0),e);const n=l.fj(t,e);return a.r.file(n)}return a.r.parse(t.toUrl(e))}}const u=new d;var p;!function(e){const t=new Map([["1",{"Cross-Origin-Opener-Policy":"same-origin"}],["2",{"Cross-Origin-Embedder-Policy":"require-corp"}],["3",{"Cross-Origin-Opener-Policy":"same-origin","Cross-Origin-Embedder-Policy":"require-corp"}]]);e.CoopAndCoep=Object.freeze(t.get("3"));const n="vscode-coi";e.getHeadersFromQuery=function(e){let r;"string"==typeof e?r=new URL(e).searchParams:e instanceof URL?r=e.searchParams:a.r.isUri(e)&&(r=new URL(e.toString(!0)).searchParams);const i=r?.get(n);if(i)return t.get(i)},e.addSearchParam=function(e,t,r){if(!globalThis.crossOriginIsolated)return;const i=t&&r?"3":r?"2":"1";e instanceof URLSearchParams?e.set(n,i):e[n]=i}}(p||(p={}))},4709:(e,t,n)=>{"use strict";n.d(t,{Fd:()=>h});var r=n(1211),i=n(2373),s=n(2548),o=n(7703),a=n(802),l=n(809),c=n(5352);const h={Configuration:"base.contributions.configuration"},d={properties:{},patternProperties:{}},u={properties:{},patternProperties:{}},p={properties:{},patternProperties:{}},m={properties:{},patternProperties:{}},f={properties:{},patternProperties:{}},g={properties:{},patternProperties:{}},b="vscode://schemas/settings/resourceLanguage",v=c.O.as(l.F.JSONContribution),y="\\[([^\\]]+)\\]",w=new RegExp(y,"g"),C=`^(${y})+$`,_=new RegExp(C);function k(e){const t=[];if(_.test(e)){let n=w.exec(e);for(;n?.length;){const r=n[1].trim();r&&t.push(r),n=w.exec(e)}}return(0,r.dM)(t)}const x=new class{constructor(){this.registeredConfigurationDefaults=[],this.overrideIdentifiers=new Set,this._onDidSchemaChange=new i.vl,this._onDidUpdateConfiguration=new i.vl,this.configurationDefaultsOverrides=new Map,this.defaultLanguageConfigurationOverridesNode={id:"defaultOverrides",title:o.kg("vs/platform/configuration/common/configurationRegistry","defaultLanguageConfigurationOverrides.title","Default Language Configuration Overrides"),properties:{}},this.configurationContributors=[this.defaultLanguageConfigurationOverridesNode],this.resourceLanguageSettingsSchema={properties:{},patternProperties:{},additionalProperties:!0,allowTrailingCommas:!0,allowComments:!0},this.configurationProperties={},this.policyConfigurations=new Map,this.excludedConfigurationProperties={},v.registerSchema(b,this.resourceLanguageSettingsSchema),this.registerOverridePropertyPatternKey()}registerConfiguration(e,t=!0){this.registerConfigurations([e],t)}registerConfigurations(e,t=!0){const n=new Set;this.doRegisterConfigurations(e,t,n),v.registerSchema(b,this.resourceLanguageSettingsSchema),this._onDidSchemaChange.fire(),this._onDidUpdateConfiguration.fire({properties:n})}registerDefaultConfigurations(e){const t=new Set;this.doRegisterDefaultConfigurations(e,t),this._onDidSchemaChange.fire(),this._onDidUpdateConfiguration.fire({properties:t,defaultsOverrides:!0})}doRegisterDefaultConfigurations(e,t){this.registeredConfigurationDefaults.push(...e);const n=[];for(const{overrides:r,source:i}of e)for(const e in r){t.add(e);const s=this.configurationDefaultsOverrides.get(e)??this.configurationDefaultsOverrides.set(e,{configurationDefaultOverrides:[]}).get(e),o=r[e];if(s.configurationDefaultOverrides.push({value:o,source:i}),_.test(e)){const t=this.mergeDefaultConfigurationsForOverrideIdentifier(e,o,i,s.configurationDefaultOverrideValue);if(!t)continue;s.configurationDefaultOverrideValue=t,this.updateDefaultOverrideProperty(e,t,i),n.push(...k(e))}else{const t=this.mergeDefaultConfigurationsForConfigurationProperty(e,o,i,s.configurationDefaultOverrideValue);if(!t)continue;s.configurationDefaultOverrideValue=t;const n=this.configurationProperties[e];n&&(this.updatePropertyDefaultValue(e,n),this.updateSchema(e,n))}}this.doRegisterOverrideIdentifiers(n)}updateDefaultOverrideProperty(e,t,n){const r={type:"object",default:t.value,description:o.kg("vs/platform/configuration/common/configurationRegistry","defaultLanguageConfiguration.description","Configure settings to be overridden for the {0} language.",(0,a.Mo)(e)),$ref:b,defaultDefaultValue:t.value,source:n,defaultValueSource:n};this.configurationProperties[e]=r,this.defaultLanguageConfigurationOverridesNode.properties[e]=r}mergeDefaultConfigurationsForOverrideIdentifier(e,t,n,r){const i=r?.value||{},o=r?.source??new Map;if(o instanceof Map){for(const e of Object.keys(t)){const r=t[e];if(s.Gv(r)&&(s.b0(i[e])||s.Gv(i[e]))){if(i[e]={...i[e]??{},...r},n)for(const t in r)o.set(`${e}.${t}`,n)}else i[e]=r,n?o.set(e,n):o.delete(e)}return{value:i,source:o}}console.error("objectConfigurationSources is not a Map")}mergeDefaultConfigurationsForConfigurationProperty(e,t,n,r){const i=this.configurationProperties[e],o=r?.value??i?.defaultDefaultValue;let a=n;if(s.Gv(t)&&(void 0!==i&&"object"===i.type||void 0===i&&(s.b0(o)||s.Gv(o)))){if(a=r?.source??new Map,!(a instanceof Map))return void console.error("defaultValueSource is not a Map");for(const r in t)n&&a.set(`${e}.${r}`,n);t={...s.Gv(o)?o:{},...t}}return{value:t,source:a}}registerOverrideIdentifiers(e){this.doRegisterOverrideIdentifiers(e),this._onDidSchemaChange.fire()}doRegisterOverrideIdentifiers(e){for(const t of e)this.overrideIdentifiers.add(t);this.updateOverridePropertyPatternKey()}doRegisterConfigurations(e,t,n){e.forEach(e=>{this.validateAndRegisterProperties(e,t,e.extensionInfo,e.restrictedProperties,void 0,n),this.configurationContributors.push(e),this.registerJSONConfiguration(e)})}validateAndRegisterProperties(e,t=!0,n,r,i=3,o){i=s.z(e.scope)?i:e.scope;const a=e.properties;if(a)for(const e in a){const l=a[e];t&&S(e,l)?delete a[e]:(l.source=n,l.defaultDefaultValue=a[e].default,this.updatePropertyDefaultValue(e,l),_.test(e)?l.scope=void 0:(l.scope=s.z(l.scope)?i:l.scope,l.restricted=s.z(l.restricted)?!!r?.includes(e):l.restricted),!a[e].hasOwnProperty("included")||a[e].included?(this.configurationProperties[e]=a[e],a[e].policy?.name&&this.policyConfigurations.set(a[e].policy.name,e),!a[e].deprecationMessage&&a[e].markdownDeprecationMessage&&(a[e].deprecationMessage=a[e].markdownDeprecationMessage),o.add(e)):(this.excludedConfigurationProperties[e]=a[e],delete a[e]))}const l=e.allOf;if(l)for(const e of l)this.validateAndRegisterProperties(e,t,n,r,i,o)}getConfigurationProperties(){return this.configurationProperties}getPolicyConfigurations(){return this.policyConfigurations}registerJSONConfiguration(e){const t=e=>{const n=e.properties;if(n)for(const e in n)this.updateSchema(e,n[e]);const r=e.allOf;r?.forEach(t)};t(e)}updateSchema(e,t){switch(d.properties[e]=t,t.scope){case 1:u.properties[e]=t;break;case 2:p.properties[e]=t;break;case 6:m.properties[e]=t;break;case 3:f.properties[e]=t;break;case 4:g.properties[e]=t;break;case 5:g.properties[e]=t,this.resourceLanguageSettingsSchema.properties[e]=t}}updateOverridePropertyPatternKey(){for(const e of this.overrideIdentifiers.values()){const t=`[${e}]`,n={type:"object",description:o.kg("vs/platform/configuration/common/configurationRegistry","overrideSettings.defaultDescription","Configure editor settings to be overridden for a language."),errorMessage:o.kg("vs/platform/configuration/common/configurationRegistry","overrideSettings.errorMessage","This setting does not support per-language configuration."),$ref:b};this.updatePropertyDefaultValue(t,n),d.properties[t]=n,u.properties[t]=n,p.properties[t]=n,m.properties[t]=n,f.properties[t]=n,g.properties[t]=n}}registerOverridePropertyPatternKey(){const e={type:"object",description:o.kg("vs/platform/configuration/common/configurationRegistry","overrideSettings.defaultDescription","Configure editor settings to be overridden for a language."),errorMessage:o.kg("vs/platform/configuration/common/configurationRegistry","overrideSettings.errorMessage","This setting does not support per-language configuration."),$ref:b};d.patternProperties[C]=e,u.patternProperties[C]=e,p.patternProperties[C]=e,m.patternProperties[C]=e,f.patternProperties[C]=e,g.patternProperties[C]=e,this._onDidSchemaChange.fire()}updatePropertyDefaultValue(e,t){const n=this.configurationDefaultsOverrides.get(e)?.configurationDefaultOverrideValue;let r,i;!n||t.disallowConfigurationDefault&&n.source||(r=n.value,i=n.source),s.b0(r)&&(r=t.defaultDefaultValue,i=void 0),s.b0(r)&&(r=function(e){switch(Array.isArray(e)?e[0]:e){case"boolean":return!1;case"integer":case"number":return 0;case"string":return"";case"array":return[];case"object":return{};default:return null}}(t.type)),t.default=r,t.defaultValueSource=i}};function S(e,t){return e.trim()?_.test(e)?o.kg("vs/platform/configuration/common/configurationRegistry","config.property.languageDefault","Cannot register '{0}'. This matches property pattern '\\\\[.*\\\\]$' for describing language specific editor settings. Use 'configurationDefaults' contribution.",e):void 0!==x.getConfigurationProperties()[e]?o.kg("vs/platform/configuration/common/configurationRegistry","config.property.duplicate","Cannot register '{0}'. This property is already registered.",e):t.policy?.name&&void 0!==x.getPolicyConfigurations().get(t.policy?.name)?o.kg("vs/platform/configuration/common/configurationRegistry","config.policy.duplicate","Cannot register '{0}'. The associated policy {1} is already registered with {2}.",e,t.policy?.name,x.getPolicyConfigurations().get(t.policy?.name)):null:o.kg("vs/platform/configuration/common/configurationRegistry","config.property.empty","Cannot register an empty property")}c.O.add(h.Configuration,x)},4756:(e,t,n)=>{"use strict";n.d(t,{buw:()=>S,b1q:()=>x,YtV:()=>N,Ubg:()=>U,IIb:()=>W,pOz:()=>B,whs:()=>O,Stt:()=>P,Hng:()=>z,yLC:()=>le,KoI:()=>oe,uMG:()=>ae,x1A:()=>d});var r=n(867),i=n(2735),s=n(3298),o=n(2373),a=n(809),l=n(5352),c=n(7703);const h=new class{constructor(){this._onDidChangeSchema=new o.vl,this.onDidChangeSchema=this._onDidChangeSchema.event,this.colorSchema={type:"object",properties:{}},this.colorReferenceSchema={type:"string",enum:[],enumDescriptions:[]},this.colorsById={}}registerColor(e,t,n,r=!1,i){const s={id:e,description:n,defaults:t,needsTransparency:r,deprecationMessage:i};this.colorsById[e]=s;const o={type:"string",format:"color-hex",defaultSnippets:[{body:"${1:#ff0000}"}]};return i&&(o.deprecationMessage=i),r&&(o.pattern="^#(?:(?[0-9a-fA-f]{3}[0-9a-eA-E])|(?:[0-9a-fA-F]{6}(?:(?![fF]{2})(?:[0-9a-fA-F]{2}))))?$",o.patternErrorMessage=c.kg("vs/platform/theme/common/colorUtils","transparecyRequired","This color must be transparent or it will obscure content")),this.colorSchema.properties[e]={description:n,oneOf:[o,{type:"string",const:"default",description:c.kg("vs/platform/theme/common/colorUtils","useDefault","Use the default color.")}]},this.colorReferenceSchema.enum.push(e),this.colorReferenceSchema.enumDescriptions.push(n),this._onDidChangeSchema.fire(),e}getColors(){return Object.keys(this.colorsById).map(e=>this.colorsById[e])}resolveDefaultColor(e,t){const n=this.colorsById[e];if(n?.defaults)return b(null!==(r=n.defaults)&&"object"==typeof r&&"light"in r&&"dark"in r?n.defaults[t.type]:n.defaults,t);var r}getColorSchema(){return this.colorSchema}toString(){return Object.keys(this.colorsById).sort((e,t)=>{const n=-1===e.indexOf(".")?0:1,r=-1===t.indexOf(".")?0:1;return n!==r?n-r:e.localeCompare(t)}).map(e=>`- \`${e}\`: ${this.colorsById[e].description}`).join("\n")}};function d(e,t,n,r,i){return h.registerColor(e,t,n,r,i)}function u(e,t){return{op:0,value:e,factor:t}}function p(e,t){return{op:1,value:e,factor:t}}function m(e,t){return{op:2,value:e,factor:t}}function f(...e){return{op:4,values:e}}function g(e,t,n,r){return{op:5,value:e,background:t,factor:n,transparency:r}}function b(e,t){if(null!==e)return"string"==typeof e?"#"===e[0]?s.Q1.fromHex(e):t.getColor(e):e instanceof s.Q1?e:"object"==typeof e?function(e,t){switch(e.op){case 0:return b(e.value,t)?.darken(e.factor);case 1:return b(e.value,t)?.lighten(e.factor);case 2:return b(e.value,t)?.transparent(e.factor);case 3:{const n=b(e.background,t);return n?b(e.value,t)?.makeOpaque(n):b(e.value,t)}case 4:for(const n of e.values){const e=b(n,t);if(e)return e}return;case 6:return b(t.defines(e.if)?e.then:e.else,t);case 5:{const n=b(e.value,t);if(!n)return;const r=b(e.background,t);return r?n.isDarkerThan(r)?s.Q1.getLighterColor(n,r,e.factor).transparent(e.transparency):s.Q1.getDarkerColor(n,r,e.factor).transparent(e.transparency):n.transparent(e.factor*e.transparency)}default:throw(0,r.xb)(e)}}(e,t):void 0}l.O.add("base.contributions.colors",h);const v="vscode://schemas/workbench-colors",y=l.O.as(a.F.JSONContribution);y.registerSchema(v,h.getColorSchema());const w=new i.uC(()=>y.notifySchemaChanged(v),200);h.onDidChangeSchema(()=>{w.isScheduled()||w.schedule()});const C=d("foreground",{dark:"#CCCCCC",light:"#616161",hcDark:"#FFFFFF",hcLight:"#292929"},c.kg("vs/platform/theme/common/colors/baseColors","foreground","Overall foreground color. This color is only used if not overridden by a component.")),_=(d("disabledForeground",{dark:"#CCCCCC80",light:"#61616180",hcDark:"#A5A5A5",hcLight:"#7F7F7F"},c.kg("vs/platform/theme/common/colors/baseColors","disabledForeground","Overall foreground for disabled elements. This color is only used if not overridden by a component.")),d("errorForeground",{dark:"#F48771",light:"#A1260D",hcDark:"#F48771",hcLight:"#B5200D"},c.kg("vs/platform/theme/common/colors/baseColors","errorForeground","Overall foreground color for error messages. This color is only used if not overridden by a component.")),d("descriptionForeground",{light:"#717171",dark:m(C,.7),hcDark:m(C,.7),hcLight:m(C,.7)},c.kg("vs/platform/theme/common/colors/baseColors","descriptionForeground","Foreground color for description text providing additional information, for example for a label.")),d("icon.foreground",{dark:"#C5C5C5",light:"#424242",hcDark:"#FFFFFF",hcLight:"#292929"},c.kg("vs/platform/theme/common/colors/baseColors","iconForeground","The default color for icons in the workbench."))),k=d("focusBorder",{dark:"#007FD4",light:"#0090F1",hcDark:"#F38518",hcLight:"#006BBD"},c.kg("vs/platform/theme/common/colors/baseColors","focusBorder","Overall border color for focused elements. This color is only used if not overridden by a component.")),x=d("contrastBorder",{light:null,dark:null,hcDark:"#6FC3DF",hcLight:"#0F4A85"},c.kg("vs/platform/theme/common/colors/baseColors","contrastBorder","An extra border around elements to separate them from others for greater contrast.")),S=d("contrastActiveBorder",{light:null,dark:null,hcDark:k,hcLight:k},c.kg("vs/platform/theme/common/colors/baseColors","activeContrastBorder","An extra border around active elements to separate them from others for greater contrast.")),E=(d("selection.background",null,c.kg("vs/platform/theme/common/colors/baseColors","selectionBackground","The background color of text selections in the workbench (e.g. for input fields or text areas). Note that this does not apply to selections within the editor.")),d("textLink.foreground",{light:"#006AB1",dark:"#3794FF",hcDark:"#21A6FF",hcLight:"#0F4A85"},c.kg("vs/platform/theme/common/colors/baseColors","textLinkForeground","Foreground color for links in text.")),d("textLink.activeForeground",{light:"#006AB1",dark:"#3794FF",hcDark:"#21A6FF",hcLight:"#0F4A85"},c.kg("vs/platform/theme/common/colors/baseColors","textLinkActiveForeground","Foreground color for links in text when clicked on and on mouse hover.")),d("textSeparator.foreground",{light:"#0000002e",dark:"#ffffff2e",hcDark:s.Q1.black,hcLight:"#292929"},c.kg("vs/platform/theme/common/colors/baseColors","textSeparatorForeground","Color for text separators.")),d("textPreformat.foreground",{light:"#A31515",dark:"#D7BA7D",hcDark:"#000000",hcLight:"#FFFFFF"},c.kg("vs/platform/theme/common/colors/baseColors","textPreformatForeground","Foreground color for preformatted text segments.")),d("textPreformat.background",{light:"#0000001A",dark:"#FFFFFF1A",hcDark:"#FFFFFF",hcLight:"#09345f"},c.kg("vs/platform/theme/common/colors/baseColors","textPreformatBackground","Background color for preformatted text segments.")),d("textBlockQuote.background",{light:"#f2f2f2",dark:"#222222",hcDark:null,hcLight:"#F2F2F2"},c.kg("vs/platform/theme/common/colors/baseColors","textBlockQuoteBackground","Background color for block quotes in text.")),d("textBlockQuote.border",{light:"#007acc80",dark:"#007acc80",hcDark:s.Q1.white,hcLight:"#292929"},c.kg("vs/platform/theme/common/colors/baseColors","textBlockQuoteBorder","Border color for block quotes in text.")),d("textCodeBlock.background",{light:"#dcdcdc66",dark:"#0a0a0a66",hcDark:s.Q1.black,hcLight:"#F2F2F2"},c.kg("vs/platform/theme/common/colors/baseColors","textCodeBlockBackground","Background color for code blocks in text.")),d("sash.hoverBorder",k,c.kg("vs/platform/theme/common/colors/miscColors","sashActiveBorder","Border color of active sashes.")),d("badge.background",{dark:"#4D4D4D",light:"#C4C4C4",hcDark:s.Q1.black,hcLight:"#0F4A85"},c.kg("vs/platform/theme/common/colors/miscColors","badgeBackground","Badge background color. Badges are small information labels, e.g. for search results count."))),F=(d("badge.foreground",{dark:s.Q1.white,light:"#333",hcDark:s.Q1.white,hcLight:s.Q1.white},c.kg("vs/platform/theme/common/colors/miscColors","badgeForeground","Badge foreground color. Badges are small information labels, e.g. for search results count.")),d("scrollbar.shadow",{dark:"#000000",light:"#DDDDDD",hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/miscColors","scrollbarShadow","Scrollbar shadow to indicate that the view is scrolled."))),L=d("scrollbarSlider.background",{dark:s.Q1.fromHex("#797979").transparent(.4),light:s.Q1.fromHex("#646464").transparent(.4),hcDark:m(x,.6),hcLight:m(x,.4)},c.kg("vs/platform/theme/common/colors/miscColors","scrollbarSliderBackground","Scrollbar slider background color.")),I=d("scrollbarSlider.hoverBackground",{dark:s.Q1.fromHex("#646464").transparent(.7),light:s.Q1.fromHex("#646464").transparent(.7),hcDark:m(x,.8),hcLight:m(x,.8)},c.kg("vs/platform/theme/common/colors/miscColors","scrollbarSliderHoverBackground","Scrollbar slider background color when hovering.")),T=d("scrollbarSlider.activeBackground",{dark:s.Q1.fromHex("#BFBFBF").transparent(.4),light:s.Q1.fromHex("#000000").transparent(.6),hcDark:x,hcLight:x},c.kg("vs/platform/theme/common/colors/miscColors","scrollbarSliderActiveBackground","Scrollbar slider background color when clicked on.")),N=(d("progressBar.background",{dark:s.Q1.fromHex("#0E70C0"),light:s.Q1.fromHex("#0E70C0"),hcDark:x,hcLight:x},c.kg("vs/platform/theme/common/colors/miscColors","progressBarBackground","Background color of the progress bar that can show for long running operations.")),d("editor.background",{light:"#ffffff",dark:"#1E1E1E",hcDark:s.Q1.black,hcLight:s.Q1.white},c.kg("vs/platform/theme/common/colors/editorColors","editorBackground","Editor background color."))),R=(d("editor.foreground",{light:"#333333",dark:"#BBBBBB",hcDark:s.Q1.white,hcLight:C},c.kg("vs/platform/theme/common/colors/editorColors","editorForeground","Editor default foreground color.")),d("editorStickyScroll.background",N,c.kg("vs/platform/theme/common/colors/editorColors","editorStickyScrollBackground","Background color of sticky scroll in the editor")),d("editorStickyScrollHover.background",{dark:"#2A2D2E",light:"#F0F0F0",hcDark:null,hcLight:s.Q1.fromHex("#0F4A85").transparent(.1)},c.kg("vs/platform/theme/common/colors/editorColors","editorStickyScrollHoverBackground","Background color of sticky scroll on hover in the editor")),d("editorStickyScroll.border",{dark:null,light:null,hcDark:x,hcLight:x},c.kg("vs/platform/theme/common/colors/editorColors","editorStickyScrollBorder","Border color of sticky scroll in the editor")),d("editorStickyScroll.shadow",F,c.kg("vs/platform/theme/common/colors/editorColors","editorStickyScrollShadow"," Shadow color of sticky scroll in the editor")),d("editorWidget.background",{dark:"#252526",light:"#F3F3F3",hcDark:"#0C141F",hcLight:s.Q1.white},c.kg("vs/platform/theme/common/colors/editorColors","editorWidgetBackground","Background color of editor widgets, such as find/replace."))),D=d("editorWidget.foreground",C,c.kg("vs/platform/theme/common/colors/editorColors","editorWidgetForeground","Foreground color of editor widgets, such as find/replace.")),A=d("editorWidget.border",{dark:"#454545",light:"#C8C8C8",hcDark:x,hcLight:x},c.kg("vs/platform/theme/common/colors/editorColors","editorWidgetBorder","Border color of editor widgets. The color is only used if the widget chooses to have a border and if the color is not overridden by a widget.")),M=(d("editorWidget.resizeBorder",null,c.kg("vs/platform/theme/common/colors/editorColors","editorWidgetResizeBorder","Border color of the resize bar of editor widgets. The color is only used if the widget chooses to have a resize border and if the color is not overridden by a widget.")),d("editorError.background",null,c.kg("vs/platform/theme/common/colors/editorColors","editorError.background","Background color of error text in the editor. The color must not be opaque so as not to hide underlying decorations."),!0),d("editorError.foreground",{dark:"#F14C4C",light:"#E51400",hcDark:"#F48771",hcLight:"#B5200D"},c.kg("vs/platform/theme/common/colors/editorColors","editorError.foreground","Foreground color of error squigglies in the editor."))),O=(d("editorError.border",{dark:null,light:null,hcDark:s.Q1.fromHex("#E47777").transparent(.8),hcLight:"#B5200D"},c.kg("vs/platform/theme/common/colors/editorColors","errorBorder","If set, color of double underlines for errors in the editor.")),d("editorWarning.background",null,c.kg("vs/platform/theme/common/colors/editorColors","editorWarning.background","Background color of warning text in the editor. The color must not be opaque so as not to hide underlying decorations."),!0)),z=d("editorWarning.foreground",{dark:"#CCA700",light:"#BF8803",hcDark:"#FFD370",hcLight:"#895503"},c.kg("vs/platform/theme/common/colors/editorColors","editorWarning.foreground","Foreground color of warning squigglies in the editor.")),P=d("editorWarning.border",{dark:null,light:null,hcDark:s.Q1.fromHex("#FFCC00").transparent(.8),hcLight:s.Q1.fromHex("#FFCC00").transparent(.8)},c.kg("vs/platform/theme/common/colors/editorColors","warningBorder","If set, color of double underlines for warnings in the editor.")),B=(d("editorInfo.background",null,c.kg("vs/platform/theme/common/colors/editorColors","editorInfo.background","Background color of info text in the editor. The color must not be opaque so as not to hide underlying decorations."),!0),d("editorInfo.foreground",{dark:"#3794FF",light:"#1a85ff",hcDark:"#3794FF",hcLight:"#1a85ff"},c.kg("vs/platform/theme/common/colors/editorColors","editorInfo.foreground","Foreground color of info squigglies in the editor."))),W=d("editorInfo.border",{dark:null,light:null,hcDark:s.Q1.fromHex("#3794FF").transparent(.8),hcLight:"#292929"},c.kg("vs/platform/theme/common/colors/editorColors","infoBorder","If set, color of double underlines for infos in the editor.")),V=(d("editorHint.foreground",{dark:s.Q1.fromHex("#eeeeee").transparent(.7),light:"#6c6c6c",hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/editorColors","editorHint.foreground","Foreground color of hint squigglies in the editor.")),d("editorHint.border",{dark:null,light:null,hcDark:s.Q1.fromHex("#eeeeee").transparent(.8),hcLight:"#292929"},c.kg("vs/platform/theme/common/colors/editorColors","hintBorder","If set, color of double underlines for hints in the editor.")),d("editorLink.activeForeground",{dark:"#4E94CE",light:s.Q1.blue,hcDark:s.Q1.cyan,hcLight:"#292929"},c.kg("vs/platform/theme/common/colors/editorColors","activeLinkForeground","Color of active links.")),d("editor.selectionBackground",{light:"#ADD6FF",dark:"#264F78",hcDark:"#f3f518",hcLight:"#0F4A85"},c.kg("vs/platform/theme/common/colors/editorColors","editorSelectionBackground","Color of the editor selection."))),U=(d("editor.selectionForeground",{light:null,dark:null,hcDark:"#000000",hcLight:s.Q1.white},c.kg("vs/platform/theme/common/colors/editorColors","editorSelectionForeground","Color of the selected text for high contrast.")),d("editor.inactiveSelectionBackground",{light:m(V,.5),dark:m(V,.5),hcDark:m(V,.7),hcLight:m(V,.5)},c.kg("vs/platform/theme/common/colors/editorColors","editorInactiveSelection","Color of the selection in an inactive editor. The color must not be opaque so as not to hide underlying decorations."),!0),d("editor.selectionHighlightBackground",{light:g(V,N,.3,.6),dark:g(V,N,.3,.6),hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/editorColors","editorSelectionHighlight","Color for regions with the same content as the selection. The color must not be opaque so as not to hide underlying decorations."),!0),d("editor.selectionHighlightBorder",{light:null,dark:null,hcDark:S,hcLight:S},c.kg("vs/platform/theme/common/colors/editorColors","editorSelectionHighlightBorder","Border color for regions with the same content as the selection.")),d("editor.findMatchBackground",{light:"#A8AC94",dark:"#515C6A",hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/editorColors","editorFindMatch","Color of the current search match.")),d("editor.findMatchForeground",null,c.kg("vs/platform/theme/common/colors/editorColors","editorFindMatchForeground","Text color of the current search match.")),d("editor.findMatchHighlightBackground",{light:"#EA5C0055",dark:"#EA5C0055",hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/editorColors","findMatchHighlight","Color of the other search matches. The color must not be opaque so as not to hide underlying decorations."),!0)),$=(d("editor.findMatchHighlightForeground",null,c.kg("vs/platform/theme/common/colors/editorColors","findMatchHighlightForeground","Foreground color of the other search matches."),!0),d("editor.findRangeHighlightBackground",{dark:"#3a3d4166",light:"#b4b4b44d",hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/editorColors","findRangeHighlight","Color of the range limiting the search. The color must not be opaque so as not to hide underlying decorations."),!0),d("editor.findMatchBorder",{light:null,dark:null,hcDark:S,hcLight:S},c.kg("vs/platform/theme/common/colors/editorColors","editorFindMatchBorder","Border color of the current search match.")),d("editor.findMatchHighlightBorder",{light:null,dark:null,hcDark:S,hcLight:S},c.kg("vs/platform/theme/common/colors/editorColors","findMatchHighlightBorder","Border color of the other search matches."))),q=(d("editor.findRangeHighlightBorder",{dark:null,light:null,hcDark:m(S,.4),hcLight:m(S,.4)},c.kg("vs/platform/theme/common/colors/editorColors","findRangeHighlightBorder","Border color of the range limiting the search. The color must not be opaque so as not to hide underlying decorations."),!0),d("editor.hoverHighlightBackground",{light:"#ADD6FF26",dark:"#264f7840",hcDark:"#ADD6FF26",hcLight:null},c.kg("vs/platform/theme/common/colors/editorColors","hoverHighlight","Highlight below the word for which a hover is shown. The color must not be opaque so as not to hide underlying decorations."),!0),d("editorHoverWidget.background",R,c.kg("vs/platform/theme/common/colors/editorColors","hoverBackground","Background color of the editor hover."))),j=(d("editorHoverWidget.foreground",D,c.kg("vs/platform/theme/common/colors/editorColors","hoverForeground","Foreground color of the editor hover.")),d("editorHoverWidget.border",A,c.kg("vs/platform/theme/common/colors/editorColors","hoverBorder","Border color of the editor hover.")),d("editorHoverWidget.statusBarBackground",{dark:p(q,.2),light:u(q,.05),hcDark:R,hcLight:R},c.kg("vs/platform/theme/common/colors/editorColors","statusBarBackground","Background color of the editor hover status bar.")),d("editorInlayHint.foreground",{dark:"#969696",light:"#969696",hcDark:s.Q1.white,hcLight:s.Q1.black},c.kg("vs/platform/theme/common/colors/editorColors","editorInlayHintForeground","Foreground color of inline hints"))),K=d("editorInlayHint.background",{dark:m(E,.1),light:m(E,.1),hcDark:m(s.Q1.white,.1),hcLight:m(E,.1)},c.kg("vs/platform/theme/common/colors/editorColors","editorInlayHintBackground","Background color of inline hints")),H=(d("editorInlayHint.typeForeground",j,c.kg("vs/platform/theme/common/colors/editorColors","editorInlayHintForegroundTypes","Foreground color of inline hints for types")),d("editorInlayHint.typeBackground",K,c.kg("vs/platform/theme/common/colors/editorColors","editorInlayHintBackgroundTypes","Background color of inline hints for types")),d("editorInlayHint.parameterForeground",j,c.kg("vs/platform/theme/common/colors/editorColors","editorInlayHintForegroundParameter","Foreground color of inline hints for parameters")),d("editorInlayHint.parameterBackground",K,c.kg("vs/platform/theme/common/colors/editorColors","editorInlayHintBackgroundParameter","Background color of inline hints for parameters")),d("editorLightBulb.foreground",{dark:"#FFCC00",light:"#DDB100",hcDark:"#FFCC00",hcLight:"#007ACC"},c.kg("vs/platform/theme/common/colors/editorColors","editorLightBulbForeground","The color used for the lightbulb actions icon."))),G=(d("editorLightBulbAutoFix.foreground",{dark:"#75BEFF",light:"#007ACC",hcDark:"#75BEFF",hcLight:"#007ACC"},c.kg("vs/platform/theme/common/colors/editorColors","editorLightBulbAutoFixForeground","The color used for the lightbulb auto fix actions icon.")),d("editorLightBulbAi.foreground",H,c.kg("vs/platform/theme/common/colors/editorColors","editorLightBulbAiForeground","The color used for the lightbulb AI icon.")),d("editor.snippetTabstopHighlightBackground",{dark:new s.Q1(new s.bU(124,124,124,.3)),light:new s.Q1(new s.bU(10,50,100,.2)),hcDark:new s.Q1(new s.bU(124,124,124,.3)),hcLight:new s.Q1(new s.bU(10,50,100,.2))},c.kg("vs/platform/theme/common/colors/editorColors","snippetTabstopHighlightBackground","Highlight background color of a snippet tabstop.")),d("editor.snippetTabstopHighlightBorder",null,c.kg("vs/platform/theme/common/colors/editorColors","snippetTabstopHighlightBorder","Highlight border color of a snippet tabstop.")),d("editor.snippetFinalTabstopHighlightBackground",null,c.kg("vs/platform/theme/common/colors/editorColors","snippetFinalTabstopHighlightBackground","Highlight background color of the final tabstop of a snippet.")),d("editor.snippetFinalTabstopHighlightBorder",{dark:"#525252",light:new s.Q1(new s.bU(10,50,100,.5)),hcDark:"#525252",hcLight:"#292929"},c.kg("vs/platform/theme/common/colors/editorColors","snippetFinalTabstopHighlightBorder","Highlight border color of the final tabstop of a snippet.")),new s.Q1(new s.bU(155,185,85,.2))),Q=new s.Q1(new s.bU(255,0,0,.2)),J=(d("diffEditor.insertedTextBackground",{dark:"#9ccc2c33",light:"#9ccc2c40",hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/editorColors","diffEditorInserted","Background color for text that got inserted. The color must not be opaque so as not to hide underlying decorations."),!0),d("diffEditor.removedTextBackground",{dark:"#ff000033",light:"#ff000033",hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/editorColors","diffEditorRemoved","Background color for text that got removed. The color must not be opaque so as not to hide underlying decorations."),!0),d("diffEditor.insertedLineBackground",{dark:G,light:G,hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/editorColors","diffEditorInsertedLines","Background color for lines that got inserted. The color must not be opaque so as not to hide underlying decorations."),!0),d("diffEditor.removedLineBackground",{dark:Q,light:Q,hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/editorColors","diffEditorRemovedLines","Background color for lines that got removed. The color must not be opaque so as not to hide underlying decorations."),!0),d("diffEditorGutter.insertedLineBackground",null,c.kg("vs/platform/theme/common/colors/editorColors","diffEditorInsertedLineGutter","Background color for the margin where lines got inserted.")),d("diffEditorGutter.removedLineBackground",null,c.kg("vs/platform/theme/common/colors/editorColors","diffEditorRemovedLineGutter","Background color for the margin where lines got removed.")),d("diffEditorOverview.insertedForeground",null,c.kg("vs/platform/theme/common/colors/editorColors","diffEditorOverviewInserted","Diff overview ruler foreground for inserted content.")),d("diffEditorOverview.removedForeground",null,c.kg("vs/platform/theme/common/colors/editorColors","diffEditorOverviewRemoved","Diff overview ruler foreground for removed content.")),d("diffEditor.insertedTextBorder",{dark:null,light:null,hcDark:"#33ff2eff",hcLight:"#374E06"},c.kg("vs/platform/theme/common/colors/editorColors","diffEditorInsertedOutline","Outline color for the text that got inserted.")),d("diffEditor.removedTextBorder",{dark:null,light:null,hcDark:"#FF008F",hcLight:"#AD0707"},c.kg("vs/platform/theme/common/colors/editorColors","diffEditorRemovedOutline","Outline color for text that got removed.")),d("diffEditor.border",{dark:null,light:null,hcDark:x,hcLight:x},c.kg("vs/platform/theme/common/colors/editorColors","diffEditorBorder","Border color between the two text editors.")),d("diffEditor.diagonalFill",{dark:"#cccccc33",light:"#22222233",hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/editorColors","diffDiagonalFill","Color of the diff editor's diagonal fill. The diagonal fill is used in side-by-side diff views.")),d("diffEditor.unchangedRegionBackground","sideBar.background",c.kg("vs/platform/theme/common/colors/editorColors","diffEditor.unchangedRegionBackground","The background color of unchanged blocks in the diff editor.")),d("diffEditor.unchangedRegionForeground","foreground",c.kg("vs/platform/theme/common/colors/editorColors","diffEditor.unchangedRegionForeground","The foreground color of unchanged blocks in the diff editor.")),d("diffEditor.unchangedCodeBackground",{dark:"#74747429",light:"#b8b8b829",hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/editorColors","diffEditor.unchangedCodeBackground","The background color of unchanged code in the diff editor.")),d("widget.shadow",{dark:m(s.Q1.black,.36),light:m(s.Q1.black,.16),hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/editorColors","widgetShadow","Shadow color of widgets such as find/replace inside the editor."))),Y=(d("widget.border",{dark:null,light:null,hcDark:x,hcLight:x},c.kg("vs/platform/theme/common/colors/editorColors","widgetBorder","Border color of widgets such as find/replace inside the editor.")),d("toolbar.hoverBackground",{dark:"#5a5d5e50",light:"#b8b8b850",hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/editorColors","toolbarHoverBackground","Toolbar background when hovering over actions using the mouse"))),X=(d("toolbar.hoverOutline",{dark:null,light:null,hcDark:S,hcLight:S},c.kg("vs/platform/theme/common/colors/editorColors","toolbarHoverOutline","Toolbar outline when hovering over actions using the mouse")),d("toolbar.activeBackground",{dark:p(Y,.1),light:u(Y,.1),hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/editorColors","toolbarActiveBackground","Toolbar background when holding the mouse over actions")),d("breadcrumb.foreground",m(C,.8),c.kg("vs/platform/theme/common/colors/editorColors","breadcrumbsFocusForeground","Color of focused breadcrumb items.")),d("breadcrumb.background",N,c.kg("vs/platform/theme/common/colors/editorColors","breadcrumbsBackground","Background color of breadcrumb items.")),d("breadcrumb.focusForeground",{light:u(C,.2),dark:p(C,.1),hcDark:p(C,.1),hcLight:p(C,.1)},c.kg("vs/platform/theme/common/colors/editorColors","breadcrumbsFocusForeground","Color of focused breadcrumb items.")),d("breadcrumb.activeSelectionForeground",{light:u(C,.2),dark:p(C,.1),hcDark:p(C,.1),hcLight:p(C,.1)},c.kg("vs/platform/theme/common/colors/editorColors","breadcrumbsSelectedForeground","Color of selected breadcrumb items.")),d("breadcrumbPicker.background",R,c.kg("vs/platform/theme/common/colors/editorColors","breadcrumbsSelectedBackground","Background color of breadcrumb item picker.")),s.Q1.fromHex("#40C8AE").transparent(.5)),Z=s.Q1.fromHex("#40A6FF").transparent(.5),ee=s.Q1.fromHex("#606060").transparent(.4),te=d("merge.currentHeaderBackground",{dark:X,light:X,hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/editorColors","mergeCurrentHeaderBackground","Current header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."),!0),ne=(d("merge.currentContentBackground",m(te,.4),c.kg("vs/platform/theme/common/colors/editorColors","mergeCurrentContentBackground","Current content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."),!0),d("merge.incomingHeaderBackground",{dark:Z,light:Z,hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/editorColors","mergeIncomingHeaderBackground","Incoming header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."),!0)),re=(d("merge.incomingContentBackground",m(ne,.4),c.kg("vs/platform/theme/common/colors/editorColors","mergeIncomingContentBackground","Incoming content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."),!0),d("merge.commonHeaderBackground",{dark:ee,light:ee,hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/editorColors","mergeCommonHeaderBackground","Common ancestor header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."),!0)),ie=(d("merge.commonContentBackground",m(re,.4),c.kg("vs/platform/theme/common/colors/editorColors","mergeCommonContentBackground","Common ancestor content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."),!0),d("merge.border",{dark:null,light:null,hcDark:"#C3DF6F",hcLight:"#007ACC"},c.kg("vs/platform/theme/common/colors/editorColors","mergeBorder","Border color on headers and the splitter in inline merge-conflicts."))),se=(d("editorOverviewRuler.currentContentForeground",{dark:m(te,1),light:m(te,1),hcDark:ie,hcLight:ie},c.kg("vs/platform/theme/common/colors/editorColors","overviewRulerCurrentContentForeground","Current overview ruler foreground for inline merge-conflicts.")),d("editorOverviewRuler.incomingContentForeground",{dark:m(ne,1),light:m(ne,1),hcDark:ie,hcLight:ie},c.kg("vs/platform/theme/common/colors/editorColors","overviewRulerIncomingContentForeground","Incoming overview ruler foreground for inline merge-conflicts.")),d("editorOverviewRuler.commonContentForeground",{dark:m(re,1),light:m(re,1),hcDark:ie,hcLight:ie},c.kg("vs/platform/theme/common/colors/editorColors","overviewRulerCommonContentForeground","Common ancestor overview ruler foreground for inline merge-conflicts.")),d("editorOverviewRuler.findMatchForeground",{dark:"#d186167e",light:"#d186167e",hcDark:"#AB5A00",hcLight:"#AB5A00"},c.kg("vs/platform/theme/common/colors/editorColors","overviewRulerFindMatchForeground","Overview ruler marker color for find matches. The color must not be opaque so as not to hide underlying decorations."),!0),d("editorOverviewRuler.selectionHighlightForeground","#A0A0A0CC",c.kg("vs/platform/theme/common/colors/editorColors","overviewRulerSelectionHighlightForeground","Overview ruler marker color for selection highlights. The color must not be opaque so as not to hide underlying decorations."),!0),d("problemsErrorIcon.foreground",M,c.kg("vs/platform/theme/common/colors/editorColors","problemsErrorIconForeground","The color used for the problems error icon.")),d("problemsWarningIcon.foreground",z,c.kg("vs/platform/theme/common/colors/editorColors","problemsWarningIconForeground","The color used for the problems warning icon.")),d("problemsInfoIcon.foreground",B,c.kg("vs/platform/theme/common/colors/editorColors","problemsInfoIconForeground","The color used for the problems info icon.")),d("minimap.findMatchHighlight",{light:"#d18616",dark:"#d18616",hcDark:"#AB5A00",hcLight:"#0F4A85"},c.kg("vs/platform/theme/common/colors/minimapColors","minimapFindMatchHighlight","Minimap marker color for find matches."),!0)),oe=(d("minimap.selectionOccurrenceHighlight",{light:"#c9c9c9",dark:"#676767",hcDark:"#ffffff",hcLight:"#0F4A85"},c.kg("vs/platform/theme/common/colors/minimapColors","minimapSelectionOccurrenceHighlight","Minimap marker color for repeating editor selections."),!0),d("minimap.selectionHighlight",{light:"#ADD6FF",dark:"#264F78",hcDark:"#ffffff",hcLight:"#0F4A85"},c.kg("vs/platform/theme/common/colors/minimapColors","minimapSelectionHighlight","Minimap marker color for the editor selection."),!0),d("minimap.infoHighlight",{dark:B,light:B,hcDark:W,hcLight:W},c.kg("vs/platform/theme/common/colors/minimapColors","minimapInfo","Minimap marker color for infos."))),ae=d("minimap.warningHighlight",{dark:z,light:z,hcDark:P,hcLight:P},c.kg("vs/platform/theme/common/colors/minimapColors","overviewRuleWarning","Minimap marker color for warnings.")),le=d("minimap.errorHighlight",{dark:new s.Q1(new s.bU(255,18,18,.7)),light:new s.Q1(new s.bU(255,18,18,.7)),hcDark:new s.Q1(new s.bU(255,50,50,1)),hcLight:"#B5200D"},c.kg("vs/platform/theme/common/colors/minimapColors","minimapError","Minimap marker color for errors.")),ce=(d("minimap.background",null,c.kg("vs/platform/theme/common/colors/minimapColors","minimapBackground","Minimap background color.")),d("minimap.foregroundOpacity",s.Q1.fromHex("#000f"),c.kg("vs/platform/theme/common/colors/minimapColors","minimapForegroundOpacity",'Opacity of foreground elements rendered in the minimap. For example, "#000000c0" will render the elements with 75% opacity.')),d("minimapSlider.background",m(L,.5),c.kg("vs/platform/theme/common/colors/minimapColors","minimapSliderBackground","Minimap slider background color.")),d("minimapSlider.hoverBackground",m(I,.5),c.kg("vs/platform/theme/common/colors/minimapColors","minimapSliderHoverBackground","Minimap slider background color when hovering.")),d("minimapSlider.activeBackground",m(T,.5),c.kg("vs/platform/theme/common/colors/minimapColors","minimapSliderActiveBackground","Minimap slider background color when clicked on.")),d("charts.foreground",C,c.kg("vs/platform/theme/common/colors/chartsColors","chartsForeground","The foreground color used in charts.")),d("charts.lines",m(C,.5),c.kg("vs/platform/theme/common/colors/chartsColors","chartsLines","The color used for horizontal lines in charts.")),d("charts.red",M,c.kg("vs/platform/theme/common/colors/chartsColors","chartsRed","The red color used in chart visualizations.")),d("charts.blue",B,c.kg("vs/platform/theme/common/colors/chartsColors","chartsBlue","The blue color used in chart visualizations.")),d("charts.yellow",z,c.kg("vs/platform/theme/common/colors/chartsColors","chartsYellow","The yellow color used in chart visualizations.")),d("charts.orange",se,c.kg("vs/platform/theme/common/colors/chartsColors","chartsOrange","The orange color used in chart visualizations.")),d("charts.green",{dark:"#89D185",light:"#388A34",hcDark:"#89D185",hcLight:"#374e06"},c.kg("vs/platform/theme/common/colors/chartsColors","chartsGreen","The green color used in chart visualizations.")),d("charts.purple",{dark:"#B180D7",light:"#652D90",hcDark:"#B180D7",hcLight:"#652D90"},c.kg("vs/platform/theme/common/colors/chartsColors","chartsPurple","The purple color used in chart visualizations.")),d("input.background",{dark:"#3C3C3C",light:s.Q1.white,hcDark:s.Q1.black,hcLight:s.Q1.white},c.kg("vs/platform/theme/common/colors/inputColors","inputBoxBackground","Input box background.")),d("input.foreground",C,c.kg("vs/platform/theme/common/colors/inputColors","inputBoxForeground","Input box foreground.")),d("input.border",{dark:null,light:null,hcDark:x,hcLight:x},c.kg("vs/platform/theme/common/colors/inputColors","inputBoxBorder","Input box border.")),d("inputOption.activeBorder",{dark:"#007ACC",light:"#007ACC",hcDark:x,hcLight:x},c.kg("vs/platform/theme/common/colors/inputColors","inputBoxActiveOptionBorder","Border color of activated options in input fields."))),he=d("inputOption.hoverBackground",{dark:"#5a5d5e80",light:"#b8b8b850",hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/inputColors","inputOption.hoverBackground","Background color of activated options in input fields.")),de=d("inputOption.activeBackground",{dark:m(k,.4),light:m(k,.2),hcDark:s.Q1.transparent,hcLight:s.Q1.transparent},c.kg("vs/platform/theme/common/colors/inputColors","inputOption.activeBackground","Background hover color of options in input fields.")),ue=d("inputOption.activeForeground",{dark:s.Q1.white,light:s.Q1.black,hcDark:C,hcLight:C},c.kg("vs/platform/theme/common/colors/inputColors","inputOption.activeForeground","Foreground color of activated options in input fields.")),pe=(d("input.placeholderForeground",{light:m(C,.5),dark:m(C,.5),hcDark:m(C,.7),hcLight:m(C,.7)},c.kg("vs/platform/theme/common/colors/inputColors","inputPlaceholderForeground","Input box foreground color for placeholder text.")),d("inputValidation.infoBackground",{dark:"#063B49",light:"#D6ECF2",hcDark:s.Q1.black,hcLight:s.Q1.white},c.kg("vs/platform/theme/common/colors/inputColors","inputValidationInfoBackground","Input validation background color for information severity.")),d("inputValidation.infoForeground",{dark:null,light:null,hcDark:null,hcLight:C},c.kg("vs/platform/theme/common/colors/inputColors","inputValidationInfoForeground","Input validation foreground color for information severity.")),d("inputValidation.infoBorder",{dark:"#007acc",light:"#007acc",hcDark:x,hcLight:x},c.kg("vs/platform/theme/common/colors/inputColors","inputValidationInfoBorder","Input validation border color for information severity.")),d("inputValidation.warningBackground",{dark:"#352A05",light:"#F6F5D2",hcDark:s.Q1.black,hcLight:s.Q1.white},c.kg("vs/platform/theme/common/colors/inputColors","inputValidationWarningBackground","Input validation background color for warning severity.")),d("inputValidation.warningForeground",{dark:null,light:null,hcDark:null,hcLight:C},c.kg("vs/platform/theme/common/colors/inputColors","inputValidationWarningForeground","Input validation foreground color for warning severity.")),d("inputValidation.warningBorder",{dark:"#B89500",light:"#B89500",hcDark:x,hcLight:x},c.kg("vs/platform/theme/common/colors/inputColors","inputValidationWarningBorder","Input validation border color for warning severity.")),d("inputValidation.errorBackground",{dark:"#5A1D1D",light:"#F2DEDE",hcDark:s.Q1.black,hcLight:s.Q1.white},c.kg("vs/platform/theme/common/colors/inputColors","inputValidationErrorBackground","Input validation background color for error severity.")),d("inputValidation.errorForeground",{dark:null,light:null,hcDark:null,hcLight:C},c.kg("vs/platform/theme/common/colors/inputColors","inputValidationErrorForeground","Input validation foreground color for error severity.")),d("inputValidation.errorBorder",{dark:"#BE1100",light:"#BE1100",hcDark:x,hcLight:x},c.kg("vs/platform/theme/common/colors/inputColors","inputValidationErrorBorder","Input validation border color for error severity.")),d("dropdown.background",{dark:"#3C3C3C",light:s.Q1.white,hcDark:s.Q1.black,hcLight:s.Q1.white},c.kg("vs/platform/theme/common/colors/inputColors","dropdownBackground","Dropdown background."))),me=(d("dropdown.listBackground",{dark:null,light:null,hcDark:s.Q1.black,hcLight:s.Q1.white},c.kg("vs/platform/theme/common/colors/inputColors","dropdownListBackground","Dropdown list background.")),d("dropdown.foreground",{dark:"#F0F0F0",light:C,hcDark:s.Q1.white,hcLight:C},c.kg("vs/platform/theme/common/colors/inputColors","dropdownForeground","Dropdown foreground."))),fe=d("dropdown.border",{dark:pe,light:"#CECECE",hcDark:x,hcLight:x},c.kg("vs/platform/theme/common/colors/inputColors","dropdownBorder","Dropdown border.")),ge=d("button.foreground",s.Q1.white,c.kg("vs/platform/theme/common/colors/inputColors","buttonForeground","Button foreground color.")),be=(d("button.separator",m(ge,.4),c.kg("vs/platform/theme/common/colors/inputColors","buttonSeparator","Button separator color.")),d("button.background",{dark:"#0E639C",light:"#007ACC",hcDark:null,hcLight:"#0F4A85"},c.kg("vs/platform/theme/common/colors/inputColors","buttonBackground","Button background color."))),ve=(d("button.hoverBackground",{dark:p(be,.2),light:u(be,.2),hcDark:be,hcLight:be},c.kg("vs/platform/theme/common/colors/inputColors","buttonHoverBackground","Button background color when hovering.")),d("button.border",x,c.kg("vs/platform/theme/common/colors/inputColors","buttonBorder","Button border color.")),d("button.secondaryForeground",{dark:s.Q1.white,light:s.Q1.white,hcDark:s.Q1.white,hcLight:C},c.kg("vs/platform/theme/common/colors/inputColors","buttonSecondaryForeground","Secondary button foreground color.")),d("button.secondaryBackground",{dark:"#3A3D41",light:"#5F6A79",hcDark:null,hcLight:s.Q1.white},c.kg("vs/platform/theme/common/colors/inputColors","buttonSecondaryBackground","Secondary button background color."))),ye=(d("button.secondaryHoverBackground",{dark:p(ve,.2),light:u(ve,.2),hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/inputColors","buttonSecondaryHoverBackground","Secondary button background color when hovering.")),d("radio.activeForeground",ue,c.kg("vs/platform/theme/common/colors/inputColors","radioActiveForeground","Foreground color of active radio option."))),we=(d("radio.activeBackground",de,c.kg("vs/platform/theme/common/colors/inputColors","radioBackground","Background color of active radio option.")),d("radio.activeBorder",ce,c.kg("vs/platform/theme/common/colors/inputColors","radioActiveBorder","Border color of the active radio option.")),d("radio.inactiveForeground",null,c.kg("vs/platform/theme/common/colors/inputColors","radioInactiveForeground","Foreground color of inactive radio option.")),d("radio.inactiveBackground",null,c.kg("vs/platform/theme/common/colors/inputColors","radioInactiveBackground","Background color of inactive radio option.")),d("radio.inactiveBorder",{light:m(ye,.2),dark:m(ye,.2),hcDark:m(ye,.4),hcLight:m(ye,.2)},c.kg("vs/platform/theme/common/colors/inputColors","radioInactiveBorder","Border color of the inactive radio option.")),d("radio.inactiveHoverBackground",he,c.kg("vs/platform/theme/common/colors/inputColors","radioHoverBackground","Background color of inactive active radio option when hovering.")),d("checkbox.background",pe,c.kg("vs/platform/theme/common/colors/inputColors","checkbox.background","Background color of checkbox widget.")),d("checkbox.selectBackground",R,c.kg("vs/platform/theme/common/colors/inputColors","checkbox.select.background","Background color of checkbox widget when the element it's in is selected.")),d("checkbox.foreground",me,c.kg("vs/platform/theme/common/colors/inputColors","checkbox.foreground","Foreground color of checkbox widget.")),d("checkbox.border",fe,c.kg("vs/platform/theme/common/colors/inputColors","checkbox.border","Border color of checkbox widget.")),d("checkbox.selectBorder",_,c.kg("vs/platform/theme/common/colors/inputColors","checkbox.select.border","Border color of checkbox widget when the element it's in is selected.")),d("keybindingLabel.background",{dark:new s.Q1(new s.bU(128,128,128,.17)),light:new s.Q1(new s.bU(221,221,221,.4)),hcDark:s.Q1.transparent,hcLight:s.Q1.transparent},c.kg("vs/platform/theme/common/colors/inputColors","keybindingLabelBackground","Keybinding label background color. The keybinding label is used to represent a keyboard shortcut.")),d("keybindingLabel.foreground",{dark:s.Q1.fromHex("#CCCCCC"),light:s.Q1.fromHex("#555555"),hcDark:s.Q1.white,hcLight:C},c.kg("vs/platform/theme/common/colors/inputColors","keybindingLabelForeground","Keybinding label foreground color. The keybinding label is used to represent a keyboard shortcut.")),d("keybindingLabel.border",{dark:new s.Q1(new s.bU(51,51,51,.6)),light:new s.Q1(new s.bU(204,204,204,.4)),hcDark:new s.Q1(new s.bU(111,195,223)),hcLight:x},c.kg("vs/platform/theme/common/colors/inputColors","keybindingLabelBorder","Keybinding label border color. The keybinding label is used to represent a keyboard shortcut.")),d("keybindingLabel.bottomBorder",{dark:new s.Q1(new s.bU(68,68,68,.6)),light:new s.Q1(new s.bU(187,187,187,.4)),hcDark:new s.Q1(new s.bU(111,195,223)),hcLight:C},c.kg("vs/platform/theme/common/colors/inputColors","keybindingLabelBottomBorder","Keybinding label border bottom color. The keybinding label is used to represent a keyboard shortcut.")),d("list.focusBackground",null,c.kg("vs/platform/theme/common/colors/listColors","listFocusBackground","List/Tree background color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")),d("list.focusForeground",null,c.kg("vs/platform/theme/common/colors/listColors","listFocusForeground","List/Tree foreground color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")),d("list.focusOutline",{dark:k,light:k,hcDark:S,hcLight:S},c.kg("vs/platform/theme/common/colors/listColors","listFocusOutline","List/Tree outline color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")),d("list.focusAndSelectionOutline",null,c.kg("vs/platform/theme/common/colors/listColors","listFocusAndSelectionOutline","List/Tree outline color for the focused item when the list/tree is active and selected. An active list/tree has keyboard focus, an inactive does not.")),d("list.activeSelectionBackground",{dark:"#04395E",light:"#0060C0",hcDark:null,hcLight:s.Q1.fromHex("#0F4A85").transparent(.1)},c.kg("vs/platform/theme/common/colors/listColors","listActiveSelectionBackground","List/Tree background color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not."))),Ce=d("list.activeSelectionForeground",{dark:s.Q1.white,light:s.Q1.white,hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/listColors","listActiveSelectionForeground","List/Tree foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")),_e=d("list.activeSelectionIconForeground",null,c.kg("vs/platform/theme/common/colors/listColors","listActiveSelectionIconForeground","List/Tree icon foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")),ke=(d("list.inactiveSelectionBackground",{dark:"#37373D",light:"#E4E6F1",hcDark:null,hcLight:s.Q1.fromHex("#0F4A85").transparent(.1)},c.kg("vs/platform/theme/common/colors/listColors","listInactiveSelectionBackground","List/Tree background color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")),d("list.inactiveSelectionForeground",null,c.kg("vs/platform/theme/common/colors/listColors","listInactiveSelectionForeground","List/Tree foreground color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")),d("list.inactiveSelectionIconForeground",null,c.kg("vs/platform/theme/common/colors/listColors","listInactiveSelectionIconForeground","List/Tree icon foreground color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")),d("list.inactiveFocusBackground",null,c.kg("vs/platform/theme/common/colors/listColors","listInactiveFocusBackground","List/Tree background color for the focused item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")),d("list.inactiveFocusOutline",null,c.kg("vs/platform/theme/common/colors/listColors","listInactiveFocusOutline","List/Tree outline color for the focused item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")),d("list.hoverBackground",{dark:"#2A2D2E",light:"#F0F0F0",hcDark:s.Q1.white.transparent(.1),hcLight:s.Q1.fromHex("#0F4A85").transparent(.1)},c.kg("vs/platform/theme/common/colors/listColors","listHoverBackground","List/Tree background when hovering over items using the mouse.")),d("list.hoverForeground",null,c.kg("vs/platform/theme/common/colors/listColors","listHoverForeground","List/Tree foreground when hovering over items using the mouse.")),d("list.dropBackground",{dark:"#062F4A",light:"#D6EBFF",hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/listColors","listDropBackground","List/Tree drag and drop background when moving items over other items when using the mouse.")),d("list.dropBetweenBackground",{dark:_,light:_,hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/listColors","listDropBetweenBackground","List/Tree drag and drop border color when moving items between items when using the mouse.")),d("list.highlightForeground",{dark:"#2AAAFF",light:"#0066BF",hcDark:k,hcLight:k},c.kg("vs/platform/theme/common/colors/listColors","highlight","List/Tree foreground color of the match highlights when searching inside the list/tree.")));var xe,Se;d("list.focusHighlightForeground",{dark:ke,light:(xe=we,Se=ke,{op:6,if:xe,then:Se,else:"#BBE7FF"}),hcDark:ke,hcLight:ke},c.kg("vs/platform/theme/common/colors/listColors","listFocusHighlightForeground","List/Tree foreground color of the match highlights on actively focused items when searching inside the list/tree.")),d("list.invalidItemForeground",{dark:"#B89500",light:"#B89500",hcDark:"#B89500",hcLight:"#B5200D"},c.kg("vs/platform/theme/common/colors/listColors","invalidItemForeground","List/Tree foreground color for invalid items, for example an unresolved root in explorer.")),d("list.errorForeground",{dark:"#F88070",light:"#B01011",hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/listColors","listErrorForeground","Foreground color of list items containing errors.")),d("list.warningForeground",{dark:"#CCA700",light:"#855F00",hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/listColors","listWarningForeground","Foreground color of list items containing warnings.")),d("listFilterWidget.background",{light:u(R,0),dark:p(R,0),hcDark:R,hcLight:R},c.kg("vs/platform/theme/common/colors/listColors","listFilterWidgetBackground","Background color of the type filter widget in lists and trees.")),d("listFilterWidget.outline",{dark:s.Q1.transparent,light:s.Q1.transparent,hcDark:"#f38518",hcLight:"#007ACC"},c.kg("vs/platform/theme/common/colors/listColors","listFilterWidgetOutline","Outline color of the type filter widget in lists and trees.")),d("listFilterWidget.noMatchesOutline",{dark:"#BE1100",light:"#BE1100",hcDark:x,hcLight:x},c.kg("vs/platform/theme/common/colors/listColors","listFilterWidgetNoMatchesOutline","Outline color of the type filter widget in lists and trees, when there are no matches.")),d("listFilterWidget.shadow",J,c.kg("vs/platform/theme/common/colors/listColors","listFilterWidgetShadow","Shadow color of the type filter widget in lists and trees.")),d("list.filterMatchBackground",{dark:U,light:U,hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/listColors","listFilterMatchHighlight","Background color of the filtered match.")),d("list.filterMatchBorder",{dark:$,light:$,hcDark:x,hcLight:S},c.kg("vs/platform/theme/common/colors/listColors","listFilterMatchHighlightBorder","Border color of the filtered match.")),d("list.deemphasizedForeground",{dark:"#8C8C8C",light:"#8E8E90",hcDark:"#A7A8A9",hcLight:"#666666"},c.kg("vs/platform/theme/common/colors/listColors","listDeemphasizedForeground","List/Tree foreground color for items that are deemphasized."));const Ee=d("tree.indentGuidesStroke",{dark:"#585858",light:"#a9a9a9",hcDark:"#a9a9a9",hcLight:"#a5a5a5"},c.kg("vs/platform/theme/common/colors/listColors","treeIndentGuidesStroke","Tree stroke color for the indentation guides.")),Fe=(d("tree.inactiveIndentGuidesStroke",m(Ee,.4),c.kg("vs/platform/theme/common/colors/listColors","treeInactiveIndentGuidesStroke","Tree stroke color for the indentation guides that are not active.")),d("tree.tableColumnsBorder",{dark:"#CCCCCC20",light:"#61616120",hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/listColors","tableColumnsBorder","Table border color between columns.")),d("tree.tableOddRowsBackground",{dark:m(C,.04),light:m(C,.04),hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/listColors","tableOddRowsBackgroundColor","Background color for odd table rows.")),d("editorActionList.background",R,c.kg("vs/platform/theme/common/colors/listColors","editorActionListBackground","Action List background color.")),d("editorActionList.foreground",D,c.kg("vs/platform/theme/common/colors/listColors","editorActionListForeground","Action List foreground color.")),d("editorActionList.focusForeground",Ce,c.kg("vs/platform/theme/common/colors/listColors","editorActionListFocusForeground","Action List foreground color for the focused item.")),d("editorActionList.focusBackground",we,c.kg("vs/platform/theme/common/colors/listColors","editorActionListFocusBackground","Action List background color for the focused item.")),d("menu.border",{dark:null,light:null,hcDark:x,hcLight:x},c.kg("vs/platform/theme/common/colors/menuColors","menuBorder","Border color of menus.")),d("menu.foreground",me,c.kg("vs/platform/theme/common/colors/menuColors","menuForeground","Foreground color of menu items.")),d("menu.background",pe,c.kg("vs/platform/theme/common/colors/menuColors","menuBackground","Background color of menu items.")),d("menu.selectionForeground",Ce,c.kg("vs/platform/theme/common/colors/menuColors","menuSelectionForeground","Foreground color of the selected menu item in menus.")),d("menu.selectionBackground",we,c.kg("vs/platform/theme/common/colors/menuColors","menuSelectionBackground","Background color of the selected menu item in menus.")),d("menu.selectionBorder",{dark:null,light:null,hcDark:S,hcLight:S},c.kg("vs/platform/theme/common/colors/menuColors","menuSelectionBorder","Border color of the selected menu item in menus.")),d("menu.separatorBackground",{dark:"#606060",light:"#D4D4D4",hcDark:x,hcLight:x},c.kg("vs/platform/theme/common/colors/menuColors","menuSeparatorBackground","Color of a separator menu item in menus.")),d("quickInput.background",R,c.kg("vs/platform/theme/common/colors/quickpickColors","pickerBackground","Quick picker background color. The quick picker widget is the container for pickers like the command palette.")),d("quickInput.foreground",D,c.kg("vs/platform/theme/common/colors/quickpickColors","pickerForeground","Quick picker foreground color. The quick picker widget is the container for pickers like the command palette.")),d("quickInputTitle.background",{dark:new s.Q1(new s.bU(255,255,255,.105)),light:new s.Q1(new s.bU(0,0,0,.06)),hcDark:"#000000",hcLight:s.Q1.white},c.kg("vs/platform/theme/common/colors/quickpickColors","pickerTitleBackground","Quick picker title background color. The quick picker widget is the container for pickers like the command palette.")),d("pickerGroup.foreground",{dark:"#3794FF",light:"#0066BF",hcDark:s.Q1.white,hcLight:"#0F4A85"},c.kg("vs/platform/theme/common/colors/quickpickColors","pickerGroupForeground","Quick picker color for grouping labels.")),d("pickerGroup.border",{dark:"#3F3F46",light:"#CCCEDB",hcDark:s.Q1.white,hcLight:"#0F4A85"},c.kg("vs/platform/theme/common/colors/quickpickColors","pickerGroupBorder","Quick picker color for grouping borders.")),d("quickInput.list.focusBackground",null,"",void 0,c.kg("vs/platform/theme/common/colors/quickpickColors","quickInput.list.focusBackground deprecation","Please use quickInputList.focusBackground instead")));d("quickInputList.focusForeground",Ce,c.kg("vs/platform/theme/common/colors/quickpickColors","quickInput.listFocusForeground","Quick picker foreground color for the focused item.")),d("quickInputList.focusIconForeground",_e,c.kg("vs/platform/theme/common/colors/quickpickColors","quickInput.listFocusIconForeground","Quick picker icon foreground color for the focused item.")),d("quickInputList.focusBackground",{dark:f(Fe,we),light:f(Fe,we),hcDark:null,hcLight:null},c.kg("vs/platform/theme/common/colors/quickpickColors","quickInput.listFocusBackground","Quick picker background color for the focused item.")),d("search.resultsInfoForeground",{light:C,dark:m(C,.65),hcDark:C,hcLight:C},c.kg("vs/platform/theme/common/colors/searchColors","search.resultsInfoForeground","Color of the text in the search viewlet's completion message.")),d("searchEditor.findMatchBackground",{light:m(U,.66),dark:m(U,.66),hcDark:U,hcLight:U},c.kg("vs/platform/theme/common/colors/searchColors","searchEditor.queryMatch","Color of the Search Editor query matches.")),d("searchEditor.findMatchBorder",{light:m($,.66),dark:m($,.66),hcDark:$,hcLight:$},c.kg("vs/platform/theme/common/colors/searchColors","searchEditor.editorFindMatchBorder","Border color of the Search Editor query matches."))},4901:(e,t,n)=>{"use strict";function r(e){return e<0?0:e>255?255:0|e}function i(e){return e<0?0:e>4294967295?4294967295:0|e}n.d(t,{W:()=>r,j:()=>i})},4945:(e,t,n)=>{"use strict";n.d(t,{rY:()=>C,ou:()=>w,dG:()=>k,OB:()=>x});var r=n(8386),i=(n(695),n(2373)),s=n(6274);class o{constructor(){this._tokenizationSupports=new Map,this._factories=new Map,this._onDidChange=new i.vl,this.onDidChange=this._onDidChange.event,this._colorMap=null}handleChange(e){this._onDidChange.fire({changedLanguages:e,changedColorMap:!1})}register(e,t){return this._tokenizationSupports.set(e,t),this.handleChange([e]),(0,s.s)(()=>{this._tokenizationSupports.get(e)===t&&(this._tokenizationSupports.delete(e),this.handleChange([e]))})}get(e){return this._tokenizationSupports.get(e)||null}registerFactory(e,t){this._factories.get(e)?.dispose();const n=new a(this,e,t);return this._factories.set(e,n),(0,s.s)(()=>{const t=this._factories.get(e);t&&t===n&&(this._factories.delete(e),t.dispose())})}async getOrCreate(e){const t=this.get(e);if(t)return t;const n=this._factories.get(e);return!n||n.isResolved?null:(await n.resolve(),this.get(e))}isResolved(e){if(this.get(e))return!0;const t=this._factories.get(e);return!(t&&!t.isResolved)}setColorMap(e){this._colorMap=e,this._onDidChange.fire({changedLanguages:Array.from(this._tokenizationSupports.keys()),changedColorMap:!0})}getColorMap(){return this._colorMap}getDefaultBackground(){return this._colorMap&&this._colorMap.length>2?this._colorMap[2]:null}}class a extends s.jG{get isResolved(){return this._isResolved}constructor(e,t,n){super(),this._registry=e,this._languageId=t,this._factory=n,this._isDisposed=!1,this._resolvePromise=null,this._isResolved=!1}dispose(){this._isDisposed=!0,super.dispose()}async resolve(){return this._resolvePromise||(this._resolvePromise=this._create()),this._resolvePromise}async _create(){const e=await this._factory.tokenizationSupport;this._isResolved=!0,e&&!this._isDisposed&&this._register(this._registry.register(this._languageId,e))}}var l,c,h,d,u,p,m,f,g,b,v,y=n(7703);class w{constructor(e,t,n){this.offset=e,this.type=t,this.language=n,this._tokenBrand=void 0}toString(){return"("+this.offset+", "+this.type+")"}}class C{constructor(e,t){this.tokens=e,this.endState=t,this._encodedTokenizationResultBrand=void 0}}!function(e){e[e.Increase=0]="Increase",e[e.Decrease=1]="Decrease"}(l||(l={})),function(e){const t=new Map;t.set(0,r.W.symbolMethod),t.set(1,r.W.symbolFunction),t.set(2,r.W.symbolConstructor),t.set(3,r.W.symbolField),t.set(4,r.W.symbolVariable),t.set(5,r.W.symbolClass),t.set(6,r.W.symbolStruct),t.set(7,r.W.symbolInterface),t.set(8,r.W.symbolModule),t.set(9,r.W.symbolProperty),t.set(10,r.W.symbolEvent),t.set(11,r.W.symbolOperator),t.set(12,r.W.symbolUnit),t.set(13,r.W.symbolValue),t.set(15,r.W.symbolEnum),t.set(14,r.W.symbolConstant),t.set(15,r.W.symbolEnum),t.set(16,r.W.symbolEnumMember),t.set(17,r.W.symbolKeyword),t.set(27,r.W.symbolSnippet),t.set(18,r.W.symbolText),t.set(19,r.W.symbolColor),t.set(20,r.W.symbolFile),t.set(21,r.W.symbolReference),t.set(22,r.W.symbolCustomColor),t.set(23,r.W.symbolFolder),t.set(24,r.W.symbolTypeParameter),t.set(25,r.W.account),t.set(26,r.W.issues),e.toIcon=function(e){let n=t.get(e);return n||(console.info("No codicon found for CompletionItemKind "+e),n=r.W.symbolProperty),n};const n=new Map;n.set("method",0),n.set("function",1),n.set("constructor",2),n.set("field",3),n.set("variable",4),n.set("class",5),n.set("struct",6),n.set("interface",7),n.set("module",8),n.set("property",9),n.set("event",10),n.set("operator",11),n.set("unit",12),n.set("value",13),n.set("constant",14),n.set("enum",15),n.set("enum-member",16),n.set("enumMember",16),n.set("keyword",17),n.set("snippet",27),n.set("text",18),n.set("color",19),n.set("file",20),n.set("reference",21),n.set("customcolor",22),n.set("folder",23),n.set("type-parameter",24),n.set("typeParameter",24),n.set("account",25),n.set("issue",26),e.fromString=function(e,t){let r=n.get(e);return void 0!==r||t||(r=9),r}}(c||(c={})),function(e){e[e.Automatic=0]="Automatic",e[e.Explicit=1]="Explicit"}(h||(h={})),function(e){e[e.Automatic=0]="Automatic",e[e.PasteAs=1]="PasteAs"}(d||(d={})),function(e){e[e.Invoke=1]="Invoke",e[e.TriggerCharacter=2]="TriggerCharacter",e[e.ContentChange=3]="ContentChange"}(u||(u={})),function(e){e[e.Text=0]="Text",e[e.Read=1]="Read",e[e.Write=2]="Write"}(p||(p={})),(0,y.kg)("vs/editor/common/languages","Array","array"),(0,y.kg)("vs/editor/common/languages","Boolean","boolean"),(0,y.kg)("vs/editor/common/languages","Class","class"),(0,y.kg)("vs/editor/common/languages","Constant","constant"),(0,y.kg)("vs/editor/common/languages","Constructor","constructor"),(0,y.kg)("vs/editor/common/languages","Enum","enumeration"),(0,y.kg)("vs/editor/common/languages","EnumMember","enumeration member"),(0,y.kg)("vs/editor/common/languages","Event","event"),(0,y.kg)("vs/editor/common/languages","Field","field"),(0,y.kg)("vs/editor/common/languages","File","file"),(0,y.kg)("vs/editor/common/languages","Function","function"),(0,y.kg)("vs/editor/common/languages","Interface","interface"),(0,y.kg)("vs/editor/common/languages","Key","key"),(0,y.kg)("vs/editor/common/languages","Method","method"),(0,y.kg)("vs/editor/common/languages","Module","module"),(0,y.kg)("vs/editor/common/languages","Namespace","namespace"),(0,y.kg)("vs/editor/common/languages","Null","null"),(0,y.kg)("vs/editor/common/languages","Number","number"),(0,y.kg)("vs/editor/common/languages","Object","object"),(0,y.kg)("vs/editor/common/languages","Operator","operator"),(0,y.kg)("vs/editor/common/languages","Package","package"),(0,y.kg)("vs/editor/common/languages","Property","property"),(0,y.kg)("vs/editor/common/languages","String","string"),(0,y.kg)("vs/editor/common/languages","Struct","struct"),(0,y.kg)("vs/editor/common/languages","TypeParameter","type parameter"),(0,y.kg)("vs/editor/common/languages","Variable","variable"),function(e){const t=new Map;t.set(0,r.W.symbolFile),t.set(1,r.W.symbolModule),t.set(2,r.W.symbolNamespace),t.set(3,r.W.symbolPackage),t.set(4,r.W.symbolClass),t.set(5,r.W.symbolMethod),t.set(6,r.W.symbolProperty),t.set(7,r.W.symbolField),t.set(8,r.W.symbolConstructor),t.set(9,r.W.symbolEnum),t.set(10,r.W.symbolInterface),t.set(11,r.W.symbolFunction),t.set(12,r.W.symbolVariable),t.set(13,r.W.symbolConstant),t.set(14,r.W.symbolString),t.set(15,r.W.symbolNumber),t.set(16,r.W.symbolBoolean),t.set(17,r.W.symbolArray),t.set(18,r.W.symbolObject),t.set(19,r.W.symbolKey),t.set(20,r.W.symbolNull),t.set(21,r.W.symbolEnumMember),t.set(22,r.W.symbolStruct),t.set(23,r.W.symbolEvent),t.set(24,r.W.symbolOperator),t.set(25,r.W.symbolTypeParameter),e.toIcon=function(e){let n=t.get(e);return n||(console.info("No codicon found for SymbolKind "+e),n=r.W.symbolProperty),n}}(m||(m={}));class _{static{this.Comment=new _("comment")}static{this.Imports=new _("imports")}static{this.Region=new _("region")}static fromValue(e){switch(e){case"comment":return _.Comment;case"imports":return _.Imports;case"region":return _.Region}return new _(e)}constructor(e){this.value=e}}!function(e){e[e.AIGenerated=1]="AIGenerated"}(f||(f={})),function(e){e[e.Invoke=0]="Invoke",e[e.Automatic=1]="Automatic"}(g||(g={})),function(e){e.is=function(e){return!(!e||"object"!=typeof e)&&"string"==typeof e.id&&"string"==typeof e.title}}(b||(b={})),function(e){e[e.Type=1]="Type",e[e.Parameter=2]="Parameter"}(v||(v={}));const k=new o,x=new o;var S;!function(e){e[e.Invoke=0]="Invoke",e[e.Automatic=1]="Automatic"}(S||(S={}))},5021:(e,t,n)=>{var r={"./editorBaseApi":7317,"./editorBaseApi.js":7317,"./editorSimpleWorker":2803,"./editorSimpleWorker.js":2803,"./editorWorker":2919,"./editorWorker.js":2919,"./editorWorkerHost":3085,"./editorWorkerHost.js":3085,"./findSectionHeaders":8332,"./findSectionHeaders.js":8332,"./getIconClasses":8123,"./getIconClasses.js":8123,"./languageFeatureDebounce":9208,"./languageFeatureDebounce.js":9208,"./languageFeatures":6461,"./languageFeatures.js":6461,"./languageFeaturesService":8258,"./languageFeaturesService.js":8258,"./languageService":1408,"./languageService.js":1408,"./languagesAssociations":6357,"./languagesAssociations.js":6357,"./languagesRegistry":6506,"./languagesRegistry.js":6506,"./markerDecorations":5563,"./markerDecorations.js":5563,"./markerDecorationsService":8476,"./markerDecorationsService.js":8476,"./model":887,"./model.js":887,"./modelService":9796,"./modelService.js":9796,"./resolverService":8707,"./resolverService.js":8707,"./semanticTokensDto":2013,"./semanticTokensDto.js":2013,"./semanticTokensProviderStyling":7975,"./semanticTokensProviderStyling.js":7975,"./semanticTokensStyling":3182,"./semanticTokensStyling.js":3182,"./semanticTokensStylingService":803,"./semanticTokensStylingService.js":803,"./textModelSync/textModelSync.impl":9956,"./textModelSync/textModelSync.impl.js":9956,"./textModelSync/textModelSync.protocol":3051,"./textModelSync/textModelSync.protocol.js":3051,"./textResourceConfiguration":6693,"./textResourceConfiguration.js":6693,"./treeSitterParserService":9241,"./treeSitterParserService.js":9241,"./treeViewsDnd":9268,"./treeViewsDnd.js":9268,"./treeViewsDndService":8685,"./treeViewsDndService.js":8685,"./unicodeTextModelHighlighter":5050,"./unicodeTextModelHighlighter.js":5050};function i(e){var t=s(e);return n(t)}function s(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}i.keys=function(){return Object.keys(r)},i.resolve=s,e.exports=i,i.id=5021},5050:(e,t,n)=>{"use strict";n.r(t),n.d(t,{UnicodeTextModelHighlighter:()=>l});var r=n(800),i=n(9182),s=n(5603),o=n(867),a=n(8281);class l{static computeUnicodeHighlights(e,t,n){const l=n?n.startLineNumber:1,h=n?n.endLineNumber:e.getLineCount(),d=new c(t),u=d.getCandidateCodePoints();let p;var m;p="allNonBasicAscii"===u?new RegExp("[^\\t\\n\\r\\x20-\\x7E]","g"):new RegExp((m=Array.from(u),`[${s.bm(m.map(e=>String.fromCodePoint(e)).join(""))}]`),"g");const f=new i.W5(null,p),g=[];let b,v=!1,y=0,w=0,C=0;e:for(let t=l,n=h;t<=n;t++){const n=e.getLineContent(t),i=n.length;f.reset(0);do{if(b=f.next(n),b){let e=b.index,l=b.index+b[0].length;if(e>0){const t=n.charCodeAt(e-1);s.pc(t)&&e--}if(l+1=n){v=!0;break e}g.push(new r.Q(t,e+1,t,l+1))}}}while(b)}return{ranges:g,hasMore:v,ambiguousCharacterCount:y,invisibleCharacterCount:w,nonBasicAsciiCharacterCount:C}}static computeUnicodeHighlightReason(e,t){const n=new c(t);switch(n.shouldHighlightNonBasicASCII(e,null)){case 0:return null;case 2:return{kind:1};case 3:{const r=e.codePointAt(0),i=n.ambiguousCharacters.getPrimaryConfusable(r),o=s.tl.getLocales().filter(e=>!s.tl.getInstance(new Set([...t.allowedLocales,e])).isAmbiguous(r));return{kind:0,confusableWith:String.fromCodePoint(i),notAmbiguousInLocales:o}}case 1:return{kind:2}}}}class c{constructor(e){this.options=e,this.allowedCodePoints=new Set(e.allowedCodePoints),this.ambiguousCharacters=s.tl.getInstance(new Set(e.allowedLocales))}getCandidateCodePoints(){if(this.options.nonBasicASCII)return"allNonBasicAscii";const e=new Set;if(this.options.invisibleCharacters)for(const t of s.y_.codePoints)h(String.fromCodePoint(t))||e.add(t);if(this.options.ambiguousCharacters)for(const t of this.ambiguousCharacters.getConfusableCodePoints())e.add(t);for(const t of this.allowedCodePoints)e.delete(t);return e}shouldHighlightNonBasicASCII(e,t){const n=e.codePointAt(0);if(this.allowedCodePoints.has(n))return 0;if(this.options.nonBasicASCII)return 1;let r=!1,i=!1;if(t)for(const e of t){const t=e.codePointAt(0),n=s.aC(e);r=r||n,n||this.ambiguousCharacters.isAmbiguous(t)||s.y_.isInvisibleCharacter(t)||(i=!0)}return!r&&i?0:this.options.invisibleCharacters&&!h(e)&&s.y_.isInvisibleCharacter(n)?2:this.options.ambiguousCharacters&&this.ambiguousCharacters.isAmbiguous(n)?3:0}}function h(e){return" "===e||"\n"===e||"\t"===e}},5352:(e,t,n)=>{"use strict";n.d(t,{O:()=>s});var r=n(867),i=n(2548);const s=new class{constructor(){this.data=new Map}add(e,t){r.ok(i.Kg(e)),r.ok(i.Gv(t)),r.ok(!this.data.has(e),"There is already an extension with this id"),this.data.set(e,t)}as(e){return this.data.get(e)||null}}},5563:(e,t,n)=>{"use strict";n.r(t),n.d(t,{IMarkerDecorationsService:()=>r});const r=(0,n(7352).u1)("markerDecorationsService")},5603:(e,t,n)=>{"use strict";n.d(t,{$X:()=>R,AV:()=>s,E_:()=>L,HG:()=>u,LJ:()=>_,LU:()=>O,NB:()=>l,OS:()=>c,Q_:()=>y,Ss:()=>A,UD:()=>m,Wv:()=>v,Z5:()=>x,_J:()=>N,aC:()=>T,bm:()=>a,eY:()=>h,jy:()=>o,km:()=>E,lT:()=>p,ne:()=>D,ns:()=>w,pc:()=>C,r_:()=>M,tk:()=>z,tl:()=>W,uz:()=>d,y_:()=>V,z_:()=>k});var r=n(1883),i=n(2323);function s(e){return!e||"string"!=typeof e||0===e.trim().length}function o(e){return e.replace(/[<>"'&]/g,e=>{switch(e){case"<":return"<";case">":return">";case'"':return""";case"'":return"'";case"&":return"&"}return e})}function a(e){return e.replace(/[\\\{\}\*\+\?\|\^\$\.\[\]\(\)]/g,"\\$&")}function l(e,t){if(!e||!t)return e;const n=t.length;if(0===n||0===e.length)return e;let r=0;for(;e.indexOf(t,r)===r;)r+=n;return e.substring(r)}function c(e,t,n={}){if(!e)throw new Error("Cannot create regex from empty string");t||(e=a(e)),n.wholeWord&&(/\B/.test(e.charAt(0))||(e="\\b"+e),/\B/.test(e.charAt(e.length-1))||(e+="\\b"));let r="";return n.global&&(r+="g"),n.matchCase||(r+="i"),n.multiline&&(r+="m"),n.unicode&&(r+="u"),new RegExp(e,r)}function h(e){return"^"!==e.source&&"^$"!==e.source&&"$"!==e.source&&"^\\s*$"!==e.source&&!(!e.exec("")||0!==e.lastIndex)}function d(e){return e.split(/\r\n|\r|\n/)}function u(e){for(let t=0,n=e.length;t=0;n--){const t=e.charCodeAt(n);if(32!==t&&9!==t)return n}return-1}function m(e,t){return et?1:0}function f(e,t,n=0,r=e.length,i=0,s=t.length){for(;ns)return 1}const o=r-n,a=s-i;return oa?1:0}function g(e,t,n=0,r=e.length,i=0,s=t.length){for(;n=128||a>=128)return f(e.toLowerCase(),t.toLowerCase(),n,r,i,s);b(o)&&(o-=32),b(a)&&(a-=32);const l=o-a;if(0!==l)return l}const o=r-n,a=s-i;return oa?1:0}function b(e){return e>=97&&e<=122}function v(e){return e>=65&&e<=90}function y(e,t){return e.length===t.length&&0===g(e,t)}function w(e,t){const n=t.length;return!(t.length>e.length)&&0===g(e,t,0,n)}function C(e){return 55296<=e&&e<=56319}function _(e){return 56320<=e&&e<=57343}function k(e,t){return t-56320+(e-55296<<10)+65536}function x(e,t,n){const r=e.charCodeAt(n);if(C(r)&&n+11){const r=e.charCodeAt(t-2);if(C(r))return k(r,n)}return n}(this._str,this._offset);return this._offset-=e>=65536?2:1,e}nextCodePoint(){const e=x(this._str,this._len,this._offset);return this._offset+=e>=65536?2:1,e}eol(){return this._offset>=this._len}}class E{get offset(){return this._iterator.offset}constructor(e,t=0){this._iterator=new S(e,t)}nextGraphemeLength(){const e=B.getInstance(),t=this._iterator,n=t.offset;let r=e.getGraphemeBreakType(t.nextCodePoint());for(;!t.eol();){const n=t.offset,i=e.getGraphemeBreakType(t.nextCodePoint());if(P(r,i)){t.setOffset(n);break}r=i}return t.offset-n}prevGraphemeLength(){const e=B.getInstance(),t=this._iterator,n=t.offset;let r=e.getGraphemeBreakType(t.prevCodePoint());for(;t.offset>0;){const n=t.offset,i=e.getGraphemeBreakType(t.prevCodePoint());if(P(i,r)){t.setOffset(n);break}r=i}return n-t.offset}eol(){return this._iterator.eol()}}let F;function L(e){return F||(F=/(?:[\u05BE\u05C0\u05C3\u05C6\u05D0-\u05F4\u0608\u060B\u060D\u061B-\u064A\u066D-\u066F\u0671-\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u0710\u0712-\u072F\u074D-\u07A5\u07B1-\u07EA\u07F4\u07F5\u07FA\u07FE-\u0815\u081A\u0824\u0828\u0830-\u0858\u085E-\u088E\u08A0-\u08C9\u200F\uFB1D\uFB1F-\uFB28\uFB2A-\uFD3D\uFD50-\uFDC7\uFDF0-\uFDFC\uFE70-\uFEFC]|\uD802[\uDC00-\uDD1B\uDD20-\uDE00\uDE10-\uDE35\uDE40-\uDEE4\uDEEB-\uDF35\uDF40-\uDFFF]|\uD803[\uDC00-\uDD23\uDE80-\uDEA9\uDEAD-\uDF45\uDF51-\uDF81\uDF86-\uDFF6]|\uD83A[\uDC00-\uDCCF\uDD00-\uDD43\uDD4B-\uDFFF]|\uD83B[\uDC00-\uDEBB])/),F.test(e)}const I=/^[\t\n\r\x20-\x7E]*$/;function T(e){return I.test(e)}const N=/[\u2028\u2029]/;function R(e){return N.test(e)}function D(e){return e>=11904&&e<=55215||e>=63744&&e<=64255||e>=65281&&e<=65374}function A(e){return e>=127462&&e<=127487||8986===e||8987===e||9200===e||9203===e||e>=9728&&e<=10175||11088===e||11093===e||e>=127744&&e<=128591||e>=128640&&e<=128764||e>=128992&&e<=129008||e>=129280&&e<=129535||e>=129648&&e<=129782}const M=String.fromCharCode(65279);function O(e){return!!(e&&e.length>0&&65279===e.charCodeAt(0))}function z(e){return(e%=52)<26?String.fromCharCode(97+e):String.fromCharCode(65+e-26)}function P(e,t){return 0===e?5!==t&&7!==t:!(2===e&&3===t||4!==e&&2!==e&&3!==e&&4!==t&&2!==t&&3!==t&&(8===e&&(8===t||9===t||11===t||12===t)||!(11!==e&&9!==e||9!==t&&10!==t)||(12===e||10===e)&&10===t||5===t||13===t||7===t||1===e||13===e&&14===t||6===e&&6===t))}class B{static{this._INSTANCE=null}static getInstance(){return B._INSTANCE||(B._INSTANCE=new B),B._INSTANCE}constructor(){this._data=JSON.parse("[0,0,0,51229,51255,12,44061,44087,12,127462,127487,6,7083,7085,5,47645,47671,12,54813,54839,12,128678,128678,14,3270,3270,5,9919,9923,14,45853,45879,12,49437,49463,12,53021,53047,12,71216,71218,7,128398,128399,14,129360,129374,14,2519,2519,5,4448,4519,9,9742,9742,14,12336,12336,14,44957,44983,12,46749,46775,12,48541,48567,12,50333,50359,12,52125,52151,12,53917,53943,12,69888,69890,5,73018,73018,5,127990,127990,14,128558,128559,14,128759,128760,14,129653,129655,14,2027,2035,5,2891,2892,7,3761,3761,5,6683,6683,5,8293,8293,4,9825,9826,14,9999,9999,14,43452,43453,5,44509,44535,12,45405,45431,12,46301,46327,12,47197,47223,12,48093,48119,12,48989,49015,12,49885,49911,12,50781,50807,12,51677,51703,12,52573,52599,12,53469,53495,12,54365,54391,12,65279,65279,4,70471,70472,7,72145,72147,7,119173,119179,5,127799,127818,14,128240,128244,14,128512,128512,14,128652,128652,14,128721,128722,14,129292,129292,14,129445,129450,14,129734,129743,14,1476,1477,5,2366,2368,7,2750,2752,7,3076,3076,5,3415,3415,5,4141,4144,5,6109,6109,5,6964,6964,5,7394,7400,5,9197,9198,14,9770,9770,14,9877,9877,14,9968,9969,14,10084,10084,14,43052,43052,5,43713,43713,5,44285,44311,12,44733,44759,12,45181,45207,12,45629,45655,12,46077,46103,12,46525,46551,12,46973,46999,12,47421,47447,12,47869,47895,12,48317,48343,12,48765,48791,12,49213,49239,12,49661,49687,12,50109,50135,12,50557,50583,12,51005,51031,12,51453,51479,12,51901,51927,12,52349,52375,12,52797,52823,12,53245,53271,12,53693,53719,12,54141,54167,12,54589,54615,12,55037,55063,12,69506,69509,5,70191,70193,5,70841,70841,7,71463,71467,5,72330,72342,5,94031,94031,5,123628,123631,5,127763,127765,14,127941,127941,14,128043,128062,14,128302,128317,14,128465,128467,14,128539,128539,14,128640,128640,14,128662,128662,14,128703,128703,14,128745,128745,14,129004,129007,14,129329,129330,14,129402,129402,14,129483,129483,14,129686,129704,14,130048,131069,14,173,173,4,1757,1757,1,2200,2207,5,2434,2435,7,2631,2632,5,2817,2817,5,3008,3008,5,3201,3201,5,3387,3388,5,3542,3542,5,3902,3903,7,4190,4192,5,6002,6003,5,6439,6440,5,6765,6770,7,7019,7027,5,7154,7155,7,8205,8205,13,8505,8505,14,9654,9654,14,9757,9757,14,9792,9792,14,9852,9853,14,9890,9894,14,9937,9937,14,9981,9981,14,10035,10036,14,11035,11036,14,42654,42655,5,43346,43347,7,43587,43587,5,44006,44007,7,44173,44199,12,44397,44423,12,44621,44647,12,44845,44871,12,45069,45095,12,45293,45319,12,45517,45543,12,45741,45767,12,45965,45991,12,46189,46215,12,46413,46439,12,46637,46663,12,46861,46887,12,47085,47111,12,47309,47335,12,47533,47559,12,47757,47783,12,47981,48007,12,48205,48231,12,48429,48455,12,48653,48679,12,48877,48903,12,49101,49127,12,49325,49351,12,49549,49575,12,49773,49799,12,49997,50023,12,50221,50247,12,50445,50471,12,50669,50695,12,50893,50919,12,51117,51143,12,51341,51367,12,51565,51591,12,51789,51815,12,52013,52039,12,52237,52263,12,52461,52487,12,52685,52711,12,52909,52935,12,53133,53159,12,53357,53383,12,53581,53607,12,53805,53831,12,54029,54055,12,54253,54279,12,54477,54503,12,54701,54727,12,54925,54951,12,55149,55175,12,68101,68102,5,69762,69762,7,70067,70069,7,70371,70378,5,70720,70721,7,71087,71087,5,71341,71341,5,71995,71996,5,72249,72249,7,72850,72871,5,73109,73109,5,118576,118598,5,121505,121519,5,127245,127247,14,127568,127569,14,127777,127777,14,127872,127891,14,127956,127967,14,128015,128016,14,128110,128172,14,128259,128259,14,128367,128368,14,128424,128424,14,128488,128488,14,128530,128532,14,128550,128551,14,128566,128566,14,128647,128647,14,128656,128656,14,128667,128673,14,128691,128693,14,128715,128715,14,128728,128732,14,128752,128752,14,128765,128767,14,129096,129103,14,129311,129311,14,129344,129349,14,129394,129394,14,129413,129425,14,129466,129471,14,129511,129535,14,129664,129666,14,129719,129722,14,129760,129767,14,917536,917631,5,13,13,2,1160,1161,5,1564,1564,4,1807,1807,1,2085,2087,5,2307,2307,7,2382,2383,7,2497,2500,5,2563,2563,7,2677,2677,5,2763,2764,7,2879,2879,5,2914,2915,5,3021,3021,5,3142,3144,5,3263,3263,5,3285,3286,5,3398,3400,7,3530,3530,5,3633,3633,5,3864,3865,5,3974,3975,5,4155,4156,7,4229,4230,5,5909,5909,7,6078,6085,7,6277,6278,5,6451,6456,7,6744,6750,5,6846,6846,5,6972,6972,5,7074,7077,5,7146,7148,7,7222,7223,5,7416,7417,5,8234,8238,4,8417,8417,5,9000,9000,14,9203,9203,14,9730,9731,14,9748,9749,14,9762,9763,14,9776,9783,14,9800,9811,14,9831,9831,14,9872,9873,14,9882,9882,14,9900,9903,14,9929,9933,14,9941,9960,14,9974,9974,14,9989,9989,14,10006,10006,14,10062,10062,14,10160,10160,14,11647,11647,5,12953,12953,14,43019,43019,5,43232,43249,5,43443,43443,5,43567,43568,7,43696,43696,5,43765,43765,7,44013,44013,5,44117,44143,12,44229,44255,12,44341,44367,12,44453,44479,12,44565,44591,12,44677,44703,12,44789,44815,12,44901,44927,12,45013,45039,12,45125,45151,12,45237,45263,12,45349,45375,12,45461,45487,12,45573,45599,12,45685,45711,12,45797,45823,12,45909,45935,12,46021,46047,12,46133,46159,12,46245,46271,12,46357,46383,12,46469,46495,12,46581,46607,12,46693,46719,12,46805,46831,12,46917,46943,12,47029,47055,12,47141,47167,12,47253,47279,12,47365,47391,12,47477,47503,12,47589,47615,12,47701,47727,12,47813,47839,12,47925,47951,12,48037,48063,12,48149,48175,12,48261,48287,12,48373,48399,12,48485,48511,12,48597,48623,12,48709,48735,12,48821,48847,12,48933,48959,12,49045,49071,12,49157,49183,12,49269,49295,12,49381,49407,12,49493,49519,12,49605,49631,12,49717,49743,12,49829,49855,12,49941,49967,12,50053,50079,12,50165,50191,12,50277,50303,12,50389,50415,12,50501,50527,12,50613,50639,12,50725,50751,12,50837,50863,12,50949,50975,12,51061,51087,12,51173,51199,12,51285,51311,12,51397,51423,12,51509,51535,12,51621,51647,12,51733,51759,12,51845,51871,12,51957,51983,12,52069,52095,12,52181,52207,12,52293,52319,12,52405,52431,12,52517,52543,12,52629,52655,12,52741,52767,12,52853,52879,12,52965,52991,12,53077,53103,12,53189,53215,12,53301,53327,12,53413,53439,12,53525,53551,12,53637,53663,12,53749,53775,12,53861,53887,12,53973,53999,12,54085,54111,12,54197,54223,12,54309,54335,12,54421,54447,12,54533,54559,12,54645,54671,12,54757,54783,12,54869,54895,12,54981,55007,12,55093,55119,12,55243,55291,10,66045,66045,5,68325,68326,5,69688,69702,5,69817,69818,5,69957,69958,7,70089,70092,5,70198,70199,5,70462,70462,5,70502,70508,5,70750,70750,5,70846,70846,7,71100,71101,5,71230,71230,7,71351,71351,5,71737,71738,5,72000,72000,7,72160,72160,5,72273,72278,5,72752,72758,5,72882,72883,5,73031,73031,5,73461,73462,7,94192,94193,7,119149,119149,7,121403,121452,5,122915,122916,5,126980,126980,14,127358,127359,14,127535,127535,14,127759,127759,14,127771,127771,14,127792,127793,14,127825,127867,14,127897,127899,14,127945,127945,14,127985,127986,14,128000,128007,14,128021,128021,14,128066,128100,14,128184,128235,14,128249,128252,14,128266,128276,14,128335,128335,14,128379,128390,14,128407,128419,14,128444,128444,14,128481,128481,14,128499,128499,14,128526,128526,14,128536,128536,14,128543,128543,14,128556,128556,14,128564,128564,14,128577,128580,14,128643,128645,14,128649,128649,14,128654,128654,14,128660,128660,14,128664,128664,14,128675,128675,14,128686,128689,14,128695,128696,14,128705,128709,14,128717,128719,14,128725,128725,14,128736,128741,14,128747,128748,14,128755,128755,14,128762,128762,14,128981,128991,14,129009,129023,14,129160,129167,14,129296,129304,14,129320,129327,14,129340,129342,14,129356,129356,14,129388,129392,14,129399,129400,14,129404,129407,14,129432,129442,14,129454,129455,14,129473,129474,14,129485,129487,14,129648,129651,14,129659,129660,14,129671,129679,14,129709,129711,14,129728,129730,14,129751,129753,14,129776,129782,14,917505,917505,4,917760,917999,5,10,10,3,127,159,4,768,879,5,1471,1471,5,1536,1541,1,1648,1648,5,1767,1768,5,1840,1866,5,2070,2073,5,2137,2139,5,2274,2274,1,2363,2363,7,2377,2380,7,2402,2403,5,2494,2494,5,2507,2508,7,2558,2558,5,2622,2624,7,2641,2641,5,2691,2691,7,2759,2760,5,2786,2787,5,2876,2876,5,2881,2884,5,2901,2902,5,3006,3006,5,3014,3016,7,3072,3072,5,3134,3136,5,3157,3158,5,3260,3260,5,3266,3266,5,3274,3275,7,3328,3329,5,3391,3392,7,3405,3405,5,3457,3457,5,3536,3537,7,3551,3551,5,3636,3642,5,3764,3772,5,3895,3895,5,3967,3967,7,3993,4028,5,4146,4151,5,4182,4183,7,4226,4226,5,4253,4253,5,4957,4959,5,5940,5940,7,6070,6070,7,6087,6088,7,6158,6158,4,6432,6434,5,6448,6449,7,6679,6680,5,6742,6742,5,6754,6754,5,6783,6783,5,6912,6915,5,6966,6970,5,6978,6978,5,7042,7042,7,7080,7081,5,7143,7143,7,7150,7150,7,7212,7219,5,7380,7392,5,7412,7412,5,8203,8203,4,8232,8232,4,8265,8265,14,8400,8412,5,8421,8432,5,8617,8618,14,9167,9167,14,9200,9200,14,9410,9410,14,9723,9726,14,9733,9733,14,9745,9745,14,9752,9752,14,9760,9760,14,9766,9766,14,9774,9774,14,9786,9786,14,9794,9794,14,9823,9823,14,9828,9828,14,9833,9850,14,9855,9855,14,9875,9875,14,9880,9880,14,9885,9887,14,9896,9897,14,9906,9916,14,9926,9927,14,9935,9935,14,9939,9939,14,9962,9962,14,9972,9972,14,9978,9978,14,9986,9986,14,9997,9997,14,10002,10002,14,10017,10017,14,10055,10055,14,10071,10071,14,10133,10135,14,10548,10549,14,11093,11093,14,12330,12333,5,12441,12442,5,42608,42610,5,43010,43010,5,43045,43046,5,43188,43203,7,43302,43309,5,43392,43394,5,43446,43449,5,43493,43493,5,43571,43572,7,43597,43597,7,43703,43704,5,43756,43757,5,44003,44004,7,44009,44010,7,44033,44059,12,44089,44115,12,44145,44171,12,44201,44227,12,44257,44283,12,44313,44339,12,44369,44395,12,44425,44451,12,44481,44507,12,44537,44563,12,44593,44619,12,44649,44675,12,44705,44731,12,44761,44787,12,44817,44843,12,44873,44899,12,44929,44955,12,44985,45011,12,45041,45067,12,45097,45123,12,45153,45179,12,45209,45235,12,45265,45291,12,45321,45347,12,45377,45403,12,45433,45459,12,45489,45515,12,45545,45571,12,45601,45627,12,45657,45683,12,45713,45739,12,45769,45795,12,45825,45851,12,45881,45907,12,45937,45963,12,45993,46019,12,46049,46075,12,46105,46131,12,46161,46187,12,46217,46243,12,46273,46299,12,46329,46355,12,46385,46411,12,46441,46467,12,46497,46523,12,46553,46579,12,46609,46635,12,46665,46691,12,46721,46747,12,46777,46803,12,46833,46859,12,46889,46915,12,46945,46971,12,47001,47027,12,47057,47083,12,47113,47139,12,47169,47195,12,47225,47251,12,47281,47307,12,47337,47363,12,47393,47419,12,47449,47475,12,47505,47531,12,47561,47587,12,47617,47643,12,47673,47699,12,47729,47755,12,47785,47811,12,47841,47867,12,47897,47923,12,47953,47979,12,48009,48035,12,48065,48091,12,48121,48147,12,48177,48203,12,48233,48259,12,48289,48315,12,48345,48371,12,48401,48427,12,48457,48483,12,48513,48539,12,48569,48595,12,48625,48651,12,48681,48707,12,48737,48763,12,48793,48819,12,48849,48875,12,48905,48931,12,48961,48987,12,49017,49043,12,49073,49099,12,49129,49155,12,49185,49211,12,49241,49267,12,49297,49323,12,49353,49379,12,49409,49435,12,49465,49491,12,49521,49547,12,49577,49603,12,49633,49659,12,49689,49715,12,49745,49771,12,49801,49827,12,49857,49883,12,49913,49939,12,49969,49995,12,50025,50051,12,50081,50107,12,50137,50163,12,50193,50219,12,50249,50275,12,50305,50331,12,50361,50387,12,50417,50443,12,50473,50499,12,50529,50555,12,50585,50611,12,50641,50667,12,50697,50723,12,50753,50779,12,50809,50835,12,50865,50891,12,50921,50947,12,50977,51003,12,51033,51059,12,51089,51115,12,51145,51171,12,51201,51227,12,51257,51283,12,51313,51339,12,51369,51395,12,51425,51451,12,51481,51507,12,51537,51563,12,51593,51619,12,51649,51675,12,51705,51731,12,51761,51787,12,51817,51843,12,51873,51899,12,51929,51955,12,51985,52011,12,52041,52067,12,52097,52123,12,52153,52179,12,52209,52235,12,52265,52291,12,52321,52347,12,52377,52403,12,52433,52459,12,52489,52515,12,52545,52571,12,52601,52627,12,52657,52683,12,52713,52739,12,52769,52795,12,52825,52851,12,52881,52907,12,52937,52963,12,52993,53019,12,53049,53075,12,53105,53131,12,53161,53187,12,53217,53243,12,53273,53299,12,53329,53355,12,53385,53411,12,53441,53467,12,53497,53523,12,53553,53579,12,53609,53635,12,53665,53691,12,53721,53747,12,53777,53803,12,53833,53859,12,53889,53915,12,53945,53971,12,54001,54027,12,54057,54083,12,54113,54139,12,54169,54195,12,54225,54251,12,54281,54307,12,54337,54363,12,54393,54419,12,54449,54475,12,54505,54531,12,54561,54587,12,54617,54643,12,54673,54699,12,54729,54755,12,54785,54811,12,54841,54867,12,54897,54923,12,54953,54979,12,55009,55035,12,55065,55091,12,55121,55147,12,55177,55203,12,65024,65039,5,65520,65528,4,66422,66426,5,68152,68154,5,69291,69292,5,69633,69633,5,69747,69748,5,69811,69814,5,69826,69826,5,69932,69932,7,70016,70017,5,70079,70080,7,70095,70095,5,70196,70196,5,70367,70367,5,70402,70403,7,70464,70464,5,70487,70487,5,70709,70711,7,70725,70725,7,70833,70834,7,70843,70844,7,70849,70849,7,71090,71093,5,71103,71104,5,71227,71228,7,71339,71339,5,71344,71349,5,71458,71461,5,71727,71735,5,71985,71989,7,71998,71998,5,72002,72002,7,72154,72155,5,72193,72202,5,72251,72254,5,72281,72283,5,72344,72345,5,72766,72766,7,72874,72880,5,72885,72886,5,73023,73029,5,73104,73105,5,73111,73111,5,92912,92916,5,94095,94098,5,113824,113827,4,119142,119142,7,119155,119162,4,119362,119364,5,121476,121476,5,122888,122904,5,123184,123190,5,125252,125258,5,127183,127183,14,127340,127343,14,127377,127386,14,127491,127503,14,127548,127551,14,127744,127756,14,127761,127761,14,127769,127769,14,127773,127774,14,127780,127788,14,127796,127797,14,127820,127823,14,127869,127869,14,127894,127895,14,127902,127903,14,127943,127943,14,127947,127950,14,127972,127972,14,127988,127988,14,127992,127994,14,128009,128011,14,128019,128019,14,128023,128041,14,128064,128064,14,128102,128107,14,128174,128181,14,128238,128238,14,128246,128247,14,128254,128254,14,128264,128264,14,128278,128299,14,128329,128330,14,128348,128359,14,128371,128377,14,128392,128393,14,128401,128404,14,128421,128421,14,128433,128434,14,128450,128452,14,128476,128478,14,128483,128483,14,128495,128495,14,128506,128506,14,128519,128520,14,128528,128528,14,128534,128534,14,128538,128538,14,128540,128542,14,128544,128549,14,128552,128555,14,128557,128557,14,128560,128563,14,128565,128565,14,128567,128576,14,128581,128591,14,128641,128642,14,128646,128646,14,128648,128648,14,128650,128651,14,128653,128653,14,128655,128655,14,128657,128659,14,128661,128661,14,128663,128663,14,128665,128666,14,128674,128674,14,128676,128677,14,128679,128685,14,128690,128690,14,128694,128694,14,128697,128702,14,128704,128704,14,128710,128714,14,128716,128716,14,128720,128720,14,128723,128724,14,128726,128727,14,128733,128735,14,128742,128744,14,128746,128746,14,128749,128751,14,128753,128754,14,128756,128758,14,128761,128761,14,128763,128764,14,128884,128895,14,128992,129003,14,129008,129008,14,129036,129039,14,129114,129119,14,129198,129279,14,129293,129295,14,129305,129310,14,129312,129319,14,129328,129328,14,129331,129338,14,129343,129343,14,129351,129355,14,129357,129359,14,129375,129387,14,129393,129393,14,129395,129398,14,129401,129401,14,129403,129403,14,129408,129412,14,129426,129431,14,129443,129444,14,129451,129453,14,129456,129465,14,129472,129472,14,129475,129482,14,129484,129484,14,129488,129510,14,129536,129647,14,129652,129652,14,129656,129658,14,129661,129663,14,129667,129670,14,129680,129685,14,129705,129708,14,129712,129718,14,129723,129727,14,129731,129733,14,129744,129750,14,129754,129759,14,129768,129775,14,129783,129791,14,917504,917504,4,917506,917535,4,917632,917759,4,918000,921599,4,0,9,4,11,12,4,14,31,4,169,169,14,174,174,14,1155,1159,5,1425,1469,5,1473,1474,5,1479,1479,5,1552,1562,5,1611,1631,5,1750,1756,5,1759,1764,5,1770,1773,5,1809,1809,5,1958,1968,5,2045,2045,5,2075,2083,5,2089,2093,5,2192,2193,1,2250,2273,5,2275,2306,5,2362,2362,5,2364,2364,5,2369,2376,5,2381,2381,5,2385,2391,5,2433,2433,5,2492,2492,5,2495,2496,7,2503,2504,7,2509,2509,5,2530,2531,5,2561,2562,5,2620,2620,5,2625,2626,5,2635,2637,5,2672,2673,5,2689,2690,5,2748,2748,5,2753,2757,5,2761,2761,7,2765,2765,5,2810,2815,5,2818,2819,7,2878,2878,5,2880,2880,7,2887,2888,7,2893,2893,5,2903,2903,5,2946,2946,5,3007,3007,7,3009,3010,7,3018,3020,7,3031,3031,5,3073,3075,7,3132,3132,5,3137,3140,7,3146,3149,5,3170,3171,5,3202,3203,7,3262,3262,7,3264,3265,7,3267,3268,7,3271,3272,7,3276,3277,5,3298,3299,5,3330,3331,7,3390,3390,5,3393,3396,5,3402,3404,7,3406,3406,1,3426,3427,5,3458,3459,7,3535,3535,5,3538,3540,5,3544,3550,7,3570,3571,7,3635,3635,7,3655,3662,5,3763,3763,7,3784,3789,5,3893,3893,5,3897,3897,5,3953,3966,5,3968,3972,5,3981,3991,5,4038,4038,5,4145,4145,7,4153,4154,5,4157,4158,5,4184,4185,5,4209,4212,5,4228,4228,7,4237,4237,5,4352,4447,8,4520,4607,10,5906,5908,5,5938,5939,5,5970,5971,5,6068,6069,5,6071,6077,5,6086,6086,5,6089,6099,5,6155,6157,5,6159,6159,5,6313,6313,5,6435,6438,7,6441,6443,7,6450,6450,5,6457,6459,5,6681,6682,7,6741,6741,7,6743,6743,7,6752,6752,5,6757,6764,5,6771,6780,5,6832,6845,5,6847,6862,5,6916,6916,7,6965,6965,5,6971,6971,7,6973,6977,7,6979,6980,7,7040,7041,5,7073,7073,7,7078,7079,7,7082,7082,7,7142,7142,5,7144,7145,5,7149,7149,5,7151,7153,5,7204,7211,7,7220,7221,7,7376,7378,5,7393,7393,7,7405,7405,5,7415,7415,7,7616,7679,5,8204,8204,5,8206,8207,4,8233,8233,4,8252,8252,14,8288,8292,4,8294,8303,4,8413,8416,5,8418,8420,5,8482,8482,14,8596,8601,14,8986,8987,14,9096,9096,14,9193,9196,14,9199,9199,14,9201,9202,14,9208,9210,14,9642,9643,14,9664,9664,14,9728,9729,14,9732,9732,14,9735,9741,14,9743,9744,14,9746,9746,14,9750,9751,14,9753,9756,14,9758,9759,14,9761,9761,14,9764,9765,14,9767,9769,14,9771,9773,14,9775,9775,14,9784,9785,14,9787,9791,14,9793,9793,14,9795,9799,14,9812,9822,14,9824,9824,14,9827,9827,14,9829,9830,14,9832,9832,14,9851,9851,14,9854,9854,14,9856,9861,14,9874,9874,14,9876,9876,14,9878,9879,14,9881,9881,14,9883,9884,14,9888,9889,14,9895,9895,14,9898,9899,14,9904,9905,14,9917,9918,14,9924,9925,14,9928,9928,14,9934,9934,14,9936,9936,14,9938,9938,14,9940,9940,14,9961,9961,14,9963,9967,14,9970,9971,14,9973,9973,14,9975,9977,14,9979,9980,14,9982,9985,14,9987,9988,14,9992,9996,14,9998,9998,14,10000,10001,14,10004,10004,14,10013,10013,14,10024,10024,14,10052,10052,14,10060,10060,14,10067,10069,14,10083,10083,14,10085,10087,14,10145,10145,14,10175,10175,14,11013,11015,14,11088,11088,14,11503,11505,5,11744,11775,5,12334,12335,5,12349,12349,14,12951,12951,14,42607,42607,5,42612,42621,5,42736,42737,5,43014,43014,5,43043,43044,7,43047,43047,7,43136,43137,7,43204,43205,5,43263,43263,5,43335,43345,5,43360,43388,8,43395,43395,7,43444,43445,7,43450,43451,7,43454,43456,7,43561,43566,5,43569,43570,5,43573,43574,5,43596,43596,5,43644,43644,5,43698,43700,5,43710,43711,5,43755,43755,7,43758,43759,7,43766,43766,5,44005,44005,5,44008,44008,5,44012,44012,7,44032,44032,11,44060,44060,11,44088,44088,11,44116,44116,11,44144,44144,11,44172,44172,11,44200,44200,11,44228,44228,11,44256,44256,11,44284,44284,11,44312,44312,11,44340,44340,11,44368,44368,11,44396,44396,11,44424,44424,11,44452,44452,11,44480,44480,11,44508,44508,11,44536,44536,11,44564,44564,11,44592,44592,11,44620,44620,11,44648,44648,11,44676,44676,11,44704,44704,11,44732,44732,11,44760,44760,11,44788,44788,11,44816,44816,11,44844,44844,11,44872,44872,11,44900,44900,11,44928,44928,11,44956,44956,11,44984,44984,11,45012,45012,11,45040,45040,11,45068,45068,11,45096,45096,11,45124,45124,11,45152,45152,11,45180,45180,11,45208,45208,11,45236,45236,11,45264,45264,11,45292,45292,11,45320,45320,11,45348,45348,11,45376,45376,11,45404,45404,11,45432,45432,11,45460,45460,11,45488,45488,11,45516,45516,11,45544,45544,11,45572,45572,11,45600,45600,11,45628,45628,11,45656,45656,11,45684,45684,11,45712,45712,11,45740,45740,11,45768,45768,11,45796,45796,11,45824,45824,11,45852,45852,11,45880,45880,11,45908,45908,11,45936,45936,11,45964,45964,11,45992,45992,11,46020,46020,11,46048,46048,11,46076,46076,11,46104,46104,11,46132,46132,11,46160,46160,11,46188,46188,11,46216,46216,11,46244,46244,11,46272,46272,11,46300,46300,11,46328,46328,11,46356,46356,11,46384,46384,11,46412,46412,11,46440,46440,11,46468,46468,11,46496,46496,11,46524,46524,11,46552,46552,11,46580,46580,11,46608,46608,11,46636,46636,11,46664,46664,11,46692,46692,11,46720,46720,11,46748,46748,11,46776,46776,11,46804,46804,11,46832,46832,11,46860,46860,11,46888,46888,11,46916,46916,11,46944,46944,11,46972,46972,11,47000,47000,11,47028,47028,11,47056,47056,11,47084,47084,11,47112,47112,11,47140,47140,11,47168,47168,11,47196,47196,11,47224,47224,11,47252,47252,11,47280,47280,11,47308,47308,11,47336,47336,11,47364,47364,11,47392,47392,11,47420,47420,11,47448,47448,11,47476,47476,11,47504,47504,11,47532,47532,11,47560,47560,11,47588,47588,11,47616,47616,11,47644,47644,11,47672,47672,11,47700,47700,11,47728,47728,11,47756,47756,11,47784,47784,11,47812,47812,11,47840,47840,11,47868,47868,11,47896,47896,11,47924,47924,11,47952,47952,11,47980,47980,11,48008,48008,11,48036,48036,11,48064,48064,11,48092,48092,11,48120,48120,11,48148,48148,11,48176,48176,11,48204,48204,11,48232,48232,11,48260,48260,11,48288,48288,11,48316,48316,11,48344,48344,11,48372,48372,11,48400,48400,11,48428,48428,11,48456,48456,11,48484,48484,11,48512,48512,11,48540,48540,11,48568,48568,11,48596,48596,11,48624,48624,11,48652,48652,11,48680,48680,11,48708,48708,11,48736,48736,11,48764,48764,11,48792,48792,11,48820,48820,11,48848,48848,11,48876,48876,11,48904,48904,11,48932,48932,11,48960,48960,11,48988,48988,11,49016,49016,11,49044,49044,11,49072,49072,11,49100,49100,11,49128,49128,11,49156,49156,11,49184,49184,11,49212,49212,11,49240,49240,11,49268,49268,11,49296,49296,11,49324,49324,11,49352,49352,11,49380,49380,11,49408,49408,11,49436,49436,11,49464,49464,11,49492,49492,11,49520,49520,11,49548,49548,11,49576,49576,11,49604,49604,11,49632,49632,11,49660,49660,11,49688,49688,11,49716,49716,11,49744,49744,11,49772,49772,11,49800,49800,11,49828,49828,11,49856,49856,11,49884,49884,11,49912,49912,11,49940,49940,11,49968,49968,11,49996,49996,11,50024,50024,11,50052,50052,11,50080,50080,11,50108,50108,11,50136,50136,11,50164,50164,11,50192,50192,11,50220,50220,11,50248,50248,11,50276,50276,11,50304,50304,11,50332,50332,11,50360,50360,11,50388,50388,11,50416,50416,11,50444,50444,11,50472,50472,11,50500,50500,11,50528,50528,11,50556,50556,11,50584,50584,11,50612,50612,11,50640,50640,11,50668,50668,11,50696,50696,11,50724,50724,11,50752,50752,11,50780,50780,11,50808,50808,11,50836,50836,11,50864,50864,11,50892,50892,11,50920,50920,11,50948,50948,11,50976,50976,11,51004,51004,11,51032,51032,11,51060,51060,11,51088,51088,11,51116,51116,11,51144,51144,11,51172,51172,11,51200,51200,11,51228,51228,11,51256,51256,11,51284,51284,11,51312,51312,11,51340,51340,11,51368,51368,11,51396,51396,11,51424,51424,11,51452,51452,11,51480,51480,11,51508,51508,11,51536,51536,11,51564,51564,11,51592,51592,11,51620,51620,11,51648,51648,11,51676,51676,11,51704,51704,11,51732,51732,11,51760,51760,11,51788,51788,11,51816,51816,11,51844,51844,11,51872,51872,11,51900,51900,11,51928,51928,11,51956,51956,11,51984,51984,11,52012,52012,11,52040,52040,11,52068,52068,11,52096,52096,11,52124,52124,11,52152,52152,11,52180,52180,11,52208,52208,11,52236,52236,11,52264,52264,11,52292,52292,11,52320,52320,11,52348,52348,11,52376,52376,11,52404,52404,11,52432,52432,11,52460,52460,11,52488,52488,11,52516,52516,11,52544,52544,11,52572,52572,11,52600,52600,11,52628,52628,11,52656,52656,11,52684,52684,11,52712,52712,11,52740,52740,11,52768,52768,11,52796,52796,11,52824,52824,11,52852,52852,11,52880,52880,11,52908,52908,11,52936,52936,11,52964,52964,11,52992,52992,11,53020,53020,11,53048,53048,11,53076,53076,11,53104,53104,11,53132,53132,11,53160,53160,11,53188,53188,11,53216,53216,11,53244,53244,11,53272,53272,11,53300,53300,11,53328,53328,11,53356,53356,11,53384,53384,11,53412,53412,11,53440,53440,11,53468,53468,11,53496,53496,11,53524,53524,11,53552,53552,11,53580,53580,11,53608,53608,11,53636,53636,11,53664,53664,11,53692,53692,11,53720,53720,11,53748,53748,11,53776,53776,11,53804,53804,11,53832,53832,11,53860,53860,11,53888,53888,11,53916,53916,11,53944,53944,11,53972,53972,11,54000,54000,11,54028,54028,11,54056,54056,11,54084,54084,11,54112,54112,11,54140,54140,11,54168,54168,11,54196,54196,11,54224,54224,11,54252,54252,11,54280,54280,11,54308,54308,11,54336,54336,11,54364,54364,11,54392,54392,11,54420,54420,11,54448,54448,11,54476,54476,11,54504,54504,11,54532,54532,11,54560,54560,11,54588,54588,11,54616,54616,11,54644,54644,11,54672,54672,11,54700,54700,11,54728,54728,11,54756,54756,11,54784,54784,11,54812,54812,11,54840,54840,11,54868,54868,11,54896,54896,11,54924,54924,11,54952,54952,11,54980,54980,11,55008,55008,11,55036,55036,11,55064,55064,11,55092,55092,11,55120,55120,11,55148,55148,11,55176,55176,11,55216,55238,9,64286,64286,5,65056,65071,5,65438,65439,5,65529,65531,4,66272,66272,5,68097,68099,5,68108,68111,5,68159,68159,5,68900,68903,5,69446,69456,5,69632,69632,7,69634,69634,7,69744,69744,5,69759,69761,5,69808,69810,7,69815,69816,7,69821,69821,1,69837,69837,1,69927,69931,5,69933,69940,5,70003,70003,5,70018,70018,7,70070,70078,5,70082,70083,1,70094,70094,7,70188,70190,7,70194,70195,7,70197,70197,7,70206,70206,5,70368,70370,7,70400,70401,5,70459,70460,5,70463,70463,7,70465,70468,7,70475,70477,7,70498,70499,7,70512,70516,5,70712,70719,5,70722,70724,5,70726,70726,5,70832,70832,5,70835,70840,5,70842,70842,5,70845,70845,5,70847,70848,5,70850,70851,5,71088,71089,7,71096,71099,7,71102,71102,7,71132,71133,5,71219,71226,5,71229,71229,5,71231,71232,5,71340,71340,7,71342,71343,7,71350,71350,7,71453,71455,5,71462,71462,7,71724,71726,7,71736,71736,7,71984,71984,5,71991,71992,7,71997,71997,7,71999,71999,1,72001,72001,1,72003,72003,5,72148,72151,5,72156,72159,7,72164,72164,7,72243,72248,5,72250,72250,1,72263,72263,5,72279,72280,7,72324,72329,1,72343,72343,7,72751,72751,7,72760,72765,5,72767,72767,5,72873,72873,7,72881,72881,7,72884,72884,7,73009,73014,5,73020,73021,5,73030,73030,1,73098,73102,7,73107,73108,7,73110,73110,7,73459,73460,5,78896,78904,4,92976,92982,5,94033,94087,7,94180,94180,5,113821,113822,5,118528,118573,5,119141,119141,5,119143,119145,5,119150,119154,5,119163,119170,5,119210,119213,5,121344,121398,5,121461,121461,5,121499,121503,5,122880,122886,5,122907,122913,5,122918,122922,5,123566,123566,5,125136,125142,5,126976,126979,14,126981,127182,14,127184,127231,14,127279,127279,14,127344,127345,14,127374,127374,14,127405,127461,14,127489,127490,14,127514,127514,14,127538,127546,14,127561,127567,14,127570,127743,14,127757,127758,14,127760,127760,14,127762,127762,14,127766,127768,14,127770,127770,14,127772,127772,14,127775,127776,14,127778,127779,14,127789,127791,14,127794,127795,14,127798,127798,14,127819,127819,14,127824,127824,14,127868,127868,14,127870,127871,14,127892,127893,14,127896,127896,14,127900,127901,14,127904,127940,14,127942,127942,14,127944,127944,14,127946,127946,14,127951,127955,14,127968,127971,14,127973,127984,14,127987,127987,14,127989,127989,14,127991,127991,14,127995,127999,5,128008,128008,14,128012,128014,14,128017,128018,14,128020,128020,14,128022,128022,14,128042,128042,14,128063,128063,14,128065,128065,14,128101,128101,14,128108,128109,14,128173,128173,14,128182,128183,14,128236,128237,14,128239,128239,14,128245,128245,14,128248,128248,14,128253,128253,14,128255,128258,14,128260,128263,14,128265,128265,14,128277,128277,14,128300,128301,14,128326,128328,14,128331,128334,14,128336,128347,14,128360,128366,14,128369,128370,14,128378,128378,14,128391,128391,14,128394,128397,14,128400,128400,14,128405,128406,14,128420,128420,14,128422,128423,14,128425,128432,14,128435,128443,14,128445,128449,14,128453,128464,14,128468,128475,14,128479,128480,14,128482,128482,14,128484,128487,14,128489,128494,14,128496,128498,14,128500,128505,14,128507,128511,14,128513,128518,14,128521,128525,14,128527,128527,14,128529,128529,14,128533,128533,14,128535,128535,14,128537,128537,14]")}getGraphemeBreakType(e){if(e<32)return 10===e?3:13===e?2:4;if(e<127)return 0;const t=this._data,n=t.length/3;let r=1;for(;r<=n;)if(et[3*r+1]))return t[3*r+2];r=2*r+1}return 0}}class W{static{this.ambiguousCharacterData=new i.d(()=>JSON.parse('{"_common":[8232,32,8233,32,5760,32,8192,32,8193,32,8194,32,8195,32,8196,32,8197,32,8198,32,8200,32,8201,32,8202,32,8287,32,8199,32,8239,32,2042,95,65101,95,65102,95,65103,95,8208,45,8209,45,8210,45,65112,45,1748,45,8259,45,727,45,8722,45,10134,45,11450,45,1549,44,1643,44,8218,44,184,44,42233,44,894,59,2307,58,2691,58,1417,58,1795,58,1796,58,5868,58,65072,58,6147,58,6153,58,8282,58,1475,58,760,58,42889,58,8758,58,720,58,42237,58,451,33,11601,33,660,63,577,63,2429,63,5038,63,42731,63,119149,46,8228,46,1793,46,1794,46,42510,46,68176,46,1632,46,1776,46,42232,46,1373,96,65287,96,8219,96,8242,96,1370,96,1523,96,8175,96,65344,96,900,96,8189,96,8125,96,8127,96,8190,96,697,96,884,96,712,96,714,96,715,96,756,96,699,96,701,96,700,96,702,96,42892,96,1497,96,2036,96,2037,96,5194,96,5836,96,94033,96,94034,96,65339,91,10088,40,10098,40,12308,40,64830,40,65341,93,10089,41,10099,41,12309,41,64831,41,10100,123,119060,123,10101,125,65342,94,8270,42,1645,42,8727,42,66335,42,5941,47,8257,47,8725,47,8260,47,9585,47,10187,47,10744,47,119354,47,12755,47,12339,47,11462,47,20031,47,12035,47,65340,92,65128,92,8726,92,10189,92,10741,92,10745,92,119311,92,119355,92,12756,92,20022,92,12034,92,42872,38,708,94,710,94,5869,43,10133,43,66203,43,8249,60,10094,60,706,60,119350,60,5176,60,5810,60,5120,61,11840,61,12448,61,42239,61,8250,62,10095,62,707,62,119351,62,5171,62,94015,62,8275,126,732,126,8128,126,8764,126,65372,124,65293,45,120784,50,120794,50,120804,50,120814,50,120824,50,130034,50,42842,50,423,50,1000,50,42564,50,5311,50,42735,50,119302,51,120785,51,120795,51,120805,51,120815,51,120825,51,130035,51,42923,51,540,51,439,51,42858,51,11468,51,1248,51,94011,51,71882,51,120786,52,120796,52,120806,52,120816,52,120826,52,130036,52,5070,52,71855,52,120787,53,120797,53,120807,53,120817,53,120827,53,130037,53,444,53,71867,53,120788,54,120798,54,120808,54,120818,54,120828,54,130038,54,11474,54,5102,54,71893,54,119314,55,120789,55,120799,55,120809,55,120819,55,120829,55,130039,55,66770,55,71878,55,2819,56,2538,56,2666,56,125131,56,120790,56,120800,56,120810,56,120820,56,120830,56,130040,56,547,56,546,56,66330,56,2663,57,2920,57,2541,57,3437,57,120791,57,120801,57,120811,57,120821,57,120831,57,130041,57,42862,57,11466,57,71884,57,71852,57,71894,57,9082,97,65345,97,119834,97,119886,97,119938,97,119990,97,120042,97,120094,97,120146,97,120198,97,120250,97,120302,97,120354,97,120406,97,120458,97,593,97,945,97,120514,97,120572,97,120630,97,120688,97,120746,97,65313,65,119808,65,119860,65,119912,65,119964,65,120016,65,120068,65,120120,65,120172,65,120224,65,120276,65,120328,65,120380,65,120432,65,913,65,120488,65,120546,65,120604,65,120662,65,120720,65,5034,65,5573,65,42222,65,94016,65,66208,65,119835,98,119887,98,119939,98,119991,98,120043,98,120095,98,120147,98,120199,98,120251,98,120303,98,120355,98,120407,98,120459,98,388,98,5071,98,5234,98,5551,98,65314,66,8492,66,119809,66,119861,66,119913,66,120017,66,120069,66,120121,66,120173,66,120225,66,120277,66,120329,66,120381,66,120433,66,42932,66,914,66,120489,66,120547,66,120605,66,120663,66,120721,66,5108,66,5623,66,42192,66,66178,66,66209,66,66305,66,65347,99,8573,99,119836,99,119888,99,119940,99,119992,99,120044,99,120096,99,120148,99,120200,99,120252,99,120304,99,120356,99,120408,99,120460,99,7428,99,1010,99,11429,99,43951,99,66621,99,128844,67,71922,67,71913,67,65315,67,8557,67,8450,67,8493,67,119810,67,119862,67,119914,67,119966,67,120018,67,120174,67,120226,67,120278,67,120330,67,120382,67,120434,67,1017,67,11428,67,5087,67,42202,67,66210,67,66306,67,66581,67,66844,67,8574,100,8518,100,119837,100,119889,100,119941,100,119993,100,120045,100,120097,100,120149,100,120201,100,120253,100,120305,100,120357,100,120409,100,120461,100,1281,100,5095,100,5231,100,42194,100,8558,68,8517,68,119811,68,119863,68,119915,68,119967,68,120019,68,120071,68,120123,68,120175,68,120227,68,120279,68,120331,68,120383,68,120435,68,5024,68,5598,68,5610,68,42195,68,8494,101,65349,101,8495,101,8519,101,119838,101,119890,101,119942,101,120046,101,120098,101,120150,101,120202,101,120254,101,120306,101,120358,101,120410,101,120462,101,43826,101,1213,101,8959,69,65317,69,8496,69,119812,69,119864,69,119916,69,120020,69,120072,69,120124,69,120176,69,120228,69,120280,69,120332,69,120384,69,120436,69,917,69,120492,69,120550,69,120608,69,120666,69,120724,69,11577,69,5036,69,42224,69,71846,69,71854,69,66182,69,119839,102,119891,102,119943,102,119995,102,120047,102,120099,102,120151,102,120203,102,120255,102,120307,102,120359,102,120411,102,120463,102,43829,102,42905,102,383,102,7837,102,1412,102,119315,70,8497,70,119813,70,119865,70,119917,70,120021,70,120073,70,120125,70,120177,70,120229,70,120281,70,120333,70,120385,70,120437,70,42904,70,988,70,120778,70,5556,70,42205,70,71874,70,71842,70,66183,70,66213,70,66853,70,65351,103,8458,103,119840,103,119892,103,119944,103,120048,103,120100,103,120152,103,120204,103,120256,103,120308,103,120360,103,120412,103,120464,103,609,103,7555,103,397,103,1409,103,119814,71,119866,71,119918,71,119970,71,120022,71,120074,71,120126,71,120178,71,120230,71,120282,71,120334,71,120386,71,120438,71,1292,71,5056,71,5107,71,42198,71,65352,104,8462,104,119841,104,119945,104,119997,104,120049,104,120101,104,120153,104,120205,104,120257,104,120309,104,120361,104,120413,104,120465,104,1211,104,1392,104,5058,104,65320,72,8459,72,8460,72,8461,72,119815,72,119867,72,119919,72,120023,72,120179,72,120231,72,120283,72,120335,72,120387,72,120439,72,919,72,120494,72,120552,72,120610,72,120668,72,120726,72,11406,72,5051,72,5500,72,42215,72,66255,72,731,105,9075,105,65353,105,8560,105,8505,105,8520,105,119842,105,119894,105,119946,105,119998,105,120050,105,120102,105,120154,105,120206,105,120258,105,120310,105,120362,105,120414,105,120466,105,120484,105,618,105,617,105,953,105,8126,105,890,105,120522,105,120580,105,120638,105,120696,105,120754,105,1110,105,42567,105,1231,105,43893,105,5029,105,71875,105,65354,106,8521,106,119843,106,119895,106,119947,106,119999,106,120051,106,120103,106,120155,106,120207,106,120259,106,120311,106,120363,106,120415,106,120467,106,1011,106,1112,106,65322,74,119817,74,119869,74,119921,74,119973,74,120025,74,120077,74,120129,74,120181,74,120233,74,120285,74,120337,74,120389,74,120441,74,42930,74,895,74,1032,74,5035,74,5261,74,42201,74,119844,107,119896,107,119948,107,120000,107,120052,107,120104,107,120156,107,120208,107,120260,107,120312,107,120364,107,120416,107,120468,107,8490,75,65323,75,119818,75,119870,75,119922,75,119974,75,120026,75,120078,75,120130,75,120182,75,120234,75,120286,75,120338,75,120390,75,120442,75,922,75,120497,75,120555,75,120613,75,120671,75,120729,75,11412,75,5094,75,5845,75,42199,75,66840,75,1472,108,8739,73,9213,73,65512,73,1633,108,1777,73,66336,108,125127,108,120783,73,120793,73,120803,73,120813,73,120823,73,130033,73,65321,73,8544,73,8464,73,8465,73,119816,73,119868,73,119920,73,120024,73,120128,73,120180,73,120232,73,120284,73,120336,73,120388,73,120440,73,65356,108,8572,73,8467,108,119845,108,119897,108,119949,108,120001,108,120053,108,120105,73,120157,73,120209,73,120261,73,120313,73,120365,73,120417,73,120469,73,448,73,120496,73,120554,73,120612,73,120670,73,120728,73,11410,73,1030,73,1216,73,1493,108,1503,108,1575,108,126464,108,126592,108,65166,108,65165,108,1994,108,11599,73,5825,73,42226,73,93992,73,66186,124,66313,124,119338,76,8556,76,8466,76,119819,76,119871,76,119923,76,120027,76,120079,76,120131,76,120183,76,120235,76,120287,76,120339,76,120391,76,120443,76,11472,76,5086,76,5290,76,42209,76,93974,76,71843,76,71858,76,66587,76,66854,76,65325,77,8559,77,8499,77,119820,77,119872,77,119924,77,120028,77,120080,77,120132,77,120184,77,120236,77,120288,77,120340,77,120392,77,120444,77,924,77,120499,77,120557,77,120615,77,120673,77,120731,77,1018,77,11416,77,5047,77,5616,77,5846,77,42207,77,66224,77,66321,77,119847,110,119899,110,119951,110,120003,110,120055,110,120107,110,120159,110,120211,110,120263,110,120315,110,120367,110,120419,110,120471,110,1400,110,1404,110,65326,78,8469,78,119821,78,119873,78,119925,78,119977,78,120029,78,120081,78,120185,78,120237,78,120289,78,120341,78,120393,78,120445,78,925,78,120500,78,120558,78,120616,78,120674,78,120732,78,11418,78,42208,78,66835,78,3074,111,3202,111,3330,111,3458,111,2406,111,2662,111,2790,111,3046,111,3174,111,3302,111,3430,111,3664,111,3792,111,4160,111,1637,111,1781,111,65359,111,8500,111,119848,111,119900,111,119952,111,120056,111,120108,111,120160,111,120212,111,120264,111,120316,111,120368,111,120420,111,120472,111,7439,111,7441,111,43837,111,959,111,120528,111,120586,111,120644,111,120702,111,120760,111,963,111,120532,111,120590,111,120648,111,120706,111,120764,111,11423,111,4351,111,1413,111,1505,111,1607,111,126500,111,126564,111,126596,111,65259,111,65260,111,65258,111,65257,111,1726,111,64428,111,64429,111,64427,111,64426,111,1729,111,64424,111,64425,111,64423,111,64422,111,1749,111,3360,111,4125,111,66794,111,71880,111,71895,111,66604,111,1984,79,2534,79,2918,79,12295,79,70864,79,71904,79,120782,79,120792,79,120802,79,120812,79,120822,79,130032,79,65327,79,119822,79,119874,79,119926,79,119978,79,120030,79,120082,79,120134,79,120186,79,120238,79,120290,79,120342,79,120394,79,120446,79,927,79,120502,79,120560,79,120618,79,120676,79,120734,79,11422,79,1365,79,11604,79,4816,79,2848,79,66754,79,42227,79,71861,79,66194,79,66219,79,66564,79,66838,79,9076,112,65360,112,119849,112,119901,112,119953,112,120005,112,120057,112,120109,112,120161,112,120213,112,120265,112,120317,112,120369,112,120421,112,120473,112,961,112,120530,112,120544,112,120588,112,120602,112,120646,112,120660,112,120704,112,120718,112,120762,112,120776,112,11427,112,65328,80,8473,80,119823,80,119875,80,119927,80,119979,80,120031,80,120083,80,120187,80,120239,80,120291,80,120343,80,120395,80,120447,80,929,80,120504,80,120562,80,120620,80,120678,80,120736,80,11426,80,5090,80,5229,80,42193,80,66197,80,119850,113,119902,113,119954,113,120006,113,120058,113,120110,113,120162,113,120214,113,120266,113,120318,113,120370,113,120422,113,120474,113,1307,113,1379,113,1382,113,8474,81,119824,81,119876,81,119928,81,119980,81,120032,81,120084,81,120188,81,120240,81,120292,81,120344,81,120396,81,120448,81,11605,81,119851,114,119903,114,119955,114,120007,114,120059,114,120111,114,120163,114,120215,114,120267,114,120319,114,120371,114,120423,114,120475,114,43847,114,43848,114,7462,114,11397,114,43905,114,119318,82,8475,82,8476,82,8477,82,119825,82,119877,82,119929,82,120033,82,120189,82,120241,82,120293,82,120345,82,120397,82,120449,82,422,82,5025,82,5074,82,66740,82,5511,82,42211,82,94005,82,65363,115,119852,115,119904,115,119956,115,120008,115,120060,115,120112,115,120164,115,120216,115,120268,115,120320,115,120372,115,120424,115,120476,115,42801,115,445,115,1109,115,43946,115,71873,115,66632,115,65331,83,119826,83,119878,83,119930,83,119982,83,120034,83,120086,83,120138,83,120190,83,120242,83,120294,83,120346,83,120398,83,120450,83,1029,83,1359,83,5077,83,5082,83,42210,83,94010,83,66198,83,66592,83,119853,116,119905,116,119957,116,120009,116,120061,116,120113,116,120165,116,120217,116,120269,116,120321,116,120373,116,120425,116,120477,116,8868,84,10201,84,128872,84,65332,84,119827,84,119879,84,119931,84,119983,84,120035,84,120087,84,120139,84,120191,84,120243,84,120295,84,120347,84,120399,84,120451,84,932,84,120507,84,120565,84,120623,84,120681,84,120739,84,11430,84,5026,84,42196,84,93962,84,71868,84,66199,84,66225,84,66325,84,119854,117,119906,117,119958,117,120010,117,120062,117,120114,117,120166,117,120218,117,120270,117,120322,117,120374,117,120426,117,120478,117,42911,117,7452,117,43854,117,43858,117,651,117,965,117,120534,117,120592,117,120650,117,120708,117,120766,117,1405,117,66806,117,71896,117,8746,85,8899,85,119828,85,119880,85,119932,85,119984,85,120036,85,120088,85,120140,85,120192,85,120244,85,120296,85,120348,85,120400,85,120452,85,1357,85,4608,85,66766,85,5196,85,42228,85,94018,85,71864,85,8744,118,8897,118,65366,118,8564,118,119855,118,119907,118,119959,118,120011,118,120063,118,120115,118,120167,118,120219,118,120271,118,120323,118,120375,118,120427,118,120479,118,7456,118,957,118,120526,118,120584,118,120642,118,120700,118,120758,118,1141,118,1496,118,71430,118,43945,118,71872,118,119309,86,1639,86,1783,86,8548,86,119829,86,119881,86,119933,86,119985,86,120037,86,120089,86,120141,86,120193,86,120245,86,120297,86,120349,86,120401,86,120453,86,1140,86,11576,86,5081,86,5167,86,42719,86,42214,86,93960,86,71840,86,66845,86,623,119,119856,119,119908,119,119960,119,120012,119,120064,119,120116,119,120168,119,120220,119,120272,119,120324,119,120376,119,120428,119,120480,119,7457,119,1121,119,1309,119,1377,119,71434,119,71438,119,71439,119,43907,119,71919,87,71910,87,119830,87,119882,87,119934,87,119986,87,120038,87,120090,87,120142,87,120194,87,120246,87,120298,87,120350,87,120402,87,120454,87,1308,87,5043,87,5076,87,42218,87,5742,120,10539,120,10540,120,10799,120,65368,120,8569,120,119857,120,119909,120,119961,120,120013,120,120065,120,120117,120,120169,120,120221,120,120273,120,120325,120,120377,120,120429,120,120481,120,5441,120,5501,120,5741,88,9587,88,66338,88,71916,88,65336,88,8553,88,119831,88,119883,88,119935,88,119987,88,120039,88,120091,88,120143,88,120195,88,120247,88,120299,88,120351,88,120403,88,120455,88,42931,88,935,88,120510,88,120568,88,120626,88,120684,88,120742,88,11436,88,11613,88,5815,88,42219,88,66192,88,66228,88,66327,88,66855,88,611,121,7564,121,65369,121,119858,121,119910,121,119962,121,120014,121,120066,121,120118,121,120170,121,120222,121,120274,121,120326,121,120378,121,120430,121,120482,121,655,121,7935,121,43866,121,947,121,8509,121,120516,121,120574,121,120632,121,120690,121,120748,121,1199,121,4327,121,71900,121,65337,89,119832,89,119884,89,119936,89,119988,89,120040,89,120092,89,120144,89,120196,89,120248,89,120300,89,120352,89,120404,89,120456,89,933,89,978,89,120508,89,120566,89,120624,89,120682,89,120740,89,11432,89,1198,89,5033,89,5053,89,42220,89,94019,89,71844,89,66226,89,119859,122,119911,122,119963,122,120015,122,120067,122,120119,122,120171,122,120223,122,120275,122,120327,122,120379,122,120431,122,120483,122,7458,122,43923,122,71876,122,66293,90,71909,90,65338,90,8484,90,8488,90,119833,90,119885,90,119937,90,119989,90,120041,90,120197,90,120249,90,120301,90,120353,90,120405,90,120457,90,918,90,120493,90,120551,90,120609,90,120667,90,120725,90,5059,90,42204,90,71849,90,65282,34,65284,36,65285,37,65286,38,65290,42,65291,43,65294,46,65295,47,65296,48,65297,49,65298,50,65299,51,65300,52,65301,53,65302,54,65303,55,65304,56,65305,57,65308,60,65309,61,65310,62,65312,64,65316,68,65318,70,65319,71,65324,76,65329,81,65330,82,65333,85,65334,86,65335,87,65343,95,65346,98,65348,100,65350,102,65355,107,65357,109,65358,110,65361,113,65362,114,65364,116,65365,117,65367,119,65370,122,65371,123,65373,125,119846,109],"_default":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"cs":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"de":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"es":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"fr":[65374,126,65306,58,65281,33,8216,96,8245,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"it":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"ja":[8211,45,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65292,44,65307,59],"ko":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"pl":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"pt-BR":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"qps-ploc":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"ru":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,305,105,921,73,1009,112,215,120,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"tr":[160,32,8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"zh-hans":[65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41],"zh-hant":[8211,45,65374,126,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65307,59]}'))}static{this.cache=new r.o5({getCacheKey:JSON.stringify},e=>{function t(e){const t=new Map;for(let n=0;n!e.startsWith("_")&&e in r);0===s.length&&(s=["_default"]);for(const e of s)i=n(i,t(r[e]));const o=function(e,t){const n=new Map(e);for(const[e,r]of t)n.set(e,r);return n}(t(r._common),i);return new W(o)})}static getInstance(e){return W.cache.get(Array.from(e))}static{this._locales=new i.d(()=>Object.keys(W.ambiguousCharacterData.value).filter(e=>!e.startsWith("_")))}static getLocales(){return W._locales.value}constructor(e){this.confusableDictionary=e}isAmbiguous(e){return this.confusableDictionary.has(e)}getPrimaryConfusable(e){return this.confusableDictionary.get(e)}getConfusableCodePoints(){return new Set(this.confusableDictionary.keys())}}class V{static getRawData(){return JSON.parse("[9,10,11,12,13,32,127,160,173,847,1564,4447,4448,6068,6069,6155,6156,6157,6158,7355,7356,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8234,8235,8236,8237,8238,8239,8287,8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,10240,12288,12644,65024,65025,65026,65027,65028,65029,65030,65031,65032,65033,65034,65035,65036,65037,65038,65039,65279,65440,65520,65521,65522,65523,65524,65525,65526,65527,65528,65532,78844,119155,119156,119157,119158,119159,119160,119161,119162,917504,917505,917506,917507,917508,917509,917510,917511,917512,917513,917514,917515,917516,917517,917518,917519,917520,917521,917522,917523,917524,917525,917526,917527,917528,917529,917530,917531,917532,917533,917534,917535,917536,917537,917538,917539,917540,917541,917542,917543,917544,917545,917546,917547,917548,917549,917550,917551,917552,917553,917554,917555,917556,917557,917558,917559,917560,917561,917562,917563,917564,917565,917566,917567,917568,917569,917570,917571,917572,917573,917574,917575,917576,917577,917578,917579,917580,917581,917582,917583,917584,917585,917586,917587,917588,917589,917590,917591,917592,917593,917594,917595,917596,917597,917598,917599,917600,917601,917602,917603,917604,917605,917606,917607,917608,917609,917610,917611,917612,917613,917614,917615,917616,917617,917618,917619,917620,917621,917622,917623,917624,917625,917626,917627,917628,917629,917630,917631,917760,917761,917762,917763,917764,917765,917766,917767,917768,917769,917770,917771,917772,917773,917774,917775,917776,917777,917778,917779,917780,917781,917782,917783,917784,917785,917786,917787,917788,917789,917790,917791,917792,917793,917794,917795,917796,917797,917798,917799,917800,917801,917802,917803,917804,917805,917806,917807,917808,917809,917810,917811,917812,917813,917814,917815,917816,917817,917818,917819,917820,917821,917822,917823,917824,917825,917826,917827,917828,917829,917830,917831,917832,917833,917834,917835,917836,917837,917838,917839,917840,917841,917842,917843,917844,917845,917846,917847,917848,917849,917850,917851,917852,917853,917854,917855,917856,917857,917858,917859,917860,917861,917862,917863,917864,917865,917866,917867,917868,917869,917870,917871,917872,917873,917874,917875,917876,917877,917878,917879,917880,917881,917882,917883,917884,917885,917886,917887,917888,917889,917890,917891,917892,917893,917894,917895,917896,917897,917898,917899,917900,917901,917902,917903,917904,917905,917906,917907,917908,917909,917910,917911,917912,917913,917914,917915,917916,917917,917918,917919,917920,917921,917922,917923,917924,917925,917926,917927,917928,917929,917930,917931,917932,917933,917934,917935,917936,917937,917938,917939,917940,917941,917942,917943,917944,917945,917946,917947,917948,917949,917950,917951,917952,917953,917954,917955,917956,917957,917958,917959,917960,917961,917962,917963,917964,917965,917966,917967,917968,917969,917970,917971,917972,917973,917974,917975,917976,917977,917978,917979,917980,917981,917982,917983,917984,917985,917986,917987,917988,917989,917990,917991,917992,917993,917994,917995,917996,917997,917998,917999]")}static{this._data=void 0}static getData(){return this._data||(this._data=new Set(V.getRawData())),this._data}static isInvisibleCharacter(e){return V.getData().has(e)}static get codePoints(){return V.getData()}}},6185:(e,t,n)=>{"use strict";n.d(t,{L:()=>i});var r=n(1490);class i{static addRange(e,t){let n=0;for(;nt))return new i(e,t)}static ofLength(e){return new i(0,e)}static ofStartAndLength(e,t){return new i(e,e+t)}constructor(e,t){if(this.start=e,this.endExclusive=t,e>t)throw new r.D7(`Invalid range: ${this.toString()}`)}get isEmpty(){return this.start===this.endExclusive}delta(e){return new i(this.start+e,this.endExclusive+e)}deltaStart(e){return new i(this.start+e,this.endExclusive)}deltaEnd(e){return new i(this.start,this.endExclusive+e)}get length(){return this.endExclusive-this.start}toString(){return`[${this.start}, ${this.endExclusive})`}contains(e){return this.start<=e&&e=e.endExclusive}slice(e){return e.slice(this.start,this.endExclusive)}substring(e){return e.substring(this.start,this.endExclusive)}clip(e){if(this.isEmpty)throw new r.D7(`Invalid clipping range: ${this.toString()}`);return Math.max(this.start,Math.min(this.endExclusive-1,e))}clipCyclic(e){if(this.isEmpty)throw new r.D7(`Invalid clipping range: ${this.toString()}`);return e=this.endExclusive?this.start+(e-this.start)%this.length:e}forEach(e){for(let t=this.start;t{"use strict";n.d(t,{H8:()=>P,HZ:()=>I,OS:()=>A,UP:()=>V,_p:()=>D,cm:()=>z,gm:()=>B,ib:()=>L,j9:()=>F,lg:()=>T,nr:()=>W,uF:()=>S,zx:()=>E});var r=n(7703);const i="en";let s,o,a=!1,l=!1,c=!1,h=!1,d=!1,u=!1,p=!1,m=!1,f=!1,g=!1,b=null,v=null,y=null;const w=globalThis;let C;void 0!==w.vscode&&void 0!==w.vscode.process?C=w.vscode.process:"undefined"!=typeof process&&"string"==typeof process?.versions?.node&&(C=process);const _="string"==typeof C?.versions?.electron,k=_&&"renderer"===C?.type;if("object"==typeof C){a="win32"===C.platform,l="darwin"===C.platform,c="linux"===C.platform,h=c&&!!C.env.SNAP&&!!C.env.SNAP_REVISION,p=_,f=!!C.env.CI||!!C.env.BUILD_ARTIFACTSTAGINGDIRECTORY,s=i,b=i;const e=C.env.VSCODE_NLS_CONFIG;if(e)try{const t=JSON.parse(e);s=t.userLocale,v=t.osLocale,b=t.resolvedLanguage||i,y=t.languagePack?.translationsConfigFile}catch(e){}d=!0}else"object"!=typeof navigator||k?console.error("Unable to resolve platform."):(o=navigator.userAgent,a=o.indexOf("Windows")>=0,l=o.indexOf("Macintosh")>=0,m=(o.indexOf("Macintosh")>=0||o.indexOf("iPad")>=0||o.indexOf("iPhone")>=0)&&!!navigator.maxTouchPoints&&navigator.maxTouchPoints>0,c=o.indexOf("Linux")>=0,o?.indexOf("Mobi")>=0,u=!0,b=r.i8()||i,s=navigator.language.toLowerCase(),v=s);let x=0;l?x=1:a?x=3:c&&(x=2);const S=a,E=l,F=c,L=d,I=u,T=u&&"function"==typeof w.importScripts?w.origin:void 0,N=o,R="function"==typeof w.postMessage&&!w.importScripts,D=(()=>{if(R){const e=[];w.addEventListener("message",t=>{if(t.data&&t.data.vscodeScheduleAsyncWork)for(let n=0,r=e.length;n{const r=++t;e.push({id:r,callback:n}),w.postMessage({vscodeScheduleAsyncWork:r},"*")}}return e=>setTimeout(e)})(),A=l||m?2:a?1:3;let M=!0,O=!1;function z(){if(!O){O=!0;const e=new Uint8Array(2);e[0]=1,e[1]=2;const t=new Uint16Array(e.buffer);M=513===t[0]}return M}const P=!!(N&&N.indexOf("Chrome")>=0),B=!!(N&&N.indexOf("Firefox")>=0),W=!!(!P&&N&&N.indexOf("Safari")>=0),V=!!(N&&N.indexOf("Edg/")>=0);N&&N.indexOf("Android")},6274:(e,t,n)=>{"use strict";function r(e,t){const n=this;let r,i=!1;return function(){if(i)return r;if(i=!0,t)try{r=e.apply(n,arguments)}finally{t()}else r=e.apply(n,arguments);return r}}n.d(t,{jG:()=>p,$w:()=>f,Cm:()=>u,HE:()=>m,qE:()=>h,AS:()=>c,VD:()=>a,s:()=>d,Ay:()=>o});var i=n(1075);let s=null;function o(e){return s?.trackDisposable(e),e}function a(e){s?.markAsDisposed(e)}function l(e,t){s?.setParent(e,t)}function c(e){if(i.f.is(e)){const t=[];for(const n of e)if(n)try{n.dispose()}catch(e){t.push(e)}if(1===t.length)throw t[0];if(t.length>1)throw new AggregateError(t,"Encountered errors while disposing of store");return Array.isArray(e)?[]:e}if(e)return e.dispose(),e}function h(...e){const t=d(()=>c(e));return function(e,t){if(s)for(const n of e)s.setParent(n,t)}(e,t),t}function d(e){const t=o({dispose:r(()=>{a(t),e()})});return t}class u{static{this.DISABLE_DISPOSED_WARNING=!1}constructor(){this._toDispose=new Set,this._isDisposed=!1,o(this)}dispose(){this._isDisposed||(a(this),this._isDisposed=!0,this.clear())}get isDisposed(){return this._isDisposed}clear(){if(0!==this._toDispose.size)try{c(this._toDispose)}finally{this._toDispose.clear()}}add(e){if(!e)return e;if(e===this)throw new Error("Cannot register a disposable on itself!");return l(e,this),this._isDisposed?u.DISABLE_DISPOSED_WARNING||console.warn(new Error("Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!").stack):this._toDispose.add(e),e}deleteAndLeak(e){e&&this._toDispose.has(e)&&(this._toDispose.delete(e),l(e,null))}}class p{static{this.None=Object.freeze({dispose(){}})}constructor(){this._store=new u,o(this),l(this._store,this)}dispose(){a(this),this._store.dispose()}_register(e){if(e===this)throw new Error("Cannot register a disposable on itself!");return this._store.add(e)}}class m{constructor(){this._isDisposed=!1,o(this)}get value(){return this._isDisposed?void 0:this._value}set value(e){this._isDisposed||e===this._value||(this._value?.dispose(),e&&l(e,this),this._value=e)}clear(){this.value=void 0}dispose(){this._isDisposed=!0,a(this),this._value?.dispose(),this._value=void 0}}class f{constructor(){this._store=new Map,this._isDisposed=!1,o(this)}dispose(){a(this),this._isDisposed=!0,this.clearAndDisposeAll()}clearAndDisposeAll(){if(this._store.size)try{c(this._store.values())}finally{this._store.clear()}}get(e){return this._store.get(e)}set(e,t,n=!1){this._isDisposed&&console.warn(new Error("Trying to add a disposable to a DisposableMap that has already been disposed of. The added object will be leaked!").stack),n||this._store.get(e)?.dispose(),this._store.set(e,t)}deleteAndDispose(e){this._store.get(e)?.dispose(),this._store.delete(e)}[Symbol.iterator](){return this._store[Symbol.iterator]()}}},6303:(e,t,n)=>{"use strict";var r,i;n.d(t,{cO:()=>h,db:()=>d,fT:()=>o,qK:()=>c});class s{constructor(e,t){this.uri=e,this.value=t}}class o{static{this.defaultToKey=e=>e.toString()}constructor(e,t){if(this[r]="ResourceMap",e instanceof o)this.map=new Map(e.map),this.toKey=t??o.defaultToKey;else if(function(e){return Array.isArray(e)}(e)){this.map=new Map,this.toKey=t??o.defaultToKey;for(const[t,n]of e)this.set(t,n)}else this.map=new Map,this.toKey=e??o.defaultToKey}set(e,t){return this.map.set(this.toKey(e),new s(e,t)),this}get(e){return this.map.get(this.toKey(e))?.value}has(e){return this.map.has(this.toKey(e))}get size(){return this.map.size}clear(){this.map.clear()}delete(e){return this.map.delete(this.toKey(e))}forEach(e,t){void 0!==t&&(e=e.bind(t));for(const[t,n]of this.map)e(n.value,n.uri,this)}*values(){for(const e of this.map.values())yield e.value}*keys(){for(const e of this.map.values())yield e.uri}*entries(){for(const e of this.map.values())yield[e.uri,e.value]}*[(r=Symbol.toStringTag,Symbol.iterator)](){for(const[,e]of this.map)yield[e.uri,e.value]}}class a{constructor(){this[i]="LinkedMap",this._map=new Map,this._head=void 0,this._tail=void 0,this._size=0,this._state=0}clear(){this._map.clear(),this._head=void 0,this._tail=void 0,this._size=0,this._state++}isEmpty(){return!this._head&&!this._tail}get size(){return this._size}get first(){return this._head?.value}get last(){return this._tail?.value}has(e){return this._map.has(e)}get(e,t=0){const n=this._map.get(e);if(n)return 0!==t&&this.touch(n,t),n.value}set(e,t,n=0){let r=this._map.get(e);if(r)r.value=t,0!==n&&this.touch(r,n);else{switch(r={key:e,value:t,next:void 0,previous:void 0},n){case 0:case 2:default:this.addItemLast(r);break;case 1:this.addItemFirst(r)}this._map.set(e,r),this._size++}return this}delete(e){return!!this.remove(e)}remove(e){const t=this._map.get(e);if(t)return this._map.delete(e),this.removeItem(t),this._size--,t.value}shift(){if(!this._head&&!this._tail)return;if(!this._head||!this._tail)throw new Error("Invalid list");const e=this._head;return this._map.delete(e.key),this.removeItem(e),this._size--,e.value}forEach(e,t){const n=this._state;let r=this._head;for(;r;){if(t?e.bind(t)(r.value,r.key,this):e(r.value,r.key,this),this._state!==n)throw new Error("LinkedMap got modified during iteration.");r=r.next}}keys(){const e=this,t=this._state;let n=this._head;const r={[Symbol.iterator]:()=>r,next(){if(e._state!==t)throw new Error("LinkedMap got modified during iteration.");if(n){const e={value:n.key,done:!1};return n=n.next,e}return{value:void 0,done:!0}}};return r}values(){const e=this,t=this._state;let n=this._head;const r={[Symbol.iterator]:()=>r,next(){if(e._state!==t)throw new Error("LinkedMap got modified during iteration.");if(n){const e={value:n.value,done:!1};return n=n.next,e}return{value:void 0,done:!0}}};return r}entries(){const e=this,t=this._state;let n=this._head;const r={[Symbol.iterator]:()=>r,next(){if(e._state!==t)throw new Error("LinkedMap got modified during iteration.");if(n){const e={value:[n.key,n.value],done:!1};return n=n.next,e}return{value:void 0,done:!0}}};return r}[(i=Symbol.toStringTag,Symbol.iterator)](){return this.entries()}trimOld(e){if(e>=this.size)return;if(0===e)return void this.clear();let t=this._head,n=this.size;for(;t&&n>e;)this._map.delete(t.key),t=t.next,n--;this._head=t,this._size=n,t&&(t.previous=void 0),this._state++}trimNew(e){if(e>=this.size)return;if(0===e)return void this.clear();let t=this._tail,n=this.size;for(;t&&n>e;)this._map.delete(t.key),t=t.previous,n--;this._tail=t,this._size=n,t&&(t.next=void 0),this._state++}addItemFirst(e){if(this._head||this._tail){if(!this._head)throw new Error("Invalid list");e.next=this._head,this._head.previous=e}else this._tail=e;this._head=e,this._state++}addItemLast(e){if(this._head||this._tail){if(!this._tail)throw new Error("Invalid list");e.previous=this._tail,this._tail.next=e}else this._head=e;this._tail=e,this._state++}removeItem(e){if(e===this._head&&e===this._tail)this._head=void 0,this._tail=void 0;else if(e===this._head){if(!e.next)throw new Error("Invalid list");e.next.previous=void 0,this._head=e.next}else if(e===this._tail){if(!e.previous)throw new Error("Invalid list");e.previous.next=void 0,this._tail=e.previous}else{const t=e.next,n=e.previous;if(!t||!n)throw new Error("Invalid list");t.previous=n,n.next=t}e.next=void 0,e.previous=void 0,this._state++}touch(e,t){if(!this._head||!this._tail)throw new Error("Invalid list");if(1===t||2===t)if(1===t){if(e===this._head)return;const t=e.next,n=e.previous;e===this._tail?(n.next=void 0,this._tail=n):(t.previous=n,n.next=t),e.previous=void 0,e.next=this._head,this._head.previous=e,this._head=e,this._state++}else if(2===t){if(e===this._tail)return;const t=e.next,n=e.previous;e===this._head?(t.previous=void 0,this._head=t):(t.previous=n,n.next=t),e.next=void 0,e.previous=this._tail,this._tail.next=e,this._tail=e,this._state++}}toJSON(){const e=[];return this.forEach((t,n)=>{e.push([n,t])}),e}fromJSON(e){this.clear();for(const[t,n]of e)this.set(t,n)}}class l extends a{constructor(e,t=1){super(),this._limit=e,this._ratio=Math.min(Math.max(0,t),1)}get limit(){return this._limit}set limit(e){this._limit=e,this.checkTrim()}get(e,t=2){return super.get(e,t)}peek(e){return super.get(e,0)}set(e,t){return super.set(e,t,2),this}checkTrim(){this.size>this._limit&&this.trim(Math.round(this._limit*this._ratio))}}class c extends l{constructor(e,t=1){super(e,t)}trim(e){this.trimOld(e)}set(e,t){return super.set(e,t),this.checkTrim(),this}}class h{constructor(e){if(this._m1=new Map,this._m2=new Map,e)for(const[t,n]of e)this.set(t,n)}clear(){this._m1.clear(),this._m2.clear()}set(e,t){this._m1.set(e,t),this._m2.set(t,e)}get(e){return this._m1.get(e)}getKey(e){return this._m2.get(e)}delete(e){const t=this._m1.get(e);return void 0!==t&&(this._m1.delete(e),this._m2.delete(t),!0)}keys(){return this._m1.keys()}values(){return this._m1.values()}}class d{constructor(){this.map=new Map}add(e,t){let n=this.map.get(e);n||(n=new Set,this.map.set(e,n)),n.add(t)}delete(e,t){const n=this.map.get(e);n&&(n.delete(t),0===n.size&&this.map.delete(e))}forEach(e,t){const n=this.map.get(e);n&&n.forEach(t)}get(e){return this.map.get(e)||new Set}}},6357:(e,t,n)=>{"use strict";n.r(t),n.d(t,{clearPlatformLanguageAssociations:()=>m,getLanguageIds:()=>f,registerPlatformLanguageAssociation:()=>p});var r=n(3035),i=n(3793),s=n(4427),o=n(9130),a=n(9996),l=n(5603),c=n(4086);let h=[],d=[],u=[];function p(e,t=!1){!function(e,t,n){const i=function(e){return{id:e.id,mime:e.mime,filename:e.filename,extension:e.extension,filepattern:e.filepattern,firstline:e.firstline,userConfigured:false,filenameLowercase:e.filename?e.filename.toLowerCase():void 0,extensionLowercase:e.extension?e.extension.toLowerCase():void 0,filepatternLowercase:e.filepattern?(0,r.qg)(e.filepattern.toLowerCase()):void 0,filepatternOnPath:!!e.filepattern&&e.filepattern.indexOf(o.SA.sep)>=0}}(e);h.push(i),i.userConfigured?u.push(i):d.push(i),n&&!i.userConfigured&&h.forEach(e=>{e.mime===i.mime||e.userConfigured||(i.extension&&e.extension===i.extension&&console.warn(`Overwriting extension <<${i.extension}>> to now point to mime <<${i.mime}>>`),i.filename&&e.filename===i.filename&&console.warn(`Overwriting filename <<${i.filename}>> to now point to mime <<${i.mime}>>`),i.filepattern&&e.filepattern===i.filepattern&&console.warn(`Overwriting filepattern <<${i.filepattern}>> to now point to mime <<${i.mime}>>`),i.firstline&&e.firstline===i.firstline&&console.warn(`Overwriting firstline <<${i.firstline}>> to now point to mime <<${i.mime}>>`))})}(e,0,t)}function m(){h=h.filter(e=>e.userConfigured),d=[]}function f(e,t){return function(e,t){let n;if(e)switch(e.scheme){case s.ny.file:n=e.fsPath;break;case s.ny.data:n=a.B6.parseMetaData(e).get(a.B6.META_DATA_LABEL);break;case s.ny.vscodeNotebookCell:n=void 0;break;default:n=e.path}if(!n)return[{id:"unknown",mime:i.K.unknown}];n=n.toLowerCase();const r=(0,o.P8)(n),p=g(n,r,u);if(p)return[p,{id:c.vH,mime:i.K.text}];const m=g(n,r,d);if(m)return[m,{id:c.vH,mime:i.K.text}];if(t){const e=function(e){if((0,l.LU)(e)&&(e=e.substr(1)),e.length>0)for(let t=h.length-1;t>=0;t--){const n=h[t];if(!n.firstline)continue;const r=e.match(n.firstline);if(r&&r.length>0)return n}}(t);if(e)return[e,{id:c.vH,mime:i.K.text}]}return[{id:"unknown",mime:i.K.unknown}]}(e,t).map(e=>e.id)}function g(e,t,n){let r,i,s;for(let o=n.length-1;o>=0;o--){const a=n[o];if(t===a.filenameLowercase){r=a;break}if(a.filepattern&&(!i||a.filepattern.length>i.filepattern.length)){const n=a.filepatternOnPath?e:t;a.filepatternLowercase?.(n)&&(i=a)}a.extension&&(!s||a.extension.length>s.extension.length)&&t.endsWith(a.extensionLowercase)&&(s=a)}return r||i||s||void 0}},6362:(e,t,n)=>{"use strict";n.d(t,{M:()=>a,S:()=>l});var r=n(1490),i=n(6185),s=n(800),o=n(8348);class a{static fromRangeInclusive(e){return new a(e.startLineNumber,e.endLineNumber+1)}static joinMany(e){if(0===e.length)return[];let t=new l(e[0].slice());for(let n=1;nt)throw new r.D7(`startLineNumber ${e} cannot be after endLineNumberExclusive ${t}`);this.startLineNumber=e,this.endLineNumberExclusive=t}contains(e){return this.startLineNumber<=e&&et.endLineNumberExclusive>=e.startLineNumber),n=(0,o.iM)(this._normalizedRanges,t=>t.startLineNumber<=e.endLineNumberExclusive)+1;if(t===n)this._normalizedRanges.splice(t,0,e);else if(t===n-1){const n=this._normalizedRanges[t];this._normalizedRanges[t]=n.join(e)}else{const r=this._normalizedRanges[t].join(this._normalizedRanges[n-1]).join(e);this._normalizedRanges.splice(t,n-t,r)}}contains(e){const t=(0,o.lx)(this._normalizedRanges,t=>t.startLineNumber<=e);return!!t&&t.endLineNumberExclusive>e}intersects(e){const t=(0,o.lx)(this._normalizedRanges,t=>t.startLineNumbere.startLineNumber}getUnion(e){if(0===this._normalizedRanges.length)return e;if(0===e._normalizedRanges.length)return this;const t=[];let n=0,r=0,i=null;for(;n=s.startLineNumber?i=new a(i.startLineNumber,Math.max(i.endLineNumberExclusive,s.endLineNumberExclusive)):(t.push(i),i=s)}return null!==i&&t.push(i),new l(t)}subtractFrom(e){const t=(0,o.hw)(this._normalizedRanges,t=>t.endLineNumberExclusive>=e.startLineNumber),n=(0,o.iM)(this._normalizedRanges,t=>t.startLineNumber<=e.endLineNumberExclusive)+1;if(t===n)return new l([e]);const r=[];let i=e.startLineNumber;for(let e=t;ei&&r.push(new a(i,t.startLineNumber)),i=t.endLineNumberExclusive}return ie.toString()).join(", ")}getIntersection(e){const t=[];let n=0,r=0;for(;nt.delta(e)))}}},6461:(e,t,n)=>{"use strict";n.r(t),n.d(t,{ILanguageFeaturesService:()=>r});const r=(0,n(7352).u1)("ILanguageFeaturesService")},6506:(e,t,n)=>{"use strict";n.r(t),n.d(t,{LanguageIdCodec:()=>u,LanguagesRegistry:()=>p});var r=n(2373),i=n(6274),s=n(5603),o=n(6357),a=n(4086),l=n(4709),c=n(5352);const h=Object.prototype.hasOwnProperty,d="vs.editor.nullLanguage";class u{constructor(){this._languageIdToLanguage=[],this._languageToLanguageId=new Map,this._register(d,0),this._register(a.vH,1),this._nextLanguageId=2}_register(e,t){this._languageIdToLanguage[t]=e,this._languageToLanguageId.set(e,t)}register(e){if(this._languageToLanguageId.has(e))return;const t=this._nextLanguageId++;this._register(e,t)}encodeLanguageId(e){return this._languageToLanguageId.get(e)||0}decodeLanguageId(e){return this._languageIdToLanguage[e]||d}}class p extends i.jG{static{this.instanceCount=0}constructor(e=!0,t=!1){super(),this._onDidChange=this._register(new r.vl),this.onDidChange=this._onDidChange.event,p.instanceCount++,this._warnOnOverwrite=t,this.languageIdCodec=new u,this._dynamicLanguages=[],this._languages={},this._mimeTypesMap={},this._nameMap={},this._lowercaseNameMap={},e&&(this._initializeFromRegistry(),this._register(a.W6.onDidChangeLanguages(e=>{this._initializeFromRegistry()})))}dispose(){p.instanceCount--,super.dispose()}_initializeFromRegistry(){this._languages={},this._mimeTypesMap={},this._nameMap={},this._lowercaseNameMap={},(0,o.clearPlatformLanguageAssociations)();const e=[].concat(a.W6.getLanguages()).concat(this._dynamicLanguages);this._registerLanguages(e)}_registerLanguages(e){for(const t of e)this._registerLanguage(t);this._mimeTypesMap={},this._nameMap={},this._lowercaseNameMap={},Object.keys(this._languages).forEach(e=>{const t=this._languages[e];t.name&&(this._nameMap[t.name]=t.identifier),t.aliases.forEach(e=>{this._lowercaseNameMap[e.toLowerCase()]=t.identifier}),t.mimetypes.forEach(e=>{this._mimeTypesMap[e]=t.identifier})}),c.O.as(l.Fd.Configuration).registerOverrideIdentifiers(this.getRegisteredLanguageIds()),this._onDidChange.fire()}_registerLanguage(e){const t=e.id;let n;h.call(this._languages,t)?n=this._languages[t]:(this.languageIdCodec.register(t),n={identifier:t,name:null,mimetypes:[],aliases:[],extensions:[],filenames:[],configurationFiles:[],icons:[]},this._languages[t]=n),this._mergeLanguage(n,e)}_mergeLanguage(e,t){const n=t.id;let r=null;if(Array.isArray(t.mimetypes)&&t.mimetypes.length>0&&(e.mimetypes.push(...t.mimetypes),r=t.mimetypes[0]),r||(r=`text/x-${n}`,e.mimetypes.push(r)),Array.isArray(t.extensions)){t.configuration?e.extensions=t.extensions.concat(e.extensions):e.extensions=e.extensions.concat(t.extensions);for(const e of t.extensions)(0,o.registerPlatformLanguageAssociation)({id:n,mime:r,extension:e},this._warnOnOverwrite)}if(Array.isArray(t.filenames))for(const i of t.filenames)(0,o.registerPlatformLanguageAssociation)({id:n,mime:r,filename:i},this._warnOnOverwrite),e.filenames.push(i);if(Array.isArray(t.filenamePatterns))for(const e of t.filenamePatterns)(0,o.registerPlatformLanguageAssociation)({id:n,mime:r,filepattern:e},this._warnOnOverwrite);if("string"==typeof t.firstLine&&t.firstLine.length>0){let e=t.firstLine;"^"!==e.charAt(0)&&(e="^"+e);try{const t=new RegExp(e);(0,s.eY)(t)||(0,o.registerPlatformLanguageAssociation)({id:n,mime:r,firstline:t},this._warnOnOverwrite)}catch(n){console.warn(`[${t.id}]: Invalid regular expression \`${e}\`: `,n)}}e.aliases.push(n);let i=null;if(void 0!==t.aliases&&Array.isArray(t.aliases)&&(i=0===t.aliases.length?[null]:t.aliases),null!==i)for(const t of i)t&&0!==t.length&&e.aliases.push(t);const a=null!==i&&i.length>0;if(a&&null===i[0]);else{const t=(a?i[0]:null)||n;!a&&e.name||(e.name=t)}t.configuration&&e.configurationFiles.push(t.configuration),t.icon&&e.icons.push(t.icon)}isRegisteredLanguageId(e){return!!e&&h.call(this._languages,e)}getRegisteredLanguageIds(){return Object.keys(this._languages)}getLanguageIdByLanguageName(e){const t=e.toLowerCase();return h.call(this._lowercaseNameMap,t)?this._lowercaseNameMap[t]:null}getLanguageIdByMimeType(e){return e&&h.call(this._mimeTypesMap,e)?this._mimeTypesMap[e]:null}guessLanguageIdByFilepathOrFirstLine(e,t){return e||t?(0,o.getLanguageIds)(e,t):[]}}},6575:(e,t,n)=>{"use strict";n.d(t,{$l:()=>a,Gs:()=>u,MB:()=>o,Sw:()=>h,bb:()=>c,gN:()=>l,pJ:()=>d});var r=n(2323);const i="undefined"!=typeof Buffer;let s;new r.d(()=>new Uint8Array(256));class o{static wrap(e){return i&&!Buffer.isBuffer(e)&&(e=Buffer.from(e.buffer,e.byteOffset,e.byteLength)),new o(e)}constructor(e){this.buffer=e,this.byteLength=this.buffer.byteLength}toString(){return i?this.buffer.toString():(s||(s=new TextDecoder),s.decode(this.buffer))}}function a(e,t){return(0|e[t+0])>>>0|e[t+1]<<8>>>0}function l(e,t,n){e[n+0]=255&t,t>>>=8,e[n+1]=255&t}function c(e,t){return e[t]*2**24+65536*e[t+1]+256*e[t+2]+e[t+3]}function h(e,t,n){e[n+3]=t,t>>>=8,e[n+2]=t,t>>>=8,e[n+1]=t,t>>>=8,e[n]=t}function d(e,t){return e[t]}function u(e,t,n){e[n]=t}},6631:(e,t,n)=>{"use strict";n.d(t,{L:()=>r});const r=(0,n(7352).u1)("languageService")},6693:(e,t,n)=>{"use strict";n.r(t),n.d(t,{ITextResourceConfigurationService:()=>i,ITextResourcePropertiesService:()=>s});var r=n(7352);const i=(0,r.u1)("textResourceConfigurationService"),s=(0,r.u1)("textResourcePropertiesService")},6781:(e,t,n)=>{var r={"./simpleWorker":3142,"./simpleWorker.js":3142};function i(e){return Promise.resolve().then(()=>{if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return n(r[e])})}i.keys=()=>Object.keys(r),i.id=6781,e.exports=i},6996:(e,t,n)=>{"use strict";n.d(t,{Gy:()=>c,zy:()=>u,Yf:()=>h});var r,i,s=n(2373),o=n(6274),a=n(7352),l=n(5352);(i=r||(r={})).DARK="dark",i.LIGHT="light",i.HIGH_CONTRAST_DARK="hcDark",i.HIGH_CONTRAST_LIGHT="hcLight";const c=(0,a.u1)("themeService");function h(e){return{id:e}}const d=new class{constructor(){this.themingParticipants=[],this.themingParticipants=[],this.onThemingParticipantAddedEmitter=new s.vl}onColorThemeChange(e){return this.themingParticipants.push(e),this.onThemingParticipantAddedEmitter.fire(e),(0,o.s)(()=>{const t=this.themingParticipants.indexOf(e);this.themingParticipants.splice(t,1)})}getThemingParticipants(){return this.themingParticipants}};function u(e){return d.onColorThemeChange(e)}l.O.add("base.contributions.theming",d),o.jG},7317:(e,t,n)=>{"use strict";n.r(t),n.d(t,{KeyMod:()=>me,createMonacoBaseAPI:()=>fe});var r=n(7542),i=n(2373);class s{constructor(){this._keyCodeToStr=[],this._strToKeyCode=Object.create(null)}define(e,t){this._keyCodeToStr[e]=t,this._strToKeyCode[t.toLowerCase()]=e}keyCodeToStr(e){return this._keyCodeToStr[e]}strToKeyCode(e){return this._strToKeyCode[e.toLowerCase()]||0}}const o=new s,a=new s,l=new s,c=new Array(230),h={},d=[],u=Object.create(null),p=Object.create(null),m=[],f=[];for(let e=0;e<=193;e++)m[e]=-1;for(let e=0;e<=132;e++)f[e]=-1;var g;!function(){const e="",t=[[1,0,"None",0,"unknown",0,"VK_UNKNOWN",e,e],[1,1,"Hyper",0,e,0,e,e,e],[1,2,"Super",0,e,0,e,e,e],[1,3,"Fn",0,e,0,e,e,e],[1,4,"FnLock",0,e,0,e,e,e],[1,5,"Suspend",0,e,0,e,e,e],[1,6,"Resume",0,e,0,e,e,e],[1,7,"Turbo",0,e,0,e,e,e],[1,8,"Sleep",0,e,0,"VK_SLEEP",e,e],[1,9,"WakeUp",0,e,0,e,e,e],[0,10,"KeyA",31,"A",65,"VK_A",e,e],[0,11,"KeyB",32,"B",66,"VK_B",e,e],[0,12,"KeyC",33,"C",67,"VK_C",e,e],[0,13,"KeyD",34,"D",68,"VK_D",e,e],[0,14,"KeyE",35,"E",69,"VK_E",e,e],[0,15,"KeyF",36,"F",70,"VK_F",e,e],[0,16,"KeyG",37,"G",71,"VK_G",e,e],[0,17,"KeyH",38,"H",72,"VK_H",e,e],[0,18,"KeyI",39,"I",73,"VK_I",e,e],[0,19,"KeyJ",40,"J",74,"VK_J",e,e],[0,20,"KeyK",41,"K",75,"VK_K",e,e],[0,21,"KeyL",42,"L",76,"VK_L",e,e],[0,22,"KeyM",43,"M",77,"VK_M",e,e],[0,23,"KeyN",44,"N",78,"VK_N",e,e],[0,24,"KeyO",45,"O",79,"VK_O",e,e],[0,25,"KeyP",46,"P",80,"VK_P",e,e],[0,26,"KeyQ",47,"Q",81,"VK_Q",e,e],[0,27,"KeyR",48,"R",82,"VK_R",e,e],[0,28,"KeyS",49,"S",83,"VK_S",e,e],[0,29,"KeyT",50,"T",84,"VK_T",e,e],[0,30,"KeyU",51,"U",85,"VK_U",e,e],[0,31,"KeyV",52,"V",86,"VK_V",e,e],[0,32,"KeyW",53,"W",87,"VK_W",e,e],[0,33,"KeyX",54,"X",88,"VK_X",e,e],[0,34,"KeyY",55,"Y",89,"VK_Y",e,e],[0,35,"KeyZ",56,"Z",90,"VK_Z",e,e],[0,36,"Digit1",22,"1",49,"VK_1",e,e],[0,37,"Digit2",23,"2",50,"VK_2",e,e],[0,38,"Digit3",24,"3",51,"VK_3",e,e],[0,39,"Digit4",25,"4",52,"VK_4",e,e],[0,40,"Digit5",26,"5",53,"VK_5",e,e],[0,41,"Digit6",27,"6",54,"VK_6",e,e],[0,42,"Digit7",28,"7",55,"VK_7",e,e],[0,43,"Digit8",29,"8",56,"VK_8",e,e],[0,44,"Digit9",30,"9",57,"VK_9",e,e],[0,45,"Digit0",21,"0",48,"VK_0",e,e],[1,46,"Enter",3,"Enter",13,"VK_RETURN",e,e],[1,47,"Escape",9,"Escape",27,"VK_ESCAPE",e,e],[1,48,"Backspace",1,"Backspace",8,"VK_BACK",e,e],[1,49,"Tab",2,"Tab",9,"VK_TAB",e,e],[1,50,"Space",10,"Space",32,"VK_SPACE",e,e],[0,51,"Minus",88,"-",189,"VK_OEM_MINUS","-","OEM_MINUS"],[0,52,"Equal",86,"=",187,"VK_OEM_PLUS","=","OEM_PLUS"],[0,53,"BracketLeft",92,"[",219,"VK_OEM_4","[","OEM_4"],[0,54,"BracketRight",94,"]",221,"VK_OEM_6","]","OEM_6"],[0,55,"Backslash",93,"\\",220,"VK_OEM_5","\\","OEM_5"],[0,56,"IntlHash",0,e,0,e,e,e],[0,57,"Semicolon",85,";",186,"VK_OEM_1",";","OEM_1"],[0,58,"Quote",95,"'",222,"VK_OEM_7","'","OEM_7"],[0,59,"Backquote",91,"`",192,"VK_OEM_3","`","OEM_3"],[0,60,"Comma",87,",",188,"VK_OEM_COMMA",",","OEM_COMMA"],[0,61,"Period",89,".",190,"VK_OEM_PERIOD",".","OEM_PERIOD"],[0,62,"Slash",90,"/",191,"VK_OEM_2","/","OEM_2"],[1,63,"CapsLock",8,"CapsLock",20,"VK_CAPITAL",e,e],[1,64,"F1",59,"F1",112,"VK_F1",e,e],[1,65,"F2",60,"F2",113,"VK_F2",e,e],[1,66,"F3",61,"F3",114,"VK_F3",e,e],[1,67,"F4",62,"F4",115,"VK_F4",e,e],[1,68,"F5",63,"F5",116,"VK_F5",e,e],[1,69,"F6",64,"F6",117,"VK_F6",e,e],[1,70,"F7",65,"F7",118,"VK_F7",e,e],[1,71,"F8",66,"F8",119,"VK_F8",e,e],[1,72,"F9",67,"F9",120,"VK_F9",e,e],[1,73,"F10",68,"F10",121,"VK_F10",e,e],[1,74,"F11",69,"F11",122,"VK_F11",e,e],[1,75,"F12",70,"F12",123,"VK_F12",e,e],[1,76,"PrintScreen",0,e,0,e,e,e],[1,77,"ScrollLock",84,"ScrollLock",145,"VK_SCROLL",e,e],[1,78,"Pause",7,"PauseBreak",19,"VK_PAUSE",e,e],[1,79,"Insert",19,"Insert",45,"VK_INSERT",e,e],[1,80,"Home",14,"Home",36,"VK_HOME",e,e],[1,81,"PageUp",11,"PageUp",33,"VK_PRIOR",e,e],[1,82,"Delete",20,"Delete",46,"VK_DELETE",e,e],[1,83,"End",13,"End",35,"VK_END",e,e],[1,84,"PageDown",12,"PageDown",34,"VK_NEXT",e,e],[1,85,"ArrowRight",17,"RightArrow",39,"VK_RIGHT","Right",e],[1,86,"ArrowLeft",15,"LeftArrow",37,"VK_LEFT","Left",e],[1,87,"ArrowDown",18,"DownArrow",40,"VK_DOWN","Down",e],[1,88,"ArrowUp",16,"UpArrow",38,"VK_UP","Up",e],[1,89,"NumLock",83,"NumLock",144,"VK_NUMLOCK",e,e],[1,90,"NumpadDivide",113,"NumPad_Divide",111,"VK_DIVIDE",e,e],[1,91,"NumpadMultiply",108,"NumPad_Multiply",106,"VK_MULTIPLY",e,e],[1,92,"NumpadSubtract",111,"NumPad_Subtract",109,"VK_SUBTRACT",e,e],[1,93,"NumpadAdd",109,"NumPad_Add",107,"VK_ADD",e,e],[1,94,"NumpadEnter",3,e,0,e,e,e],[1,95,"Numpad1",99,"NumPad1",97,"VK_NUMPAD1",e,e],[1,96,"Numpad2",100,"NumPad2",98,"VK_NUMPAD2",e,e],[1,97,"Numpad3",101,"NumPad3",99,"VK_NUMPAD3",e,e],[1,98,"Numpad4",102,"NumPad4",100,"VK_NUMPAD4",e,e],[1,99,"Numpad5",103,"NumPad5",101,"VK_NUMPAD5",e,e],[1,100,"Numpad6",104,"NumPad6",102,"VK_NUMPAD6",e,e],[1,101,"Numpad7",105,"NumPad7",103,"VK_NUMPAD7",e,e],[1,102,"Numpad8",106,"NumPad8",104,"VK_NUMPAD8",e,e],[1,103,"Numpad9",107,"NumPad9",105,"VK_NUMPAD9",e,e],[1,104,"Numpad0",98,"NumPad0",96,"VK_NUMPAD0",e,e],[1,105,"NumpadDecimal",112,"NumPad_Decimal",110,"VK_DECIMAL",e,e],[0,106,"IntlBackslash",97,"OEM_102",226,"VK_OEM_102",e,e],[1,107,"ContextMenu",58,"ContextMenu",93,e,e,e],[1,108,"Power",0,e,0,e,e,e],[1,109,"NumpadEqual",0,e,0,e,e,e],[1,110,"F13",71,"F13",124,"VK_F13",e,e],[1,111,"F14",72,"F14",125,"VK_F14",e,e],[1,112,"F15",73,"F15",126,"VK_F15",e,e],[1,113,"F16",74,"F16",127,"VK_F16",e,e],[1,114,"F17",75,"F17",128,"VK_F17",e,e],[1,115,"F18",76,"F18",129,"VK_F18",e,e],[1,116,"F19",77,"F19",130,"VK_F19",e,e],[1,117,"F20",78,"F20",131,"VK_F20",e,e],[1,118,"F21",79,"F21",132,"VK_F21",e,e],[1,119,"F22",80,"F22",133,"VK_F22",e,e],[1,120,"F23",81,"F23",134,"VK_F23",e,e],[1,121,"F24",82,"F24",135,"VK_F24",e,e],[1,122,"Open",0,e,0,e,e,e],[1,123,"Help",0,e,0,e,e,e],[1,124,"Select",0,e,0,e,e,e],[1,125,"Again",0,e,0,e,e,e],[1,126,"Undo",0,e,0,e,e,e],[1,127,"Cut",0,e,0,e,e,e],[1,128,"Copy",0,e,0,e,e,e],[1,129,"Paste",0,e,0,e,e,e],[1,130,"Find",0,e,0,e,e,e],[1,131,"AudioVolumeMute",117,"AudioVolumeMute",173,"VK_VOLUME_MUTE",e,e],[1,132,"AudioVolumeUp",118,"AudioVolumeUp",175,"VK_VOLUME_UP",e,e],[1,133,"AudioVolumeDown",119,"AudioVolumeDown",174,"VK_VOLUME_DOWN",e,e],[1,134,"NumpadComma",110,"NumPad_Separator",108,"VK_SEPARATOR",e,e],[0,135,"IntlRo",115,"ABNT_C1",193,"VK_ABNT_C1",e,e],[1,136,"KanaMode",0,e,0,e,e,e],[0,137,"IntlYen",0,e,0,e,e,e],[1,138,"Convert",0,e,0,e,e,e],[1,139,"NonConvert",0,e,0,e,e,e],[1,140,"Lang1",0,e,0,e,e,e],[1,141,"Lang2",0,e,0,e,e,e],[1,142,"Lang3",0,e,0,e,e,e],[1,143,"Lang4",0,e,0,e,e,e],[1,144,"Lang5",0,e,0,e,e,e],[1,145,"Abort",0,e,0,e,e,e],[1,146,"Props",0,e,0,e,e,e],[1,147,"NumpadParenLeft",0,e,0,e,e,e],[1,148,"NumpadParenRight",0,e,0,e,e,e],[1,149,"NumpadBackspace",0,e,0,e,e,e],[1,150,"NumpadMemoryStore",0,e,0,e,e,e],[1,151,"NumpadMemoryRecall",0,e,0,e,e,e],[1,152,"NumpadMemoryClear",0,e,0,e,e,e],[1,153,"NumpadMemoryAdd",0,e,0,e,e,e],[1,154,"NumpadMemorySubtract",0,e,0,e,e,e],[1,155,"NumpadClear",131,"Clear",12,"VK_CLEAR",e,e],[1,156,"NumpadClearEntry",0,e,0,e,e,e],[1,0,e,5,"Ctrl",17,"VK_CONTROL",e,e],[1,0,e,4,"Shift",16,"VK_SHIFT",e,e],[1,0,e,6,"Alt",18,"VK_MENU",e,e],[1,0,e,57,"Meta",91,"VK_COMMAND",e,e],[1,157,"ControlLeft",5,e,0,"VK_LCONTROL",e,e],[1,158,"ShiftLeft",4,e,0,"VK_LSHIFT",e,e],[1,159,"AltLeft",6,e,0,"VK_LMENU",e,e],[1,160,"MetaLeft",57,e,0,"VK_LWIN",e,e],[1,161,"ControlRight",5,e,0,"VK_RCONTROL",e,e],[1,162,"ShiftRight",4,e,0,"VK_RSHIFT",e,e],[1,163,"AltRight",6,e,0,"VK_RMENU",e,e],[1,164,"MetaRight",57,e,0,"VK_RWIN",e,e],[1,165,"BrightnessUp",0,e,0,e,e,e],[1,166,"BrightnessDown",0,e,0,e,e,e],[1,167,"MediaPlay",0,e,0,e,e,e],[1,168,"MediaRecord",0,e,0,e,e,e],[1,169,"MediaFastForward",0,e,0,e,e,e],[1,170,"MediaRewind",0,e,0,e,e,e],[1,171,"MediaTrackNext",124,"MediaTrackNext",176,"VK_MEDIA_NEXT_TRACK",e,e],[1,172,"MediaTrackPrevious",125,"MediaTrackPrevious",177,"VK_MEDIA_PREV_TRACK",e,e],[1,173,"MediaStop",126,"MediaStop",178,"VK_MEDIA_STOP",e,e],[1,174,"Eject",0,e,0,e,e,e],[1,175,"MediaPlayPause",127,"MediaPlayPause",179,"VK_MEDIA_PLAY_PAUSE",e,e],[1,176,"MediaSelect",128,"LaunchMediaPlayer",181,"VK_MEDIA_LAUNCH_MEDIA_SELECT",e,e],[1,177,"LaunchMail",129,"LaunchMail",180,"VK_MEDIA_LAUNCH_MAIL",e,e],[1,178,"LaunchApp2",130,"LaunchApp2",183,"VK_MEDIA_LAUNCH_APP2",e,e],[1,179,"LaunchApp1",0,e,0,"VK_MEDIA_LAUNCH_APP1",e,e],[1,180,"SelectTask",0,e,0,e,e,e],[1,181,"LaunchScreenSaver",0,e,0,e,e,e],[1,182,"BrowserSearch",120,"BrowserSearch",170,"VK_BROWSER_SEARCH",e,e],[1,183,"BrowserHome",121,"BrowserHome",172,"VK_BROWSER_HOME",e,e],[1,184,"BrowserBack",122,"BrowserBack",166,"VK_BROWSER_BACK",e,e],[1,185,"BrowserForward",123,"BrowserForward",167,"VK_BROWSER_FORWARD",e,e],[1,186,"BrowserStop",0,e,0,"VK_BROWSER_STOP",e,e],[1,187,"BrowserRefresh",0,e,0,"VK_BROWSER_REFRESH",e,e],[1,188,"BrowserFavorites",0,e,0,"VK_BROWSER_FAVORITES",e,e],[1,189,"ZoomToggle",0,e,0,e,e,e],[1,190,"MailReply",0,e,0,e,e,e],[1,191,"MailForward",0,e,0,e,e,e],[1,192,"MailSend",0,e,0,e,e,e],[1,0,e,114,"KeyInComposition",229,e,e,e],[1,0,e,116,"ABNT_C2",194,"VK_ABNT_C2",e,e],[1,0,e,96,"OEM_8",223,"VK_OEM_8",e,e],[1,0,e,0,e,0,"VK_KANA",e,e],[1,0,e,0,e,0,"VK_HANGUL",e,e],[1,0,e,0,e,0,"VK_JUNJA",e,e],[1,0,e,0,e,0,"VK_FINAL",e,e],[1,0,e,0,e,0,"VK_HANJA",e,e],[1,0,e,0,e,0,"VK_KANJI",e,e],[1,0,e,0,e,0,"VK_CONVERT",e,e],[1,0,e,0,e,0,"VK_NONCONVERT",e,e],[1,0,e,0,e,0,"VK_ACCEPT",e,e],[1,0,e,0,e,0,"VK_MODECHANGE",e,e],[1,0,e,0,e,0,"VK_SELECT",e,e],[1,0,e,0,e,0,"VK_PRINT",e,e],[1,0,e,0,e,0,"VK_EXECUTE",e,e],[1,0,e,0,e,0,"VK_SNAPSHOT",e,e],[1,0,e,0,e,0,"VK_HELP",e,e],[1,0,e,0,e,0,"VK_APPS",e,e],[1,0,e,0,e,0,"VK_PROCESSKEY",e,e],[1,0,e,0,e,0,"VK_PACKET",e,e],[1,0,e,0,e,0,"VK_DBE_SBCSCHAR",e,e],[1,0,e,0,e,0,"VK_DBE_DBCSCHAR",e,e],[1,0,e,0,e,0,"VK_ATTN",e,e],[1,0,e,0,e,0,"VK_CRSEL",e,e],[1,0,e,0,e,0,"VK_EXSEL",e,e],[1,0,e,0,e,0,"VK_EREOF",e,e],[1,0,e,0,e,0,"VK_PLAY",e,e],[1,0,e,0,e,0,"VK_ZOOM",e,e],[1,0,e,0,e,0,"VK_NONAME",e,e],[1,0,e,0,e,0,"VK_PA1",e,e],[1,0,e,0,e,0,"VK_OEM_CLEAR",e,e]],n=[],r=[];for(const e of t){const[t,i,s,g,b,v,y,w,C]=e;if(r[i]||(r[i]=!0,d[i]=s,u[s]=i,p[s.toLowerCase()]=i,t&&(m[i]=g,0!==g&&3!==g&&5!==g&&4!==g&&6!==g&&57!==g&&(f[g]=i))),!n[g]){if(n[g]=!0,!b)throw new Error(`String representation missing for key code ${g} around scan code ${s}`);o.define(g,b),a.define(g,w||b),l.define(g,C||w||b)}v&&(c[v]=g),y&&(h[y]=g)}f[3]=46}(),function(e){e.toString=function(e){return o.keyCodeToStr(e)},e.fromString=function(e){return o.strToKeyCode(e)},e.toUserSettingsUS=function(e){return a.keyCodeToStr(e)},e.toUserSettingsGeneral=function(e){return l.keyCodeToStr(e)},e.fromUserSettings=function(e){return a.strToKeyCode(e)||l.strToKeyCode(e)},e.toElectronAccelerator=function(e){if(e>=98&&e<=113)return null;switch(e){case 16:return"Up";case 18:return"Down";case 15:return"Left";case 17:return"Right"}return o.keyCodeToStr(e)}}(g||(g={}));var b,v,y,w,C,_,k,x,S,E,F,L,I,T,N,R,D,A,M,O,z,P,B,W,V,U,$,q,j,K,H,G,Q,J,Y,X,Z,ee,te,ne,re,ie,se,oe,ae,le,ce=n(695),he=n(8274),de=n(800),ue=n(1471),pe=n(4945);!function(e){e[e.Unknown=0]="Unknown",e[e.Disabled=1]="Disabled",e[e.Enabled=2]="Enabled"}(b||(b={})),function(e){e[e.Invoke=1]="Invoke",e[e.Auto=2]="Auto"}(v||(v={})),function(e){e[e.None=0]="None",e[e.KeepWhitespace=1]="KeepWhitespace",e[e.InsertAsSnippet=4]="InsertAsSnippet"}(y||(y={})),function(e){e[e.Method=0]="Method",e[e.Function=1]="Function",e[e.Constructor=2]="Constructor",e[e.Field=3]="Field",e[e.Variable=4]="Variable",e[e.Class=5]="Class",e[e.Struct=6]="Struct",e[e.Interface=7]="Interface",e[e.Module=8]="Module",e[e.Property=9]="Property",e[e.Event=10]="Event",e[e.Operator=11]="Operator",e[e.Unit=12]="Unit",e[e.Value=13]="Value",e[e.Constant=14]="Constant",e[e.Enum=15]="Enum",e[e.EnumMember=16]="EnumMember",e[e.Keyword=17]="Keyword",e[e.Text=18]="Text",e[e.Color=19]="Color",e[e.File=20]="File",e[e.Reference=21]="Reference",e[e.Customcolor=22]="Customcolor",e[e.Folder=23]="Folder",e[e.TypeParameter=24]="TypeParameter",e[e.User=25]="User",e[e.Issue=26]="Issue",e[e.Snippet=27]="Snippet"}(w||(w={})),function(e){e[e.Deprecated=1]="Deprecated"}(C||(C={})),function(e){e[e.Invoke=0]="Invoke",e[e.TriggerCharacter=1]="TriggerCharacter",e[e.TriggerForIncompleteCompletions=2]="TriggerForIncompleteCompletions"}(_||(_={})),function(e){e[e.EXACT=0]="EXACT",e[e.ABOVE=1]="ABOVE",e[e.BELOW=2]="BELOW"}(k||(k={})),function(e){e[e.NotSet=0]="NotSet",e[e.ContentFlush=1]="ContentFlush",e[e.RecoverFromMarkers=2]="RecoverFromMarkers",e[e.Explicit=3]="Explicit",e[e.Paste=4]="Paste",e[e.Undo=5]="Undo",e[e.Redo=6]="Redo"}(x||(x={})),function(e){e[e.LF=1]="LF",e[e.CRLF=2]="CRLF"}(S||(S={})),function(e){e[e.Text=0]="Text",e[e.Read=1]="Read",e[e.Write=2]="Write"}(E||(E={})),function(e){e[e.None=0]="None",e[e.Keep=1]="Keep",e[e.Brackets=2]="Brackets",e[e.Advanced=3]="Advanced",e[e.Full=4]="Full"}(F||(F={})),function(e){e[e.acceptSuggestionOnCommitCharacter=0]="acceptSuggestionOnCommitCharacter",e[e.acceptSuggestionOnEnter=1]="acceptSuggestionOnEnter",e[e.accessibilitySupport=2]="accessibilitySupport",e[e.accessibilityPageSize=3]="accessibilityPageSize",e[e.ariaLabel=4]="ariaLabel",e[e.ariaRequired=5]="ariaRequired",e[e.autoClosingBrackets=6]="autoClosingBrackets",e[e.autoClosingComments=7]="autoClosingComments",e[e.screenReaderAnnounceInlineSuggestion=8]="screenReaderAnnounceInlineSuggestion",e[e.autoClosingDelete=9]="autoClosingDelete",e[e.autoClosingOvertype=10]="autoClosingOvertype",e[e.autoClosingQuotes=11]="autoClosingQuotes",e[e.autoIndent=12]="autoIndent",e[e.automaticLayout=13]="automaticLayout",e[e.autoSurround=14]="autoSurround",e[e.bracketPairColorization=15]="bracketPairColorization",e[e.guides=16]="guides",e[e.codeLens=17]="codeLens",e[e.codeLensFontFamily=18]="codeLensFontFamily",e[e.codeLensFontSize=19]="codeLensFontSize",e[e.colorDecorators=20]="colorDecorators",e[e.colorDecoratorsLimit=21]="colorDecoratorsLimit",e[e.columnSelection=22]="columnSelection",e[e.comments=23]="comments",e[e.contextmenu=24]="contextmenu",e[e.copyWithSyntaxHighlighting=25]="copyWithSyntaxHighlighting",e[e.cursorBlinking=26]="cursorBlinking",e[e.cursorSmoothCaretAnimation=27]="cursorSmoothCaretAnimation",e[e.cursorStyle=28]="cursorStyle",e[e.cursorSurroundingLines=29]="cursorSurroundingLines",e[e.cursorSurroundingLinesStyle=30]="cursorSurroundingLinesStyle",e[e.cursorWidth=31]="cursorWidth",e[e.disableLayerHinting=32]="disableLayerHinting",e[e.disableMonospaceOptimizations=33]="disableMonospaceOptimizations",e[e.domReadOnly=34]="domReadOnly",e[e.dragAndDrop=35]="dragAndDrop",e[e.dropIntoEditor=36]="dropIntoEditor",e[e.emptySelectionClipboard=37]="emptySelectionClipboard",e[e.experimentalWhitespaceRendering=38]="experimentalWhitespaceRendering",e[e.extraEditorClassName=39]="extraEditorClassName",e[e.fastScrollSensitivity=40]="fastScrollSensitivity",e[e.find=41]="find",e[e.fixedOverflowWidgets=42]="fixedOverflowWidgets",e[e.folding=43]="folding",e[e.foldingStrategy=44]="foldingStrategy",e[e.foldingHighlight=45]="foldingHighlight",e[e.foldingImportsByDefault=46]="foldingImportsByDefault",e[e.foldingMaximumRegions=47]="foldingMaximumRegions",e[e.unfoldOnClickAfterEndOfLine=48]="unfoldOnClickAfterEndOfLine",e[e.fontFamily=49]="fontFamily",e[e.fontInfo=50]="fontInfo",e[e.fontLigatures=51]="fontLigatures",e[e.fontSize=52]="fontSize",e[e.fontWeight=53]="fontWeight",e[e.fontVariations=54]="fontVariations",e[e.formatOnPaste=55]="formatOnPaste",e[e.formatOnType=56]="formatOnType",e[e.glyphMargin=57]="glyphMargin",e[e.gotoLocation=58]="gotoLocation",e[e.hideCursorInOverviewRuler=59]="hideCursorInOverviewRuler",e[e.hover=60]="hover",e[e.inDiffEditor=61]="inDiffEditor",e[e.inlineSuggest=62]="inlineSuggest",e[e.inlineEdit=63]="inlineEdit",e[e.letterSpacing=64]="letterSpacing",e[e.lightbulb=65]="lightbulb",e[e.lineDecorationsWidth=66]="lineDecorationsWidth",e[e.lineHeight=67]="lineHeight",e[e.lineNumbers=68]="lineNumbers",e[e.lineNumbersMinChars=69]="lineNumbersMinChars",e[e.linkedEditing=70]="linkedEditing",e[e.links=71]="links",e[e.matchBrackets=72]="matchBrackets",e[e.minimap=73]="minimap",e[e.mouseStyle=74]="mouseStyle",e[e.mouseWheelScrollSensitivity=75]="mouseWheelScrollSensitivity",e[e.mouseWheelZoom=76]="mouseWheelZoom",e[e.multiCursorMergeOverlapping=77]="multiCursorMergeOverlapping",e[e.multiCursorModifier=78]="multiCursorModifier",e[e.multiCursorPaste=79]="multiCursorPaste",e[e.multiCursorLimit=80]="multiCursorLimit",e[e.occurrencesHighlight=81]="occurrencesHighlight",e[e.overviewRulerBorder=82]="overviewRulerBorder",e[e.overviewRulerLanes=83]="overviewRulerLanes",e[e.padding=84]="padding",e[e.pasteAs=85]="pasteAs",e[e.parameterHints=86]="parameterHints",e[e.peekWidgetDefaultFocus=87]="peekWidgetDefaultFocus",e[e.placeholder=88]="placeholder",e[e.definitionLinkOpensInPeek=89]="definitionLinkOpensInPeek",e[e.quickSuggestions=90]="quickSuggestions",e[e.quickSuggestionsDelay=91]="quickSuggestionsDelay",e[e.readOnly=92]="readOnly",e[e.readOnlyMessage=93]="readOnlyMessage",e[e.renameOnType=94]="renameOnType",e[e.renderControlCharacters=95]="renderControlCharacters",e[e.renderFinalNewline=96]="renderFinalNewline",e[e.renderLineHighlight=97]="renderLineHighlight",e[e.renderLineHighlightOnlyWhenFocus=98]="renderLineHighlightOnlyWhenFocus",e[e.renderValidationDecorations=99]="renderValidationDecorations",e[e.renderWhitespace=100]="renderWhitespace",e[e.revealHorizontalRightPadding=101]="revealHorizontalRightPadding",e[e.roundedSelection=102]="roundedSelection",e[e.rulers=103]="rulers",e[e.scrollbar=104]="scrollbar",e[e.scrollBeyondLastColumn=105]="scrollBeyondLastColumn",e[e.scrollBeyondLastLine=106]="scrollBeyondLastLine",e[e.scrollPredominantAxis=107]="scrollPredominantAxis",e[e.selectionClipboard=108]="selectionClipboard",e[e.selectionHighlight=109]="selectionHighlight",e[e.selectOnLineNumbers=110]="selectOnLineNumbers",e[e.showFoldingControls=111]="showFoldingControls",e[e.showUnused=112]="showUnused",e[e.snippetSuggestions=113]="snippetSuggestions",e[e.smartSelect=114]="smartSelect",e[e.smoothScrolling=115]="smoothScrolling",e[e.stickyScroll=116]="stickyScroll",e[e.stickyTabStops=117]="stickyTabStops",e[e.stopRenderingLineAfter=118]="stopRenderingLineAfter",e[e.suggest=119]="suggest",e[e.suggestFontSize=120]="suggestFontSize",e[e.suggestLineHeight=121]="suggestLineHeight",e[e.suggestOnTriggerCharacters=122]="suggestOnTriggerCharacters",e[e.suggestSelection=123]="suggestSelection",e[e.tabCompletion=124]="tabCompletion",e[e.tabIndex=125]="tabIndex",e[e.unicodeHighlighting=126]="unicodeHighlighting",e[e.unusualLineTerminators=127]="unusualLineTerminators",e[e.useShadowDOM=128]="useShadowDOM",e[e.useTabStops=129]="useTabStops",e[e.wordBreak=130]="wordBreak",e[e.wordSegmenterLocales=131]="wordSegmenterLocales",e[e.wordSeparators=132]="wordSeparators",e[e.wordWrap=133]="wordWrap",e[e.wordWrapBreakAfterCharacters=134]="wordWrapBreakAfterCharacters",e[e.wordWrapBreakBeforeCharacters=135]="wordWrapBreakBeforeCharacters",e[e.wordWrapColumn=136]="wordWrapColumn",e[e.wordWrapOverride1=137]="wordWrapOverride1",e[e.wordWrapOverride2=138]="wordWrapOverride2",e[e.wrappingIndent=139]="wrappingIndent",e[e.wrappingStrategy=140]="wrappingStrategy",e[e.showDeprecated=141]="showDeprecated",e[e.inlayHints=142]="inlayHints",e[e.editorClassName=143]="editorClassName",e[e.pixelRatio=144]="pixelRatio",e[e.tabFocusMode=145]="tabFocusMode",e[e.layoutInfo=146]="layoutInfo",e[e.wrappingInfo=147]="wrappingInfo",e[e.defaultColorDecorators=148]="defaultColorDecorators",e[e.colorDecoratorsActivatedOn=149]="colorDecoratorsActivatedOn",e[e.inlineCompletionsAccessibilityVerbose=150]="inlineCompletionsAccessibilityVerbose"}(L||(L={})),function(e){e[e.TextDefined=0]="TextDefined",e[e.LF=1]="LF",e[e.CRLF=2]="CRLF"}(I||(I={})),function(e){e[e.LF=0]="LF",e[e.CRLF=1]="CRLF"}(T||(T={})),function(e){e[e.Left=1]="Left",e[e.Center=2]="Center",e[e.Right=3]="Right"}(N||(N={})),function(e){e[e.Increase=0]="Increase",e[e.Decrease=1]="Decrease"}(R||(R={})),function(e){e[e.None=0]="None",e[e.Indent=1]="Indent",e[e.IndentOutdent=2]="IndentOutdent",e[e.Outdent=3]="Outdent"}(D||(D={})),function(e){e[e.Both=0]="Both",e[e.Right=1]="Right",e[e.Left=2]="Left",e[e.None=3]="None"}(A||(A={})),function(e){e[e.Type=1]="Type",e[e.Parameter=2]="Parameter"}(M||(M={})),function(e){e[e.Automatic=0]="Automatic",e[e.Explicit=1]="Explicit"}(O||(O={})),function(e){e[e.Invoke=0]="Invoke",e[e.Automatic=1]="Automatic"}(z||(z={})),function(e){e[e.DependsOnKbLayout=-1]="DependsOnKbLayout",e[e.Unknown=0]="Unknown",e[e.Backspace=1]="Backspace",e[e.Tab=2]="Tab",e[e.Enter=3]="Enter",e[e.Shift=4]="Shift",e[e.Ctrl=5]="Ctrl",e[e.Alt=6]="Alt",e[e.PauseBreak=7]="PauseBreak",e[e.CapsLock=8]="CapsLock",e[e.Escape=9]="Escape",e[e.Space=10]="Space",e[e.PageUp=11]="PageUp",e[e.PageDown=12]="PageDown",e[e.End=13]="End",e[e.Home=14]="Home",e[e.LeftArrow=15]="LeftArrow",e[e.UpArrow=16]="UpArrow",e[e.RightArrow=17]="RightArrow",e[e.DownArrow=18]="DownArrow",e[e.Insert=19]="Insert",e[e.Delete=20]="Delete",e[e.Digit0=21]="Digit0",e[e.Digit1=22]="Digit1",e[e.Digit2=23]="Digit2",e[e.Digit3=24]="Digit3",e[e.Digit4=25]="Digit4",e[e.Digit5=26]="Digit5",e[e.Digit6=27]="Digit6",e[e.Digit7=28]="Digit7",e[e.Digit8=29]="Digit8",e[e.Digit9=30]="Digit9",e[e.KeyA=31]="KeyA",e[e.KeyB=32]="KeyB",e[e.KeyC=33]="KeyC",e[e.KeyD=34]="KeyD",e[e.KeyE=35]="KeyE",e[e.KeyF=36]="KeyF",e[e.KeyG=37]="KeyG",e[e.KeyH=38]="KeyH",e[e.KeyI=39]="KeyI",e[e.KeyJ=40]="KeyJ",e[e.KeyK=41]="KeyK",e[e.KeyL=42]="KeyL",e[e.KeyM=43]="KeyM",e[e.KeyN=44]="KeyN",e[e.KeyO=45]="KeyO",e[e.KeyP=46]="KeyP",e[e.KeyQ=47]="KeyQ",e[e.KeyR=48]="KeyR",e[e.KeyS=49]="KeyS",e[e.KeyT=50]="KeyT",e[e.KeyU=51]="KeyU",e[e.KeyV=52]="KeyV",e[e.KeyW=53]="KeyW",e[e.KeyX=54]="KeyX",e[e.KeyY=55]="KeyY",e[e.KeyZ=56]="KeyZ",e[e.Meta=57]="Meta",e[e.ContextMenu=58]="ContextMenu",e[e.F1=59]="F1",e[e.F2=60]="F2",e[e.F3=61]="F3",e[e.F4=62]="F4",e[e.F5=63]="F5",e[e.F6=64]="F6",e[e.F7=65]="F7",e[e.F8=66]="F8",e[e.F9=67]="F9",e[e.F10=68]="F10",e[e.F11=69]="F11",e[e.F12=70]="F12",e[e.F13=71]="F13",e[e.F14=72]="F14",e[e.F15=73]="F15",e[e.F16=74]="F16",e[e.F17=75]="F17",e[e.F18=76]="F18",e[e.F19=77]="F19",e[e.F20=78]="F20",e[e.F21=79]="F21",e[e.F22=80]="F22",e[e.F23=81]="F23",e[e.F24=82]="F24",e[e.NumLock=83]="NumLock",e[e.ScrollLock=84]="ScrollLock",e[e.Semicolon=85]="Semicolon",e[e.Equal=86]="Equal",e[e.Comma=87]="Comma",e[e.Minus=88]="Minus",e[e.Period=89]="Period",e[e.Slash=90]="Slash",e[e.Backquote=91]="Backquote",e[e.BracketLeft=92]="BracketLeft",e[e.Backslash=93]="Backslash",e[e.BracketRight=94]="BracketRight",e[e.Quote=95]="Quote",e[e.OEM_8=96]="OEM_8",e[e.IntlBackslash=97]="IntlBackslash",e[e.Numpad0=98]="Numpad0",e[e.Numpad1=99]="Numpad1",e[e.Numpad2=100]="Numpad2",e[e.Numpad3=101]="Numpad3",e[e.Numpad4=102]="Numpad4",e[e.Numpad5=103]="Numpad5",e[e.Numpad6=104]="Numpad6",e[e.Numpad7=105]="Numpad7",e[e.Numpad8=106]="Numpad8",e[e.Numpad9=107]="Numpad9",e[e.NumpadMultiply=108]="NumpadMultiply",e[e.NumpadAdd=109]="NumpadAdd",e[e.NUMPAD_SEPARATOR=110]="NUMPAD_SEPARATOR",e[e.NumpadSubtract=111]="NumpadSubtract",e[e.NumpadDecimal=112]="NumpadDecimal",e[e.NumpadDivide=113]="NumpadDivide",e[e.KEY_IN_COMPOSITION=114]="KEY_IN_COMPOSITION",e[e.ABNT_C1=115]="ABNT_C1",e[e.ABNT_C2=116]="ABNT_C2",e[e.AudioVolumeMute=117]="AudioVolumeMute",e[e.AudioVolumeUp=118]="AudioVolumeUp",e[e.AudioVolumeDown=119]="AudioVolumeDown",e[e.BrowserSearch=120]="BrowserSearch",e[e.BrowserHome=121]="BrowserHome",e[e.BrowserBack=122]="BrowserBack",e[e.BrowserForward=123]="BrowserForward",e[e.MediaTrackNext=124]="MediaTrackNext",e[e.MediaTrackPrevious=125]="MediaTrackPrevious",e[e.MediaStop=126]="MediaStop",e[e.MediaPlayPause=127]="MediaPlayPause",e[e.LaunchMediaPlayer=128]="LaunchMediaPlayer",e[e.LaunchMail=129]="LaunchMail",e[e.LaunchApp2=130]="LaunchApp2",e[e.Clear=131]="Clear",e[e.MAX_VALUE=132]="MAX_VALUE"}(P||(P={})),function(e){e[e.Hint=1]="Hint",e[e.Info=2]="Info",e[e.Warning=4]="Warning",e[e.Error=8]="Error"}(B||(B={})),function(e){e[e.Unnecessary=1]="Unnecessary",e[e.Deprecated=2]="Deprecated"}(W||(W={})),function(e){e[e.Inline=1]="Inline",e[e.Gutter=2]="Gutter"}(V||(V={})),function(e){e[e.Normal=1]="Normal",e[e.Underlined=2]="Underlined"}(U||(U={})),function(e){e[e.UNKNOWN=0]="UNKNOWN",e[e.TEXTAREA=1]="TEXTAREA",e[e.GUTTER_GLYPH_MARGIN=2]="GUTTER_GLYPH_MARGIN",e[e.GUTTER_LINE_NUMBERS=3]="GUTTER_LINE_NUMBERS",e[e.GUTTER_LINE_DECORATIONS=4]="GUTTER_LINE_DECORATIONS",e[e.GUTTER_VIEW_ZONE=5]="GUTTER_VIEW_ZONE",e[e.CONTENT_TEXT=6]="CONTENT_TEXT",e[e.CONTENT_EMPTY=7]="CONTENT_EMPTY",e[e.CONTENT_VIEW_ZONE=8]="CONTENT_VIEW_ZONE",e[e.CONTENT_WIDGET=9]="CONTENT_WIDGET",e[e.OVERVIEW_RULER=10]="OVERVIEW_RULER",e[e.SCROLLBAR=11]="SCROLLBAR",e[e.OVERLAY_WIDGET=12]="OVERLAY_WIDGET",e[e.OUTSIDE_EDITOR=13]="OUTSIDE_EDITOR"}($||($={})),function(e){e[e.AIGenerated=1]="AIGenerated"}(q||(q={})),function(e){e[e.Invoke=0]="Invoke",e[e.Automatic=1]="Automatic"}(j||(j={})),function(e){e[e.TOP_RIGHT_CORNER=0]="TOP_RIGHT_CORNER",e[e.BOTTOM_RIGHT_CORNER=1]="BOTTOM_RIGHT_CORNER",e[e.TOP_CENTER=2]="TOP_CENTER"}(K||(K={})),function(e){e[e.Left=1]="Left",e[e.Center=2]="Center",e[e.Right=4]="Right",e[e.Full=7]="Full"}(H||(H={})),function(e){e[e.Word=0]="Word",e[e.Line=1]="Line",e[e.Suggest=2]="Suggest"}(G||(G={})),function(e){e[e.Left=0]="Left",e[e.Right=1]="Right",e[e.None=2]="None",e[e.LeftOfInjectedText=3]="LeftOfInjectedText",e[e.RightOfInjectedText=4]="RightOfInjectedText"}(Q||(Q={})),function(e){e[e.Off=0]="Off",e[e.On=1]="On",e[e.Relative=2]="Relative",e[e.Interval=3]="Interval",e[e.Custom=4]="Custom"}(J||(J={})),function(e){e[e.None=0]="None",e[e.Text=1]="Text",e[e.Blocks=2]="Blocks"}(Y||(Y={})),function(e){e[e.Smooth=0]="Smooth",e[e.Immediate=1]="Immediate"}(X||(X={})),function(e){e[e.Auto=1]="Auto",e[e.Hidden=2]="Hidden",e[e.Visible=3]="Visible"}(Z||(Z={})),function(e){e[e.LTR=0]="LTR",e[e.RTL=1]="RTL"}(ee||(ee={})),function(e){e.Off="off",e.OnCode="onCode",e.On="on"}(te||(te={})),function(e){e[e.Invoke=1]="Invoke",e[e.TriggerCharacter=2]="TriggerCharacter",e[e.ContentChange=3]="ContentChange"}(ne||(ne={})),function(e){e[e.File=0]="File",e[e.Module=1]="Module",e[e.Namespace=2]="Namespace",e[e.Package=3]="Package",e[e.Class=4]="Class",e[e.Method=5]="Method",e[e.Property=6]="Property",e[e.Field=7]="Field",e[e.Constructor=8]="Constructor",e[e.Enum=9]="Enum",e[e.Interface=10]="Interface",e[e.Function=11]="Function",e[e.Variable=12]="Variable",e[e.Constant=13]="Constant",e[e.String=14]="String",e[e.Number=15]="Number",e[e.Boolean=16]="Boolean",e[e.Array=17]="Array",e[e.Object=18]="Object",e[e.Key=19]="Key",e[e.Null=20]="Null",e[e.EnumMember=21]="EnumMember",e[e.Struct=22]="Struct",e[e.Event=23]="Event",e[e.Operator=24]="Operator",e[e.TypeParameter=25]="TypeParameter"}(re||(re={})),function(e){e[e.Deprecated=1]="Deprecated"}(ie||(ie={})),function(e){e[e.Hidden=0]="Hidden",e[e.Blink=1]="Blink",e[e.Smooth=2]="Smooth",e[e.Phase=3]="Phase",e[e.Expand=4]="Expand",e[e.Solid=5]="Solid"}(se||(se={})),function(e){e[e.Line=1]="Line",e[e.Block=2]="Block",e[e.Underline=3]="Underline",e[e.LineThin=4]="LineThin",e[e.BlockOutline=5]="BlockOutline",e[e.UnderlineThin=6]="UnderlineThin"}(oe||(oe={})),function(e){e[e.AlwaysGrowsWhenTypingAtEdges=0]="AlwaysGrowsWhenTypingAtEdges",e[e.NeverGrowsWhenTypingAtEdges=1]="NeverGrowsWhenTypingAtEdges",e[e.GrowsOnlyWhenTypingBefore=2]="GrowsOnlyWhenTypingBefore",e[e.GrowsOnlyWhenTypingAfter=3]="GrowsOnlyWhenTypingAfter"}(ae||(ae={})),function(e){e[e.None=0]="None",e[e.Same=1]="Same",e[e.Indent=2]="Indent",e[e.DeepIndent=3]="DeepIndent"}(le||(le={}));class me{static{this.CtrlCmd=2048}static{this.Shift=1024}static{this.Alt=512}static{this.WinCtrl=256}static chord(e,t){return function(e,t){return(e|(65535&t)<<16>>>0)>>>0}(e,t)}}function fe(){return{editor:void 0,languages:void 0,CancellationTokenSource:r.Qi,Emitter:i.vl,KeyCode:P,KeyMod:me,Position:he.y,Range:de.Q,Selection:ue.L,SelectionDirection:ee,MarkerSeverity:B,MarkerTag:W,Uri:ce.r,Token:pe.ou}}},7352:(e,t,n)=>{"use strict";var r;n.d(t,{_Y:()=>i,u1:()=>s}),function(e){e.serviceIds=new Map,e.DI_TARGET="$di$target",e.DI_DEPENDENCIES="$di$dependencies",e.getServiceDependencies=function(t){return t[e.DI_DEPENDENCIES]||[]}}(r||(r={}));const i=s("instantiationService");function s(e){if(r.serviceIds.has(e))return r.serviceIds.get(e);const t=function(e,n,i){if(3!==arguments.length)throw new Error("@IServiceName-decorator can only be used to decorate a parameter");!function(e,t,n){t[r.DI_TARGET]===t?t[r.DI_DEPENDENCIES].push({id:e,index:n}):(t[r.DI_DEPENDENCIES]=[{id:e,index:n}],t[r.DI_TARGET]=t)}(t,e,i)};return t.toString=()=>e,r.serviceIds.set(e,t),t}},7542:(e,t,n)=>{"use strict";n.d(t,{Qi:()=>a});var r=n(2373);const i=Object.freeze(function(e,t){const n=setTimeout(e.bind(t),0);return{dispose(){clearTimeout(n)}}});var s;!function(e){e.isCancellationToken=function(t){return t===e.None||t===e.Cancelled||t instanceof o||!(!t||"object"!=typeof t)&&"boolean"==typeof t.isCancellationRequested&&"function"==typeof t.onCancellationRequested},e.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:r.Jh.None}),e.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:i})}(s||(s={}));class o{constructor(){this._isCancelled=!1,this._emitter=null}cancel(){this._isCancelled||(this._isCancelled=!0,this._emitter&&this.dispose())}get isCancellationRequested(){return this._isCancelled}get onCancellationRequested(){return this._isCancelled?i:(this._emitter||(this._emitter=new r.vl),this._emitter.event)}dispose(){this._emitter&&(this._emitter.dispose(),this._emitter=null)}}class a{constructor(e){this._token=void 0,this._parentListener=void 0,this._parentListener=e&&e.onCancellationRequested(this.cancel,this)}get token(){return this._token||(this._token=new o),this._token}cancel(){this._token?this._token instanceof o&&this._token.cancel():this._token=s.Cancelled}dispose(e=!1){e&&this.cancel(),this._parentListener?.dispose(),this._token?this._token instanceof o&&this._token.dispose():this._token=s.None}}},7703:(e,t,n)=>{"use strict";n.d(t,{i8:()=>o,kg:()=>s});const r="object"==typeof globalThis?globalThis:"object"==typeof window?window:"object"==typeof self?self:n.g;let i="undefined"!=typeof document&&document.location&&document.location.hash.indexOf("pseudo=true")>=0;function s(e,t,n,...s){const o="object"==typeof t?t.key:t;let a=(((r.MonacoLocale||{}||{}).data||{})[e]||{})[o];a||(a=n),s=[];for(let e=3;e{"use strict";n.r(t),n.d(t,{SemanticTokensProviderStyling:()=>p,toMultilineTokens2:()=>m}),n(1551);var r=n(6996),i=n(579),s=n(8274),o=n(800),a=n(8738);class l{static create(e,t){return new l(e,new c(t))}get startLineNumber(){return this._startLineNumber}get endLineNumber(){return this._endLineNumber}constructor(e,t){this._startLineNumber=e,this._tokens=t,this._endLineNumber=this._startLineNumber+this._tokens.getMaxDeltaLine()}toString(){return this._tokens.toString(this._startLineNumber)}_updateEndLineNumber(){this._endLineNumber=this._startLineNumber+this._tokens.getMaxDeltaLine()}isEmpty(){return this._tokens.isEmpty()}getLineTokens(e){return this._startLineNumber<=e&&e<=this._endLineNumber?this._tokens.getLineTokens(e-this._startLineNumber):null}getRange(){const e=this._tokens.getRange();return e?new o.Q(this._startLineNumber+e.startLineNumber,e.startColumn,this._startLineNumber+e.endLineNumber,e.endColumn):e}removeTokens(e){const t=e.startLineNumber-this._startLineNumber,n=e.endLineNumber-this._startLineNumber;this._startLineNumber+=this._tokens.removeTokens(t,e.startColumn-1,n,e.endColumn-1),this._updateEndLineNumber()}split(e){const t=e.startLineNumber-this._startLineNumber,n=e.endLineNumber-this._startLineNumber,[r,i,s]=this._tokens.split(t,e.startColumn-1,n,e.endColumn-1);return[new l(this._startLineNumber,r),new l(this._startLineNumber+s,i)]}applyEdit(e,t){const[n,r,i]=(0,a.W)(t);this.acceptEdit(e,n,r,i,t.length>0?t.charCodeAt(0):0)}acceptEdit(e,t,n,r,i){this._acceptDeleteRange(e),this._acceptInsertText(new s.y(e.startLineNumber,e.startColumn),t,n,r,i),this._updateEndLineNumber()}_acceptDeleteRange(e){if(e.startLineNumber===e.endLineNumber&&e.startColumn===e.endColumn)return;const t=e.startLineNumber-this._startLineNumber,n=e.endLineNumber-this._startLineNumber;if(n<0){const e=n-t;return void(this._startLineNumber-=e)}const r=this._tokens.getMaxDeltaLine();if(!(t>=r+1)){if(t<0&&n>=r+1)return this._startLineNumber=0,void this._tokens.clear();if(t<0){const r=-t;this._startLineNumber-=r,this._tokens.acceptDeleteRange(e.startColumn-1,0,0,n,e.endColumn-1)}else this._tokens.acceptDeleteRange(0,t,e.startColumn-1,n,e.endColumn-1)}}_acceptInsertText(e,t,n,r,i){if(0===t&&0===n)return;const s=e.lineNumber-this._startLineNumber;s<0?this._startLineNumber+=t:s>=this._tokens.getMaxDeltaLine()+1||this._tokens.acceptInsertText(s,e.column-1,t,n,r,i)}}class c{constructor(e){this._tokens=e,this._tokenCount=e.length/4}toString(e){const t=[];for(let n=0;ne)){let i=r;for(;i>t&&this._getDeltaLine(i-1)===e;)i--;let s=r;for(;se||h===e&&u>=t)&&(he||c===e&&p>=t){if(ci?m-=i-n:m=n;else if(u===t&&p===n){if(!(u===r&&m>i)){c=!0;continue}m-=i-n}else if(ui)){c=!0;continue}u=t,p=n,m=p+(m-i)}else if(u>r){if(0===a&&!c){l=o;break}u-=a}else{if(!(u===r&&p>=i))throw new Error("Not possible!");e&&0===u&&(p+=e,m+=e),u-=a,p-=i-n,m-=i-n}const g=4*l;s[g]=u,s[g+1]=p,s[g+2]=m,s[g+3]=f,l++}this._tokenCount=l}acceptInsertText(e,t,n,r,i,s){const o=0===n&&1===r&&(s>=48&&s<=57||s>=65&&s<=90||s>=97&&s<=122),a=this._tokens,l=this._tokenCount;for(let s=0;s0&&t>=1;const r=this._themeService.getColorTheme().getTokenStyleMetadata(i,o,n);void 0===r?s=2147483647:(s=0,void 0!==r.italic&&(s|=1|(r.italic?1:0)<<11),void 0!==r.bold&&(s|=2|(r.bold?2:0)<<11),void 0!==r.underline&&(s|=4|(r.underline?4:0)<<11),void 0!==r.strikethrough&&(s|=8|(r.strikethrough?8:0)<<11),r.foreground&&(s|=16|r.foreground<<15),0===s&&(s=2147483647))}else s=2147483647,i="not-in-legend";this._hashTable.add(e,t,r,s)}return s}warnOverlappingSemanticTokens(e,t){this._hasWarnedOverlappingTokens||(this._hasWarnedOverlappingTokens=!0,this._logService.warn(`Overlapping semantic tokens detected at lineNumber ${e}, column ${t}`))}warnInvalidLengthSemanticTokens(e,t){this._hasWarnedInvalidLengthTokens||(this._hasWarnedInvalidLengthTokens=!0,this._logService.warn(`Semantic token with invalid length detected at lineNumber ${e}, column ${t}`))}warnInvalidEditStart(e,t,n,r,i){this._hasWarnedInvalidEditStart||(this._hasWarnedInvalidEditStart=!0,this._logService.warn(`Invalid semantic tokens edit detected (previousResultId: ${e}, resultId: ${t}) at edit #${n}: The provided start offset ${r} is outside the previous data (length ${i}).`))}};function m(e,t,n){const r=e.data,i=e.data.length/5|0,s=Math.max(Math.ceil(i/1024),400),o=[];let a=0,c=1,h=0;for(;ae&&0===r[5*t];)t--;if(t-1===e){let e=d;for(;e+1l)t.warnOverlappingSemanticTokens(o,l+1);else{const e=t.getMetadata(b,v,n);2147483647!==e&&(0===m&&(m=o),u[p]=o-m,u[p+1]=l,u[p+2]=d,u[p+3]=e,p+=4,f=o,g=d)}c=o,h=l,a++}p!==u.length&&(u=u.subarray(0,p));const b=l.create(m,u);o.push(b)}return o}p=function(e,t,n,r){var i,s=arguments.length,o=s<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,n,r);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(o=(s<3?i(o):s>3?i(t,n,o):i(t,n))||o);return s>3&&o&&Object.defineProperty(t,n,o),o}([u(1,r.Gy),u(2,d.L),u(3,i.rr)],p);class f{constructor(e,t,n,r){this.tokenTypeIndex=e,this.tokenModifierSet=t,this.languageId=n,this.metadata=r,this.next=null}}class g{static{this._SIZES=[3,7,13,31,61,127,251,509,1021,2039,4093,8191,16381,32749,65521,131071,262139,524287,1048573,2097143]}constructor(){this._elementsCount=0,this._currentLengthIndex=0,this._currentLength=g._SIZES[this._currentLengthIndex],this._growCount=Math.round(this._currentLengthIndex+1=this._growCount){const e=this._elements;this._currentLengthIndex++,this._currentLength=g._SIZES[this._currentLengthIndex],this._growCount=Math.round(this._currentLengthIndex+1{"use strict";n.r(t),n.d(t,{getIconClasses:()=>u});var r,i=n(4427),s=n(9996),o=n(695),a=n(4086);!function(e){e[e.FILE=0]="FILE",e[e.FOLDER=1]="FOLDER",e[e.ROOT_FOLDER=2]="ROOT_FOLDER"}(r||(r={}));var l,c,h=n(8386);!function(e){e.isThemeColor=function(e){return e&&"object"==typeof e&&"string"==typeof e.id}}(l||(l={})),function(e){e.iconNameSegment="[A-Za-z0-9]+",e.iconNameExpression="[A-Za-z0-9-]+",e.iconModifierExpression="~[A-Za-z]+",e.iconNameCharacter="[A-Za-z0-9~-]";const t=new RegExp(`^(${e.iconNameExpression})(${e.iconModifierExpression})?$`);function n(e){const r=t.exec(e.id);if(!r)return n(h.W.error);const[,i,s]=r,o=["codicon","codicon-"+i];return s&&o.push("codicon-modifier-"+s.substring(1)),o}e.asClassNameArray=n,e.asClassName=function(e){return n(e).join(" ")},e.asCSSSelector=function(e){return"."+n(e).join(".")},e.isThemeIcon=function(e){return e&&"object"==typeof e&&"string"==typeof e.id&&(void 0===e.color||l.isThemeColor(e.color))};const r=new RegExp(`^\\$\\((${e.iconNameExpression}(?:${e.iconModifierExpression})?)\\)$`);e.fromString=function(e){const t=r.exec(e);if(!t)return;const[,n]=t;return{id:n}},e.fromId=function(e){return{id:e}},e.modify=function(e,t){let n=e.id;const r=n.lastIndexOf("~");return-1!==r&&(n=n.substring(0,r)),t&&(n=`${n}~${t}`),{id:n}},e.getModifier=function(e){const t=e.id.lastIndexOf("~");if(-1!==t)return e.id.substring(t+1)},e.isEqual=function(e,t){return e.id===t.id&&e.color?.id===t.color?.id}}(c||(c={}));const d=/(?:\/|^)(?:([^\/]+)\/)?([^\/]+)$/;function u(e,t,n,l,h){if(c.isThemeIcon(h))return[`codicon-${h.id}`,"predefined-file-icon"];if(o.r.isUri(h))return[];const u=l===r.ROOT_FOLDER?["rootfolder-icon"]:l===r.FOLDER?["folder-icon"]:["file-icon"];if(n){let o;if(n.scheme===i.ny.data)o=s.B6.parseMetaData(n).get(s.B6.META_DATA_LABEL);else{const e=n.path.match(d);e?(o=p(e[2].toLowerCase()),e[1]&&u.push(`${p(e[1].toLowerCase())}-name-dir-icon`)):o=p(n.authority.toLowerCase())}if(l===r.ROOT_FOLDER)u.push(`${o}-root-name-folder-icon`);else if(l===r.FOLDER)u.push(`${o}-name-folder-icon`);else{if(o){if(u.push(`${o}-name-file-icon`),u.push("name-file-icon"),o.length<=255){const e=o.split(".");for(let t=1;t{"use strict";n.d(t,{V:()=>i});var r=n(4901);class i{constructor(e){const t=(0,r.W)(e);this._defaultValue=t,this._asciiMap=i._createAsciiMap(t),this._map=new Map}static _createAsciiMap(e){const t=new Uint8Array(256);return t.fill(e),t}set(e,t){const n=(0,r.W)(t);e>=0&&e<256?this._asciiMap[e]=n:this._map.set(e,n)}get(e){return e>=0&&e<256?this._asciiMap[e]:this._map.get(e)||this._defaultValue}clear(){this._asciiMap.fill(this._defaultValue),this._map.clear()}}},8258:(e,t,n)=>{"use strict";n.r(t),n.d(t,{LanguageFeaturesService:()=>f});var r=n(2373),i=n(6274),s=n(8748),o=n(3035),a=n(9130);function l(e,t,n,r,i,s){if(Array.isArray(e)){let o=0;for(const a of e){const e=l(a,t,n,r,i,s);if(10===e)return e;e>o&&(o=e)}return o}if("string"==typeof e)return r?"*"===e?5:e===n?10:0:0;if(e){const{language:l,pattern:c,scheme:h,hasAccessToAllModels:d,notebookType:u}=e;if(!r&&!d)return 0;u&&i&&(t=i);let p=0;if(h)if(h===t.scheme)p=10;else{if("*"!==h)return 0;p=5}if(l)if(l===n)p=10;else{if("*"!==l)return 0;p=Math.max(p,5)}if(u)if(u===s)p=10;else{if("*"!==u||void 0===s)return 0;p=Math.max(p,5)}if(c){let e;if(e="string"==typeof c?c:{...c,base:(0,a.S8)(c.base)},e!==t.fsPath&&!(0,o.YW)(e,t.fsPath))return 0;p=10}return p}return 0}function c(e){return"string"!=typeof e&&(Array.isArray(e)?e.every(c):!!e.exclusive)}class h{constructor(e,t,n,r,i){this.uri=e,this.languageId=t,this.notebookUri=n,this.notebookType=r,this.recursive=i}equals(e){return this.notebookType===e.notebookType&&this.languageId===e.languageId&&this.uri.toString()===e.uri.toString()&&this.notebookUri?.toString()===e.notebookUri?.toString()&&this.recursive===e.recursive}}class d{constructor(e){this._notebookInfoResolver=e,this._clock=0,this._entries=[],this._onDidChange=new r.vl,this.onDidChange=this._onDidChange.event}register(e,t){let n={selector:e,provider:t,_score:-1,_time:this._clock++};return this._entries.push(n),this._lastCandidate=void 0,this._onDidChange.fire(this._entries.length),(0,i.s)(()=>{if(n){const e=this._entries.indexOf(n);e>=0&&(this._entries.splice(e,1),this._lastCandidate=void 0,this._onDidChange.fire(this._entries.length),n=void 0)}})}has(e){return this.all(e).length>0}all(e){if(!e)return[];this._updateScores(e,!1);const t=[];for(const e of this._entries)e._score>0&&t.push(e.provider);return t}ordered(e,t=!1){const n=[];return this._orderedForEach(e,t,e=>n.push(e.provider)),n}orderedGroups(e){const t=[];let n,r;return this._orderedForEach(e,!1,e=>{n&&r===e._score?n.push(e.provider):(r=e._score,n=[e.provider],t.push(n))}),t}_orderedForEach(e,t,n){this._updateScores(e,t);for(const e of this._entries)e._score>0&&n(e)}_updateScores(e,t){const n=this._notebookInfoResolver?.(e.uri),r=n?new h(e.uri,e.getLanguageId(),n.uri,n.type,t):new h(e.uri,e.getLanguageId(),void 0,void 0,t);if(!this._lastCandidate?.equals(r)){this._lastCandidate=r;for(const n of this._entries)if(n._score=l(n.selector,r.uri,r.languageId,(0,s.vd)(e),r.notebookUri,r.notebookType),c(n.selector)&&n._score>0){if(!t){for(const e of this._entries)e._score=0;n._score=1e3;break}n._score=0}this._entries.sort(d._compareByScoreAndTime)}}static _compareByScoreAndTime(e,t){return e._scoret._score?-1:u(e.selector)&&!u(t.selector)?1:!u(e.selector)&&u(t.selector)?-1:e._timet._time?-1:0}}function u(e){return"string"!=typeof e&&(Array.isArray(e)?e.some(u):Boolean(e.isBuiltin))}var p=n(6461),m=n(1964);class f{constructor(){this.referenceProvider=new d(this._score.bind(this)),this.renameProvider=new d(this._score.bind(this)),this.newSymbolNamesProvider=new d(this._score.bind(this)),this.codeActionProvider=new d(this._score.bind(this)),this.definitionProvider=new d(this._score.bind(this)),this.typeDefinitionProvider=new d(this._score.bind(this)),this.declarationProvider=new d(this._score.bind(this)),this.implementationProvider=new d(this._score.bind(this)),this.documentSymbolProvider=new d(this._score.bind(this)),this.inlayHintsProvider=new d(this._score.bind(this)),this.colorProvider=new d(this._score.bind(this)),this.codeLensProvider=new d(this._score.bind(this)),this.documentFormattingEditProvider=new d(this._score.bind(this)),this.documentRangeFormattingEditProvider=new d(this._score.bind(this)),this.onTypeFormattingEditProvider=new d(this._score.bind(this)),this.signatureHelpProvider=new d(this._score.bind(this)),this.hoverProvider=new d(this._score.bind(this)),this.documentHighlightProvider=new d(this._score.bind(this)),this.multiDocumentHighlightProvider=new d(this._score.bind(this)),this.selectionRangeProvider=new d(this._score.bind(this)),this.foldingRangeProvider=new d(this._score.bind(this)),this.linkProvider=new d(this._score.bind(this)),this.inlineCompletionsProvider=new d(this._score.bind(this)),this.inlineEditProvider=new d(this._score.bind(this)),this.completionProvider=new d(this._score.bind(this)),this.linkedEditingRangeProvider=new d(this._score.bind(this)),this.documentRangeSemanticTokensProvider=new d(this._score.bind(this)),this.documentSemanticTokensProvider=new d(this._score.bind(this)),this.documentDropEditProvider=new d(this._score.bind(this)),this.documentPasteEditProvider=new d(this._score.bind(this))}_score(e){return this._notebookTypeResolver?.(e)}}(0,m.v)(p.ILanguageFeaturesService,f,1)},8274:(e,t,n)=>{"use strict";n.d(t,{y:()=>r});class r{constructor(e,t){this.lineNumber=e,this.column=t}with(e=this.lineNumber,t=this.column){return e===this.lineNumber&&t===this.column?this:new r(e,t)}delta(e=0,t=0){return this.with(this.lineNumber+e,this.column+t)}equals(e){return r.equals(this,e)}static equals(e,t){return!e&&!t||!!e&&!!t&&e.lineNumber===t.lineNumber&&e.column===t.column}isBefore(e){return r.isBefore(this,e)}static isBefore(e,t){return e.lineNumber{"use strict";n.d(t,{Io:()=>o,Ld:()=>s,Th:()=>l});var r=n(1075),i=n(1732);const s=function(e=""){let t="(-?\\d*\\.\\d\\w*)|([^";for(const n of"`~!@#$%^&*()-=+[{]}\\|;:'\",.<>/?")e.indexOf(n)>=0||(t+="\\"+n);return t+="\\s]+)",new RegExp(t,"g")}();function o(e){let t=s;if(e&&e instanceof RegExp)if(e.global)t=e;else{let n="g";e.ignoreCase&&(n+="i"),e.multiline&&(n+="m"),e.unicode&&(n+="u"),t=new RegExp(e.source,n)}return t.lastIndex=0,t}const a=new i.w;function l(e,t,n,i,s){if(t=o(t),s||(s=r.f.first(a)),n.length>s.maxLen){let r=e-s.maxLen/2;return r<0?r=0:i+=r,l(e,t,n=n.substring(r,e+s.maxLen/2),i,s)}const h=Date.now(),d=e-1-i;let u=-1,p=null;for(let e=1;!(Date.now()-h>=s.timeBudget);e++){const r=d-s.windowSize*e;t.lastIndex=Math.max(0,r);const i=c(t,n,d,u);if(!i&&p)break;if(p=i,r<=0)break;u=r}if(p){const e={word:p[0],startColumn:i+1+p.index,endColumn:i+1+p.index+p[0].length};return t.lastIndex=0,e}return null}function c(e,t,n,r){let i;for(;i=e.exec(t);){const t=i.index||0;if(t<=n&&e.lastIndex>=n)return i;if(r>0&&t>r)return null}return null}a.unshift({maxLen:1e3,windowSize:15,timeBudget:150})},8332:(e,t,n)=>{"use strict";n.r(t),n.d(t,{findSectionHeaders:()=>s});const r=new RegExp("\\bMARK:\\s*(.*)$","d"),i=/^-+|-+$/g;function s(e,t){let n=[];if(t.findRegionSectionHeaders&&t.foldingRules?.markers){const r=function(e,t){const n=[],r=e.getLineCount();for(let i=1;i<=r;i++){const r=e.getLineContent(i),s=r.match(t.foldingRules.markers.start);if(s){const e={startLineNumber:i,startColumn:s[0].length+1,endLineNumber:i,endColumn:r.length+1};if(e.endColumn>e.startColumn){const t={range:e,...a(r.substring(s[0].length)),shouldBeInComments:!1};(t.text||t.hasSeparatorLine)&&n.push(t)}}}return n}(e,t);n=n.concat(r)}if(t.findMarkSectionHeaders){const t=function(e){const t=[],n=e.getLineCount();for(let r=1;r<=n;r++)o(e.getLineContent(r),r,t);return t}(e);n=n.concat(t)}return n}function o(e,t,n){r.lastIndex=0;const i=r.exec(e);if(i){const e={startLineNumber:t,startColumn:i.indices[1][0]+1,endLineNumber:t,endColumn:i.indices[1][1]+1};if(e.endColumn>e.startColumn){const t={range:e,...a(i[1]),shouldBeInComments:!0};(t.text||t.hasSeparatorLine)&&n.push(t)}}}function a(e){const t=(e=e.trim()).startsWith("-");return{text:e=e.replace(i,""),hasSeparatorLine:t}}},8348:(e,t,n)=>{"use strict";function r(e,t){const n=function(e,t,n=e.length-1){for(let r=n;r>=0;r--)if(t(e[r]))return r;return-1}(e,t);if(-1!==n)return e[n]}function i(e,t){const n=s(e,t);return-1===n?void 0:e[n]}function s(e,t,n=0,r=e.length){let i=n,s=r;for(;ir,XP:()=>o,hw:()=>a,iM:()=>s,lx:()=>i,vJ:()=>l});class l{static{this.assertInvariants=!1}constructor(e){this._array=e,this._findLastMonotonousLastIdx=0}findLastMonotonous(e){if(l.assertInvariants){if(this._prevFindLastPredicate)for(const t of this._array)if(this._prevFindLastPredicate(t)&&!e(t))throw new Error("MonotonousArray: current predicate must be weaker than (or equal to) the previous predicate.");this._prevFindLastPredicate=e}const t=s(this._array,e,this._findLastMonotonousLastIdx);return this._findLastMonotonousLastIdx=t+1,-1===t?void 0:this._array[t]}}},8386:(e,t,n)=>{"use strict";n.d(t,{W:()=>o});var r=n(2548);const i=Object.create(null);function s(e,t){if((0,r.Kg)(t)){const n=i[t];if(void 0===n)throw new Error(`${e} references an unknown codicon: ${t}`);t=n}return i[e]=t,{id:e}}const o={add:s("add",6e4),plus:s("plus",6e4),gistNew:s("gist-new",6e4),repoCreate:s("repo-create",6e4),lightbulb:s("lightbulb",60001),lightBulb:s("light-bulb",60001),repo:s("repo",60002),repoDelete:s("repo-delete",60002),gistFork:s("gist-fork",60003),repoForked:s("repo-forked",60003),gitPullRequest:s("git-pull-request",60004),gitPullRequestAbandoned:s("git-pull-request-abandoned",60004),recordKeys:s("record-keys",60005),keyboard:s("keyboard",60005),tag:s("tag",60006),gitPullRequestLabel:s("git-pull-request-label",60006),tagAdd:s("tag-add",60006),tagRemove:s("tag-remove",60006),person:s("person",60007),personFollow:s("person-follow",60007),personOutline:s("person-outline",60007),personFilled:s("person-filled",60007),gitBranch:s("git-branch",60008),gitBranchCreate:s("git-branch-create",60008),gitBranchDelete:s("git-branch-delete",60008),sourceControl:s("source-control",60008),mirror:s("mirror",60009),mirrorPublic:s("mirror-public",60009),star:s("star",60010),starAdd:s("star-add",60010),starDelete:s("star-delete",60010),starEmpty:s("star-empty",60010),comment:s("comment",60011),commentAdd:s("comment-add",60011),alert:s("alert",60012),warning:s("warning",60012),search:s("search",60013),searchSave:s("search-save",60013),logOut:s("log-out",60014),signOut:s("sign-out",60014),logIn:s("log-in",60015),signIn:s("sign-in",60015),eye:s("eye",60016),eyeUnwatch:s("eye-unwatch",60016),eyeWatch:s("eye-watch",60016),circleFilled:s("circle-filled",60017),primitiveDot:s("primitive-dot",60017),closeDirty:s("close-dirty",60017),debugBreakpoint:s("debug-breakpoint",60017),debugBreakpointDisabled:s("debug-breakpoint-disabled",60017),debugHint:s("debug-hint",60017),terminalDecorationSuccess:s("terminal-decoration-success",60017),primitiveSquare:s("primitive-square",60018),edit:s("edit",60019),pencil:s("pencil",60019),info:s("info",60020),issueOpened:s("issue-opened",60020),gistPrivate:s("gist-private",60021),gitForkPrivate:s("git-fork-private",60021),lock:s("lock",60021),mirrorPrivate:s("mirror-private",60021),close:s("close",60022),removeClose:s("remove-close",60022),x:s("x",60022),repoSync:s("repo-sync",60023),sync:s("sync",60023),clone:s("clone",60024),desktopDownload:s("desktop-download",60024),beaker:s("beaker",60025),microscope:s("microscope",60025),vm:s("vm",60026),deviceDesktop:s("device-desktop",60026),file:s("file",60027),fileText:s("file-text",60027),more:s("more",60028),ellipsis:s("ellipsis",60028),kebabHorizontal:s("kebab-horizontal",60028),mailReply:s("mail-reply",60029),reply:s("reply",60029),organization:s("organization",60030),organizationFilled:s("organization-filled",60030),organizationOutline:s("organization-outline",60030),newFile:s("new-file",60031),fileAdd:s("file-add",60031),newFolder:s("new-folder",60032),fileDirectoryCreate:s("file-directory-create",60032),trash:s("trash",60033),trashcan:s("trashcan",60033),history:s("history",60034),clock:s("clock",60034),folder:s("folder",60035),fileDirectory:s("file-directory",60035),symbolFolder:s("symbol-folder",60035),logoGithub:s("logo-github",60036),markGithub:s("mark-github",60036),github:s("github",60036),terminal:s("terminal",60037),console:s("console",60037),repl:s("repl",60037),zap:s("zap",60038),symbolEvent:s("symbol-event",60038),error:s("error",60039),stop:s("stop",60039),variable:s("variable",60040),symbolVariable:s("symbol-variable",60040),array:s("array",60042),symbolArray:s("symbol-array",60042),symbolModule:s("symbol-module",60043),symbolPackage:s("symbol-package",60043),symbolNamespace:s("symbol-namespace",60043),symbolObject:s("symbol-object",60043),symbolMethod:s("symbol-method",60044),symbolFunction:s("symbol-function",60044),symbolConstructor:s("symbol-constructor",60044),symbolBoolean:s("symbol-boolean",60047),symbolNull:s("symbol-null",60047),symbolNumeric:s("symbol-numeric",60048),symbolNumber:s("symbol-number",60048),symbolStructure:s("symbol-structure",60049),symbolStruct:s("symbol-struct",60049),symbolParameter:s("symbol-parameter",60050),symbolTypeParameter:s("symbol-type-parameter",60050),symbolKey:s("symbol-key",60051),symbolText:s("symbol-text",60051),symbolReference:s("symbol-reference",60052),goToFile:s("go-to-file",60052),symbolEnum:s("symbol-enum",60053),symbolValue:s("symbol-value",60053),symbolRuler:s("symbol-ruler",60054),symbolUnit:s("symbol-unit",60054),activateBreakpoints:s("activate-breakpoints",60055),archive:s("archive",60056),arrowBoth:s("arrow-both",60057),arrowDown:s("arrow-down",60058),arrowLeft:s("arrow-left",60059),arrowRight:s("arrow-right",60060),arrowSmallDown:s("arrow-small-down",60061),arrowSmallLeft:s("arrow-small-left",60062),arrowSmallRight:s("arrow-small-right",60063),arrowSmallUp:s("arrow-small-up",60064),arrowUp:s("arrow-up",60065),bell:s("bell",60066),bold:s("bold",60067),book:s("book",60068),bookmark:s("bookmark",60069),debugBreakpointConditionalUnverified:s("debug-breakpoint-conditional-unverified",60070),debugBreakpointConditional:s("debug-breakpoint-conditional",60071),debugBreakpointConditionalDisabled:s("debug-breakpoint-conditional-disabled",60071),debugBreakpointDataUnverified:s("debug-breakpoint-data-unverified",60072),debugBreakpointData:s("debug-breakpoint-data",60073),debugBreakpointDataDisabled:s("debug-breakpoint-data-disabled",60073),debugBreakpointLogUnverified:s("debug-breakpoint-log-unverified",60074),debugBreakpointLog:s("debug-breakpoint-log",60075),debugBreakpointLogDisabled:s("debug-breakpoint-log-disabled",60075),briefcase:s("briefcase",60076),broadcast:s("broadcast",60077),browser:s("browser",60078),bug:s("bug",60079),calendar:s("calendar",60080),caseSensitive:s("case-sensitive",60081),check:s("check",60082),checklist:s("checklist",60083),chevronDown:s("chevron-down",60084),chevronLeft:s("chevron-left",60085),chevronRight:s("chevron-right",60086),chevronUp:s("chevron-up",60087),chromeClose:s("chrome-close",60088),chromeMaximize:s("chrome-maximize",60089),chromeMinimize:s("chrome-minimize",60090),chromeRestore:s("chrome-restore",60091),circleOutline:s("circle-outline",60092),circle:s("circle",60092),debugBreakpointUnverified:s("debug-breakpoint-unverified",60092),terminalDecorationIncomplete:s("terminal-decoration-incomplete",60092),circleSlash:s("circle-slash",60093),circuitBoard:s("circuit-board",60094),clearAll:s("clear-all",60095),clippy:s("clippy",60096),closeAll:s("close-all",60097),cloudDownload:s("cloud-download",60098),cloudUpload:s("cloud-upload",60099),code:s("code",60100),collapseAll:s("collapse-all",60101),colorMode:s("color-mode",60102),commentDiscussion:s("comment-discussion",60103),creditCard:s("credit-card",60105),dash:s("dash",60108),dashboard:s("dashboard",60109),database:s("database",60110),debugContinue:s("debug-continue",60111),debugDisconnect:s("debug-disconnect",60112),debugPause:s("debug-pause",60113),debugRestart:s("debug-restart",60114),debugStart:s("debug-start",60115),debugStepInto:s("debug-step-into",60116),debugStepOut:s("debug-step-out",60117),debugStepOver:s("debug-step-over",60118),debugStop:s("debug-stop",60119),debug:s("debug",60120),deviceCameraVideo:s("device-camera-video",60121),deviceCamera:s("device-camera",60122),deviceMobile:s("device-mobile",60123),diffAdded:s("diff-added",60124),diffIgnored:s("diff-ignored",60125),diffModified:s("diff-modified",60126),diffRemoved:s("diff-removed",60127),diffRenamed:s("diff-renamed",60128),diff:s("diff",60129),diffSidebyside:s("diff-sidebyside",60129),discard:s("discard",60130),editorLayout:s("editor-layout",60131),emptyWindow:s("empty-window",60132),exclude:s("exclude",60133),extensions:s("extensions",60134),eyeClosed:s("eye-closed",60135),fileBinary:s("file-binary",60136),fileCode:s("file-code",60137),fileMedia:s("file-media",60138),filePdf:s("file-pdf",60139),fileSubmodule:s("file-submodule",60140),fileSymlinkDirectory:s("file-symlink-directory",60141),fileSymlinkFile:s("file-symlink-file",60142),fileZip:s("file-zip",60143),files:s("files",60144),filter:s("filter",60145),flame:s("flame",60146),foldDown:s("fold-down",60147),foldUp:s("fold-up",60148),fold:s("fold",60149),folderActive:s("folder-active",60150),folderOpened:s("folder-opened",60151),gear:s("gear",60152),gift:s("gift",60153),gistSecret:s("gist-secret",60154),gist:s("gist",60155),gitCommit:s("git-commit",60156),gitCompare:s("git-compare",60157),compareChanges:s("compare-changes",60157),gitMerge:s("git-merge",60158),githubAction:s("github-action",60159),githubAlt:s("github-alt",60160),globe:s("globe",60161),grabber:s("grabber",60162),graph:s("graph",60163),gripper:s("gripper",60164),heart:s("heart",60165),home:s("home",60166),horizontalRule:s("horizontal-rule",60167),hubot:s("hubot",60168),inbox:s("inbox",60169),issueReopened:s("issue-reopened",60171),issues:s("issues",60172),italic:s("italic",60173),jersey:s("jersey",60174),json:s("json",60175),kebabVertical:s("kebab-vertical",60176),key:s("key",60177),law:s("law",60178),lightbulbAutofix:s("lightbulb-autofix",60179),linkExternal:s("link-external",60180),link:s("link",60181),listOrdered:s("list-ordered",60182),listUnordered:s("list-unordered",60183),liveShare:s("live-share",60184),loading:s("loading",60185),location:s("location",60186),mailRead:s("mail-read",60187),mail:s("mail",60188),markdown:s("markdown",60189),megaphone:s("megaphone",60190),mention:s("mention",60191),milestone:s("milestone",60192),gitPullRequestMilestone:s("git-pull-request-milestone",60192),mortarBoard:s("mortar-board",60193),move:s("move",60194),multipleWindows:s("multiple-windows",60195),mute:s("mute",60196),noNewline:s("no-newline",60197),note:s("note",60198),octoface:s("octoface",60199),openPreview:s("open-preview",60200),package:s("package",60201),paintcan:s("paintcan",60202),pin:s("pin",60203),play:s("play",60204),run:s("run",60204),plug:s("plug",60205),preserveCase:s("preserve-case",60206),preview:s("preview",60207),project:s("project",60208),pulse:s("pulse",60209),question:s("question",60210),quote:s("quote",60211),radioTower:s("radio-tower",60212),reactions:s("reactions",60213),references:s("references",60214),refresh:s("refresh",60215),regex:s("regex",60216),remoteExplorer:s("remote-explorer",60217),remote:s("remote",60218),remove:s("remove",60219),replaceAll:s("replace-all",60220),replace:s("replace",60221),repoClone:s("repo-clone",60222),repoForcePush:s("repo-force-push",60223),repoPull:s("repo-pull",60224),repoPush:s("repo-push",60225),report:s("report",60226),requestChanges:s("request-changes",60227),rocket:s("rocket",60228),rootFolderOpened:s("root-folder-opened",60229),rootFolder:s("root-folder",60230),rss:s("rss",60231),ruby:s("ruby",60232),saveAll:s("save-all",60233),saveAs:s("save-as",60234),save:s("save",60235),screenFull:s("screen-full",60236),screenNormal:s("screen-normal",60237),searchStop:s("search-stop",60238),server:s("server",60240),settingsGear:s("settings-gear",60241),settings:s("settings",60242),shield:s("shield",60243),smiley:s("smiley",60244),sortPrecedence:s("sort-precedence",60245),splitHorizontal:s("split-horizontal",60246),splitVertical:s("split-vertical",60247),squirrel:s("squirrel",60248),starFull:s("star-full",60249),starHalf:s("star-half",60250),symbolClass:s("symbol-class",60251),symbolColor:s("symbol-color",60252),symbolConstant:s("symbol-constant",60253),symbolEnumMember:s("symbol-enum-member",60254),symbolField:s("symbol-field",60255),symbolFile:s("symbol-file",60256),symbolInterface:s("symbol-interface",60257),symbolKeyword:s("symbol-keyword",60258),symbolMisc:s("symbol-misc",60259),symbolOperator:s("symbol-operator",60260),symbolProperty:s("symbol-property",60261),wrench:s("wrench",60261),wrenchSubaction:s("wrench-subaction",60261),symbolSnippet:s("symbol-snippet",60262),tasklist:s("tasklist",60263),telescope:s("telescope",60264),textSize:s("text-size",60265),threeBars:s("three-bars",60266),thumbsdown:s("thumbsdown",60267),thumbsup:s("thumbsup",60268),tools:s("tools",60269),triangleDown:s("triangle-down",60270),triangleLeft:s("triangle-left",60271),triangleRight:s("triangle-right",60272),triangleUp:s("triangle-up",60273),twitter:s("twitter",60274),unfold:s("unfold",60275),unlock:s("unlock",60276),unmute:s("unmute",60277),unverified:s("unverified",60278),verified:s("verified",60279),versions:s("versions",60280),vmActive:s("vm-active",60281),vmOutline:s("vm-outline",60282),vmRunning:s("vm-running",60283),watch:s("watch",60284),whitespace:s("whitespace",60285),wholeWord:s("whole-word",60286),window:s("window",60287),wordWrap:s("word-wrap",60288),zoomIn:s("zoom-in",60289),zoomOut:s("zoom-out",60290),listFilter:s("list-filter",60291),listFlat:s("list-flat",60292),listSelection:s("list-selection",60293),selection:s("selection",60293),listTree:s("list-tree",60294),debugBreakpointFunctionUnverified:s("debug-breakpoint-function-unverified",60295),debugBreakpointFunction:s("debug-breakpoint-function",60296),debugBreakpointFunctionDisabled:s("debug-breakpoint-function-disabled",60296),debugStackframeActive:s("debug-stackframe-active",60297),circleSmallFilled:s("circle-small-filled",60298),debugStackframeDot:s("debug-stackframe-dot",60298),terminalDecorationMark:s("terminal-decoration-mark",60298),debugStackframe:s("debug-stackframe",60299),debugStackframeFocused:s("debug-stackframe-focused",60299),debugBreakpointUnsupported:s("debug-breakpoint-unsupported",60300),symbolString:s("symbol-string",60301),debugReverseContinue:s("debug-reverse-continue",60302),debugStepBack:s("debug-step-back",60303),debugRestartFrame:s("debug-restart-frame",60304),debugAlt:s("debug-alt",60305),callIncoming:s("call-incoming",60306),callOutgoing:s("call-outgoing",60307),menu:s("menu",60308),expandAll:s("expand-all",60309),feedback:s("feedback",60310),gitPullRequestReviewer:s("git-pull-request-reviewer",60310),groupByRefType:s("group-by-ref-type",60311),ungroupByRefType:s("ungroup-by-ref-type",60312),account:s("account",60313),gitPullRequestAssignee:s("git-pull-request-assignee",60313),bellDot:s("bell-dot",60314),debugConsole:s("debug-console",60315),library:s("library",60316),output:s("output",60317),runAll:s("run-all",60318),syncIgnored:s("sync-ignored",60319),pinned:s("pinned",60320),githubInverted:s("github-inverted",60321),serverProcess:s("server-process",60322),serverEnvironment:s("server-environment",60323),pass:s("pass",60324),issueClosed:s("issue-closed",60324),stopCircle:s("stop-circle",60325),playCircle:s("play-circle",60326),record:s("record",60327),debugAltSmall:s("debug-alt-small",60328),vmConnect:s("vm-connect",60329),cloud:s("cloud",60330),merge:s("merge",60331),export:s("export",60332),graphLeft:s("graph-left",60333),magnet:s("magnet",60334),notebook:s("notebook",60335),redo:s("redo",60336),checkAll:s("check-all",60337),pinnedDirty:s("pinned-dirty",60338),passFilled:s("pass-filled",60339),circleLargeFilled:s("circle-large-filled",60340),circleLarge:s("circle-large",60341),circleLargeOutline:s("circle-large-outline",60341),combine:s("combine",60342),gather:s("gather",60342),table:s("table",60343),variableGroup:s("variable-group",60344),typeHierarchy:s("type-hierarchy",60345),typeHierarchySub:s("type-hierarchy-sub",60346),typeHierarchySuper:s("type-hierarchy-super",60347),gitPullRequestCreate:s("git-pull-request-create",60348),runAbove:s("run-above",60349),runBelow:s("run-below",60350),notebookTemplate:s("notebook-template",60351),debugRerun:s("debug-rerun",60352),workspaceTrusted:s("workspace-trusted",60353),workspaceUntrusted:s("workspace-untrusted",60354),workspaceUnknown:s("workspace-unknown",60355),terminalCmd:s("terminal-cmd",60356),terminalDebian:s("terminal-debian",60357),terminalLinux:s("terminal-linux",60358),terminalPowershell:s("terminal-powershell",60359),terminalTmux:s("terminal-tmux",60360),terminalUbuntu:s("terminal-ubuntu",60361),terminalBash:s("terminal-bash",60362),arrowSwap:s("arrow-swap",60363),copy:s("copy",60364),personAdd:s("person-add",60365),filterFilled:s("filter-filled",60366),wand:s("wand",60367),debugLineByLine:s("debug-line-by-line",60368),inspect:s("inspect",60369),layers:s("layers",60370),layersDot:s("layers-dot",60371),layersActive:s("layers-active",60372),compass:s("compass",60373),compassDot:s("compass-dot",60374),compassActive:s("compass-active",60375),azure:s("azure",60376),issueDraft:s("issue-draft",60377),gitPullRequestClosed:s("git-pull-request-closed",60378),gitPullRequestDraft:s("git-pull-request-draft",60379),debugAll:s("debug-all",60380),debugCoverage:s("debug-coverage",60381),runErrors:s("run-errors",60382),folderLibrary:s("folder-library",60383),debugContinueSmall:s("debug-continue-small",60384),beakerStop:s("beaker-stop",60385),graphLine:s("graph-line",60386),graphScatter:s("graph-scatter",60387),pieChart:s("pie-chart",60388),bracket:s("bracket",60175),bracketDot:s("bracket-dot",60389),bracketError:s("bracket-error",60390),lockSmall:s("lock-small",60391),azureDevops:s("azure-devops",60392),verifiedFilled:s("verified-filled",60393),newline:s("newline",60394),layout:s("layout",60395),layoutActivitybarLeft:s("layout-activitybar-left",60396),layoutActivitybarRight:s("layout-activitybar-right",60397),layoutPanelLeft:s("layout-panel-left",60398),layoutPanelCenter:s("layout-panel-center",60399),layoutPanelJustify:s("layout-panel-justify",60400),layoutPanelRight:s("layout-panel-right",60401),layoutPanel:s("layout-panel",60402),layoutSidebarLeft:s("layout-sidebar-left",60403),layoutSidebarRight:s("layout-sidebar-right",60404),layoutStatusbar:s("layout-statusbar",60405),layoutMenubar:s("layout-menubar",60406),layoutCentered:s("layout-centered",60407),target:s("target",60408),indent:s("indent",60409),recordSmall:s("record-small",60410),errorSmall:s("error-small",60411),terminalDecorationError:s("terminal-decoration-error",60411),arrowCircleDown:s("arrow-circle-down",60412),arrowCircleLeft:s("arrow-circle-left",60413),arrowCircleRight:s("arrow-circle-right",60414),arrowCircleUp:s("arrow-circle-up",60415),layoutSidebarRightOff:s("layout-sidebar-right-off",60416),layoutPanelOff:s("layout-panel-off",60417),layoutSidebarLeftOff:s("layout-sidebar-left-off",60418),blank:s("blank",60419),heartFilled:s("heart-filled",60420),map:s("map",60421),mapHorizontal:s("map-horizontal",60421),foldHorizontal:s("fold-horizontal",60421),mapFilled:s("map-filled",60422),mapHorizontalFilled:s("map-horizontal-filled",60422),foldHorizontalFilled:s("fold-horizontal-filled",60422),circleSmall:s("circle-small",60423),bellSlash:s("bell-slash",60424),bellSlashDot:s("bell-slash-dot",60425),commentUnresolved:s("comment-unresolved",60426),gitPullRequestGoToChanges:s("git-pull-request-go-to-changes",60427),gitPullRequestNewChanges:s("git-pull-request-new-changes",60428),searchFuzzy:s("search-fuzzy",60429),commentDraft:s("comment-draft",60430),send:s("send",60431),sparkle:s("sparkle",60432),insert:s("insert",60433),mic:s("mic",60434),thumbsdownFilled:s("thumbsdown-filled",60435),thumbsupFilled:s("thumbsup-filled",60436),coffee:s("coffee",60437),snake:s("snake",60438),game:s("game",60439),vr:s("vr",60440),chip:s("chip",60441),piano:s("piano",60442),music:s("music",60443),micFilled:s("mic-filled",60444),repoFetch:s("repo-fetch",60445),copilot:s("copilot",60446),lightbulbSparkle:s("lightbulb-sparkle",60447),robot:s("robot",60448),sparkleFilled:s("sparkle-filled",60449),diffSingle:s("diff-single",60450),diffMultiple:s("diff-multiple",60451),surroundWith:s("surround-with",60452),share:s("share",60453),gitStash:s("git-stash",60454),gitStashApply:s("git-stash-apply",60455),gitStashPop:s("git-stash-pop",60456),vscode:s("vscode",60457),vscodeInsiders:s("vscode-insiders",60458),codeOss:s("code-oss",60459),runCoverage:s("run-coverage",60460),runAllCoverage:s("run-all-coverage",60461),coverage:s("coverage",60462),githubProject:s("github-project",60463),mapVertical:s("map-vertical",60464),foldVertical:s("fold-vertical",60464),mapVerticalFilled:s("map-vertical-filled",60465),foldVerticalFilled:s("fold-vertical-filled",60465),goToSearch:s("go-to-search",60466),percentage:s("percentage",60467),sortPercentage:s("sort-percentage",60467),attach:s("attach",60468),dialogError:s("dialog-error","error"),dialogWarning:s("dialog-warning","warning"),dialogInfo:s("dialog-info","info"),dialogClose:s("dialog-close","close"),treeItemExpanded:s("tree-item-expanded","chevron-down"),treeFilterOnTypeOn:s("tree-filter-on-type-on","list-filter"),treeFilterOnTypeOff:s("tree-filter-on-type-off","list-selection"),treeFilterClear:s("tree-filter-clear","close"),treeItemLoading:s("tree-item-loading","loading"),menuSelection:s("menu-selection","check"),menuSubmenu:s("menu-submenu","chevron-right"),menuBarMore:s("menubar-more","more"),scrollbarButtonLeft:s("scrollbar-button-left","triangle-left"),scrollbarButtonRight:s("scrollbar-button-right","triangle-right"),scrollbarButtonUp:s("scrollbar-button-up","triangle-up"),scrollbarButtonDown:s("scrollbar-button-down","triangle-down"),toolBarMore:s("toolbar-more","more"),quickInputBack:s("quick-input-back","arrow-left"),dropDownButton:s("drop-down-button",60084),symbolCustomColor:s("symbol-customcolor",60252),exportIcon:s("export",60332),workspaceUnspecified:s("workspace-unspecified",60355),newLine:s("newline",60394),thumbsDownFilled:s("thumbsdown-filled",60435),thumbsUpFilled:s("thumbsup-filled",60436),gitFetch:s("git-fetch",60445),lightbulbSparkleAutofix:s("lightbulb-sparkle-autofix",60447),debugBreakpointPending:s("debug-breakpoint-pending",60377)}},8476:(e,t,n)=>{"use strict";n.r(t),n.d(t,{MarkerDecorationsService:()=>_});var r,i=n(5603);!function(e){e[e.Ignore=0]="Ignore",e[e.Info=1]="Info",e[e.Warning=2]="Warning",e[e.Error=3]="Error"}(r||(r={})),function(e){const t="error",n="warning",r="info";e.fromValue=function(s){return s?i.Q_(t,s)?e.Error:i.Q_(n,s)||i.Q_("warn",s)?e.Warning:i.Q_(r,s)?e.Info:e.Ignore:e.Ignore},e.toString=function(i){switch(i){case e.Error:return t;case e.Warning:return n;case e.Info:return r;default:return"ignore"}}}(r||(r={}));const s=r;var o,a,l=n(7703),c=n(7352);!function(e){e[e.Hint=1]="Hint",e[e.Info=2]="Info",e[e.Warning=4]="Warning",e[e.Error=8]="Error"}(o||(o={})),function(e){e.compare=function(e,t){return t-e};const t=Object.create(null);t[e.Error]=(0,l.kg)("vs/platform/markers/common/markers","sev.error","Error"),t[e.Warning]=(0,l.kg)("vs/platform/markers/common/markers","sev.warning","Warning"),t[e.Info]=(0,l.kg)("vs/platform/markers/common/markers","sev.info","Info"),e.toString=function(e){return t[e]||""},e.fromSeverity=function(t){switch(t){case s.Error:return e.Error;case s.Warning:return e.Warning;case s.Info:return e.Info;case s.Ignore:return e.Hint}},e.toSeverity=function(t){switch(t){case e.Error:return s.Error;case e.Warning:return s.Warning;case e.Info:return s.Info;case e.Hint:return s.Ignore}}}(o||(o={})),function(e){const t="";function n(e,n){const r=[t];return e.source?r.push(e.source.replace("¦","\\¦")):r.push(t),e.code?"string"==typeof e.code?r.push(e.code.replace("¦","\\¦")):r.push(e.code.value.replace("¦","\\¦")):r.push(t),void 0!==e.severity&&null!==e.severity?r.push(o.toString(e.severity)):r.push(t),e.message&&n?r.push(e.message.replace("¦","\\¦")):r.push(t),void 0!==e.startLineNumber&&null!==e.startLineNumber?r.push(e.startLineNumber.toString()):r.push(t),void 0!==e.startColumn&&null!==e.startColumn?r.push(e.startColumn.toString()):r.push(t),void 0!==e.endLineNumber&&null!==e.endLineNumber?r.push(e.endLineNumber.toString()):r.push(t),void 0!==e.endColumn&&null!==e.endColumn?r.push(e.endColumn.toString()):r.push(t),r.push(t),r.join("¦")}e.makeKey=function(e){return n(e,!0)},e.makeKeyOptionalMessage=n}(a||(a={}));const h=(0,c.u1)("markerService");var d=n(6274),u=n(8748),p=n(6996),m=n(550),f=n(887),g=n(800),b=n(4427),v=n(2373),y=n(4756),w=n(6303),C=function(e,t){return function(n,r){t(n,r,e)}};let _=class extends d.jG{constructor(e,t){super(),this._markerService=t,this._onDidChangeMarker=this._register(new v.vl),this._markerDecorations=new w.fT,e.getModels().forEach(e=>this._onModelAdded(e)),this._register(e.onModelAdded(this._onModelAdded,this)),this._register(e.onModelRemoved(this._onModelRemoved,this)),this._register(this._markerService.onMarkerChanged(this._handleMarkerChange,this))}dispose(){super.dispose(),this._markerDecorations.forEach(e=>e.dispose()),this._markerDecorations.clear()}getMarker(e,t){const n=this._markerDecorations.get(e);return n&&n.getMarker(t)||null}_handleMarkerChange(e){e.forEach(e=>{const t=this._markerDecorations.get(e);t&&this._updateDecorations(t)})}_onModelAdded(e){const t=new k(e);this._markerDecorations.set(e.uri,t),this._updateDecorations(t)}_onModelRemoved(e){const t=this._markerDecorations.get(e.uri);t&&(t.dispose(),this._markerDecorations.delete(e.uri)),e.uri.scheme!==b.ny.inMemory&&e.uri.scheme!==b.ny.internal&&e.uri.scheme!==b.ny.vscode||this._markerService?.read({resource:e.uri}).map(e=>e.owner).forEach(t=>this._markerService.remove(t,[e.uri]))}_updateDecorations(e){const t=this._markerService.read({resource:e.model.uri,take:500});e.update(t)&&this._onDidChangeMarker.fire(e.model)}};_=function(e,t,n,r){var i,s=arguments.length,o=s<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,n,r);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(o=(s<3?i(o):s>3?i(t,n,o):i(t,n))||o);return s>3&&o&&Object.defineProperty(t,n,o),o}([C(0,f.IModelService),C(1,h)],_);class k extends d.jG{constructor(e){super(),this.model=e,this._map=new w.cO,this._register((0,d.s)(()=>{this.model.deltaDecorations([...this._map.values()],[]),this._map.clear()}))}update(e){const{added:t,removed:n}=function(e,t){const n=[],r=[];for(const r of e)t.has(r)||n.push(r);for(const n of t)e.has(n)||r.push(n);return{removed:n,added:r}}(new Set(this._map.keys()),new Set(e));if(0===t.length&&0===n.length)return!1;const r=n.map(e=>this._map.get(e)),i=t.map(e=>({range:this._createDecorationRange(this.model,e),options:this._createDecorationOption(e)})),s=this.model.deltaDecorations(r,i);for(const e of n)this._map.delete(e);for(let e=0;e=t)return n;const r=e.getWordAtPosition(n.getStartPosition());r&&(n=new g.Q(n.startLineNumber,r.startColumn,n.endLineNumber,r.endColumn))}else if(t.endColumn===Number.MAX_VALUE&&1===t.startColumn&&n.startLineNumber===n.endLineNumber){const r=e.getLineFirstNonWhitespaceColumn(t.startLineNumber);r=0}}},8581:(e,t,n)=>{"use strict";function r(e,t){if(e===t)return!0;if(null==e||null==t)return!1;if(typeof e!=typeof t)return!1;if("object"!=typeof e)return!1;if(Array.isArray(e)!==Array.isArray(t))return!1;let n,i;if(Array.isArray(e)){if(e.length!==t.length)return!1;for(n=0;nfunction(){const n=Array.prototype.slice.call(arguments,0);return t(e,n)},r={};for(const t of e)r[t]=n(t);return r}n.d(t,{V0:()=>i,aI:()=>r,kT:()=>s}),Object.prototype.hasOwnProperty},8685:(e,t,n)=>{"use strict";n.r(t),n.d(t,{ITreeViewsDnDService:()=>o});var r=n(1964),i=n(7352),s=n(9268);const o=(0,i.u1)("treeViewsDndService");(0,r.v)(o,s.TreeViewsDnDService,1)},8707:(e,t,n)=>{"use strict";n.r(t),n.d(t,{ITextModelService:()=>r});const r=(0,n(7352).u1)("textModelService")},8738:(e,t,n)=>{"use strict";function r(e){let t=0,n=0,r=0,i=0;for(let s=0,o=e.length;sr})},8748:(e,t,n)=>{"use strict";n.d(t,{A5:()=>r,Dg:()=>l,F4:()=>u,L5:()=>d,Wo:()=>h,X2:()=>a,ZS:()=>i,nk:()=>c,vd:()=>p});var r,i,s,o=n(8581);!function(e){e[e.Left=1]="Left",e[e.Center=2]="Center",e[e.Right=4]="Right",e[e.Full=7]="Full"}(r||(r={})),function(e){e[e.Left=1]="Left",e[e.Center=2]="Center",e[e.Right=3]="Right"}(i||(i={})),function(e){e[e.Both=0]="Both",e[e.Right=1]="Right",e[e.Left=2]="Left",e[e.None=3]="None"}(s||(s={}));class a{get originalIndentSize(){return this._indentSizeIsTabSize?"tabSize":this.indentSize}constructor(e){this._textModelResolvedOptionsBrand=void 0,this.tabSize=Math.max(1,0|e.tabSize),"tabSize"===e.indentSize?(this.indentSize=this.tabSize,this._indentSizeIsTabSize=!0):(this.indentSize=Math.max(1,0|e.indentSize),this._indentSizeIsTabSize=!1),this.insertSpaces=Boolean(e.insertSpaces),this.defaultEOL=0|e.defaultEOL,this.trimAutoWhitespace=Boolean(e.trimAutoWhitespace),this.bracketPairColorizationOptions=e.bracketPairColorizationOptions}equals(e){return this.tabSize===e.tabSize&&this._indentSizeIsTabSize===e._indentSizeIsTabSize&&this.indentSize===e.indentSize&&this.insertSpaces===e.insertSpaces&&this.defaultEOL===e.defaultEOL&&this.trimAutoWhitespace===e.trimAutoWhitespace&&(0,o.aI)(this.bracketPairColorizationOptions,e.bracketPairColorizationOptions)}createChangeEvent(e){return{tabSize:this.tabSize!==e.tabSize,indentSize:this.indentSize!==e.indentSize,insertSpaces:this.insertSpaces!==e.insertSpaces,trimAutoWhitespace:this.trimAutoWhitespace!==e.trimAutoWhitespace}}}class l{constructor(e,t){this._findMatchBrand=void 0,this.range=e,this.matches=t}}function c(e){return e&&"function"==typeof e.read}class h{constructor(e,t,n,r,i,s){this.identifier=e,this.range=t,this.text=n,this.forceMoveMarkers=r,this.isAutoWhitespaceEdit=i,this._isTracked=s}}class d{constructor(e,t,n){this.regex=e,this.wordSeparators=t,this.simpleSearch=n}}class u{constructor(e,t,n){this.reverseEdits=e,this.changes=t,this.trimAutoWhitespaceLineNumbers=n}}function p(e){return!e.isTooLargeForSyncing()&&!e.isForSimpleWidget}},9130:(e,t,n)=>{"use strict";n.d(t,{P8:()=>I,pD:()=>L,LC:()=>T,fj:()=>S,S8:()=>x,SA:()=>k,V8:()=>F,hd:()=>E,Vn:()=>N,IN:()=>C});var r=n(6206);let i;const s=globalThis.vscode;if(void 0!==s&&void 0!==s.process){const e=s.process;i={get platform(){return e.platform},get arch(){return e.arch},get env(){return e.env},cwd:()=>e.cwd()}}else i="undefined"!=typeof process&&"string"==typeof process?.versions?.node?{get platform(){return process.platform},get arch(){return process.arch},get env(){return process.env},cwd:()=>process.env.VSCODE_CWD||process.cwd()}:{get platform(){return r.uF?"win32":r.zx?"darwin":"linux"},get arch(){},get env(){return{}},cwd:()=>"/"};const o=i.cwd,a=i.env,l=i.platform,c=46,h=47,d=92,u=58;class p extends Error{constructor(e,t,n){let r;"string"==typeof t&&0===t.indexOf("not ")?(r="must not be",t=t.replace(/^not /,"")):r="must be";const i=-1!==e.indexOf(".")?"property":"argument";let s=`The "${e}" ${i} ${r} of type ${t}`;s+=". Received type "+typeof n,super(s),this.code="ERR_INVALID_ARG_TYPE"}}function m(e,t){if("string"!=typeof e)throw new p(t,"string",e)}const f="win32"===l;function g(e){return e===h||e===d}function b(e){return e===h}function v(e){return e>=65&&e<=90||e>=97&&e<=122}function y(e,t,n,r){let i="",s=0,o=-1,a=0,l=0;for(let d=0;d<=e.length;++d){if(d2){const e=i.lastIndexOf(n);-1===e?(i="",s=0):(i=i.slice(0,e),s=i.length-1-i.lastIndexOf(n)),o=d,a=0;continue}if(0!==i.length){i="",s=0,o=d,a=0;continue}}t&&(i+=i.length>0?`${n}..`:"..",s=2)}else i.length>0?i+=`${n}${e.slice(o+1,d)}`:i=e.slice(o+1,d),s=d-o-1;o=d,a=0}else l===c&&-1!==a?++a:a=-1}return i}function w(e,t){!function(e){if(null===e||"object"!=typeof e)throw new p("pathObject","Object",e)}(t);const n=t.dir||t.root,r=t.base||`${t.name||""}${i=t.ext,i?`${"."===i[0]?"":"."}${i}`:""}`;var i;return n?n===t.root?`${n}${r}`:`${n}${e}${r}`:r}const C={resolve(...e){let t="",n="",r=!1;for(let i=e.length-1;i>=-1;i--){let s;if(i>=0){if(s=e[i],m(s,`paths[${i}]`),0===s.length)continue}else 0===t.length?s=o():(s=a[`=${t}`]||o(),(void 0===s||s.slice(0,2).toLowerCase()!==t.toLowerCase()&&s.charCodeAt(2)===d)&&(s=`${t}\\`));const l=s.length;let c=0,h="",p=!1;const f=s.charCodeAt(0);if(1===l)g(f)&&(c=1,p=!0);else if(g(f))if(p=!0,g(s.charCodeAt(1))){let e=2,t=e;for(;e2&&g(s.charCodeAt(2))&&(p=!0,c=3));if(h.length>0)if(t.length>0){if(h.toLowerCase()!==t.toLowerCase())continue}else t=h;if(r){if(t.length>0)break}else if(n=`${s.slice(c)}\\${n}`,r=p,p&&t.length>0)break}return n=y(n,!r,"\\",g),r?`${t}\\${n}`:`${t}${n}`||"."},normalize(e){m(e,"path");const t=e.length;if(0===t)return".";let n,r=0,i=!1;const s=e.charCodeAt(0);if(1===t)return b(s)?"\\":e;if(g(s))if(i=!0,g(e.charCodeAt(1))){let i=2,s=i;for(;i2&&g(e.charCodeAt(2))&&(i=!0,r=3));let o=r0&&g(e.charCodeAt(t-1))&&(o+="\\"),void 0===n?i?`\\${o}`:o:i?`${n}\\${o}`:`${n}${o}`},isAbsolute(e){m(e,"path");const t=e.length;if(0===t)return!1;const n=e.charCodeAt(0);return g(n)||t>2&&v(n)&&e.charCodeAt(1)===u&&g(e.charCodeAt(2))},join(...e){if(0===e.length)return".";let t,n;for(let r=0;r0&&(void 0===t?t=n=i:t+=`\\${i}`)}if(void 0===t)return".";let r=!0,i=0;if("string"==typeof n&&g(n.charCodeAt(0))){++i;const e=n.length;e>1&&g(n.charCodeAt(1))&&(++i,e>2&&(g(n.charCodeAt(2))?++i:r=!1))}if(r){for(;i=2&&(t=`\\${t.slice(i)}`)}return C.normalize(t)},relative(e,t){if(m(e,"from"),m(t,"to"),e===t)return"";const n=C.resolve(e),r=C.resolve(t);if(n===r)return"";if((e=n.toLowerCase())===(t=r.toLowerCase()))return"";let i=0;for(;ii&&e.charCodeAt(s-1)===d;)s--;const o=s-i;let a=0;for(;aa&&t.charCodeAt(l-1)===d;)l--;const c=l-a,h=oh){if(t.charCodeAt(a+p)===d)return r.slice(a+p+1);if(2===p)return r.slice(a+p)}o>h&&(e.charCodeAt(i+p)===d?u=p:2===p&&(u=3)),-1===u&&(u=0)}let f="";for(p=i+u+1;p<=s;++p)p!==s&&e.charCodeAt(p)!==d||(f+=0===f.length?"..":"\\..");return a+=u,f.length>0?`${f}${r.slice(a,l)}`:(r.charCodeAt(a)===d&&++a,r.slice(a,l))},toNamespacedPath(e){if("string"!=typeof e||0===e.length)return e;const t=C.resolve(e);if(t.length<=2)return e;if(t.charCodeAt(0)===d){if(t.charCodeAt(1)===d){const e=t.charCodeAt(2);if(63!==e&&e!==c)return`\\\\?\\UNC\\${t.slice(2)}`}}else if(v(t.charCodeAt(0))&&t.charCodeAt(1)===u&&t.charCodeAt(2)===d)return`\\\\?\\${t}`;return e},dirname(e){m(e,"path");const t=e.length;if(0===t)return".";let n=-1,r=0;const i=e.charCodeAt(0);if(1===t)return g(i)?e:".";if(g(i)){if(n=r=1,g(e.charCodeAt(1))){let i=2,s=i;for(;i2&&g(e.charCodeAt(2))?3:2,r=n);let s=-1,o=!0;for(let n=t-1;n>=r;--n)if(g(e.charCodeAt(n))){if(!o){s=n;break}}else o=!1;if(-1===s){if(-1===n)return".";s=n}return e.slice(0,s)},basename(e,t){void 0!==t&&m(t,"suffix"),m(e,"path");let n,r=0,i=-1,s=!0;if(e.length>=2&&v(e.charCodeAt(0))&&e.charCodeAt(1)===u&&(r=2),void 0!==t&&t.length>0&&t.length<=e.length){if(t===e)return"";let o=t.length-1,a=-1;for(n=e.length-1;n>=r;--n){const l=e.charCodeAt(n);if(g(l)){if(!s){r=n+1;break}}else-1===a&&(s=!1,a=n+1),o>=0&&(l===t.charCodeAt(o)?-1===--o&&(i=n):(o=-1,i=a))}return r===i?i=a:-1===i&&(i=e.length),e.slice(r,i)}for(n=e.length-1;n>=r;--n)if(g(e.charCodeAt(n))){if(!s){r=n+1;break}}else-1===i&&(s=!1,i=n+1);return-1===i?"":e.slice(r,i)},extname(e){m(e,"path");let t=0,n=-1,r=0,i=-1,s=!0,o=0;e.length>=2&&e.charCodeAt(1)===u&&v(e.charCodeAt(0))&&(t=r=2);for(let a=e.length-1;a>=t;--a){const t=e.charCodeAt(a);if(g(t)){if(!s){r=a+1;break}}else-1===i&&(s=!1,i=a+1),t===c?-1===n?n=a:1!==o&&(o=1):-1!==n&&(o=-1)}return-1===n||-1===i||0===o||1===o&&n===i-1&&n===r+1?"":e.slice(n,i)},format:w.bind(null,"\\"),parse(e){m(e,"path");const t={root:"",dir:"",base:"",ext:"",name:""};if(0===e.length)return t;const n=e.length;let r=0,i=e.charCodeAt(0);if(1===n)return g(i)?(t.root=t.dir=e,t):(t.base=t.name=e,t);if(g(i)){if(r=1,g(e.charCodeAt(1))){let t=2,i=t;for(;t0&&(t.root=e.slice(0,r));let s=-1,o=r,a=-1,l=!0,h=e.length-1,d=0;for(;h>=r;--h)if(i=e.charCodeAt(h),g(i)){if(!l){o=h+1;break}}else-1===a&&(l=!1,a=h+1),i===c?-1===s?s=h:1!==d&&(d=1):-1!==s&&(d=-1);return-1!==a&&(-1===s||0===d||1===d&&s===a-1&&s===o+1?t.base=t.name=e.slice(o,a):(t.name=e.slice(o,s),t.base=e.slice(o,a),t.ext=e.slice(s,a))),t.dir=o>0&&o!==r?e.slice(0,o-1):t.root,t},sep:"\\",delimiter:";",win32:null,posix:null},_=(()=>{if(f){const e=/\\/g;return()=>{const t=o().replace(e,"/");return t.slice(t.indexOf("/"))}}return()=>o()})(),k={resolve(...e){let t="",n=!1;for(let r=e.length-1;r>=-1&&!n;r--){const i=r>=0?e[r]:_();m(i,`paths[${r}]`),0!==i.length&&(t=`${i}/${t}`,n=i.charCodeAt(0)===h)}return t=y(t,!n,"/",b),n?`/${t}`:t.length>0?t:"."},normalize(e){if(m(e,"path"),0===e.length)return".";const t=e.charCodeAt(0)===h,n=e.charCodeAt(e.length-1)===h;return 0===(e=y(e,!t,"/",b)).length?t?"/":n?"./":".":(n&&(e+="/"),t?`/${e}`:e)},isAbsolute:e=>(m(e,"path"),e.length>0&&e.charCodeAt(0)===h),join(...e){if(0===e.length)return".";let t;for(let n=0;n0&&(void 0===t?t=r:t+=`/${r}`)}return void 0===t?".":k.normalize(t)},relative(e,t){if(m(e,"from"),m(t,"to"),e===t)return"";if((e=k.resolve(e))===(t=k.resolve(t)))return"";const n=e.length,r=n-1,i=t.length-1,s=rs){if(t.charCodeAt(1+a)===h)return t.slice(1+a+1);if(0===a)return t.slice(1+a)}else r>s&&(e.charCodeAt(1+a)===h?o=a:0===a&&(o=0));let l="";for(a=1+o+1;a<=n;++a)a!==n&&e.charCodeAt(a)!==h||(l+=0===l.length?"..":"/..");return`${l}${t.slice(1+o)}`},toNamespacedPath:e=>e,dirname(e){if(m(e,"path"),0===e.length)return".";const t=e.charCodeAt(0)===h;let n=-1,r=!0;for(let t=e.length-1;t>=1;--t)if(e.charCodeAt(t)===h){if(!r){n=t;break}}else r=!1;return-1===n?t?"/":".":t&&1===n?"//":e.slice(0,n)},basename(e,t){void 0!==t&&m(t,"ext"),m(e,"path");let n,r=0,i=-1,s=!0;if(void 0!==t&&t.length>0&&t.length<=e.length){if(t===e)return"";let o=t.length-1,a=-1;for(n=e.length-1;n>=0;--n){const l=e.charCodeAt(n);if(l===h){if(!s){r=n+1;break}}else-1===a&&(s=!1,a=n+1),o>=0&&(l===t.charCodeAt(o)?-1===--o&&(i=n):(o=-1,i=a))}return r===i?i=a:-1===i&&(i=e.length),e.slice(r,i)}for(n=e.length-1;n>=0;--n)if(e.charCodeAt(n)===h){if(!s){r=n+1;break}}else-1===i&&(s=!1,i=n+1);return-1===i?"":e.slice(r,i)},extname(e){m(e,"path");let t=-1,n=0,r=-1,i=!0,s=0;for(let o=e.length-1;o>=0;--o){const a=e.charCodeAt(o);if(a!==h)-1===r&&(i=!1,r=o+1),a===c?-1===t?t=o:1!==s&&(s=1):-1!==t&&(s=-1);else if(!i){n=o+1;break}}return-1===t||-1===r||0===s||1===s&&t===r-1&&t===n+1?"":e.slice(t,r)},format:w.bind(null,"/"),parse(e){m(e,"path");const t={root:"",dir:"",base:"",ext:"",name:""};if(0===e.length)return t;const n=e.charCodeAt(0)===h;let r;n?(t.root="/",r=1):r=0;let i=-1,s=0,o=-1,a=!0,l=e.length-1,d=0;for(;l>=r;--l){const t=e.charCodeAt(l);if(t!==h)-1===o&&(a=!1,o=l+1),t===c?-1===i?i=l:1!==d&&(d=1):-1!==i&&(d=-1);else if(!a){s=l+1;break}}if(-1!==o){const r=0===s&&n?1:s;-1===i||0===d||1===d&&i===o-1&&i===s+1?t.base=t.name=e.slice(r,o):(t.name=e.slice(r,i),t.base=e.slice(r,o),t.ext=e.slice(i,o))}return s>0?t.dir=e.slice(0,s-1):n&&(t.dir="/"),t},sep:"/",delimiter:":",win32:null,posix:null};k.win32=C.win32=C,k.posix=C.posix=k;const x=f?C.normalize:k.normalize,S=f?C.join:k.join,E=f?C.resolve:k.resolve,F=f?C.relative:k.relative,L=f?C.dirname:k.dirname,I=f?C.basename:k.basename,T=f?C.extname:k.extname,N=f?C.sep:k.sep},9182:(e,t,n)=>{"use strict";n.d(t,{lt:()=>d,W5:()=>g,hB:()=>m,dr:()=>u,wC:()=>f});var r=n(5603),i=n(6303),s=n(8223);class o extends s.V{constructor(e,t){super(0),this._segmenter=null,this._cachedLine=null,this._cachedSegments=[],this.intlSegmenterLocales=t,this.intlSegmenterLocales.length>0?this._segmenter=new Intl.Segmenter(this.intlSegmenterLocales,{granularity:"word"}):this._segmenter=null;for(let t=0,n=e.length;tt)break;n=r}return n}findNextIntlWordAtOrAfterOffset(e,t){for(const n of this._getIntlSegmenterWordsOnLine(e))if(!(n.index=n)break;const r=e.charCodeAt(t);if(110===r||114===r||87===r)return!0}}return!1}(this.searchString):this.searchString.indexOf("\n")>=0;let t=null;try{t=r.OS(this.searchString,this.isRegex,{matchCase:this.matchCase,wholeWord:!1,multiline:e,global:!0,unicode:!0})}catch(e){return null}if(!t)return null;let n=!this.isRegex&&!e;return n&&this.searchString.toLowerCase()!==this.searchString.toUpperCase()&&(n=this.matchCase),new h.L5(t,this.wordSeparators?function(e,t){const n=`${e}/${t.join(",")}`;let r=a.get(n);return r||(r=new o(e,t),a.set(n,r)),r}(this.wordSeparators,[]):null,n?this.searchString:null)}}function u(e,t,n){if(!n)return new h.Dg(e,null);const r=[];for(let e=0,n=t.length;e=e?r=i-1:t[i+1]>=e?(n=i,r=i):n=i+1}return n+1}}class m{static findMatches(e,t,n,r,i){const s=t.parseSearchRequest();return s?s.regex.multiline?this._doFindMatchesMultiline(e,n,new g(s.wordSeparators,s.regex),r,i):this._doFindMatchesLineByLine(e,n,s,r,i):[]}static _getMultilineMatchRange(e,t,n,r,i,s){let o,a,l=0;if(r?(l=r.findLineFeedCountBeforeOffset(i),o=t+i+l):o=t+i,r){const e=r.findLineFeedCountBeforeOffset(i+s.length)-l;a=o+s.length+e}else a=o+s.length;const h=e.getPositionAt(o),d=e.getPositionAt(a);return new c.Q(h.lineNumber,h.column,d.lineNumber,d.column)}static _doFindMatchesMultiline(e,t,n,r,i){const s=e.getOffsetAt(t.getStartPosition()),o=e.getValueInRange(t,1),a="\r\n"===e.getEOL()?new p(o):null,l=[];let c,h=0;for(n.reset(0);c=n.next(o);)if(l[h++]=u(this._getMultilineMatchRange(e,s,o,a,c.index,c[0]),c,r),h>=i)return l;return l}static _doFindMatchesLineByLine(e,t,n,r,i){const s=[];let o=0;if(t.startLineNumber===t.endLineNumber){const a=e.getLineContent(t.startLineNumber).substring(t.startColumn-1,t.endColumn-1);return o=this._findMatchesInLine(n,a,t.startLineNumber,t.startColumn-1,o,s,r,i),s}const a=e.getLineContent(t.startLineNumber).substring(t.startColumn-1);o=this._findMatchesInLine(n,a,t.startLineNumber,t.startColumn-1,o,s,r,i);for(let a=t.startLineNumber+1;a=a))return i;return i}const d=new g(e.wordSeparators,e.regex);let p;d.reset(0);do{if(p=d.next(t),p&&(s[i++]=u(new c.Q(n,p.index+1+r,n,p.index+1+p[0].length+r),p,o),i>=a))return i}while(p);return i}static findNextMatch(e,t,n,r){const i=t.parseSearchRequest();if(!i)return null;const s=new g(i.wordSeparators,i.regex);return i.regex.multiline?this._doFindNextMatchMultiline(e,n,s,r):this._doFindNextMatchLineByLine(e,n,s,r)}static _doFindNextMatchMultiline(e,t,n,r){const i=new l.y(t.lineNumber,1),s=e.getOffsetAt(i),o=e.getLineCount(),a=e.getValueInRange(new c.Q(i.lineNumber,i.column,o,e.getLineMaxColumn(o)),1),h="\r\n"===e.getEOL()?new p(a):null;n.reset(t.column-1);const d=n.next(a);return d?u(this._getMultilineMatchRange(e,s,a,h,d.index,d[0]),d,r):1!==t.lineNumber||1!==t.column?this._doFindNextMatchMultiline(e,new l.y(1,1),n,r):null}static _doFindNextMatchLineByLine(e,t,n,r){const i=e.getLineCount(),s=t.lineNumber,o=e.getLineContent(s),a=this._findFirstMatchInLine(n,o,s,t.column,r);if(a)return a;for(let t=1;t<=i;t++){const o=(s+t-1)%i,a=e.getLineContent(o+1),l=this._findFirstMatchInLine(n,a,o+1,1,r);if(l)return l}return null}static _findFirstMatchInLine(e,t,n,r,i){e.reset(r-1);const s=e.next(t);return s?u(new c.Q(n,s.index+1,n,s.index+1+s[0].length),s,i):null}static findPreviousMatch(e,t,n,r){const i=t.parseSearchRequest();if(!i)return null;const s=new g(i.wordSeparators,i.regex);return i.regex.multiline?this._doFindPreviousMatchMultiline(e,n,s,r):this._doFindPreviousMatchLineByLine(e,n,s,r)}static _doFindPreviousMatchMultiline(e,t,n,r){const i=this._doFindMatchesMultiline(e,new c.Q(1,1,t.lineNumber,t.column),n,r,9990);if(i.length>0)return i[i.length-1];const s=e.getLineCount();return t.lineNumber!==s||t.column!==e.getLineMaxColumn(s)?this._doFindPreviousMatchMultiline(e,new l.y(s,e.getLineMaxColumn(s)),n,r):null}static _doFindPreviousMatchLineByLine(e,t,n,r){const i=e.getLineCount(),s=t.lineNumber,o=e.getLineContent(s).substring(0,t.column-1),a=this._findLastMatchInLine(n,o,s,r);if(a)return a;for(let t=1;t<=i;t++){const o=(i+s-t-1)%i,a=e.getLineContent(o+1),l=this._findLastMatchInLine(n,a,o+1,r);if(l)return l}return null}static _findLastMatchInLine(e,t,n,r){let i,s=null;for(e.reset(0);i=e.next(t);)s=u(new c.Q(n,i.index+1,n,i.index+1+i[0].length),i,r);return s}}function f(e,t,n,r,i){return function(e,t,n,r,i){if(0===r)return!0;const s=t.charCodeAt(r-1);if(0!==e.get(s))return!0;if(13===s||10===s)return!0;if(i>0){const n=t.charCodeAt(r);if(0!==e.get(n))return!0}return!1}(e,t,0,r,i)&&function(e,t,n,r,i){if(r+i===n)return!0;const s=t.charCodeAt(r+i);if(0!==e.get(s))return!0;if(13===s||10===s)return!0;if(i>0){const n=t.charCodeAt(r+i-1);if(0!==e.get(n))return!0}return!1}(e,t,n,r,i)}class g{constructor(e,t){this._wordSeparators=e,this._searchRegex=t,this._prevMatchStartIndex=-1,this._prevMatchLength=0}reset(e){this._searchRegex.lastIndex=e,this._prevMatchStartIndex=-1,this._prevMatchLength=0}next(e){const t=e.length;let n;do{if(this._prevMatchStartIndex+this._prevMatchLength===t)return null;if(n=this._searchRegex.exec(e),!n)return null;const i=n.index,s=n[0].length;if(i===this._prevMatchStartIndex&&s===this._prevMatchLength){if(0===s){r.Z5(e,t,this._searchRegex.lastIndex)>65535?this._searchRegex.lastIndex+=2:this._searchRegex.lastIndex+=1;continue}return null}if(this._prevMatchStartIndex=i,this._prevMatchLength=s,!this._wordSeparators||f(this._wordSeparators,e,t,i,s))return n}while(n);return null}}},9208:(e,t,n)=>{"use strict";n.r(t),n.d(t,{ILanguageFeatureDebounceService:()=>m,LanguageFeatureDebounceService:()=>v});var r=n(9517),i=n(6303);function s(e,t,n){return Math.min(Math.max(e,t),n)}class o{constructor(){this._n=1,this._val=0}update(e){return this._val=this._val+(e-this._val)/this._n,this._n+=1,this._val}get value(){return this._val}}class a{constructor(e){this._n=0,this._val=0,this._values=[],this._index=0,this._sum=0,this._values=new Array(e),this._values.fill(0,0,e)}update(e){const t=this._values[this._index];return this._values[this._index]=e,this._index=(this._index+1)%this._values.length,this._sum-=t,this._sum+=e,this._n(0,r.sN)(f.of(t),e),0)}get(e){const t=this._key(e),n=this._cache.get(t);return n?s(n.value,this._min,this._max):this.default()}update(e,t){const n=this._key(e);let r=this._cache.get(n);r||(r=new a(6),this._cache.set(n,r));const i=s(r.update(t),this._min,this._max);return(0,u.v$)(e.uri,"output")||this._logService.trace(`[DEBOUNCE: ${this._name}] for ${e.uri.toString()} is ${i}ms`),i}_overall(){const e=new o;for(const[,t]of this._cache)e.update(t.value);return e.value}default(){return s(0|this._overall()||this._default,this._min,this._max)}}let v=class{constructor(e,t){this._logService=e,this._data=new Map,this._isDev=t.isExtensionDevelopment||!t.isBuilt}for(e,t,n){const r=n?.min??50,i=n?.max??r**2,s=n?.key??void 0,o=`${f.of(e)},${r}${s?","+s:""}`;let a=this._data.get(o);return a||(this._isDev?(this._logService.debug(`[DEBOUNCE: ${t}] is disabled in developed mode`),a=new g(1.5*r)):a=new b(this._logService,t,e,0|this._overallAverage()||1.5*r,r,i),this._data.set(o,a)),a}_overallAverage(){const e=new o;for(const t of this._data.values())e.update(t.default());return e.value}};v=function(e,t,n,r){var i,s=arguments.length,o=s<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,n,r);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(o=(s<3?i(o):s>3?i(t,n,o):i(t,n))||o);return s>3&&o&&Object.defineProperty(t,n,o),o}([p(0,d.rr),p(1,c)],v),(0,h.v)(m,v,1)},9241:(e,t,n)=>{"use strict";n.r(t),n.d(t,{ITreeSitterParserService:()=>r});const r=(0,n(7352).u1)("treeSitterParserService")},9268:(e,t,n)=>{"use strict";n.r(t),n.d(t,{DraggedTreeItemsIdentifier:()=>i,TreeViewsDnDService:()=>r});class r{constructor(){this._dragOperations=new Map}removeDragOperationTransfer(e){if(e&&this._dragOperations.has(e)){const t=this._dragOperations.get(e);return this._dragOperations.delete(e),t}}}class i{constructor(e){this.identifier=e}}},9517:(e,t,n)=>{"use strict";n.d(t,{e2:()=>o,sN:()=>i,v7:()=>h});var r=n(5603);function i(e,t){switch(typeof e){case"object":return null===e?s(349,t):Array.isArray(e)?(n=e,r=s(104579,r=t),n.reduce((e,t)=>i(t,e),r)):function(e,t){return t=s(181387,t),Object.keys(e).sort().reduce((t,n)=>(t=o(n,t),i(e[n],t)),t)}(e,t);case"string":return o(e,t);case"boolean":return function(e,t){return s(e?433:863,t)}(e,t);case"number":return s(e,t);case"undefined":return s(937,t);default:return s(617,t)}var n,r}function s(e,t){return(t<<5)-t+e|0}function o(e,t){t=s(149417,t);for(let n=0,r=e.length;n>>r)>>>0}function l(e,t=0,n=e.byteLength,r=0){for(let i=0;ie.toString(16).padStart(2,"0")).join(""):function(e,t,n="0"){for(;e.length>>0).toString(16),t/4)}class h{static{this._bigBlock32=new DataView(new ArrayBuffer(320))}constructor(){this._h0=1732584193,this._h1=4023233417,this._h2=2562383102,this._h3=271733878,this._h4=3285377520,this._buff=new Uint8Array(67),this._buffDV=new DataView(this._buff.buffer),this._buffLen=0,this._totalLen=0,this._leftoverHighSurrogate=0,this._finished=!1}update(e){const t=e.length;if(0===t)return;const n=this._buff;let i,s,o=this._buffLen,a=this._leftoverHighSurrogate;for(0!==a?(i=a,s=-1,a=0):(i=e.charCodeAt(0),s=0);;){let l=i;if(r.pc(i)){if(!(s+1>>6,e[t++]=128|(63&n)>>>0):n<65536?(e[t++]=224|(61440&n)>>>12,e[t++]=128|(4032&n)>>>6,e[t++]=128|(63&n)>>>0):(e[t++]=240|(1835008&n)>>>18,e[t++]=128|(258048&n)>>>12,e[t++]=128|(4032&n)>>>6,e[t++]=128|(63&n)>>>0),t>=64&&(this._step(),t-=64,this._totalLen+=64,e[0]=e[64],e[1]=e[65],e[2]=e[66]),t}digest(){return this._finished||(this._finished=!0,this._leftoverHighSurrogate&&(this._leftoverHighSurrogate=0,this._buffLen=this._push(this._buff,this._buffLen,65533)),this._totalLen+=this._buffLen,this._wrapUp()),c(this._h0)+c(this._h1)+c(this._h2)+c(this._h3)+c(this._h4)}_wrapUp(){this._buff[this._buffLen++]=128,l(this._buff,this._buffLen),this._buffLen>56&&(this._step(),l(this._buff));const e=8*this._totalLen;this._buffDV.setUint32(56,Math.floor(e/4294967296),!1),this._buffDV.setUint32(60,e%4294967296,!1),this._step()}_step(){const e=h._bigBlock32,t=this._buffDV;for(let n=0;n<64;n+=4)e.setUint32(n,t.getUint32(n,!1),!1);for(let t=64;t<320;t+=4)e.setUint32(t,a(e.getUint32(t-12,!1)^e.getUint32(t-32,!1)^e.getUint32(t-56,!1)^e.getUint32(t-64,!1),1),!1);let n,r,i,s=this._h0,o=this._h1,l=this._h2,c=this._h3,d=this._h4;for(let t=0;t<80;t++)t<20?(n=o&l|~o&c,r=1518500249):t<40?(n=o^l^c,r=1859775393):t<60?(n=o&l|o&c|l&c,r=2400959708):(n=o^l^c,r=3395469782),i=a(s,5)+n+d+r+e.getUint32(4*t,!1)&4294967295,d=c,c=l,l=a(o,30),o=s,s=i;this._h0=this._h0+s&4294967295,this._h1=this._h1+o&4294967295,this._h2=this._h2+l&4294967295,this._h3=this._h3+c&4294967295,this._h4=this._h4+d&4294967295}}},9796:(e,t,n)=>{"use strict";n.r(t),n.d(t,{DefaultModelSHA1Computer:()=>gi,ModelService:()=>fi});var r=n(2373),i=n(6274),s=n(6206),o=n(1211),a=n(3298),l=n(1490),c=n(5603),h=n(695),d=n(8738);class u{static _nextVisibleColumn(e,t,n){return 9===e?u.nextRenderTabStop(t,n):c.ne(e)||c.Ss(e)?t+2:t+1}static visibleColumnFromColumn(e,t,n){const r=Math.min(t-1,e.length),i=e.substring(0,r),s=new c.km(i);let o=0;for(;!s.eol();){const e=c.Z5(i,r,s.offset);s.nextGraphemeLength(),o=this._nextVisibleColumn(e,o,n)}return o}static columnFromVisibleColumn(e,t,n){if(t<=0)return 1;const r=e.length,i=new c.km(e);let s=0,o=1;for(;!i.eol();){const a=c.Z5(e,r,i.offset);i.nextGraphemeLength();const l=this._nextVisibleColumn(a,s,n),h=i.offset+1;if(l>=t)return l-t \n\t"}constructor(e){if(e.autoClosingPairs?this._autoClosingPairs=e.autoClosingPairs.map(e=>new w(e)):e.brackets?this._autoClosingPairs=e.brackets.map(e=>new w({open:e[0],close:e[1]})):this._autoClosingPairs=[],e.__electricCharacterSupport&&e.__electricCharacterSupport.docComment){const t=e.__electricCharacterSupport.docComment;this._autoClosingPairs.push(new w({open:t.open,close:t.close||""}))}this._autoCloseBeforeForQuotes="string"==typeof e.autoCloseBefore?e.autoCloseBefore:k.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_QUOTES,this._autoCloseBeforeForBrackets="string"==typeof e.autoCloseBefore?e.autoCloseBefore:k.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_BRACKETS,this._surroundingPairs=e.surroundingPairs||this._autoClosingPairs}getAutoClosingPairs(){return this._autoClosingPairs}getAutoCloseBeforeSet(e){return e?this._autoCloseBeforeForQuotes:this._autoCloseBeforeForBrackets}getSurroundingPairs(){return this._surroundingPairs}}function x(e){return!!(3&e)}var S=n(6575);let E,F,L;function I(){return E||(E=new TextDecoder("UTF-16LE")),E}class T{constructor(e,t,n,r,i,s){this._richEditBracketBrand=void 0,this.languageId=e,this.index=t,this.open=n,this.close=r,this.forwardRegex=i,this.reversedRegex=s,this._openSet=T._toSet(this.open),this._closeSet=T._toSet(this.close)}isOpen(e){return this._openSet.has(e)}isClose(e){return this._closeSet.has(e)}static _toSet(e){const t=new Set;for(const n of e)t.add(n);return t}}class N{constructor(e,t){this._richEditBracketsBrand=void 0;const n=function(e){const t=e.length;e=e.map(e=>[e[0].toLowerCase(),e[1].toLowerCase()]);const n=[];for(let e=0;e{const[n,r]=e,[i,s]=t;return n===i||n===s||r===i||r===s},i=(e,r)=>{const i=Math.min(e,r),s=Math.max(e,r);for(let e=0;e0&&s.push({open:i,close:o})}return s}(t);this.brackets=n.map((t,r)=>new T(e,r,t.open,t.close,function(e,t,n,r){let i=[];i=i.concat(e),i=i.concat(t);for(let e=0,t=i.length;e=0&&r.push(t);for(const t of s.close)t.indexOf(e)>=0&&r.push(t)}}function D(e,t){return e.length-t.length}function A(e){if(e.length<=1)return e;const t=[],n=new Set;for(const r of e)n.has(r)||(t.push(r),n.add(r));return t}function M(e){const t=/^[\w ]+$/.test(e);return e=c.bm(e),t?`\\b${e}\\b`:e}function O(e,t){const n=`(${e.map(M).join(")|(")})`;return c.OS(n,!0,t)}const z=function(){let e=null,t=null;return function(n){return e!==n&&(e=n,t=function(e){const t=new Uint16Array(e.length);let n=0;for(let r=e.length-1;r>=0;r--)t[n++]=e.charCodeAt(r);return(L||(L=s.cm()?I():(F||(F=new TextDecoder("UTF-16BE")),F)),L).decode(t)}(e)),t}}();class P{static _findPrevBracketInText(e,t,n,r){const i=n.match(e);if(!i)return null;const s=n.length-(i.index||0),o=i[0].length,a=r+s;return new m.Q(t,a-o+1,t,a+1)}static findPrevBracketInRange(e,t,n,r,i){const s=z(n).substring(n.length-i,n.length-r);return this._findPrevBracketInText(e,t,s,r)}static findNextBracketInText(e,t,n,r){const i=n.match(e);if(!i)return null;const s=i.index||0,o=i[0].length;if(0===o)return null;const a=r+s;return new m.Q(t,a+1,t,a+1+o)}static findNextBracketInRange(e,t,n,r,i){const s=n.substring(r,i);return this.findNextBracketInText(e,t,s,r)}}class B{constructor(e){this._richEditBrackets=e}getElectricCharacters(){const e=[];if(this._richEditBrackets)for(const t of this._richEditBrackets.brackets)for(const n of t.close){const t=n.charAt(n.length-1);e.push(t)}return(0,o.dM)(e)}onElectricCharacter(e,t,n){if(!this._richEditBrackets||0===this._richEditBrackets.brackets.length)return null;const r=t.findTokenIndexAtOffset(n-1);if(x(t.getStandardTokenType(r)))return null;const i=this._richEditBrackets.reversedRegex,s=t.getLineContent().substring(0,n-1)+e,o=P.findPrevBracketInRange(i,1,s,0,s.length);if(!o)return null;const a=s.substring(o.startColumn-1,o.endColumn-1).toLowerCase();if(this._richEditBrackets.textIsOpenBracket[a])return null;const l=t.getActualLineContentBefore(o.startColumn-1);return/^\s*$/.test(l)?{matchOpenBracket:a}:null}}function W(e){return e.global&&(e.lastIndex=0),!0}class V{constructor(e){this._indentationRules=e}shouldIncrease(e){return!!(this._indentationRules&&this._indentationRules.increaseIndentPattern&&W(this._indentationRules.increaseIndentPattern)&&this._indentationRules.increaseIndentPattern.test(e))}shouldDecrease(e){return!!(this._indentationRules&&this._indentationRules.decreaseIndentPattern&&W(this._indentationRules.decreaseIndentPattern)&&this._indentationRules.decreaseIndentPattern.test(e))}shouldIndentNextLine(e){return!!(this._indentationRules&&this._indentationRules.indentNextLinePattern&&W(this._indentationRules.indentNextLinePattern)&&this._indentationRules.indentNextLinePattern.test(e))}shouldIgnore(e){return!!(this._indentationRules&&this._indentationRules.unIndentedLinePattern&&W(this._indentationRules.unIndentedLinePattern)&&this._indentationRules.unIndentedLinePattern.test(e))}getIndentMetadata(e){let t=0;return this.shouldIncrease(e)&&(t+=1),this.shouldDecrease(e)&&(t+=2),this.shouldIndentNextLine(e)&&(t+=4),this.shouldIgnore(e)&&(t+=8),t}}class U{constructor(e){(e=e||{}).brackets=e.brackets||[["(",")"],["{","}"],["[","]"]],this._brackets=[],e.brackets.forEach(e=>{const t=U._createOpenBracketRegExp(e[0]),n=U._createCloseBracketRegExp(e[1]);t&&n&&this._brackets.push({open:e[0],openRegExp:t,close:e[1],closeRegExp:n})}),this._regExpRules=e.onEnterRules||[]}onEnter(e,t,n,r){if(e>=3)for(let e=0,i=this._regExpRules.length;e!e.reg||(e.reg.lastIndex=0,e.reg.test(e.text))))return i.action}if(e>=2&&n.length>0&&r.length>0)for(let e=0,t=this._brackets.length;e=2&&n.length>0)for(let e=0,t=this._brackets.length;e{const t=new Set;return{info:new Y(this,e,t),closing:t}}),i=new H.VV(e=>{const t=new Set,n=new Set;return{info:new X(this,e,t,n),opening:t,openingColorized:n}});for(const[e,t]of n){const n=r.get(e),s=i.get(t);n.closing.add(s.info),s.opening.add(n.info)}const s=t.colorizedBracketPairs?Q(t.colorizedBracketPairs):n.filter(e=>!("<"===e[0]&&">"===e[1]));for(const[e,t]of s){const n=r.get(e),s=i.get(t);n.closing.add(s.info),s.openingColorized.add(n.info),s.opening.add(n.info)}this._openingBrackets=new Map([...r.cachedValues].map(([e,t])=>[e,t.info])),this._closingBrackets=new Map([...i.cachedValues].map(([e,t])=>[e,t.info]))}get openingBrackets(){return[...this._openingBrackets.values()]}get closingBrackets(){return[...this._closingBrackets.values()]}getOpeningBracketInfo(e){return this._openingBrackets.get(e)}getClosingBracketInfo(e){return this._closingBrackets.get(e)}getBracketInfo(e){return this.getOpeningBracketInfo(e)||this.getClosingBracketInfo(e)}getBracketRegExp(e){return O(Array.from([...this._openingBrackets.keys(),...this._closingBrackets.keys()]),e)}}function Q(e){return e.filter(([e,t])=>""!==e&&""!==t)}class J{constructor(e,t){this.config=e,this.bracketText=t}get languageId(){return this.config.languageId}}class Y extends J{constructor(e,t,n){super(e,t),this.openedBrackets=n,this.isOpeningBracket=!0}}class X extends J{constructor(e,t,n,r){super(e,t),this.openingBrackets=n,this.openingColorizedBrackets=r,this.isOpeningBracket=!1}closes(e){return e.config===this.config&&this.openingBrackets.has(e)}closesColorized(e){return e.config===this.config&&this.openingColorizedBrackets.has(e)}getOpeningBrackets(){return[...this.openingBrackets]}}var Z=function(e,t){return function(n,r){t(n,r,e)}};class ee{constructor(e){this.languageId=e}affects(e){return!this.languageId||this.languageId===e}}const te=(0,$.u1)("languageConfigurationService");let ne=class extends i.jG{constructor(e,t){super(),this.configurationService=e,this.languageService=t,this._registry=this._register(new ce),this.onDidChangeEmitter=this._register(new r.vl),this.onDidChange=this.onDidChangeEmitter.event,this.configurations=new Map;const n=new Set(Object.values(re));this._register(this.configurationService.onDidChangeConfiguration(e=>{const t=e.change.keys.some(e=>n.has(e)),r=e.change.overrides.filter(([e,t])=>t.some(e=>n.has(e))).map(([e])=>e);if(t)this.configurations.clear(),this.onDidChangeEmitter.fire(new ee(void 0));else for(const e of r)this.languageService.isRegisteredLanguageId(e)&&(this.configurations.delete(e),this.onDidChangeEmitter.fire(new ee(e)))})),this._register(this._registry.onDidChange(e=>{this.configurations.delete(e.languageId),this.onDidChangeEmitter.fire(new ee(e.languageId))}))}register(e,t,n){return this._registry.register(e,t,n)}getLanguageConfiguration(e){let t=this.configurations.get(e);return t||(t=function(e,t,n,r){let i=t.getLanguageConfiguration(e);if(!i){if(!r.isRegisteredLanguageId(e))return new he(e,{});i=new he(e,{})}const s=function(e,t){const n=t.getValue(re.brackets,{overrideIdentifier:e}),r=t.getValue(re.colorizedBracketPairs,{overrideIdentifier:e});return{brackets:ie(n),colorizedBracketPairs:ie(r)}}(i.languageId,n),o=oe([i.underlyingConfig,s]);return new he(i.languageId,o)}(e,this._registry,this.configurationService,this.languageService),this.configurations.set(e,t)),t}};ne=function(e,t,n,r){var i,s=arguments.length,o=s<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,n,r);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(o=(s<3?i(o):s>3?i(t,n,o):i(t,n))||o);return s>3&&o&&Object.defineProperty(t,n,o),o}([Z(0,q.pG),Z(1,v.L)],ne);const re={brackets:"editor.language.brackets",colorizedBracketPairs:"editor.language.colorizedBracketPairs"};function ie(e){if(Array.isArray(e))return e.map(e=>{if(Array.isArray(e)&&2===e.length)return[e[0],e[1]]}).filter(e=>!!e)}class se{constructor(e){this.languageId=e,this._resolved=null,this._entries=[],this._order=0,this._resolved=null}register(e,t){const n=new ae(e,t,++this._order);return this._entries.push(n),this._resolved=null,(0,i.s)(()=>{for(let e=0;ee.configuration)))}}function oe(e){let t={comments:void 0,brackets:void 0,wordPattern:void 0,indentationRules:void 0,onEnterRules:void 0,autoClosingPairs:void 0,surroundingPairs:void 0,autoCloseBefore:void 0,folding:void 0,colorizedBracketPairs:void 0,__electricCharacterSupport:void 0};for(const n of e)t={comments:n.comments||t.comments,brackets:n.brackets||t.brackets,wordPattern:n.wordPattern||t.wordPattern,indentationRules:n.indentationRules||t.indentationRules,onEnterRules:n.onEnterRules||t.onEnterRules,autoClosingPairs:n.autoClosingPairs||t.autoClosingPairs,surroundingPairs:n.surroundingPairs||t.surroundingPairs,autoCloseBefore:n.autoCloseBefore||t.autoCloseBefore,folding:n.folding||t.folding,colorizedBracketPairs:n.colorizedBracketPairs||t.colorizedBracketPairs,__electricCharacterSupport:n.__electricCharacterSupport||t.__electricCharacterSupport};return t}class ae{constructor(e,t,n){this.configuration=e,this.priority=t,this.order=n}static cmp(e,t){return e.priority===t.priority?e.order-t.order:e.priority-t.priority}}class le{constructor(e){this.languageId=e}}class ce extends i.jG{constructor(){super(),this._entries=new Map,this._onDidChange=this._register(new r.vl),this.onDidChange=this._onDidChange.event,this._register(this.register(K.vH,{brackets:[["(",")"],["[","]"],["{","}"]],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:"<",close:">"},{open:'"',close:'"'},{open:"'",close:"'"},{open:"`",close:"`"}],colorizedBracketPairs:[],folding:{offSide:!0}},0))}register(e,t,n=0){let r=this._entries.get(e);r||(r=new se(e),this._entries.set(e,r));const s=r.register(t,n);return this._onDidChange.fire(new le(e)),(0,i.s)(()=>{s.dispose(),this._onDidChange.fire(new le(e))})}getLanguageConfiguration(e){const t=this._entries.get(e);return t?.getResolvedConfiguration()||null}}class he{constructor(e,t){this.languageId=e,this.underlyingConfig=t,this._brackets=null,this._electricCharacter=null,this._onEnterSupport=this.underlyingConfig.brackets||this.underlyingConfig.indentationRules||this.underlyingConfig.onEnterRules?new U(this.underlyingConfig):null,this.comments=he._handleComments(this.underlyingConfig),this.characterPair=new k(this.underlyingConfig),this.wordDefinition=this.underlyingConfig.wordPattern||y.Ld,this.indentationRules=this.underlyingConfig.indentationRules,this.underlyingConfig.indentationRules?this.indentRulesSupport=new V(this.underlyingConfig.indentationRules):this.indentRulesSupport=null,this.foldingRules=this.underlyingConfig.folding||{},this.bracketsNew=new G(e,this.underlyingConfig)}getWordDefinition(){return(0,y.Io)(this.wordDefinition)}get brackets(){return!this._brackets&&this.underlyingConfig.brackets&&(this._brackets=new N(this.languageId,this.underlyingConfig.brackets)),this._brackets}get electricCharacter(){return this._electricCharacter||(this._electricCharacter=new B(this.brackets)),this._electricCharacter}onEnter(e,t,n,r){return this._onEnterSupport?this._onEnterSupport.onEnter(e,t,n,r):null}getAutoClosingPairs(){return new C(this.characterPair.getAutoClosingPairs())}getAutoCloseBeforeSet(e){return this.characterPair.getAutoCloseBeforeSet(e)}getSurroundingPairs(){return this.characterPair.getSurroundingPairs()}static _handleComments(e){const t=e.comments;if(!t)return null;const n={};if(t.lineComment&&(n.lineCommentToken=t.lineComment),t.blockComment){const[e,r]=t.blockComment;n.blockCommentStartToken=e,n.blockCommentEndToken=r}return n}}(0,j.v)(te,ne,1);var de=n(8748);class ue{constructor(e,t,n,r){this.range=e,this.nestingLevel=t,this.nestingLevelOfEqualBracketType=n,this.isInvalid=r}}class pe{constructor(e,t,n,r,i,s){this.range=e,this.openingBracketRange=t,this.closingBracketRange=n,this.nestingLevel=r,this.nestingLevelOfEqualBracketType=i,this.bracketPairNode=s}get openingBracketInfo(){return this.bracketPairNode.openingBracket.bracketInfo}}class me extends pe{constructor(e,t,n,r,i,s,o){super(e,t,n,r,i,s),this.minVisibleColumnIndentation=o}}var fe=n(3550);function ge(e){return 0===e}const be=2**26;function ve(e,t){return e*be+t}function ye(e){const t=e,n=Math.floor(t/be),r=t-n*be;return new fe.W(n,r)}function we(e){return e}function Ce(e,t){let n=e+t;return t>=be&&(n-=e%be),n}function _e(e,t){return e.reduce((e,n)=>Ce(e,t(n)),0)}function ke(e,t){return e===t}function xe(e,t){const n=e,r=t;if(r-n<=0)return 0;const i=Math.floor(n/be),s=Math.floor(r/be),o=r-s*be;return i===s?ve(0,o-(n-i*be)):ve(s-i,o)}function Se(e,t){return e=t}function Le(e){return ve(e.lineNumber-1,e.column-1)}function Ie(e,t){const n=e,r=Math.floor(n/be),i=n-r*be,s=t,o=Math.floor(s/be),a=s-o*be;return new m.Q(r+1,i+1,o+1,a+1)}class Te{static fromModelContentChanges(e){return e.map(e=>{const t=m.Q.lift(e.range);return new Te(Le(t.getStartPosition()),Le(t.getEndPosition()),function(e){const t=(0,c.uz)(e);return ve(t.length-1,t[t.length-1].length)}(e.text))}).reverse()}constructor(e,t,n){this.startOffset=e,this.endOffset=t,this.newLength=n}toString(){return`[${ye(this.startOffset)}...${ye(this.endOffset)}) -> ${ye(this.newLength)}`}}class Ne{constructor(e){this.nextEditIdx=0,this.deltaOldToNewLineCount=0,this.deltaOldToNewColumnCount=0,this.deltaLineIdxInOld=-1,this.edits=e.map(e=>Re.from(e))}getOffsetBeforeChange(e){return this.adjustNextEdit(e),this.translateCurToOld(e)}getDistanceToNextChange(e){this.adjustNextEdit(e);const t=this.edits[this.nextEditIdx],n=t?this.translateOldToCur(t.offsetObj):null;return null===n?null:xe(e,n)}translateOldToCur(e){return e.lineCount===this.deltaLineIdxInOld?ve(e.lineCount+this.deltaOldToNewLineCount,e.columnCount+this.deltaOldToNewColumnCount):ve(e.lineCount+this.deltaOldToNewLineCount,e.columnCount)}translateCurToOld(e){const t=ye(e);return t.lineCount-this.deltaOldToNewLineCount===this.deltaLineIdxInOld?ve(t.lineCount-this.deltaOldToNewLineCount,t.columnCount-this.deltaOldToNewColumnCount):ve(t.lineCount-this.deltaOldToNewLineCount,t.columnCount)}adjustNextEdit(e){for(;this.nextEditIdx>5;if(0===r){const e=1<e};class Oe{constructor(){this.items=new Map}getKey(e){let t=this.items.get(e);return void 0===t&&(t=this.items.size,this.items.set(e,t)),t}}class ze{get length(){return this._length}constructor(e){this._length=e}}class Pe extends ze{static create(e,t,n){let r=e.length;return t&&(r=Ce(r,t.length)),n&&(r=Ce(r,n.length)),new Pe(r,e,t,n,t?t.missingOpeningBracketIds:Ae.getEmpty())}get kind(){return 2}get listHeight(){return 0}get childrenLength(){return 3}getChild(e){switch(e){case 0:return this.openingBracket;case 1:return this.child;case 2:return this.closingBracket}throw new Error("Invalid child index")}get children(){const e=[];return e.push(this.openingBracket),this.child&&e.push(this.child),this.closingBracket&&e.push(this.closingBracket),e}constructor(e,t,n,r,i){super(e),this.openingBracket=t,this.child=n,this.closingBracket=r,this.missingOpeningBracketIds=i}canBeReused(e){return null!==this.closingBracket&&!e.intersects(this.missingOpeningBracketIds)}deepClone(){return new Pe(this.length,this.openingBracket.deepClone(),this.child&&this.child.deepClone(),this.closingBracket&&this.closingBracket.deepClone(),this.missingOpeningBracketIds)}computeMinIndentation(e,t){return this.child?this.child.computeMinIndentation(Ce(e,this.openingBracket.length),t):Number.MAX_SAFE_INTEGER}}class Be extends ze{static create23(e,t,n,r=!1){let i=e.length,s=e.missingOpeningBracketIds;if(e.listHeight!==t.listHeight)throw new Error("Invalid list heights");if(i=Ce(i,t.length),s=s.merge(t.missingOpeningBracketIds),n){if(e.listHeight!==n.listHeight)throw new Error("Invalid list heights");i=Ce(i,n.length),s=s.merge(n.missingOpeningBracketIds)}return r?new Ve(i,e.listHeight+1,e,t,n,s):new We(i,e.listHeight+1,e,t,n,s)}static getEmpty(){return new $e(0,0,[],Ae.getEmpty())}get kind(){return 4}get missingOpeningBracketIds(){return this._missingOpeningBracketIds}constructor(e,t,n){super(e),this.listHeight=t,this._missingOpeningBracketIds=n,this.cachedMinIndentation=-1}throwIfImmutable(){}makeLastElementMutable(){this.throwIfImmutable();const e=this.childrenLength;if(0===e)return;const t=this.getChild(e-1),n=4===t.kind?t.toMutable():t;return t!==n&&this.setChild(e-1,n),n}makeFirstElementMutable(){if(this.throwIfImmutable(),0===this.childrenLength)return;const e=this.getChild(0),t=4===e.kind?e.toMutable():e;return e!==t&&this.setChild(0,t),t}canBeReused(e){if(e.intersects(this.missingOpeningBracketIds))return!1;if(0===this.childrenLength)return!1;let t=this;for(;4===t.kind;){const e=t.childrenLength;if(0===e)throw new l.D7;t=t.getChild(e-1)}return t.canBeReused(e)}handleChildrenChanged(){this.throwIfImmutable();const e=this.childrenLength;let t=this.getChild(0).length,n=this.getChild(0).missingOpeningBracketIds;for(let r=1;rthis.textBufferLineCount-1||this.lineIdx===this.textBufferLineCount-1&&this.lineCharOffset>=this.textBufferLastLineLength)return null;null===this.line&&(this.lineTokens=this.textModel.tokenization.getLineTokens(this.lineIdx+1),this.line=this.lineTokens.getLineContent(),this.lineTokenOffset=0===this.lineCharOffset?0:this.lineTokens.findTokenIndexAtOffset(this.lineCharOffset));const e=this.lineIdx,t=this.lineCharOffset;let n=0;for(;;){const r=this.lineTokens,i=r.getCount();let s=null;if(this.lineTokenOffset1e3)break}if(n>1500)break}const r=(i=e,s=t,o=this.lineIdx,a=this.lineCharOffset,i!==o?ve(o-i,a):ve(0,a-s));var i,s,o,a;return new Je(r,0,-1,Ae.getEmpty(),new Ke(r))}}class Ze{constructor(e,t){this.text=e,this._offset=0,this.idx=0;const n=t.getRegExpStr(),r=n?new RegExp(n+"|\n","gi"):null,i=[];let s,o=0,a=0,l=0,c=0;const h=[];for(let e=0;e<60;e++)h.push(new Je(ve(0,e),0,-1,Ae.getEmpty(),new Ke(ve(0,e))));const d=[];for(let e=0;e<60;e++)d.push(new Je(ve(1,e),0,-1,Ae.getEmpty(),new Ke(ve(1,e))));if(r)for(r.lastIndex=0;null!==(s=r.exec(e));){const e=s.index,n=s[0];if("\n"===n)o++,a=e+1;else{if(l!==e){let t;if(c===o){const n=e-l;if(nfunction(e){let t=(0,c.bm)(e);return/^[\w ]+/.test(e)&&(t=`\\b${t}`),/[\w ]+$/.test(e)&&(t=`${t}\\b`),t}(e)).join("|")}}get regExpGlobal(){if(!this.hasRegExp){const e=this.getRegExpStr();this._regExpGlobal=e?new RegExp(e,"gi"):null,this.hasRegExp=!0}return this._regExpGlobal}getToken(e){return this.map.get(e.toLowerCase())}findClosingTokenText(e){for(const[t,n]of this.map)if(2===n.kind&&n.bracketIds.intersects(e))return t}get isEmpty(){return 0===this.map.size}}class tt{constructor(e,t){this.denseKeyProvider=e,this.getLanguageConfiguration=t,this.languageIdToBracketTokens=new Map}didLanguageChange(e){return this.languageIdToBracketTokens.has(e)}getSingleLanguageBracketTokens(e){let t=this.languageIdToBracketTokens.get(e);return t||(t=et.createFromLanguage(this.getLanguageConfiguration(e),this.denseKeyProvider),this.languageIdToBracketTokens.set(e,t)),t}}function nt(e,t=!1){if(0===e.length)return null;if(1===e.length)return e[0];let n=e.length;for(;n>3;){const r=n>>1;for(let i=0;i=3?e[2]:null,t)}function rt(e,t){return Math.abs(e.listHeight-t.listHeight)}function it(e,t){return e.listHeight===t.listHeight?Be.create23(e,t,null,!1):e.listHeight>t.listHeight?function(e,t){let n=e=e.toMutable();const r=[];let i;for(;;){if(t.listHeight===n.listHeight){i=t;break}if(4!==n.kind)throw new Error("unexpected");r.push(n),n=n.makeLastElementMutable()}for(let e=r.length-1;e>=0;e--){const t=r[e];i?t.childrenLength>=3?i=Be.create23(t.unappendChild(),i,null,!1):(t.appendChildOfSameHeight(i),i=void 0):t.handleChildrenChanged()}return i?Be.create23(e,i,null,!1):e}(e,t):function(e,t){let n=e=e.toMutable();const r=[];for(;t.listHeight!==n.listHeight;){if(4!==n.kind)throw new Error("unexpected");r.push(n),n=n.makeFirstElementMutable()}let i=t;for(let e=r.length-1;e>=0;e--){const t=r[e];i?t.childrenLength>=3?i=Be.create23(i,t.unprependChild(),null,!1):(t.prependChildOfSameHeight(i),i=void 0):t.handleChildrenChanged()}return i?Be.create23(i,e,null,!1):e}(t,e)}class st{constructor(e){this.lastOffset=0,this.nextNodes=[e],this.offsets=[0],this.idxs=[]}readLongestNodeAt(e,t){if(Se(e,this.lastOffset))throw new Error("Invalid offset");for(this.lastOffset=e;;){const n=at(this.nextNodes);if(!n)return;const r=at(this.offsets);if(Se(e,r))return;if(Se(r,e))if(Ce(r,n.length)<=e)this.nextNodeAfterCurrent();else{const e=ot(n);-1!==e?(this.nextNodes.push(n.getChild(e)),this.offsets.push(r),this.idxs.push(e)):this.nextNodeAfterCurrent()}else{if(t(n))return this.nextNodeAfterCurrent(),n;{const e=ot(n);if(-1===e)return void this.nextNodeAfterCurrent();this.nextNodes.push(n.getChild(e)),this.offsets.push(r),this.idxs.push(e)}}}}nextNodeAfterCurrent(){for(;;){const e=at(this.offsets),t=at(this.nextNodes);if(this.nextNodes.pop(),this.offsets.pop(),0===this.idxs.length)break;const n=at(this.nextNodes),r=ot(n,this.idxs[this.idxs.length-1]);if(-1!==r){this.nextNodes.push(n.getChild(r)),this.offsets.push(Ce(e,t.length)),this.idxs[this.idxs.length-1]=r;break}this.idxs.pop()}}}function ot(e,t=-1){for(;;){if(++t>=e.childrenLength)return-1;if(e.getChild(t))return t}}function at(e){return e.length>0?e[e.length-1]:void 0}function lt(e,t,n,r){return new ct(e,t,n,r).parseDocument()}class ct{constructor(e,t,n,r){if(this.tokenizer=e,this.createImmutableLists=r,this._itemsConstructed=0,this._itemsFromCache=0,n&&r)throw new Error("Not supported");this.oldNodeReader=n?new st(n):void 0,this.positionMapper=new Ne(t)}parseDocument(){this._itemsConstructed=0,this._itemsFromCache=0;let e=this.parseList(Ae.getEmpty(),0);return e||(e=Be.getEmpty()),e}parseList(e,t){const n=[];for(;;){let r=this.tryReadChildFromCache(e);if(!r){const n=this.tokenizer.peek();if(!n||2===n.kind&&n.bracketIds.intersects(e))break;r=this.parseChild(e,t+1)}4===r.kind&&0===r.childrenLength||n.push(r)}const r=this.oldNodeReader?function(e){if(0===e.length)return null;if(1===e.length)return e[0];let t=0;function n(){if(t>=e.length)return null;const n=t,r=e[n].listHeight;for(t++;t=2?nt(0===n&&t===e.length?e:e.slice(n,t),!1):e[n]}let r=n(),i=n();if(!i)return r;for(let e=n();e;e=n())rt(r,i)<=rt(i,e)?(r=it(r,i),i=e):i=it(i,e);return it(r,i)}(n):nt(n,this.createImmutableLists);return r}tryReadChildFromCache(e){if(this.oldNodeReader){const t=this.positionMapper.getDistanceToNextChange(this.tokenizer.offset);if(null===t||!ge(t)){const n=this.oldNodeReader.readLongestNodeAt(this.positionMapper.getOffsetBeforeChange(this.tokenizer.offset),n=>!(null!==t&&!Se(n.length,t))&&n.canBeReused(e));if(n)return this._itemsFromCache++,this.tokenizer.skip(n.length),n}}}parseChild(e,t){this._itemsConstructed++;const n=this.tokenizer.read();switch(n.kind){case 2:return new Ge(n.bracketIds,n.length);case 0:return n.astNode;case 1:{if(t>300)return new Ke(n.length);const r=e.merge(n.bracketIds),i=this.parseList(r,t+1),s=this.tokenizer.peek();return s&&2===s.kind&&(s.bracketId===n.bracketId||s.bracketIds.intersects(n.bracketIds))?(this.tokenizer.read(),Pe.create(n.astNode,i,s.astNode)):Pe.create(n.astNode,i,null)}default:throw new Error("unexpected")}}}function ht(e,t){if(0===e.length)return t;if(0===t.length)return e;const n=new o.j3(ut(e)),r=ut(t);r.push({modified:!1,lengthBefore:void 0,lengthAfter:void 0});let i=n.dequeue();function s(e){if(void 0===e){const e=n.takeWhile(e=>!0)||[];return i&&e.unshift(i),e}const t=[];for(;i&&!ge(e);){const[r,s]=i.splitAt(e);t.push(r),e=xe(r.lengthAfter,e),i=s??n.dequeue()}return ge(e)||t.push(new dt(!1,e,e)),t}const a=[];function l(e,t,n){if(a.length>0&&ke(a[a.length-1].endOffset,e)){const e=a[a.length-1];a[a.length-1]=new Te(e.startOffset,t,Ce(e.newLength,n))}else a.push({startOffset:e,endOffset:t,newLength:n})}let c=0;for(const e of r){const t=s(e.lengthBefore);if(e.modified){const n=Ce(c,_e(t,e=>e.lengthBefore));l(c,n,e.lengthAfter),c=n}else for(const e of t){const t=c;c=Ce(c,e.lengthBefore),e.modified&&l(t,c,e.lengthAfter)}}return a}class dt{constructor(e,t,n){this.modified=e,this.lengthBefore=t,this.lengthAfter=n}splitAt(e){const t=xe(e,this.lengthAfter);return ke(t,0)?[this,void 0]:this.modified?[new dt(this.modified,this.lengthBefore,e),new dt(this.modified,0,t)]:[new dt(this.modified,e,e),new dt(this.modified,t,t)]}toString(){return`${this.modified?"M":"U"}:${ye(this.lengthBefore)} -> ${ye(this.lengthAfter)}`}}function ut(e){const t=[];let n=0;for(const r of e){const e=xe(n,r.startOffset);ge(e)||t.push(new dt(!1,e,e));const i=xe(r.startOffset,r.endOffset);t.push(new dt(!0,i,r.newLength)),n=r.endOffset}return t}class pt extends i.jG{didLanguageChange(e){return this.brackets.didLanguageChange(e)}constructor(e,t){if(super(),this.textModel=e,this.getLanguageConfiguration=t,this.didChangeEmitter=new r.vl,this.denseKeyProvider=new Oe,this.brackets=new tt(this.denseKeyProvider,this.getLanguageConfiguration),this.onDidChange=this.didChangeEmitter.event,this.queuedTextEditsForInitialAstWithoutTokens=[],this.queuedTextEdits=[],e.tokenization.hasTokens)2===e.tokenization.backgroundTokenizationState?(this.initialAstWithoutTokens=void 0,this.astWithTokens=this.parseDocumentFromTextBuffer([],void 0,!1)):(this.initialAstWithoutTokens=this.parseDocumentFromTextBuffer([],void 0,!0),this.astWithTokens=this.initialAstWithoutTokens);else{const e=this.brackets.getSingleLanguageBracketTokens(this.textModel.getLanguageId()),t=new Ze(this.textModel.getValue(),e);this.initialAstWithoutTokens=lt(t,[],void 0,!0),this.astWithTokens=this.initialAstWithoutTokens}}handleDidChangeBackgroundTokenizationState(){if(2===this.textModel.tokenization.backgroundTokenizationState){const e=void 0===this.initialAstWithoutTokens;this.initialAstWithoutTokens=void 0,e||this.didChangeEmitter.fire()}}handleDidChangeTokens({ranges:e}){const t=e.map(e=>new Te(ve(e.fromLineNumber-1,0),ve(e.toLineNumber,0),ve(e.toLineNumber-e.fromLineNumber+1,0)));this.handleEdits(t,!0),this.initialAstWithoutTokens||this.didChangeEmitter.fire()}handleContentChanged(e){const t=Te.fromModelContentChanges(e.changes);this.handleEdits(t,!1)}handleEdits(e,t){const n=ht(this.queuedTextEdits,e);this.queuedTextEdits=n,this.initialAstWithoutTokens&&!t&&(this.queuedTextEditsForInitialAstWithoutTokens=ht(this.queuedTextEditsForInitialAstWithoutTokens,e))}flushQueue(){this.queuedTextEdits.length>0&&(this.astWithTokens=this.parseDocumentFromTextBuffer(this.queuedTextEdits,this.astWithTokens,!1),this.queuedTextEdits=[]),this.queuedTextEditsForInitialAstWithoutTokens.length>0&&(this.initialAstWithoutTokens&&(this.initialAstWithoutTokens=this.parseDocumentFromTextBuffer(this.queuedTextEditsForInitialAstWithoutTokens,this.initialAstWithoutTokens,!1)),this.queuedTextEditsForInitialAstWithoutTokens=[])}parseDocumentFromTextBuffer(e,t,n){const r=t;return lt(new Ye(this.textModel,this.brackets),e,r,n)}getBracketsInRange(e,t){this.flushQueue();const n=ve(e.startLineNumber-1,e.startColumn-1),r=ve(e.endLineNumber-1,e.endColumn-1);return new o.c1(e=>{const i=this.initialAstWithoutTokens||this.astWithTokens;gt(i,0,i.length,n,r,e,0,0,new Map,t)})}getBracketPairsInRange(e,t){this.flushQueue();const n=Le(e.getStartPosition()),r=Le(e.getEndPosition());return new o.c1(e=>{const i=this.initialAstWithoutTokens||this.astWithTokens,s=new bt(e,t,this.textModel);vt(i,0,i.length,n,r,s,0,new Map)})}getFirstBracketAfter(e){this.flushQueue();const t=this.initialAstWithoutTokens||this.astWithTokens;return ft(t,0,t.length,Le(e))}getFirstBracketBefore(e){this.flushQueue();const t=this.initialAstWithoutTokens||this.astWithTokens;return mt(t,0,t.length,Le(e))}}function mt(e,t,n,r){if(4===e.kind||2===e.kind){const i=[];for(const r of e.children)n=Ce(t,r.length),i.push({nodeOffsetStart:t,nodeOffsetEnd:n}),t=n;for(let t=i.length-1;t>=0;t--){const{nodeOffsetStart:n,nodeOffsetEnd:s}=i[t];if(Se(n,r)){const i=mt(e.children[t],n,s,r);if(i)return i}}return null}if(3===e.kind)return null;if(1===e.kind){const r=Ie(t,n);return{bracketInfo:e.bracketInfo,range:r}}return null}function ft(e,t,n,r){if(4===e.kind||2===e.kind){for(const i of e.children){if(Se(r,n=Ce(t,i.length))){const e=ft(i,t,n,r);if(e)return e}t=n}return null}if(3===e.kind)return null;if(1===e.kind){const r=Ie(t,n);return{bracketInfo:e.bracketInfo,range:r}}return null}function gt(e,t,n,r,i,s,o,a,l,c,h=!1){if(o>200)return!0;e:for(;;)switch(e.kind){case 4:{const a=e.childrenLength;for(let h=0;h200)return!0;let l=!0;if(2===e.kind){let c=0;if(a){let t=a.get(e.openingBracket.text);void 0===t&&(t=0),c=t,t++,a.set(e.openingBracket.text,t)}const h=Ce(t,e.openingBracket.length);let d=-1;if(s.includeMinIndentation&&(d=e.computeMinIndentation(t,s.textModel)),l=s.push(new me(Ie(t,n),Ie(t,h),e.closingBracket?Ie(Ce(h,e.child?.length||0),n):void 0,o,c,e,d)),t=h,l&&e.child){const c=e.child;if(n=Ce(t,c.length),Ee(t,i)&&Fe(n,r)&&(l=vt(c,t,n,r,i,s,o+1,a),!l))return!1}a?.set(e.openingBracket.text,c)}else{let n=t;for(const t of e.children){const e=n;if(n=Ce(n,t.length),Ee(e,i)&&Ee(r,n)&&(l=vt(t,e,n,r,i,s,o,a),!l))return!1}}return l}class yt extends i.jG{get canBuildAST(){return this.textModel.getValueLength()<=5e6}constructor(e,t){super(),this.textModel=e,this.languageConfigurationService=t,this.bracketPairsTree=this._register(new i.HE),this.onDidChangeEmitter=new r.vl,this.onDidChange=this.onDidChangeEmitter.event,this.bracketsRequested=!1}handleLanguageConfigurationServiceChange(e){e.languageId&&!this.bracketPairsTree.value?.object.didLanguageChange(e.languageId)||(this.bracketPairsTree.clear(),this.updateBracketPairsTree())}handleDidChangeOptions(e){this.bracketPairsTree.clear(),this.updateBracketPairsTree()}handleDidChangeLanguage(e){this.bracketPairsTree.clear(),this.updateBracketPairsTree()}handleDidChangeContent(e){this.bracketPairsTree.value?.object.handleContentChanged(e)}handleDidChangeBackgroundTokenizationState(){this.bracketPairsTree.value?.object.handleDidChangeBackgroundTokenizationState()}handleDidChangeTokens(e){this.bracketPairsTree.value?.object.handleDidChangeTokens(e)}updateBracketPairsTree(){if(this.bracketsRequested&&this.canBuildAST){if(!this.bracketPairsTree.value){const n=new i.Cm;this.bracketPairsTree.value=(e=n.add(new pt(this.textModel,e=>this.languageConfigurationService.getLanguageConfiguration(e))),t=n,{object:e,dispose:()=>t?.dispose()}),n.add(this.bracketPairsTree.value.object.onDidChange(e=>this.onDidChangeEmitter.fire(e))),this.onDidChangeEmitter.fire()}}else this.bracketPairsTree.value&&(this.bracketPairsTree.clear(),this.onDidChangeEmitter.fire());var e,t}getBracketPairsInRange(e){return this.bracketsRequested=!0,this.updateBracketPairsTree(),this.bracketPairsTree.value?.object.getBracketPairsInRange(e,!1)||o.c1.empty}getBracketPairsInRangeWithMinIndentation(e){return this.bracketsRequested=!0,this.updateBracketPairsTree(),this.bracketPairsTree.value?.object.getBracketPairsInRange(e,!0)||o.c1.empty}getBracketsInRange(e,t=!1){return this.bracketsRequested=!0,this.updateBracketPairsTree(),this.bracketPairsTree.value?.object.getBracketsInRange(e,t)||o.c1.empty}findMatchingBracketUp(e,t,n){const r=this.textModel.validatePosition(t),i=this.textModel.getLanguageIdAtPosition(r.lineNumber,r.column);if(this.canBuildAST){const n=this.languageConfigurationService.getLanguageConfiguration(i).bracketsNew.getClosingBracketInfo(e);if(!n)return null;const r=this.getBracketPairsInRange(m.Q.fromPositions(t,t)).findLast(e=>n.closes(e.openingBracketInfo));return r?r.openingBracketRange:null}{const t=e.toLowerCase(),s=this.languageConfigurationService.getLanguageConfiguration(i).brackets;if(!s)return null;const o=s.textIsBracket[t];return o?_t(this._findMatchingBracketUp(o,r,wt(n))):null}}matchBracket(e,t){if(this.canBuildAST){const t=this.getBracketPairsInRange(m.Q.fromPositions(e,e)).filter(t=>void 0!==t.closingBracketRange&&(t.openingBracketRange.containsPosition(e)||t.closingBracketRange.containsPosition(e))).findLastMaxBy((0,o.VE)(t=>t.openingBracketRange.containsPosition(e)?t.openingBracketRange:t.closingBracketRange,m.Q.compareRangesUsingStarts));return t?[t.openingBracketRange,t.closingBracketRange]:null}{const n=wt(t);return this._matchBracket(this.textModel.validatePosition(e),n)}}_establishBracketSearchOffsets(e,t,n,r){const i=t.getCount(),s=t.getLanguageId(r);let o=Math.max(0,e.column-1-n.maxBracketLength);for(let e=r-1;e>=0;e--){const n=t.getEndOffset(e);if(n<=o)break;if(x(t.getStandardTokenType(e))||t.getLanguageId(e)!==s){o=n;break}}let a=Math.min(t.getLineContent().length,e.column-1+n.maxBracketLength);for(let e=r+1;e=a)break;if(x(t.getStandardTokenType(e))||t.getLanguageId(e)!==s){a=n;break}}return{searchStartOffset:o,searchEndOffset:a}}_matchBracket(e,t){const n=e.lineNumber,r=this.textModel.tokenization.getLineTokens(n),i=this.textModel.getLineContent(n),s=r.findTokenIndexAtOffset(e.column-1);if(s<0)return null;const o=this.languageConfigurationService.getLanguageConfiguration(r.getLanguageId(s)).brackets;if(o&&!x(r.getStandardTokenType(s))){let{searchStartOffset:a,searchEndOffset:l}=this._establishBracketSearchOffsets(e,r,o,s),c=null;for(;;){const r=P.findNextBracketInRange(o.forwardRegex,n,i,a,l);if(!r)break;if(r.startColumn<=e.column&&e.column<=r.endColumn){const e=i.substring(r.startColumn-1,r.endColumn-1).toLowerCase(),n=this._matchFoundBracket(r,o.textIsBracket[e],o.textIsOpenBracket[e],t);if(n){if(n instanceof Ct)return null;c=n}}a=r.endColumn-1}if(c)return c}if(s>0&&r.getStartOffset(s)===e.column-1){const o=s-1,a=this.languageConfigurationService.getLanguageConfiguration(r.getLanguageId(o)).brackets;if(a&&!x(r.getStandardTokenType(o))){const{searchStartOffset:s,searchEndOffset:l}=this._establishBracketSearchOffsets(e,r,a,o),c=P.findPrevBracketInRange(a.reversedRegex,n,i,s,l);if(c&&c.startColumn<=e.column&&e.column<=c.endColumn){const e=i.substring(c.startColumn-1,c.endColumn-1).toLowerCase(),n=this._matchFoundBracket(c,a.textIsBracket[e],a.textIsOpenBracket[e],t);if(n)return n instanceof Ct?null:n}}}return null}_matchFoundBracket(e,t,n,r){if(!t)return null;const i=n?this._findMatchingBracketDown(t,e.getEndPosition(),r):this._findMatchingBracketUp(t,e.getStartPosition(),r);return i?i instanceof Ct?i:[e,i]:null}_findMatchingBracketUp(e,t,n){const r=e.languageId,i=e.reversedRegex;let s=-1,o=0;const a=(t,r,a,l)=>{for(;;){if(n&&++o%100==0&&!n())return Ct.INSTANCE;const c=P.findPrevBracketInRange(i,t,r,a,l);if(!c)break;const h=r.substring(c.startColumn-1,c.endColumn-1).toLowerCase();if(e.isOpen(h)?s++:e.isClose(h)&&s--,0===s)return c;l=c.startColumn-1}return null};for(let e=t.lineNumber;e>=1;e--){const n=this.textModel.tokenization.getLineTokens(e),i=n.getCount(),s=this.textModel.getLineContent(e);let o=i-1,l=s.length,c=s.length;e===t.lineNumber&&(o=n.findTokenIndexAtOffset(t.column-1),l=t.column-1,c=t.column-1);let h=!0;for(;o>=0;o--){const t=n.getLanguageId(o)===r&&!x(n.getStandardTokenType(o));if(t)h?l=n.getStartOffset(o):(l=n.getStartOffset(o),c=n.getEndOffset(o));else if(h&&l!==c){const t=a(e,s,l,c);if(t)return t}h=t}if(h&&l!==c){const t=a(e,s,l,c);if(t)return t}}return null}_findMatchingBracketDown(e,t,n){const r=e.languageId,i=e.forwardRegex;let s=1,o=0;const a=(t,r,a,l)=>{for(;;){if(n&&++o%100==0&&!n())return Ct.INSTANCE;const c=P.findNextBracketInRange(i,t,r,a,l);if(!c)break;const h=r.substring(c.startColumn-1,c.endColumn-1).toLowerCase();if(e.isOpen(h)?s++:e.isClose(h)&&s--,0===s)return c;a=c.endColumn-1}return null},l=this.textModel.getLineCount();for(let e=t.lineNumber;e<=l;e++){const n=this.textModel.tokenization.getLineTokens(e),i=n.getCount(),s=this.textModel.getLineContent(e);let o=0,l=0,c=0;e===t.lineNumber&&(o=n.findTokenIndexAtOffset(t.column-1),l=t.column-1,c=t.column-1);let h=!0;for(;o=1;e--){const s=this.textModel.tokenization.getLineTokens(e),o=s.getCount(),a=this.textModel.getLineContent(e);let l=o-1,c=a.length,h=a.length;if(e===t.lineNumber){l=s.findTokenIndexAtOffset(t.column-1),c=t.column-1,h=t.column-1;const e=s.getLanguageId(l);n!==e&&(n=e,r=this.languageConfigurationService.getLanguageConfiguration(n).brackets,i=this.languageConfigurationService.getLanguageConfiguration(n).bracketsNew)}let d=!0;for(;l>=0;l--){const t=s.getLanguageId(l);if(n!==t){if(r&&i&&d&&c!==h){const t=P.findPrevBracketInRange(r.reversedRegex,e,a,c,h);if(t)return this._toFoundBracket(i,t);d=!1}n=t,r=this.languageConfigurationService.getLanguageConfiguration(n).brackets,i=this.languageConfigurationService.getLanguageConfiguration(n).bracketsNew}const o=!!r&&!x(s.getStandardTokenType(l));if(o)d?c=s.getStartOffset(l):(c=s.getStartOffset(l),h=s.getEndOffset(l));else if(i&&r&&d&&c!==h){const t=P.findPrevBracketInRange(r.reversedRegex,e,a,c,h);if(t)return this._toFoundBracket(i,t)}d=o}if(i&&r&&d&&c!==h){const t=P.findPrevBracketInRange(r.reversedRegex,e,a,c,h);if(t)return this._toFoundBracket(i,t)}}return null}findNextBracket(e){const t=this.textModel.validatePosition(e);if(this.canBuildAST)return this.bracketsRequested=!0,this.updateBracketPairsTree(),this.bracketPairsTree.value?.object.getFirstBracketAfter(t)||null;const n=this.textModel.getLineCount();let r=null,i=null,s=null;for(let e=t.lineNumber;e<=n;e++){const n=this.textModel.tokenization.getLineTokens(e),o=n.getCount(),a=this.textModel.getLineContent(e);let l=0,c=0,h=0;if(e===t.lineNumber){l=n.findTokenIndexAtOffset(t.column-1),c=t.column-1,h=t.column-1;const e=n.getLanguageId(l);r!==e&&(r=e,i=this.languageConfigurationService.getLanguageConfiguration(r).brackets,s=this.languageConfigurationService.getLanguageConfiguration(r).bracketsNew)}let d=!0;for(;lvoid 0!==t.closingBracketRange&&t.range.strictContainsRange(e));return t?[t.openingBracketRange,t.closingBracketRange]:null}const r=wt(t),i=this.textModel.getLineCount(),s=new Map;let o=[];const a=(e,t)=>{if(!s.has(e)){const n=[];for(let e=0,r=t?t.brackets.length:0;e{for(;;){if(r&&++l%100==0&&!r())return Ct.INSTANCE;const a=P.findNextBracketInRange(e.forwardRegex,t,n,i,s);if(!a)break;const c=n.substring(a.startColumn-1,a.endColumn-1).toLowerCase(),h=e.textIsBracket[c];if(h&&(h.isOpen(c)?o[h.index]++:h.isClose(c)&&o[h.index]--,-1===o[h.index]))return this._matchFoundBracket(a,h,!1,r);i=a.endColumn-1}return null};let h=null,d=null;for(let e=n.lineNumber;e<=i;e++){const t=this.textModel.tokenization.getLineTokens(e),r=t.getCount(),i=this.textModel.getLineContent(e);let s=0,o=0,l=0;if(e===n.lineNumber){s=t.findTokenIndexAtOffset(n.column-1),o=n.column-1,l=n.column-1;const e=t.getLanguageId(s);h!==e&&(h=e,d=this.languageConfigurationService.getLanguageConfiguration(h).brackets,a(h,d))}let u=!0;for(;s!0;{const t=Date.now();return()=>Date.now()-t<=e}}class Ct{static{this.INSTANCE=new Ct}constructor(){this._searchCanceledBrand=void 0}}function _t(e){return e instanceof Ct?null:e}var kt=n(550),xt=n(6996);class St extends i.jG{constructor(e){super(),this.textModel=e,this.colorProvider=new Et,this.onDidChangeEmitter=new r.vl,this.onDidChange=this.onDidChangeEmitter.event,this.colorizationOptions=e.getOptions().bracketPairColorizationOptions,this._register(e.bracketPairs.onDidChange(e=>{this.onDidChangeEmitter.fire()}))}handleDidChangeOptions(e){this.colorizationOptions=this.textModel.getOptions().bracketPairColorizationOptions}getDecorationsInRange(e,t,n,r){return r||void 0===t?[]:this.colorizationOptions.enabled?this.textModel.bracketPairs.getBracketsInRange(e,!0).map(e=>({id:`bracket${e.range.toString()}-${e.nestingLevel}`,options:{description:"BracketPairColorization",inlineClassName:this.colorProvider.getInlineClassName(e,this.colorizationOptions.independentColorPoolPerBracketType)},ownerId:0,range:e.range})).toArray():[]}getAllDecorations(e,t){return void 0===e?[]:this.colorizationOptions.enabled?this.getDecorationsInRange(new m.Q(1,1,this.textModel.getLineCount(),1),e,t):[]}}class Et{constructor(){this.unexpectedClosingBracketClassName="unexpected-closing-bracket"}getInlineClassName(e,t){return e.isInvalid?this.unexpectedClosingBracketClassName:this.getInlineClassNameOfLevel(t?e.nestingLevelOfEqualBracketType:e.nestingLevel)}getInlineClassNameOfLevel(e){return"bracket-highlighting-"+e%30}}(0,xt.zy)((e,t)=>{const n=[kt.sN,kt.lQ,kt.ss,kt.l5,kt.sH,kt.zp],r=new Et;t.addRule(`.monaco-editor .${r.unexpectedClosingBracketClassName} { color: ${e.getColor(kt.s7)}; }`);const i=n.map(t=>e.getColor(t)).filter(e=>!!e).filter(e=>!e.isTransparent());for(let e=0;e<30;e++){const n=i[e%i.length];t.addRule(`.monaco-editor .${r.getInlineClassNameOfLevel(e)} { color: ${n}; }`)}});var Ft=n(7703);function Lt(e){return e.replace(/\n/g,"\\n").replace(/\r/g,"\\r")}class It{get oldLength(){return this.oldText.length}get oldEnd(){return this.oldPosition+this.oldText.length}get newLength(){return this.newText.length}get newEnd(){return this.newPosition+this.newText.length}constructor(e,t,n,r){this.oldPosition=e,this.oldText=t,this.newPosition=n,this.newText=r}toString(){return 0===this.oldText.length?`(insert@${this.oldPosition} "${Lt(this.newText)}")`:0===this.newText.length?`(delete@${this.oldPosition} "${Lt(this.oldText)}")`:`(replace@${this.oldPosition} "${Lt(this.oldText)}" with "${Lt(this.newText)}")`}static _writeStringSize(e){return 4+2*e.length}static _writeString(e,t,n){const r=t.length;S.Sw(e,r,n),n+=4;for(let i=0;i0&&(65279===r[0]||65534===r[0])?function(e,t,n){const r=[];let i=0;for(let s=0;s0&&(this.changes=(o=t,null===(s=this.changes)||0===s.length?o:new Tt(s,o).compress())),this.afterEOL=n,this.afterVersionId=r,this.afterCursorState=i}static _writeSelectionsSize(e){return 4+16*(e?e.length:0)}static _writeSelections(e,t,n){if(S.Sw(e,t?t.length:0,n),n+=4,t)for(const r of t)S.Sw(e,r.selectionStartLineNumber,n),n+=4,S.Sw(e,r.selectionStartColumn,n),n+=4,S.Sw(e,r.positionLineNumber,n),n+=4,S.Sw(e,r.positionColumn,n),n+=4;return n}static _readSelections(e,t,n){const r=S.bb(e,t);t+=4;for(let i=0;ie.toString()).join(", ")}matchesResource(e){return(h.r.isUri(this.model)?this.model:this.model.uri).toString()===e.toString()}setModel(e){this.model=e}canAppend(e){return this.model===e&&this._data instanceof Dt}append(e,t,n,r,i){this._data instanceof Dt&&this._data.append(e,t,n,r,i)}close(){this._data instanceof Dt&&(this._data=this._data.serialize())}open(){this._data instanceof Dt||(this._data=Dt.deserialize(this._data))}undo(){if(h.r.isUri(this.model))throw new Error("Invalid SingleModelEditStackElement");this._data instanceof Dt&&(this._data=this._data.serialize());const e=Dt.deserialize(this._data);this.model._applyUndo(e.changes,e.beforeEOL,e.beforeVersionId,e.beforeCursorState)}redo(){if(h.r.isUri(this.model))throw new Error("Invalid SingleModelEditStackElement");this._data instanceof Dt&&(this._data=this._data.serialize());const e=Dt.deserialize(this._data);this.model._applyRedo(e.changes,e.afterEOL,e.afterVersionId,e.afterCursorState)}heapSize(){return this._data instanceof Dt&&(this._data=this._data.serialize()),this._data.byteLength+168}}class Mt{get resources(){return this._editStackElementsArr.map(e=>e.resource)}constructor(e,t,n){this.label=e,this.code=t,this.type=1,this._isOpen=!0,this._editStackElementsArr=n.slice(0),this._editStackElementsMap=new Map;for(const e of this._editStackElementsArr){const t=Rt(e.resource);this._editStackElementsMap.set(t,e)}this._delegate=null}prepareUndoRedo(){if(this._delegate)return this._delegate.prepareUndoRedo(this)}matchesResource(e){const t=Rt(e);return this._editStackElementsMap.has(t)}setModel(e){const t=Rt(h.r.isUri(e)?e:e.uri);this._editStackElementsMap.has(t)&&this._editStackElementsMap.get(t).setModel(e)}canAppend(e){if(!this._isOpen)return!1;const t=Rt(e.uri);return!!this._editStackElementsMap.has(t)&&this._editStackElementsMap.get(t).canAppend(e)}append(e,t,n,r,i){const s=Rt(e.uri);this._editStackElementsMap.get(s).append(e,t,n,r,i)}close(){this._isOpen=!1}open(){}undo(){this._isOpen=!1;for(const e of this._editStackElementsArr)e.undo()}redo(){for(const e of this._editStackElementsArr)e.redo()}heapSize(e){const t=Rt(e);return this._editStackElementsMap.has(t)?this._editStackElementsMap.get(t).heapSize():0}split(){return this._editStackElementsArr}toString(){const e=[];for(const t of this._editStackElementsArr)e.push(`${(0,Nt.P8)(t.resource)}: ${t}`);return`{${e.join(", ")}}`}}function Ot(e){return"\n"===e.getEOL()?0:1}function zt(e){return!!e&&(e instanceof At||e instanceof Mt)}class Pt{constructor(e,t){this._model=e,this._undoRedoService=t}pushStackElement(){const e=this._undoRedoService.getLastElement(this._model.uri);zt(e)&&e.close()}popStackElement(){const e=this._undoRedoService.getLastElement(this._model.uri);zt(e)&&e.open()}clear(){this._undoRedoService.removeElements(this._model.uri)}_getOrCreateEditStackElement(e,t){const n=this._undoRedoService.getLastElement(this._model.uri);if(zt(n)&&n.canAppend(this._model))return n;const r=new At(Ft.kg("vs/editor/common/model/editStack","edit","Typing"),"undoredo.textBufferEdit",this._model,e);return this._undoRedoService.pushElement(r,t),r}pushEOL(e){const t=this._getOrCreateEditStackElement(null,void 0);this._model.setEOL(e),t.append(this._model,[],Ot(this._model),this._model.getAlternativeVersionId(),null)}pushEditOperation(e,t,n,r){const i=this._getOrCreateEditStackElement(e,r),s=this._model.applyEdits(t,!0),o=Pt._computeCursorState(n,s),a=s.map((e,t)=>({index:t,textChange:e.textChange}));return a.sort((e,t)=>e.textChange.oldPosition===t.textChange.oldPosition?e.index-t.index:e.textChange.oldPosition-t.textChange.oldPosition),i.append(this._model,a.map(e=>e.textChange),Ot(this._model),this._model.getAlternativeVersionId(),o),o}static _computeCursorState(e,t){try{return e?e(t):null}catch(e){return(0,l.dz)(e),null}}}var Bt,Wt=n(8348);class Vt extends i.jG{constructor(){super(...arguments),this._isDisposed=!1}dispose(){super.dispose(),this._isDisposed=!0}assertNotDisposed(){if(this._isDisposed)throw new Error("TextModelPart is disposed!")}}!function(e){e[e.Disabled=0]="Disabled",e[e.EnabledForActive=1]="EnabledForActive",e[e.Enabled=2]="Enabled"}(Bt||(Bt={}));class Ut{constructor(e,t,n,r,i,s){if(this.visibleColumn=e,this.column=t,this.className=n,this.horizontalLine=r,this.forWrappedLinesAfterColumn=i,this.forWrappedLinesBeforeOrAtColumn=s,-1!==e==(-1!==t))throw new Error}}class $t{constructor(e,t){this.top=e,this.endColumn=t}}class qt extends Vt{constructor(e,t){super(),this.textModel=e,this.languageConfigurationService=t}getLanguageConfiguration(e){return this.languageConfigurationService.getLanguageConfiguration(e)}_computeIndentLevel(e){return function(e,t){let n=0,r=0;const i=e.length;for(;rr)throw new l.D7("Illegal value for lineNumber");const i=this.getLanguageConfiguration(this.textModel.getLanguageId()).foldingRules,s=Boolean(i&&i.offSide);let o=-2,a=-1,c=-2,h=-1;const d=e=>{if(-1!==o&&(-2===o||o>e-1)){o=-1,a=-1;for(let t=e-2;t>=0;t--){const e=this._computeIndentLevel(t);if(e>=0){o=t,a=e;break}}}if(-2===c){c=-1,h=-1;for(let t=e;t=0){c=t,h=e;break}}}};let u=-2,p=-1,m=-2,f=-1;const g=e=>{if(-2===u){u=-1,p=-1;for(let t=e-2;t>=0;t--){const e=this._computeIndentLevel(t);if(e>=0){u=t,p=e;break}}}if(-1!==m&&(-2===m||m=0){m=t,f=e;break}}}};let b=0,v=!0,y=0,w=!0,C=0,_=0;for(let i=0;v||w;i++){const o=e-i,l=e+i;i>1&&(o<1||o1&&(l>r||l>n)&&(w=!1),i>5e4&&(v=!1,w=!1);let m=-1;if(v&&o>=1){const e=this._computeIndentLevel(o-1);e>=0?(c=o-1,h=e,m=Math.ceil(e/this.textModel.getOptions().indentSize)):(d(o),m=this._getIndentLevelForWhitespaceLine(s,a,h))}let k=-1;if(w&&l<=r){const e=this._computeIndentLevel(l-1);e>=0?(u=l-1,p=e,k=Math.ceil(e/this.textModel.getOptions().indentSize)):(g(l),k=this._getIndentLevelForWhitespaceLine(s,p,f))}if(0!==i){if(1===i){if(l<=r&&k>=0&&_+1===k){v=!1,b=l,y=l,C=k;continue}if(o>=1&&m>=0&&m-1===_){w=!1,b=o,y=o,C=m;continue}if(b=e,y=e,C=_,0===C)return{startLineNumber:b,endLineNumber:y,indent:C}}v&&(m>=C?b=o:v=!1),w&&(k>=C?y=l:w=!1)}else _=m}return{startLineNumber:b,endLineNumber:y,indent:C}}getLinesBracketGuides(e,t,n,r){const i=[];for(let n=e;n<=t;n++)i.push([]);const s=this.textModel.bracketPairs.getBracketPairsInRangeWithMinIndentation(new m.Q(e,1,t,this.textModel.getLineMaxColumn(t))).toArray();let o;if(n&&s.length>0){const r=(e<=n.lineNumber&&n.lineNumber<=t?s:this.textModel.bracketPairs.getBracketPairsInRange(m.Q.fromPositions(n)).toArray()).filter(e=>m.Q.strictContainsPosition(e.range,n));o=(0,Wt.Uk)(r,e=>true)?.range}const a=this.textModel.getOptions().bracketPairColorizationOptions.independentColorPoolPerBracketType,l=new jt;for(const n of s){if(!n.closingBracketRange)continue;const s=o&&n.range.equalsRange(o);if(!s&&!r.includeInactive)continue;const h=l.getInlineClassName(n.nestingLevel,n.nestingLevelOfEqualBracketType,a)+(r.highlightActive&&s?" "+l.activeClassName:""),d=n.openingBracketRange.getStartPosition(),u=n.closingBracketRange.getStartPosition(),p=r.horizontalGuides===Bt.Enabled||r.horizontalGuides===Bt.EnabledForActive&&s;if(n.range.startLineNumber===n.range.endLineNumber){p&&i[n.range.startLineNumber-e].push(new Ut(-1,n.openingBracketRange.getEndPosition().column,h,new $t(!1,u.column),-1,-1));continue}const m=this.getVisibleColumnFromPosition(u),f=this.getVisibleColumnFromPosition(n.openingBracketRange.getStartPosition()),g=Math.min(f,m,n.minVisibleColumnIndentation+1);let b=!1;c.HG(this.textModel.getLineContent(n.closingBracketRange.startLineNumber))=e&&f>g&&i[d.lineNumber-e].push(new Ut(g,-1,h,new $t(!1,d.column),-1,-1)),u.lineNumber<=t&&m>g&&i[u.lineNumber-e].push(new Ut(g,-1,h,new $t(!b,u.column),-1,-1)))}for(const e of i)e.sort((e,t)=>e.visibleColumn-t.visibleColumn);return i}getVisibleColumnFromPosition(e){return u.visibleColumnFromColumn(this.textModel.getLineContent(e.lineNumber),e.column,this.textModel.getOptions().tabSize)+1}getLinesIndentGuides(e,t){this.assertNotDisposed();const n=this.textModel.getLineCount();if(e<1||e>n)throw new Error("Illegal value for startLineNumber");if(t<1||t>n)throw new Error("Illegal value for endLineNumber");const r=this.textModel.getOptions(),i=this.getLanguageConfiguration(this.textModel.getLanguageId()).foldingRules,s=Boolean(i&&i.offSide),o=new Array(t-e+1);let a=-2,l=-1,c=-2,h=-1;for(let i=e;i<=t;i++){const t=i-e,d=this._computeIndentLevel(i-1);if(d>=0)a=i-1,l=d,o[t]=Math.ceil(d/r.indentSize);else{if(-2===a){a=-1,l=-1;for(let e=i-2;e>=0;e--){const t=this._computeIndentLevel(e);if(t>=0){a=e,l=t;break}}}if(-1!==c&&(-2===c||c=0){c=e,h=t;break}}}o[t]=this._getIndentLevelForWhitespaceLine(s,l,h)}}return o}_getIndentLevelForWhitespaceLine(e,t,n){const r=this.textModel.getOptions();return-1===t||-1===n?0:t0&&a>0)return;if(l>0&&c>0)return;const h=Math.abs(a-c),d=Math.abs(o-l);if(0===h)return i.spacesDiff=d,void(d>0&&0<=l-1&&l-10?i++:f>1&&s++,Ht(o,a,d,m,h),h.looksLikeAlignment&&(!n||t!==h.spacesDiff))continue;const b=h.spacesDiff;b<=8&&c[b]++,o=d,a=m}let d=n;i!==s&&(d=i{const n=c[t];n>e&&(e=n,u=t)}),4===u&&c[4]>0&&c[2]>0&&c[2]>=c[4]/2&&(u=2)}return{insertSpaces:d,tabSize:u}}function Qt(e){return(1&e.metadata)>>>0}function Jt(e,t){e.metadata=254&e.metadata|t}function Yt(e){return(2&e.metadata)>>>1==1}function Xt(e,t){e.metadata=253&e.metadata|(t?1:0)<<1}function Zt(e){return(4&e.metadata)>>>2==1}function en(e,t){e.metadata=251&e.metadata|(t?1:0)<<2}function tn(e){return(64&e.metadata)>>>6==1}function nn(e,t){e.metadata=191&e.metadata|(t?1:0)<<6}function rn(e,t){e.metadata=231&e.metadata|t<<3}function sn(e,t){e.metadata=223&e.metadata|(t?1:0)<<5}class on{constructor(e,t,n){this.metadata=0,this.parent=this,this.left=this,this.right=this,Jt(this,1),this.start=t,this.end=n,this.delta=0,this.maxEnd=n,this.id=e,this.ownerId=0,this.options=null,en(this,!1),nn(this,!1),rn(this,1),sn(this,!1),this.cachedVersionId=0,this.cachedAbsoluteStart=t,this.cachedAbsoluteEnd=n,this.range=null,Xt(this,!1)}reset(e,t,n,r){this.start=t,this.end=n,this.maxEnd=n,this.cachedVersionId=e,this.cachedAbsoluteStart=t,this.cachedAbsoluteEnd=n,this.range=r}setOptions(e){this.options=e;const t=this.options.className;en(this,"squiggly-error"===t||"squiggly-warning"===t||"squiggly-info"===t),nn(this,null!==this.options.glyphMarginClassName),rn(this,this.options.stickiness),sn(this,this.options.collapseOnReplaceEdit)}setCachedOffsets(e,t,n){this.cachedVersionId!==n&&(this.range=null),this.cachedVersionId=n,this.cachedAbsoluteStart=e,this.cachedAbsoluteEnd=t}detach(){this.parent=null,this.left=null,this.right=null}}const an=new on(null,0,0);an.parent=an,an.left=an,an.right=an,Jt(an,0);class ln{constructor(){this.root=an,this.requestNormalizeDelta=!1}intervalSearch(e,t,n,r,i,s){return this.root===an?[]:function(e,t,n,r,i,s,o){let a=e.root,l=0,c=0,h=0,d=0;const u=[];let p=0;for(;a!==an;)if(Yt(a))Xt(a.left,!1),Xt(a.right,!1),a===a.parent.right&&(l-=a.parent.delta),a=a.parent;else{if(!Yt(a.left)){if(c=l+a.maxEnd,cn)Xt(a,!0);else{if(d=l+a.end,d>=t){a.setCachedOffsets(h,d,s);let e=!0;r&&a.ownerId&&a.ownerId!==r&&(e=!1),i&&Zt(a)&&(e=!1),o&&!tn(a)&&(e=!1),e&&(u[p++]=a)}Xt(a,!0),a.right===an||Yt(a.right)||(l+=a.delta,a=a.right)}}return Xt(e.root,!1),u}(this,e,t,n,r,i,s)}search(e,t,n,r){return this.root===an?[]:function(e,t,n,r,i){let s=e.root,o=0,a=0,l=0;const c=[];let h=0;for(;s!==an;){if(Yt(s)){Xt(s.left,!1),Xt(s.right,!1),s===s.parent.right&&(o-=s.parent.delta),s=s.parent;continue}if(s.left!==an&&!Yt(s.left)){s=s.left;continue}a=o+s.start,l=o+s.end,s.setCachedOffsets(a,l,r);let e=!0;t&&s.ownerId&&s.ownerId!==t&&(e=!1),n&&Zt(s)&&(e=!1),i&&!tn(s)&&(e=!1),e&&(c[h++]=s),Xt(s,!0),s.right===an||Yt(s.right)||(o+=s.delta,s=s.right)}return Xt(e.root,!1),c}(this,e,t,n,r)}collectNodesFromOwner(e){return function(e,t){let n=e.root;const r=[];let i=0;for(;n!==an;)Yt(n)?(Xt(n.left,!1),Xt(n.right,!1),n=n.parent):n.left===an||Yt(n.left)?(n.ownerId===t&&(r[i++]=n),Xt(n,!0),n.right===an||Yt(n.right)||(n=n.right)):n=n.left;return Xt(e.root,!1),r}(this,e)}collectNodesPostOrder(){return function(e){let t=e.root;const n=[];let r=0;for(;t!==an;)Yt(t)?(Xt(t.left,!1),Xt(t.right,!1),t=t.parent):t.left===an||Yt(t.left)?t.right===an||Yt(t.right)?(n[r++]=t,Xt(t,!0)):t=t.right:t=t.left;return Xt(e.root,!1),n}(this)}insert(e){dn(this,e),this._normalizeDeltaIfNecessary()}delete(e){un(this,e),this._normalizeDeltaIfNecessary()}resolveNode(e,t){const n=e;let r=0;for(;e!==this.root;)e===e.parent.right&&(r+=e.parent.delta),e=e.parent;const i=n.start+r,s=n.end+r;n.setCachedOffsets(i,s,t)}acceptReplace(e,t,n,r){const i=function(e,t,n){let r=e.root,i=0,s=0,o=0,a=0;const l=[];let c=0;for(;r!==an;)if(Yt(r))Xt(r.left,!1),Xt(r.right,!1),r===r.parent.right&&(i-=r.parent.delta),r=r.parent;else{if(!Yt(r.left)){if(s=i+r.maxEnd,sn?Xt(r,!0):(a=i+r.end,a>=t&&(r.setCachedOffsets(o,a,0),l[c++]=r),Xt(r,!0),r.right===an||Yt(r.right)||(i+=r.delta,r=r.right))}return Xt(e.root,!1),l}(this,e,e+t);for(let e=0,t=i.length;en?(i.start+=l,i.end+=l,i.delta+=l,(i.delta<-1073741824||i.delta>1073741824)&&(e.requestNormalizeDelta=!0),Xt(i,!0)):(Xt(i,!0),i.right===an||Yt(i.right)||(s+=i.delta,i=i.right))}Xt(e.root,!1)}(this,e,e+t,n),this._normalizeDeltaIfNecessary();for(let s=0,o=i.length;sn)&&1!==r&&(2===r||t)}function hn(e,t,n,r,i){const s=function(e){return(24&e.metadata)>>>3}(e),o=0===s||2===s,a=1===s||2===s,l=n-t,c=r,h=Math.min(l,c),d=e.start;let u=!1;const p=e.end;let m=!1;t<=d&&p<=n&&function(e){return(32&e.metadata)>>>5==1}(e)&&(e.start=t,u=!0,e.end=t,m=!0);{const e=i?1:l>0?2:0;!u&&cn(d,o,t,e)&&(u=!0),!m&&cn(p,a,t,e)&&(m=!0)}if(h>0&&!i){const e=l>c?2:0;!u&&cn(d,o,t+h,e)&&(u=!0),!m&&cn(p,a,t+h,e)&&(m=!0)}{const r=i?1:0;!u&&cn(d,o,n,r)&&(e.start=t+c,u=!0),!m&&cn(p,a,n,r)&&(e.end=t+c,m=!0)}const f=c-l;u||(e.start=Math.max(0,d+f)),m||(e.end=Math.max(0,p+f)),e.start>e.end&&(e.end=e.start)}function dn(e,t){if(e.root===an)return t.parent=an,t.left=an,t.right=an,Jt(t,0),e.root=t,e.root;!function(e,t){let n=0,r=e.root;const i=t.start,s=t.end;for(;;)if(yn(i,s,r.start+n,r.end+n)<0){if(r.left===an){t.start-=n,t.end-=n,t.maxEnd-=n,r.left=t;break}r=r.left}else{if(r.right===an){t.start-=n+r.delta,t.end-=n+r.delta,t.maxEnd-=n+r.delta,r.right=t;break}n+=r.delta,r=r.right}t.parent=r,t.left=an,t.right=an,Jt(t,1)}(e,t),vn(t.parent);let n=t;for(;n!==e.root&&1===Qt(n.parent);)if(n.parent===n.parent.parent.left){const t=n.parent.parent.right;1===Qt(t)?(Jt(n.parent,0),Jt(t,0),Jt(n.parent.parent,1),n=n.parent.parent):(n===n.parent.right&&(n=n.parent,mn(e,n)),Jt(n.parent,0),Jt(n.parent.parent,1),fn(e,n.parent.parent))}else{const t=n.parent.parent.left;1===Qt(t)?(Jt(n.parent,0),Jt(t,0),Jt(n.parent.parent,1),n=n.parent.parent):(n===n.parent.left&&(n=n.parent,fn(e,n)),Jt(n.parent,0),Jt(n.parent.parent,1),mn(e,n.parent.parent))}return Jt(e.root,0),t}function un(e,t){let n,r;if(t.left===an?(n=t.right,r=t,n.delta+=t.delta,(n.delta<-1073741824||n.delta>1073741824)&&(e.requestNormalizeDelta=!0),n.start+=t.delta,n.end+=t.delta):t.right===an?(n=t.left,r=t):(r=function(e){for(;e.left!==an;)e=e.left;return e}(t.right),n=r.right,n.start+=r.delta,n.end+=r.delta,n.delta+=r.delta,(n.delta<-1073741824||n.delta>1073741824)&&(e.requestNormalizeDelta=!0),r.start+=t.delta,r.end+=t.delta,r.delta=t.delta,(r.delta<-1073741824||r.delta>1073741824)&&(e.requestNormalizeDelta=!0)),r===e.root)return e.root=n,Jt(n,0),t.detach(),pn(),bn(n),void(e.root.parent=an);const i=1===Qt(r);if(r===r.parent.left?r.parent.left=n:r.parent.right=n,r===t?n.parent=r.parent:(r.parent===t?n.parent=r:n.parent=r.parent,r.left=t.left,r.right=t.right,r.parent=t.parent,Jt(r,Qt(t)),t===e.root?e.root=r:t===t.parent.left?t.parent.left=r:t.parent.right=r,r.left!==an&&(r.left.parent=r),r.right!==an&&(r.right.parent=r)),t.detach(),i)return vn(n.parent),r!==t&&(vn(r),vn(r.parent)),void pn();let s;for(vn(n),vn(n.parent),r!==t&&(vn(r),vn(r.parent));n!==e.root&&0===Qt(n);)n===n.parent.left?(s=n.parent.right,1===Qt(s)&&(Jt(s,0),Jt(n.parent,1),mn(e,n.parent),s=n.parent.right),0===Qt(s.left)&&0===Qt(s.right)?(Jt(s,1),n=n.parent):(0===Qt(s.right)&&(Jt(s.left,0),Jt(s,1),fn(e,s),s=n.parent.right),Jt(s,Qt(n.parent)),Jt(n.parent,0),Jt(s.right,0),mn(e,n.parent),n=e.root)):(s=n.parent.left,1===Qt(s)&&(Jt(s,0),Jt(n.parent,1),fn(e,n.parent),s=n.parent.left),0===Qt(s.left)&&0===Qt(s.right)?(Jt(s,1),n=n.parent):(0===Qt(s.left)&&(Jt(s.right,0),Jt(s,1),mn(e,s),s=n.parent.left),Jt(s,Qt(n.parent)),Jt(n.parent,0),Jt(s.left,0),fn(e,n.parent),n=e.root));Jt(n,0),pn()}function pn(){an.parent=an,an.delta=0,an.start=0,an.end=0}function mn(e,t){const n=t.right;n.delta+=t.delta,(n.delta<-1073741824||n.delta>1073741824)&&(e.requestNormalizeDelta=!0),n.start+=t.delta,n.end+=t.delta,t.right=n.left,n.left!==an&&(n.left.parent=t),n.parent=t.parent,t.parent===an?e.root=n:t===t.parent.left?t.parent.left=n:t.parent.right=n,n.left=t,t.parent=n,bn(t),bn(n)}function fn(e,t){const n=t.left;t.delta-=n.delta,(t.delta<-1073741824||t.delta>1073741824)&&(e.requestNormalizeDelta=!0),t.start-=n.delta,t.end-=n.delta,t.left=n.right,n.right!==an&&(n.right.parent=t),n.parent=t.parent,t.parent===an?e.root=n:t===t.parent.right?t.parent.right=n:t.parent.left=n,n.right=t,t.parent=n,bn(t),bn(n)}function gn(e){let t=e.end;if(e.left!==an){const n=e.left.maxEnd;n>t&&(t=n)}if(e.right!==an){const n=e.right.maxEnd+e.delta;n>t&&(t=n)}return t}function bn(e){e.maxEnd=gn(e)}function vn(e){for(;e!==an;){const t=gn(e);if(e.maxEnd===t)return;e.maxEnd=t,e=e.parent}}function yn(e,t,n,r){return e===n?t-r:e-n}class wn{constructor(e,t){this.piece=e,this.color=t,this.size_left=0,this.lf_left=0,this.parent=this,this.left=this,this.right=this}next(){if(this.right!==Cn)return _n(this.right);let e=this;for(;e.parent!==Cn&&e.parent.left!==e;)e=e.parent;return e.parent===Cn?Cn:e.parent}prev(){if(this.left!==Cn)return kn(this.left);let e=this;for(;e.parent!==Cn&&e.parent.right!==e;)e=e.parent;return e.parent===Cn?Cn:e.parent}detach(){this.parent=null,this.left=null,this.right=null}}const Cn=new wn(null,0);function _n(e){for(;e.left!==Cn;)e=e.left;return e}function kn(e){for(;e.right!==Cn;)e=e.right;return e}function xn(e){return e===Cn?0:e.size_left+e.piece.length+xn(e.right)}function Sn(e){return e===Cn?0:e.lf_left+e.piece.lineFeedCnt+Sn(e.right)}function En(){Cn.parent=Cn}function Fn(e,t){const n=t.right;n.size_left+=t.size_left+(t.piece?t.piece.length:0),n.lf_left+=t.lf_left+(t.piece?t.piece.lineFeedCnt:0),t.right=n.left,n.left!==Cn&&(n.left.parent=t),n.parent=t.parent,t.parent===Cn?e.root=n:t.parent.left===t?t.parent.left=n:t.parent.right=n,n.left=t,t.parent=n}function Ln(e,t){const n=t.left;t.left=n.right,n.right!==Cn&&(n.right.parent=t),n.parent=t.parent,t.size_left-=n.size_left+(n.piece?n.piece.length:0),t.lf_left-=n.lf_left+(n.piece?n.piece.lineFeedCnt:0),t.parent===Cn?e.root=n:t===t.parent.right?t.parent.right=n:t.parent.left=n,n.right=t,t.parent=n}function In(e,t){let n,r;if(t.left===Cn?(r=t,n=r.right):t.right===Cn?(r=t,n=r.left):(r=_n(t.right),n=r.right),r===e.root)return e.root=n,n.color=0,t.detach(),En(),void(e.root.parent=Cn);const i=1===r.color;if(r===r.parent.left?r.parent.left=n:r.parent.right=n,r===t?(n.parent=r.parent,Rn(e,n)):(r.parent===t?n.parent=r:n.parent=r.parent,Rn(e,n),r.left=t.left,r.right=t.right,r.parent=t.parent,r.color=t.color,t===e.root?e.root=r:t===t.parent.left?t.parent.left=r:t.parent.right=r,r.left!==Cn&&(r.left.parent=r),r.right!==Cn&&(r.right.parent=r),r.size_left=t.size_left,r.lf_left=t.lf_left,Rn(e,r)),t.detach(),n.parent.left===n){const t=xn(n),r=Sn(n);if(t!==n.parent.size_left||r!==n.parent.lf_left){const i=t-n.parent.size_left,s=r-n.parent.lf_left;n.parent.size_left=t,n.parent.lf_left=r,Nn(e,n.parent,i,s)}}if(Rn(e,n.parent),i)return void En();let s;for(;n!==e.root&&0===n.color;)n===n.parent.left?(s=n.parent.right,1===s.color&&(s.color=0,n.parent.color=1,Fn(e,n.parent),s=n.parent.right),0===s.left.color&&0===s.right.color?(s.color=1,n=n.parent):(0===s.right.color&&(s.left.color=0,s.color=1,Ln(e,s),s=n.parent.right),s.color=n.parent.color,n.parent.color=0,s.right.color=0,Fn(e,n.parent),n=e.root)):(s=n.parent.left,1===s.color&&(s.color=0,n.parent.color=1,Ln(e,n.parent),s=n.parent.left),0===s.left.color&&0===s.right.color?(s.color=1,n=n.parent):(0===s.left.color&&(s.right.color=0,s.color=1,Fn(e,s),s=n.parent.left),s.color=n.parent.color,n.parent.color=0,s.left.color=0,Ln(e,n.parent),n=e.root));n.color=0,En()}function Tn(e,t){for(Rn(e,t);t!==e.root&&1===t.parent.color;)if(t.parent===t.parent.parent.left){const n=t.parent.parent.right;1===n.color?(t.parent.color=0,n.color=0,t.parent.parent.color=1,t=t.parent.parent):(t===t.parent.right&&Fn(e,t=t.parent),t.parent.color=0,t.parent.parent.color=1,Ln(e,t.parent.parent))}else{const n=t.parent.parent.left;1===n.color?(t.parent.color=0,n.color=0,t.parent.parent.color=1,t=t.parent.parent):(t===t.parent.left&&Ln(e,t=t.parent),t.parent.color=0,t.parent.parent.color=1,Fn(e,t.parent.parent))}e.root.color=0}function Nn(e,t,n,r){for(;t!==e.root&&t!==Cn;)t.parent.left===t&&(t.parent.size_left+=n,t.parent.lf_left+=r),t=t.parent}function Rn(e,t){let n=0,r=0;if(t!==e.root){for(;t!==e.root&&t===t.parent.right;)t=t.parent;if(t!==e.root)for(n=xn((t=t.parent).left)-t.size_left,r=Sn(t.left)-t.lf_left,t.size_left+=n,t.lf_left+=r;t!==e.root&&(0!==n||0!==r);)t.parent.left===t&&(t.parent.size_left+=n,t.parent.lf_left+=r),t=t.parent}}Cn.parent=Cn,Cn.left=Cn,Cn.right=Cn,Cn.color=0;var Dn=n(9182);const An=65535;function Mn(e){let t;return t=e[e.length-1]<65536?new Uint16Array(e.length):new Uint32Array(e.length),t.set(e,0),t}class On{constructor(e,t,n,r,i){this.lineStarts=e,this.cr=t,this.lf=n,this.crlf=r,this.isBasicASCII=i}}function zn(e,t=!0){const n=[0];let r=1;for(let t=0,i=e.length;t(e!==Cn&&this._pieces.push(e.piece),!0))}read(){return 0===this._pieces.length?0===this._index?(this._index++,this._BOM):null:this._index>this._pieces.length-1?null:0===this._index?this._BOM+this._tree.getPieceContent(this._pieces[this._index++]):this._tree.getPieceContent(this._pieces[this._index++])}}class Vn{constructor(e){this._limit=e,this._cache=[]}get(e){for(let t=this._cache.length-1;t>=0;t--){const n=this._cache[t];if(n.nodeStartOffset<=e&&n.nodeStartOffset+n.node.piece.length>=e)return n}return null}get2(e){for(let t=this._cache.length-1;t>=0;t--){const n=this._cache[t];if(n.nodeStartLineNumber&&n.nodeStartLineNumber=e)return n}return null}set(e){this._cache.length>=this._limit&&this._cache.shift(),this._cache.push(e)}validate(e){let t=!1;const n=this._cache;for(let r=0;r=e)&&(n[r]=null,t=!0)}if(t){const e=[];for(const t of n)null!==t&&e.push(t);this._cache=e}}}class Un{constructor(e,t,n){this.create(e,t,n)}create(e,t,n){this._buffers=[new Bn("",[0])],this._lastChangeBufferPos={line:0,column:0},this.root=Cn,this._lineCnt=1,this._length=0,this._EOL=t,this._EOLLength=t.length,this._EOLNormalized=n;let r=null;for(let t=0,n=e.length;t0){e[t].lineStarts||(e[t].lineStarts=zn(e[t].buffer));const n=new Pn(t+1,{line:0,column:0},{line:e[t].lineStarts.length-1,column:e[t].buffer.length-e[t].lineStarts[e[t].lineStarts.length-1]},e[t].lineStarts.length-1,e[t].buffer.length);this._buffers.push(e[t]),r=this.rbInsertRight(r,n)}this._searchCache=new Vn(1),this._lastVisitedLine={lineNumber:0,value:""},this.computeBufferMetadata()}normalizeEOL(e){const t=65535-Math.floor(21845),n=2*t;let r="",i=0;const s=[];if(this.iterate(this.root,o=>{const a=this.getNodeContent(o),l=a.length;if(i<=t||i+l0){const t=r.replace(/\r\n|\r|\n/g,e);s.push(new Bn(t,zn(t)))}this.create(s,e,!0)}getEOL(){return this._EOL}setEOL(e){this._EOL=e,this._EOLLength=this._EOL.length,this.normalizeEOL(e)}createSnapshot(e){return new Wn(this,e)}getOffsetAt(e,t){let n=0,r=this.root;for(;r!==Cn;)if(r.left!==Cn&&r.lf_left+1>=e)r=r.left;else{if(r.lf_left+r.piece.lineFeedCnt+1>=e)return n+=r.size_left,n+(this.getAccumulatedValue(r,e-r.lf_left-2)+t-1);e-=r.lf_left+r.piece.lineFeedCnt,n+=r.size_left+r.piece.length,r=r.right}return n}getPositionAt(e){e=Math.floor(e),e=Math.max(0,e);let t=this.root,n=0;const r=e;for(;t!==Cn;)if(0!==t.size_left&&t.size_left>=e)t=t.left;else{if(t.size_left+t.piece.length>=e){const i=this.getIndexOf(t,e-t.size_left);if(n+=t.lf_left+i.index,0===i.index){const e=r-this.getOffsetAt(n+1,1);return new p.y(n+1,e+1)}return new p.y(n+1,i.remainder+1)}if(e-=t.size_left+t.piece.length,n+=t.lf_left+t.piece.lineFeedCnt,t.right===Cn){const t=r-e-this.getOffsetAt(n+1,1);return new p.y(n+1,t+1)}t=t.right}return new p.y(1,1)}getValueInRange(e,t){if(e.startLineNumber===e.endLineNumber&&e.startColumn===e.endColumn)return"";const n=this.nodeAt2(e.startLineNumber,e.startColumn),r=this.nodeAt2(e.endLineNumber,e.endColumn),i=this.getValueInRange2(n,r);return t?t===this._EOL&&this._EOLNormalized&&t===this.getEOL()&&this._EOLNormalized?i:i.replace(/\r\n|\r|\n/g,t):i}getValueInRange2(e,t){if(e.node===t.node){const n=e.node,r=this._buffers[n.piece.bufferIndex].buffer,i=this.offsetInBuffer(n.piece.bufferIndex,n.piece.start);return r.substring(i+e.remainder,i+t.remainder)}let n=e.node;const r=this._buffers[n.piece.bufferIndex].buffer,i=this.offsetInBuffer(n.piece.bufferIndex,n.piece.start);let s=r.substring(i+e.remainder,i+n.piece.length);for(n=n.next();n!==Cn;){const e=this._buffers[n.piece.bufferIndex].buffer,r=this.offsetInBuffer(n.piece.bufferIndex,n.piece.start);if(n===t.node){s+=e.substring(r,r+t.remainder);break}s+=e.substr(r,n.piece.length),n=n.next()}return s}getLinesContent(){const e=[];let t=0,n="",r=!1;return this.iterate(this.root,i=>{if(i===Cn)return!0;const s=i.piece;let o=s.length;if(0===o)return!0;const a=this._buffers[s.bufferIndex].buffer,l=this._buffers[s.bufferIndex].lineStarts,c=s.start.line,h=s.end.line;let d=l[c]+s.start.column;if(r&&(10===a.charCodeAt(d)&&(d++,o--),e[t++]=n,n="",r=!1,0===o))return!0;if(c===h)return this._EOLNormalized||13!==a.charCodeAt(d+o-1)?n+=a.substr(d,o):(r=!0,n+=a.substr(d,o-1)),!0;n+=this._EOLNormalized?a.substring(d,Math.max(d,l[c+1]-this._EOLLength)):a.substring(d,l[c+1]).replace(/(\r\n|\r|\n)$/,""),e[t++]=n;for(let r=c+1;re+p,t.reset(0)):(v=d.buffer,y=e=>e,t.reset(p));do{if(g=t.next(v),g){if(y(g.index)>=f)return c;this.positionInBuffer(e,y(g.index)-u,b);const t=this.getLineFeedCnt(e.piece.bufferIndex,i,b),s=b.line===i.line?b.column-i.column+r:b.column+1,o=s+g[0].length;if(h[c++]=(0,Dn.dr)(new m.Q(n+t,s,n+t,o),g,a),y(g.index)+g[0].length>=f)return c;if(c>=l)return c}}while(g);return c}findMatchesLineByLine(e,t,n,r){const i=[];let s=0;const o=new Dn.W5(t.wordSeparators,t.regex);let a=this.nodeAt2(e.startLineNumber,e.startColumn);if(null===a)return[];const l=this.nodeAt2(e.endLineNumber,e.endColumn);if(null===l)return[];let c=this.positionInBuffer(a.node,a.remainder);const h=this.positionInBuffer(l.node,l.remainder);if(a.node===l.node)return this.findMatchesInNode(a.node,o,e.startLineNumber,e.startColumn,c,h,t,n,r,s,i),i;let d=e.startLineNumber,u=a.node;for(;u!==l.node;){const l=this.getLineFeedCnt(u.piece.bufferIndex,c,u.piece.end);if(l>=1){const a=this._buffers[u.piece.bufferIndex].lineStarts,h=this.offsetInBuffer(u.piece.bufferIndex,u.piece.start),p=a[c.line+l],m=d===e.startLineNumber?e.startColumn:1;if(s=this.findMatchesInNode(u,o,d,m,c,this.positionInBuffer(u,p-h),t,n,r,s,i),s>=r)return i;d+=l}const h=d===e.startLineNumber?e.startColumn-1:0;if(d===e.endLineNumber){const a=this.getLineContent(d).substring(h,e.endColumn-1);return s=this._findMatchesInLine(t,o,a,e.endLineNumber,h,s,i,n,r),i}if(s=this._findMatchesInLine(t,o,this.getLineContent(d).substr(h),d,h,s,i,n,r),s>=r)return i;d++,a=this.nodeAt2(d,1),u=a.node,c=this.positionInBuffer(a.node,a.remainder)}if(d===e.endLineNumber){const a=d===e.startLineNumber?e.startColumn-1:0,l=this.getLineContent(d).substring(a,e.endColumn-1);return s=this._findMatchesInLine(t,o,l,e.endLineNumber,a,s,i,n,r),i}const p=d===e.startLineNumber?e.startColumn:1;return s=this.findMatchesInNode(l.node,o,d,p,c,h,t,n,r,s,i),i}_findMatchesInLine(e,t,n,r,i,s,o,a,l){const c=e.wordSeparators;if(!a&&e.simpleSearch){const t=e.simpleSearch,a=t.length,h=n.length;let d=-a;for(;-1!==(d=n.indexOf(t,d+a));)if((!c||(0,Dn.wC)(c,n,h,d,a))&&(o[s++]=new de.Dg(new m.Q(r,d+1+i,r,d+1+a+i),null),s>=l))return s;return s}let h;t.reset(0);do{if(h=t.next(n),h&&(o[s++]=(0,Dn.dr)(new m.Q(r,h.index+1+i,r,h.index+1+h[0].length+i),h,a),s>=l))return s}while(h);return s}insert(e,t,n=!1){if(this._EOLNormalized=this._EOLNormalized&&n,this._lastVisitedLine.lineNumber=0,this._lastVisitedLine.value="",this.root!==Cn){const{node:n,remainder:r,nodeStartOffset:i}=this.nodeAt(e),s=n.piece,o=s.bufferIndex,a=this.positionInBuffer(n,r);if(0===n.piece.bufferIndex&&s.end.line===this._lastChangeBufferPos.line&&s.end.column===this._lastChangeBufferPos.column&&i+s.length===e&&t.lengthe){const e=[];let i=new Pn(s.bufferIndex,a,s.end,this.getLineFeedCnt(s.bufferIndex,a,s.end),this.offsetInBuffer(o,s.end)-this.offsetInBuffer(o,a));if(this.shouldCheckCRLF()&&this.endWithCR(t)&&10===this.nodeCharCodeAt(n,r)){const e={line:i.start.line+1,column:0};i=new Pn(i.bufferIndex,e,i.end,this.getLineFeedCnt(i.bufferIndex,e,i.end),i.length-1),t+="\n"}if(this.shouldCheckCRLF()&&this.startWithLF(t))if(13===this.nodeCharCodeAt(n,r-1)){const i=this.positionInBuffer(n,r-1);this.deleteNodeTail(n,i),t="\r"+t,0===n.piece.length&&e.push(n)}else this.deleteNodeTail(n,a);else this.deleteNodeTail(n,a);const l=this.createNewPieces(t);i.length>0&&this.rbInsertRight(n,i);let c=n;for(let e=0;e=0;e--)i=this.rbInsertLeft(i,r[e]);this.validateCRLFWithPrevNode(i),this.deleteNodes(n)}insertContentToNodeRight(e,t){this.adjustCarriageReturnFromNext(e,t)&&(e+="\n");const n=this.createNewPieces(e),r=this.rbInsertRight(t,n[0]);let i=r;for(let e=1;e=h))break;a=c+1}return n?(n.line=c,n.column=o-d,null):{line:c,column:o-d}}getLineFeedCnt(e,t,n){if(0===n.column)return n.line-t.line;const r=this._buffers[e].lineStarts;if(n.line===r.length-1)return n.line-t.line;const i=r[n.line+1],s=r[n.line]+n.column;if(i>s+1)return n.line-t.line;const o=s-1;return 13===this._buffers[e].buffer.charCodeAt(o)?n.line-t.line+1:n.line-t.line}offsetInBuffer(e,t){return this._buffers[e].lineStarts[t.line]+t.column}deleteNodes(e){for(let t=0;tAn){const t=[];for(;e.length>An;){const n=e.charCodeAt(65534);let r;13===n||n>=55296&&n<=56319?(r=e.substring(0,65534),e=e.substring(65534)):(r=e.substring(0,An),e=e.substring(An));const i=zn(r);t.push(new Pn(this._buffers.length,{line:0,column:0},{line:i.length-1,column:r.length-i[i.length-1]},i.length-1,r.length)),this._buffers.push(new Bn(r,i))}const n=zn(e);return t.push(new Pn(this._buffers.length,{line:0,column:0},{line:n.length-1,column:e.length-n[n.length-1]},n.length-1,e.length)),this._buffers.push(new Bn(e,n)),t}let t=this._buffers[0].buffer.length;const n=zn(e,!1);let r=this._lastChangeBufferPos;if(this._buffers[0].lineStarts[this._buffers[0].lineStarts.length-1]===t&&0!==t&&this.startWithLF(e)&&this.endWithCR(this._buffers[0].buffer)){this._lastChangeBufferPos={line:this._lastChangeBufferPos.line,column:this._lastChangeBufferPos.column+1},r=this._lastChangeBufferPos;for(let e=0;e=e-1)n=n.left;else{if(n.lf_left+n.piece.lineFeedCnt>e-1){const r=this.getAccumulatedValue(n,e-n.lf_left-2),o=this.getAccumulatedValue(n,e-n.lf_left-1),a=this._buffers[n.piece.bufferIndex].buffer,l=this.offsetInBuffer(n.piece.bufferIndex,n.piece.start);return i+=n.size_left,this._searchCache.set({node:n,nodeStartOffset:i,nodeStartLineNumber:s-(e-1-n.lf_left)}),a.substring(l+r,l+o-t)}if(n.lf_left+n.piece.lineFeedCnt===e-1){const t=this.getAccumulatedValue(n,e-n.lf_left-2),i=this._buffers[n.piece.bufferIndex].buffer,s=this.offsetInBuffer(n.piece.bufferIndex,n.piece.start);r=i.substring(s+t,s+n.piece.length);break}e-=n.lf_left+n.piece.lineFeedCnt,i+=n.size_left+n.piece.length,n=n.right}}for(n=n.next();n!==Cn;){const e=this._buffers[n.piece.bufferIndex].buffer;if(n.piece.lineFeedCnt>0){const i=this.getAccumulatedValue(n,0),s=this.offsetInBuffer(n.piece.bufferIndex,n.piece.start);return r+=e.substring(s,s+i-t),r}{const t=this.offsetInBuffer(n.piece.bufferIndex,n.piece.start);r+=e.substr(t,n.piece.length)}n=n.next()}return r}computeBufferMetadata(){let e=this.root,t=1,n=0;for(;e!==Cn;)t+=e.lf_left+e.piece.lineFeedCnt,n+=e.size_left+e.piece.length,e=e.right;this._lineCnt=t,this._length=n,this._searchCache.validate(this._length)}getIndexOf(e,t){const n=e.piece,r=this.positionInBuffer(e,t),i=r.line-n.start.line;if(this.offsetInBuffer(n.bufferIndex,n.end)-this.offsetInBuffer(n.bufferIndex,n.start)===t){const t=this.getLineFeedCnt(e.piece.bufferIndex,n.start,r);if(t!==i)return{index:t,remainder:0}}return{index:i,remainder:r.column}}getAccumulatedValue(e,t){if(t<0)return 0;const n=e.piece,r=this._buffers[n.bufferIndex].lineStarts,i=n.start.line+t+1;return i>n.end.line?r[n.end.line]+n.end.column-r[n.start.line]-n.start.column:r[i]-r[n.start.line]-n.start.column}deleteNodeTail(e,t){const n=e.piece,r=n.lineFeedCnt,i=this.offsetInBuffer(n.bufferIndex,n.end),s=t,o=this.offsetInBuffer(n.bufferIndex,s),a=this.getLineFeedCnt(n.bufferIndex,n.start,s),l=a-r,c=o-i,h=n.length+c;e.piece=new Pn(n.bufferIndex,n.start,s,a,h),Nn(this,e,c,l)}deleteNodeHead(e,t){const n=e.piece,r=n.lineFeedCnt,i=this.offsetInBuffer(n.bufferIndex,n.start),s=t,o=this.getLineFeedCnt(n.bufferIndex,s,n.end),a=o-r,l=i-this.offsetInBuffer(n.bufferIndex,s),c=n.length+l;e.piece=new Pn(n.bufferIndex,s,n.end,o,c),Nn(this,e,l,a)}shrinkNode(e,t,n){const r=e.piece,i=r.start,s=r.end,o=r.length,a=r.lineFeedCnt,l=t,c=this.getLineFeedCnt(r.bufferIndex,r.start,l),h=this.offsetInBuffer(r.bufferIndex,t)-this.offsetInBuffer(r.bufferIndex,i);e.piece=new Pn(r.bufferIndex,r.start,l,c,h),Nn(this,e,h-o,c-a);const d=new Pn(r.bufferIndex,n,s,this.getLineFeedCnt(r.bufferIndex,n,s),this.offsetInBuffer(r.bufferIndex,s)-this.offsetInBuffer(r.bufferIndex,n)),u=this.rbInsertRight(e,d);this.validateCRLFWithPrevNode(u)}appendToNode(e,t){this.adjustCarriageReturnFromNext(t,e)&&(t+="\n");const n=this.shouldCheckCRLF()&&this.startWithLF(t)&&this.endWithCR(e),r=this._buffers[0].buffer.length;this._buffers[0].buffer+=t;const i=zn(t,!1);for(let e=0;ee)t=t.left;else{if(t.size_left+t.piece.length>=e){r+=t.size_left;const n={node:t,remainder:e-t.size_left,nodeStartOffset:r};return this._searchCache.set(n),n}e-=t.size_left+t.piece.length,r+=t.size_left+t.piece.length,t=t.right}return null}nodeAt2(e,t){let n=this.root,r=0;for(;n!==Cn;)if(n.left!==Cn&&n.lf_left>=e-1)n=n.left;else{if(n.lf_left+n.piece.lineFeedCnt>e-1){const i=this.getAccumulatedValue(n,e-n.lf_left-2),s=this.getAccumulatedValue(n,e-n.lf_left-1);return r+=n.size_left,{node:n,remainder:Math.min(i+t-1,s),nodeStartOffset:r}}if(n.lf_left+n.piece.lineFeedCnt===e-1){const i=this.getAccumulatedValue(n,e-n.lf_left-2);if(i+t-1<=n.piece.length)return{node:n,remainder:i+t-1,nodeStartOffset:r};t-=n.piece.length-i;break}e-=n.lf_left+n.piece.lineFeedCnt,r+=n.size_left+n.piece.length,n=n.right}for(n=n.next();n!==Cn;){if(n.piece.lineFeedCnt>0){const e=this.getAccumulatedValue(n,0),r=this.offsetOfNode(n);return{node:n,remainder:Math.min(t-1,e),nodeStartOffset:r}}if(n.piece.length>=t-1)return{node:n,remainder:t-1,nodeStartOffset:this.offsetOfNode(n)};t-=n.piece.length,n=n.next()}return null}nodeCharCodeAt(e,t){if(e.piece.lineFeedCnt<1)return-1;const n=this._buffers[e.piece.bufferIndex],r=this.offsetInBuffer(e.piece.bufferIndex,e.piece.start)+t;return n.buffer.charCodeAt(r)}offsetOfNode(e){if(!e)return 0;let t=e.size_left;for(;e!==this.root;)e.parent.right===e&&(t+=e.parent.size_left+e.parent.piece.length),e=e.parent;return t}shouldCheckCRLF(){return!(this._EOLNormalized&&"\n"===this._EOL)}startWithLF(e){if("string"==typeof e)return 10===e.charCodeAt(0);if(e===Cn||0===e.piece.lineFeedCnt)return!1;const t=e.piece,n=this._buffers[t.bufferIndex].lineStarts,r=t.start.line,i=n[r]+t.start.column;return r!==n.length-1&&(!(n[r+1]>i+1)&&10===this._buffers[t.bufferIndex].buffer.charCodeAt(i))}endWithCR(e){return"string"==typeof e?13===e.charCodeAt(e.length-1):e!==Cn&&0!==e.piece.lineFeedCnt&&13===this.nodeCharCodeAt(e,e.piece.length-1)}validateCRLFWithPrevNode(e){if(this.shouldCheckCRLF()&&this.startWithLF(e)){const t=e.prev();this.endWithCR(t)&&this.fixCRLF(t,e)}}validateCRLFWithNextNode(e){if(this.shouldCheckCRLF()&&this.endWithCR(e)){const t=e.next();this.startWithLF(t)&&this.fixCRLF(e,t)}}fixCRLF(e,t){const n=[],r=this._buffers[e.piece.bufferIndex].lineStarts;let i;i=0===e.piece.end.column?{line:e.piece.end.line-1,column:r[e.piece.end.line]-r[e.piece.end.line-1]-1}:{line:e.piece.end.line,column:e.piece.end.column-1};const s=e.piece.length-1,o=e.piece.lineFeedCnt-1;e.piece=new Pn(e.piece.bufferIndex,e.piece.start,i,o,s),Nn(this,e,-1,-1),0===e.piece.length&&n.push(e);const a={line:t.piece.start.line+1,column:0},l=t.piece.length-1,c=this.getLineFeedCnt(t.piece.bufferIndex,a,t.piece.end);t.piece=new Pn(t.piece.bufferIndex,a,t.piece.end,c,l),Nn(this,t,-1,-1),0===t.piece.length&&n.push(t);const h=this.createNewPieces("\r\n");this.rbInsertRight(e,h[0]);for(let e=0;ee.sortIndex-t.sortIndex)}this._mightContainRTL=r,this._mightContainUnusualLineTerminators=i,this._mightContainNonBasicASCII=s;const m=this._doApplyEdits(a);let f=null;if(t&&u.length>0){u.sort((e,t)=>t.lineNumber-e.lineNumber),f=[];for(let e=0,t=u.length;e0&&u[e-1].lineNumber===t)continue;const n=u[e].oldContent,r=this.getLineContent(t);0!==r.length&&r!==n&&-1===c.HG(r)&&f.push(t)}}return this._onDidChangeContent.fire(),new de.F4(p,m,f)}_reduceOperations(e){return e.length<1e3?e:[this._toSingleEditOperation(e)]}_toSingleEditOperation(e){let t=!1;const n=e[0].range,r=e[e.length-1].range,i=new m.Q(n.startLineNumber,n.startColumn,r.endLineNumber,r.endColumn);let s=n.startLineNumber,o=n.startColumn;const a=[];for(let n=0,r=e.length;n0&&a.push(r.text),s=i.endLineNumber,o=i.endColumn}const l=a.join(""),[c,h,u]=(0,d.W)(l);return{sortIndex:0,identifier:e[0].identifier,range:i,rangeOffset:this.getOffsetAt(i.startLineNumber,i.startColumn),rangeLength:this.getValueLengthInRange(i,0),text:l,eolCount:c,firstLineLength:h,lastLineLength:u,forceMoveMarkers:t,isAutoWhitespaceEdit:!1}}_doApplyEdits(e){e.sort($n._sortOpsDescending);const t=[];for(let n=0;n0){const e=o.eolCount+1;c=1===e?new m.Q(a,l,a,l+o.firstLineLength):new m.Q(a,l,a+e-1,o.lastLineLength+1)}else c=new m.Q(a,l,a,l);n=c.endLineNumber,r=c.endColumn,t.push(c),i=o}return t}static _sortOpsAscending(e,t){const n=m.Q.compareRangesUsingEnds(e.range,t.range);return 0===n?e.sortIndex-t.sortIndex:n}static _sortOpsDescending(e,t){const n=m.Q.compareRangesUsingEnds(e.range,t.range);return 0===n?t.sortIndex-e.sortIndex:-n}}class qn{constructor(e,t,n,r,i,s,o,a,l){this._chunks=e,this._bom=t,this._cr=n,this._lf=r,this._crlf=i,this._containsRTL=s,this._containsUnusualLineTerminators=o,this._isBasicASCII=a,this._normalizeEOL=l}_getEOL(e){const t=this._cr+this._lf+this._crlf,n=this._cr+this._crlf;return 0===t?1===e?"\n":"\r\n":n>t/2?"\r\n":"\n"}create(e){const t=this._getEOL(e),n=this._chunks;if(this._normalizeEOL&&("\r\n"===t&&(this._cr>0||this._lf>0)||"\n"===t&&(this._cr>0||this._crlf>0)))for(let e=0,r=n.length;e=55296&&t<=56319?(this._acceptChunk1(e.substr(0,e.length-1),!1),this._hasPreviousChar=!0,this._previousChar=t):(this._acceptChunk1(e,!1),this._hasPreviousChar=!1,this._previousChar=t)}_acceptChunk1(e,t){(t||0!==e.length)&&(this._hasPreviousChar?this._acceptChunk2(String.fromCharCode(this._previousChar)+e):this._acceptChunk2(e))}_acceptChunk2(e){const t=function(e,t){e.length=0,e[0]=0;let n=1,r=0,i=0,s=0,o=!0;for(let a=0,l=t.length;a126)&&(o=!1)}const a=new On(Mn(e),r,i,s,o);return e.length=0,a}(this._tmpLineStarts,e);this.chunks.push(new Bn(e,t.lineStarts)),this.cr+=t.cr,this.lf+=t.lf,this.crlf+=t.crlf,t.isBasicASCII||(this.isBasicASCII=!1,this.containsRTL||(this.containsRTL=c.E_(e)),this.containsUnusualLineTerminators||(this.containsUnusualLineTerminators=c.$X(e)))}finish(e=!0){return this._finish(),new qn(this.chunks,this.BOM,this.cr,this.lf,this.crlf,this.containsRTL,this.containsUnusualLineTerminators,this.isBasicASCII,e)}_finish(){if(0===this.chunks.length&&this._acceptChunk1("",!0),this._hasPreviousChar){this._hasPreviousChar=!1;const e=this.chunks[this.chunks.length-1];e.buffer+=String.fromCharCode(this._previousChar);const t=zn(e.buffer);e.lineStarts=t,13===this._previousChar&&this.cr++}}}var Kn=n(6362),Hn=n(4945),Gn=n(2735),Qn=n(3958),Jn=n(6185);const Yn=new class{clone(){return this}equals(e){return this===e}};class Xn{constructor(e){this._default=e,this._store=[]}get(e){return e=this._store.length;)this._store[this._store.length]=this._default;this._store[e]=t}replace(e,t,n){if(e>=this._store.length)return;if(0===t)return void this.insert(e,n);if(0===n)return void this.delete(e,t);const r=this._store.slice(0,e),i=this._store.slice(e+t),s=function(e,t){const n=[];for(let r=0;r=this._store.length||this._store.splice(e,t)}insert(e,t){if(0===t||e>=this._store.length)return;const n=[];for(let e=0;e0){const n=this._tokens[this._tokens.length-1];if(n.endLineNumber+1===e)return void n.appendLineTokens(t)}this._tokens.push(new Zn(e,[t]))}finalize(){return this._tokens}}class tr{static{this.defaultTokenMetadata=33587200}static createEmpty(e,t){const n=tr.defaultTokenMetadata,r=new Uint32Array(2);return r[0]=e.length,r[1]=n,new tr(r,e,t)}static createFromTextAndMetadata(e,t){let n=0,r="";const i=new Array;for(const{text:t,metadata:s}of e)i.push(n+t.length,s),n+=t.length,r+=t;return new tr(new Uint32Array(i),r,t)}constructor(e,t,n){this._lineTokensBrand=void 0,this._tokens=e,this._tokensCount=this._tokens.length>>>1,this._text=t,this.languageIdCodec=n}equals(e){return e instanceof tr&&this.slicedEquals(e,0,this._tokensCount)}slicedEquals(e,t,n){if(this._text!==e._text)return!1;if(this._tokensCount!==e._tokensCount)return!1;const r=t<<1,i=r+(n<<1);for(let t=r;t0?this._tokens[e-1<<1]:0}getMetadata(e){return this._tokens[1+(e<<1)]}getLanguageId(e){const t=this._tokens[1+(e<<1)],n=Qe.x.getLanguageId(t);return this.languageIdCodec.decodeLanguageId(n)}getStandardTokenType(e){const t=this._tokens[1+(e<<1)];return Qe.x.getTokenType(t)}getForeground(e){const t=this._tokens[1+(e<<1)];return Qe.x.getForeground(t)}getClassName(e){const t=this._tokens[1+(e<<1)];return Qe.x.getClassNameFromMetadata(t)}getInlineStyle(e,t){const n=this._tokens[1+(e<<1)];return Qe.x.getInlineStyleFromMetadata(n,t)}getPresentation(e){const t=this._tokens[1+(e<<1)];return Qe.x.getPresentationFromMetadata(t)}getEndOffset(e){return this._tokens[e<<1]}findTokenIndexAtOffset(e){return tr.findIndexInTokensArray(this._tokens,e)}inflate(){return this}sliceAndInflate(e,t,n){return new nr(this,e,t,n)}static convertToEndOffset(e,t){const n=(e.length>>>1)-1;for(let t=0;t>>1)-1;for(;nt&&(r=i)}return n}withInserted(e){if(0===e.length)return this;let t=0,n=0,r="";const i=new Array;let s=0;for(;;){const o=ts){r+=this._text.substring(s,a.offset);const e=this._tokens[1+(t<<1)];i.push(r.length,e),s=a.offset}r+=a.text,i.push(r.length,a.tokenMetadata),n++}}return new tr(new Uint32Array(i),r,this.languageIdCodec)}getTokenText(e){const t=this.getStartOffset(e),n=this.getEndOffset(e);return this._text.substring(t,n)}forEach(e){const t=this.getCount();for(let n=0;n=n);t++)this._tokensCount++}getMetadata(e){return this._source.getMetadata(this._firstTokenIndex+e)}getLanguageId(e){return this._source.getLanguageId(this._firstTokenIndex+e)}getLineContent(){return this._source.getLineContent().substring(this._startOffset,this._endOffset)}equals(e){return e instanceof nr&&this._startOffset===e._startOffset&&this._endOffset===e._endOffset&&this._deltaOffset===e._deltaOffset&&this._source.slicedEquals(e._source,this._firstTokenIndex,this._tokensCount)}getCount(){return this._tokensCount}getStandardTokenType(e){return this._source.getStandardTokenType(this._firstTokenIndex+e)}getForeground(e){return this._source.getForeground(this._firstTokenIndex+e)}getEndOffset(e){const t=this._source.getEndOffset(this._firstTokenIndex+e);return Math.min(this._endOffset,t)-this._startOffset+this._deltaOffset}getClassName(e){return this._source.getClassName(this._firstTokenIndex+e)}getInlineStyle(e,t){return this._source.getInlineStyle(this._firstTokenIndex+e,t)}getPresentation(e){return this._source.getPresentation(this._firstTokenIndex+e)}findTokenIndexAtOffset(e){return this._source.findTokenIndexAtOffset(e+this._startOffset-this._deltaOffset)-this._firstTokenIndex}getTokenText(e){const t=this._firstTokenIndex+e,n=this._source.getStartOffset(t),r=this._source.getEndOffset(t);let i=this._source.getTokenText(t);return nthis._endOffset&&(i=i.substring(0,i.length-(r-this._endOffset))),i}forEach(e){for(let t=0;tt)break;const i=this._textModel.getLineContent(r.lineNumber),s=lr(this._languageIdCodec,n,this.tokenizationSupport,i,!0,r.startState);e.add(r.lineNumber,s.tokens),this.store.setEndState(r.lineNumber,s.endState)}}getTokenTypeIfInsertingCharacter(e,t){const n=this.getStartState(e.lineNumber);if(!n)return 0;const r=this._textModel.getLanguageId(),i=this._textModel.getLineContent(e.lineNumber),s=i.substring(0,e.column-1)+t+i.substring(e.column-1),o=lr(this._languageIdCodec,r,this.tokenizationSupport,s,!0,n),a=new tr(o.tokens,s,this._languageIdCodec);if(0===a.getCount())return 0;const l=a.findTokenIndexAtOffset(e.column-1);return a.getStandardTokenType(l)}tokenizeLineWithEdit(e,t,n){const r=e.lineNumber,i=e.column,s=this.getStartState(r);if(!s)return null;const o=this._textModel.getLineContent(r),a=o.substring(0,i-1)+n+o.substring(i-1+t),l=this._textModel.getLanguageIdAtPosition(r,0),c=lr(this._languageIdCodec,l,this.tokenizationSupport,a,!0,s);return new tr(c.tokens,a,this._languageIdCodec)}hasAccurateTokensForLine(e){return e1&&i>=1;i--){const e=this._textModel.getLineFirstNonWhitespaceColumn(i);if(0!==e&&e0&&n>0&&(n--,t--),this._lineEndStates.replace(e.startLineNumber,n,t)}}class ar{constructor(){this._ranges=[]}get min(){return 0===this._ranges.length?null:this._ranges[0].start}delete(e){const t=this._ranges.findIndex(t=>t.contains(e));if(-1!==t){const n=this._ranges[t];n.start===e?n.endExclusive===e+1?this._ranges.splice(t,1):this._ranges[t]=new Jn.L(e+1,n.endExclusive):n.endExclusive===e+1?this._ranges[t]=new Jn.L(n.start,e):this._ranges.splice(t,1,new Jn.L(n.start,e),new Jn.L(e+1,n.endExclusive))}}addRange(e){Jn.L.addRange(e,this._ranges)}addRangeAndResize(e,t){let n=0;for(;!(n>=this._ranges.length||e.start<=this._ranges[n].endExclusive);)n++;let r=n;for(;!(r>=this._ranges.length||e.endExclusivee.toString()).join(" + ")}}function lr(e,t,n,r,i,s){let o=null;if(n)try{o=n.tokenizeEncoded(r,i,s.clone())}catch(e){(0,l.dz)(e)}return o||(o=function(e,t){const n=new Uint32Array(2);return n[0]=0,n[1]=(32768|e|2<<24)>>>0,new Hn.rY(n,null===t?Yn:t)}(e.encodeLanguageId(t),s)),tr.convertToEndOffset(o.tokens,r.length),o}class cr{constructor(e,t){this._tokenizerWithStateStore=e,this._backgroundTokenStore=t,this._isDisposed=!1,this._isScheduled=!1}dispose(){this._isDisposed=!0}handleChanges(){this._beginBackgroundTokenization()}_beginBackgroundTokenization(){!this._isScheduled&&this._tokenizerWithStateStore._textModel.isAttachedToEditor()&&this._hasLinesToTokenize()&&(this._isScheduled=!0,(0,Gn.$6)(e=>{this._isScheduled=!1,this._backgroundTokenizeWithDeadline(e)}))}_backgroundTokenizeWithDeadline(e){const t=Date.now()+e.timeRemaining(),n=()=>{!this._isDisposed&&this._tokenizerWithStateStore._textModel.isAttachedToEditor()&&this._hasLinesToTokenize()&&(this._backgroundTokenizeForAtLeast1ms(),Date.now()1)break;if(this._tokenizeOneInvalidLine(t)>=e)break}while(this._hasLinesToTokenize());this._backgroundTokenStore.setTokens(t.finalize()),this.checkFinished()}_hasLinesToTokenize(){return!!this._tokenizerWithStateStore&&!this._tokenizerWithStateStore.store.allStatesValid()}_tokenizeOneInvalidLine(e){const t=this._tokenizerWithStateStore?.getFirstInvalidLine();return t?(this._tokenizerWithStateStore.updateTokensUntilLine(e,t.lineNumber),t.lineNumber):this._tokenizerWithStateStore._textModel.getLineCount()+1}checkFinished(){this._isDisposed||this._tokenizerWithStateStore.store.allStatesValid()&&this._backgroundTokenStore.backgroundTokenizationFinished()}requestTokens(e,t){this._tokenizerWithStateStore.store.invalidateEndStateRange(new Kn.M(e,t))}}class hr{constructor(){this._onDidChangeVisibleRanges=new r.vl,this.onDidChangeVisibleRanges=this._onDidChangeVisibleRanges.event,this._views=new Set}attachView(){const e=new dr(t=>{this._onDidChangeVisibleRanges.fire({view:e,state:t})});return this._views.add(e),e}detachView(e){this._views.delete(e),this._onDidChangeVisibleRanges.fire({view:e,state:void 0})}}class dr{constructor(e){this.handleStateChange=e}setVisibleLines(e,t){const n=e.map(e=>new Kn.M(e.startLineNumber,e.endLineNumber+1));this.handleStateChange({visibleLineRanges:n,stabilized:t})}}class ur extends i.jG{get lineRanges(){return this._lineRanges}constructor(e){super(),this._refreshTokens=e,this.runner=this._register(new Gn.uC(()=>this.update(),50)),this._computedLineRanges=[],this._lineRanges=[]}update(){(0,o.aI)(this._computedLineRanges,this._lineRanges,(e,t)=>e.equals(t))||(this._computedLineRanges=this._lineRanges,this._refreshTokens())}handleStateChange(e){this._lineRanges=e.visibleLineRanges,e.stabilized?(this.runner.cancel(),this.update()):this.runner.schedule()}}class pr extends i.jG{get backgroundTokenizationState(){return this._backgroundTokenizationState}constructor(e,t,n){super(),this._languageIdCodec=e,this._textModel=t,this.getLanguageId=n,this._backgroundTokenizationState=1,this._onDidChangeBackgroundTokenizationState=this._register(new r.vl),this.onDidChangeBackgroundTokenizationState=this._onDidChangeBackgroundTokenizationState.event,this._onDidChangeTokens=this._register(new r.vl),this.onDidChangeTokens=this._onDidChangeTokens.event}tokenizeIfCheap(e){this.isCheapToTokenize(e)&&this.forceTokenization(e)}}class mr extends pr{constructor(e,t,n,r){super(t,n,r),this._treeSitterService=e,this._tokenizationSupport=null,this._initialize()}_initialize(){const e=this.getLanguageId();this._tokenizationSupport&&this._lastLanguageId===e||(this._lastLanguageId=e,this._tokenizationSupport=Hn.OB.get(e))}getLineTokens(e){const t=this._textModel.getLineContent(e);if(this._tokenizationSupport){const n=this._tokenizationSupport.tokenizeEncoded(e,this._textModel);if(n)return new tr(n,t,this._languageIdCodec)}return tr.createEmpty(t,this._languageIdCodec)}resetTokenization(e=!0){e&&this._onDidChangeTokens.fire({semanticTokensApplied:!1,ranges:[{fromLineNumber:1,toLineNumber:this._textModel.getLineCount()}]}),this._initialize()}handleDidChangeAttached(){}handleDidChangeContent(e){e.isFlush&&this.resetTokenization(!1)}forceTokenization(e){}hasAccurateTokensForLine(e){return!0}isCheapToTokenize(e){return!0}getTokenTypeIfInsertingCharacter(e,t,n){return 0}tokenizeLineWithEdit(e,t,n){return null}get hasTokens(){return void 0!==this._treeSitterService.getParseResult(this._textModel)}}var fr=n(9241);const gr=new Uint32Array(0).buffer;class br{static deleteBeginning(e,t){return null===e||e===gr?e:br.delete(e,0,t)}static deleteEnding(e,t){if(null===e||e===gr)return e;const n=vr(e),r=n[n.length-2];return br.delete(e,t,r)}static delete(e,t,n){if(null===e||e===gr||t===n)return e;const r=vr(e),i=r.length>>>1;if(0===t&&r[r.length-2]===n)return gr;const s=tr.findIndexInTokensArray(r,t),o=s>0?r[s-1<<1]:0;if(nl&&(r[a++]=t,r[a++]=r[1+(e<<1)],l=t)}if(a===r.length)return e;const h=new Uint32Array(a);return h.set(r.subarray(0,a),0),h.buffer}static append(e,t){if(t===gr)return e;if(e===gr)return t;if(null===e)return e;if(null===t)return null;const n=vr(e),r=vr(t),i=r.length>>>1,s=new Uint32Array(n.length+r.length);s.set(n,0);let o=n.length;const a=n[n.length-2];for(let e=0;e>>1;let s=tr.findIndexInTokensArray(r,t);s>0&&r[s-1<<1]===t&&s--;for(let e=s;e0}getTokens(e,t,n){let r=null;if(t1&&(t=Qe.x.getLanguageId(r[1])!==e),!t)return gr}if(!r||0===r.length){const n=new Uint32Array(2);return n[0]=t,n[1]=wr(e),n.buffer}return r[r.length-2]=t,0===r.byteOffset&&r.byteLength===r.buffer.byteLength?r.buffer:r}_ensureLine(e){for(;e>=this._len;)this._lineTokens[this._len]=null,this._len++}_deleteLines(e,t){0!==t&&(e+t>this._len&&(t=this._len-e),this._lineTokens.splice(e,t),this._len-=t)}_insertLines(e,t){if(0===t)return;const n=[];for(let e=0;e=this._len)return;if(e.startLineNumber===e.endLineNumber){if(e.startColumn===e.endColumn)return;return void(this._lineTokens[t]=br.delete(this._lineTokens[t],e.startColumn-1,e.endColumn-1))}this._lineTokens[t]=br.deleteEnding(this._lineTokens[t],e.startColumn-1);const n=e.endLineNumber-1;let r=null;n=this._len||(0!==t?(this._lineTokens[r]=br.deleteEnding(this._lineTokens[r],e.column-1),this._lineTokens[r]=br.insert(this._lineTokens[r],e.column-1,n),this._insertLines(e.lineNumber,t)):this._lineTokens[r]=br.insert(this._lineTokens[r],e.column-1,n))}setMultilineTokens(e,t){if(0===e.length)return{changes:[]};const n=[];for(let r=0,i=e.length;r>>0}class Cr{constructor(e){this._pieces=[],this._isComplete=!1,this._languageIdCodec=e}flush(){this._pieces=[],this._isComplete=!1}isEmpty(){return 0===this._pieces.length}set(e,t){this._pieces=e||[],this._isComplete=t}setPartial(e,t){let n=e;if(t.length>0){const r=t[0].getRange(),i=t[t.length-1].getRange();if(!r||!i)return e;n=e.plusRange(r).plusRange(i)}let r=null;for(let e=0,t=this._pieces.length;en.endLineNumber){r=r||{index:e};break}if(i.removeTokens(n),i.isEmpty()){this._pieces.splice(e,1),e--,t--;continue}if(i.endLineNumbern.endLineNumber){r=r||{index:e};continue}const[s,o]=i.split(n);s.isEmpty()?r=r||{index:e}:o.isEmpty()||(this._pieces.splice(e,1,s,o),e++,t++,r=r||{index:e})}return r=r||{index:this._pieces.length},t.length>0&&(this._pieces=o.nK(this._pieces,r.index,t)),n}isComplete(){return this._isComplete}addSparseTokens(e,t){if(0===t.getLineContent().length)return t;const n=this._pieces;if(0===n.length)return t;const r=n[Cr._findFirstPieceWithLine(n,e)].getLineTokens(e);if(!r)return t;const i=t.getCount(),s=r.getCount();let o=0;const a=[];let l=0,c=0;const h=(e,t)=>{e!==c&&(c=e,a[l++]=e,a[l++]=t)};for(let e=0;e>>0,c=~l>>>0;for(;ot)){for(;i>n&&e[i-1].startLineNumber<=t&&t<=e[i-1].endLineNumber;)i--;return i}r=i-1}}return n}acceptEdit(e,t,n,r,i){for(const s of this._pieces)s.acceptEdit(e,t,n,r,i)}}var _r,kr=function(e,t){return function(n,r){t(n,r,e)}};let xr=_r=class extends Vt{constructor(e,t,n,s,o,a,l){super(),this._textModel=e,this._bracketPairsTextModelPart=t,this._languageId=n,this._attachedViews=s,this._languageService=o,this._languageConfigurationService=a,this._treeSitterService=l,this._semanticTokens=new Cr(this._languageService.languageIdCodec),this._onDidChangeLanguage=this._register(new r.vl),this.onDidChangeLanguage=this._onDidChangeLanguage.event,this._onDidChangeLanguageConfiguration=this._register(new r.vl),this.onDidChangeLanguageConfiguration=this._onDidChangeLanguageConfiguration.event,this._onDidChangeTokens=this._register(new r.vl),this.onDidChangeTokens=this._onDidChangeTokens.event,this._tokensDisposables=this._register(new i.Cm),this._register(this._languageConfigurationService.onDidChange(e=>{e.affects(this._languageId)&&this._onDidChangeLanguageConfiguration.fire({})})),this._register(r.Jh.filter(Hn.OB.onDidChange,e=>e.changedLanguages.includes(this._languageId))(()=>{this.createPreferredTokenProvider()})),this.createPreferredTokenProvider()}createGrammarTokens(){return this._register(new Sr(this._languageService.languageIdCodec,this._textModel,()=>this._languageId,this._attachedViews))}createTreeSitterTokens(){return this._register(new mr(this._treeSitterService,this._languageService.languageIdCodec,this._textModel,()=>this._languageId))}createTokens(e){const t=void 0!==this._tokens;this._tokens?.dispose(),this._tokens=e?this.createTreeSitterTokens():this.createGrammarTokens(),this._tokensDisposables.clear(),this._tokensDisposables.add(this._tokens.onDidChangeTokens(e=>{this._emitModelTokensChangedEvent(e)})),this._tokensDisposables.add(this._tokens.onDidChangeBackgroundTokenizationState(e=>{this._bracketPairsTextModelPart.handleDidChangeBackgroundTokenizationState()})),t&&this._tokens.resetTokenization()}createPreferredTokenProvider(){Hn.OB.get(this._languageId)?this._tokens instanceof mr||this.createTokens(!0):this._tokens instanceof Sr||this.createTokens(!1)}handleLanguageConfigurationServiceChange(e){e.affects(this._languageId)&&this._onDidChangeLanguageConfiguration.fire({})}handleDidChangeContent(e){if(e.isFlush)this._semanticTokens.flush();else if(!e.isEolChange)for(const t of e.changes){const[e,n,r]=(0,d.W)(t.text);this._semanticTokens.acceptEdit(t.range,e,n,r,t.text.length>0?t.text.charCodeAt(0):0)}this._tokens.handleDidChangeContent(e)}handleDidChangeAttached(){this._tokens.handleDidChangeAttached()}getLineTokens(e){this.validateLineNumber(e);const t=this._tokens.getLineTokens(e);return this._semanticTokens.addSparseTokens(e,t)}_emitModelTokensChangedEvent(e){this._textModel._isDisposing()||(this._bracketPairsTextModelPart.handleDidChangeTokens(e),this._onDidChangeTokens.fire(e))}validateLineNumber(e){if(e<1||e>this._textModel.getLineCount())throw new l.D7("Illegal value for lineNumber")}get hasTokens(){return this._tokens.hasTokens}resetTokenization(){this._tokens.resetTokenization()}get backgroundTokenizationState(){return this._tokens.backgroundTokenizationState}forceTokenization(e){this.validateLineNumber(e),this._tokens.forceTokenization(e)}hasAccurateTokensForLine(e){return this.validateLineNumber(e),this._tokens.hasAccurateTokensForLine(e)}isCheapToTokenize(e){return this.validateLineNumber(e),this._tokens.isCheapToTokenize(e)}tokenizeIfCheap(e){this.validateLineNumber(e),this._tokens.tokenizeIfCheap(e)}getTokenTypeIfInsertingCharacter(e,t,n){return this._tokens.getTokenTypeIfInsertingCharacter(e,t,n)}tokenizeLineWithEdit(e,t,n){return this._tokens.tokenizeLineWithEdit(e,t,n)}setSemanticTokens(e,t){this._semanticTokens.set(e,t),this._emitModelTokensChangedEvent({semanticTokensApplied:null!==e,ranges:[{fromLineNumber:1,toLineNumber:this._textModel.getLineCount()}]})}hasCompleteSemanticTokens(){return this._semanticTokens.isComplete()}hasSomeSemanticTokens(){return!this._semanticTokens.isEmpty()}setPartialSemanticTokens(e,t){if(this.hasCompleteSemanticTokens())return;const n=this._textModel.validateRange(this._semanticTokens.setPartial(e,t));this._emitModelTokensChangedEvent({semanticTokensApplied:!0,ranges:[{fromLineNumber:n.startLineNumber,toLineNumber:n.endLineNumber}]})}getWordAtPosition(e){this.assertNotDisposed();const t=this._textModel.validatePosition(e),n=this._textModel.getLineContent(t.lineNumber),r=this.getLineTokens(t.lineNumber),i=r.findTokenIndexAtOffset(t.column-1),[s,o]=_r._findLanguageBoundaries(r,i),a=(0,y.Th)(t.column,this.getLanguageConfiguration(r.getLanguageId(i)).getWordDefinition(),n.substring(s,o),s);if(a&&a.startColumn<=e.column&&e.column<=a.endColumn)return a;if(i>0&&s===t.column-1){const[s,o]=_r._findLanguageBoundaries(r,i-1),a=(0,y.Th)(t.column,this.getLanguageConfiguration(r.getLanguageId(i-1)).getWordDefinition(),n.substring(s,o),s);if(a&&a.startColumn<=e.column&&e.column<=a.endColumn)return a}return null}getLanguageConfiguration(e){return this._languageConfigurationService.getLanguageConfiguration(e)}static _findLanguageBoundaries(e,t){const n=e.getLanguageId(t);let r=0;for(let i=t;i>=0&&e.getLanguageId(i)===n;i--)r=e.getStartOffset(i);let i=e.getLineContent().length;for(let r=t,s=e.getCount();r=0;a--)(i=e[a])&&(o=(s<3?i(o):s>3?i(t,n,o):i(t,n))||o);return s>3&&o&&Object.defineProperty(t,n,o),o}([kr(4,v.L),kr(5,te),kr(6,fr.ITreeSitterParserService)],xr);class Sr extends pr{constructor(e,t,n,r){super(e,t,n),this._tokenizer=null,this._defaultBackgroundTokenizer=null,this._backgroundTokenizer=this._register(new i.HE),this._tokens=new yr(this._languageIdCodec),this._debugBackgroundTokenizer=this._register(new i.HE),this._attachedViewStates=this._register(new i.$w),this._register(Hn.dG.onDidChange(e=>{const t=this.getLanguageId();-1!==e.changedLanguages.indexOf(t)&&this.resetTokenization()})),this.resetTokenization(),this._register(r.onDidChangeVisibleRanges(({view:e,state:t})=>{if(t){let n=this._attachedViewStates.get(e);n||(n=new ur(()=>this.refreshRanges(n.lineRanges)),this._attachedViewStates.set(e,n)),n.handleStateChange(t)}else this._attachedViewStates.deleteAndDispose(e)}))}resetTokenization(e=!0){this._tokens.flush(),this._debugBackgroundTokens?.flush(),this._debugBackgroundStates&&(this._debugBackgroundStates=new sr(this._textModel.getLineCount())),e&&this._onDidChangeTokens.fire({semanticTokensApplied:!1,ranges:[{fromLineNumber:1,toLineNumber:this._textModel.getLineCount()}]});const[t,n]=(()=>{if(this._textModel.isTooLargeForTokenization())return[null,null];const e=Hn.dG.get(this.getLanguageId());if(!e)return[null,null];let t;try{t=e.getInitialState()}catch(e){return(0,l.dz)(e),[null,null]}return[e,t]})();if(this._tokenizer=t&&n?new ir(this._textModel.getLineCount(),t,this._textModel,this._languageIdCodec):null,this._backgroundTokenizer.clear(),this._defaultBackgroundTokenizer=null,this._tokenizer){const e={setTokens:e=>{this.setTokens(e)},backgroundTokenizationFinished:()=>{2!==this._backgroundTokenizationState&&(this._backgroundTokenizationState=2,this._onDidChangeBackgroundTokenizationState.fire())},setEndState:(e,t)=>{if(!this._tokenizer)return;const n=this._tokenizer.store.getFirstInvalidEndStateLineNumber();null!==n&&e>=n&&this._tokenizer?.store.setEndState(e,t)}};t&&t.createBackgroundTokenizer&&!t.backgroundTokenizerShouldOnlyVerifyTokens&&(this._backgroundTokenizer.value=t.createBackgroundTokenizer(this._textModel,e)),this._backgroundTokenizer.value||this._textModel.isTooLargeForTokenization()||(this._backgroundTokenizer.value=this._defaultBackgroundTokenizer=new cr(this._tokenizer,e),this._defaultBackgroundTokenizer.handleChanges()),t?.backgroundTokenizerShouldOnlyVerifyTokens&&t.createBackgroundTokenizer?(this._debugBackgroundTokens=new yr(this._languageIdCodec),this._debugBackgroundStates=new sr(this._textModel.getLineCount()),this._debugBackgroundTokenizer.clear(),this._debugBackgroundTokenizer.value=t.createBackgroundTokenizer(this._textModel,{setTokens:e=>{this._debugBackgroundTokens?.setMultilineTokens(e,this._textModel)},backgroundTokenizationFinished(){},setEndState:(e,t)=>{this._debugBackgroundStates?.setEndState(e,t)}})):(this._debugBackgroundTokens=void 0,this._debugBackgroundStates=void 0,this._debugBackgroundTokenizer.value=void 0)}this.refreshAllVisibleLineTokens()}handleDidChangeAttached(){this._defaultBackgroundTokenizer?.handleChanges()}handleDidChangeContent(e){if(e.isFlush)this.resetTokenization(!1);else if(!e.isEolChange){for(const t of e.changes){const[e,n]=(0,d.W)(t.text);this._tokens.acceptEdit(t.range,e,n),this._debugBackgroundTokens?.acceptEdit(t.range,e,n)}this._debugBackgroundStates?.acceptChanges(e.changes),this._tokenizer&&this._tokenizer.store.acceptChanges(e.changes),this._defaultBackgroundTokenizer?.handleChanges()}}setTokens(e){const{changes:t}=this._tokens.setMultilineTokens(e,this._textModel);return t.length>0&&this._onDidChangeTokens.fire({semanticTokensApplied:!1,ranges:t}),{changes:t}}refreshAllVisibleLineTokens(){const e=Kn.M.joinMany([...this._attachedViewStates].map(([e,t])=>t.lineRanges));this.refreshRanges(e)}refreshRanges(e){for(const t of e)this.refreshRange(t.startLineNumber,t.endLineNumberExclusive-1)}refreshRange(e,t){if(!this._tokenizer)return;e=Math.max(1,Math.min(this._textModel.getLineCount(),e)),t=Math.min(this._textModel.getLineCount(),t);const n=new er,{heuristicTokens:r}=this._tokenizer.tokenizeHeuristically(n,e,t),i=this.setTokens(n.finalize());if(r)for(const e of i.changes)this._backgroundTokenizer.value?.requestTokens(e.fromLineNumber,e.toLineNumber+1);this._defaultBackgroundTokenizer?.checkFinished()}forceTokenization(e){const t=new er;this._tokenizer?.updateTokensUntilLine(t,e),this.setTokens(t.finalize()),this._defaultBackgroundTokenizer?.checkFinished()}hasAccurateTokensForLine(e){return!this._tokenizer||this._tokenizer.hasAccurateTokensForLine(e)}isCheapToTokenize(e){return!this._tokenizer||this._tokenizer.isCheapToTokenize(e)}getLineTokens(e){const t=this._textModel.getLineContent(e),n=this._tokens.getTokens(this._textModel.getLanguageId(),e-1,t);if(this._debugBackgroundTokens&&this._debugBackgroundStates&&this._tokenizer&&this._debugBackgroundStates.getFirstInvalidEndStateLineNumberOrMax()>e&&this._tokenizer.store.getFirstInvalidEndStateLineNumberOrMax()>e){const r=this._debugBackgroundTokens.getTokens(this._textModel.getLanguageId(),e-1,t);!n.equals(r)&&this._debugBackgroundTokenizer.value?.reportMismatchingTokens&&this._debugBackgroundTokenizer.value.reportMismatchingTokens(e)}return n}getTokenTypeIfInsertingCharacter(e,t,n){if(!this._tokenizer)return 0;const r=this._textModel.validatePosition(new p.y(e,t));return this.forceTokenization(r.lineNumber),this._tokenizer.getTokenTypeIfInsertingCharacter(r,n)}tokenizeLineWithEdit(e,t,n){if(!this._tokenizer)return null;const r=this._textModel.validatePosition(e);return this.forceTokenization(r.lineNumber),this._tokenizer.tokenizeLineWithEdit(r,t,n)}get hasTokens(){return this._tokens.hasTokens}}class Er{constructor(){this.changeType=1}}class Fr{static applyInjectedText(e,t){if(!t||0===t.length)return e;let n="",r=0;for(const i of t)n+=e.substring(r,i.column-1),r=i.column-1,n+=i.options.content;return n+=e.substring(r),n}static fromDecorations(e){const t=[];for(const n of e)n.options.before&&n.options.before.content.length>0&&t.push(new Fr(n.ownerId,n.range.startLineNumber,n.range.startColumn,n.options.before,0)),n.options.after&&n.options.after.content.length>0&&t.push(new Fr(n.ownerId,n.range.endLineNumber,n.range.endColumn,n.options.after,1));return t.sort((e,t)=>e.lineNumber===t.lineNumber?e.column===t.column?e.order-t.order:e.column-t.column:e.lineNumber-t.lineNumber),t}constructor(e,t,n,r,i){this.ownerId=e,this.lineNumber=t,this.column=n,this.options=r,this.order=i}}class Lr{constructor(e,t,n){this.changeType=2,this.lineNumber=e,this.detail=t,this.injectedText=n}}class Ir{constructor(e,t){this.changeType=3,this.fromLineNumber=e,this.toLineNumber=t}}class Tr{constructor(e,t,n,r){this.changeType=4,this.injectedTexts=r,this.fromLineNumber=e,this.toLineNumber=t,this.detail=n}}class Nr{constructor(){this.changeType=5}}class Rr{constructor(e,t,n,r){this.changes=e,this.versionId=t,this.isUndoing=n,this.isRedoing=r,this.resultingSelection=null}containsEvent(e){for(let t=0,n=this.changes.length;t0&&(e[t++]=r,n+=r.length),n>=65536)return e.join("")}}}const $r=()=>{throw new Error("Invalid change accessor")};let qr=class extends i.jG{static{Pr=this}static{this._MODEL_SYNC_LIMIT=52428800}static{this.LARGE_FILE_SIZE_THRESHOLD=20971520}static{this.LARGE_FILE_LINE_COUNT_THRESHOLD=3e5}static{this.LARGE_FILE_HEAP_OPERATION_THRESHOLD=268435456}static{this.DEFAULT_CREATION_OPTIONS={isForSimpleWidget:!1,tabSize:g.tabSize,indentSize:g.indentSize,insertSpaces:g.insertSpaces,detectIndentation:!1,defaultEOL:1,trimAutoWhitespace:g.trimAutoWhitespace,largeFileOptimizations:g.largeFileOptimizations,bracketPairColorizationOptions:g.bracketPairColorizationOptions}}static resolveOptions(e,t){if(t.detectIndentation){const n=Gt(e,t.tabSize,t.insertSpaces);return new de.X2({tabSize:n.tabSize,indentSize:"tabSize",insertSpaces:n.insertSpaces,trimAutoWhitespace:t.trimAutoWhitespace,defaultEOL:t.defaultEOL,bracketPairColorizationOptions:t.bracketPairColorizationOptions})}return new de.X2(t)}get onDidChangeLanguage(){return this._tokenizationTextModelPart.onDidChangeLanguage}get onDidChangeLanguageConfiguration(){return this._tokenizationTextModelPart.onDidChangeLanguageConfiguration}get onDidChangeTokens(){return this._tokenizationTextModelPart.onDidChangeTokens}onDidChangeContent(e){return this._eventEmitter.slowEvent(t=>e(t.contentChangedEvent))}onDidChangeContentOrInjectedText(e){return(0,i.qE)(this._eventEmitter.fastEvent(t=>e(t)),this._onDidChangeInjectedText.event(t=>e(t)))}_isDisposing(){return this.__isDisposing}get tokenization(){return this._tokenizationTextModelPart}get bracketPairs(){return this._bracketPairs}get guides(){return this._guidesTextModelPart}constructor(e,t,n,s=null,o,a,l,d){super(),this._undoRedoService=o,this._languageService=a,this._languageConfigurationService=l,this.instantiationService=d,this._onWillDispose=this._register(new r.vl),this.onWillDispose=this._onWillDispose.event,this._onDidChangeDecorations=this._register(new ri(e=>this.handleBeforeFireDecorationsChangedEvent(e))),this.onDidChangeDecorations=this._onDidChangeDecorations.event,this._onDidChangeOptions=this._register(new r.vl),this.onDidChangeOptions=this._onDidChangeOptions.event,this._onDidChangeAttached=this._register(new r.vl),this.onDidChangeAttached=this._onDidChangeAttached.event,this._onDidChangeInjectedText=this._register(new r.vl),this._eventEmitter=this._register(new ii),this._languageSelectionListener=this._register(new i.HE),this._deltaDecorationCallCnt=0,this._attachedViews=new hr,Vr++,this.id="$model"+Vr,this.isForSimpleWidget=n.isForSimpleWidget,this._associatedResource=null==s?h.r.parse("inmemory://model/"+Vr):s,this._attachedEditorCount=0;const{textBuffer:u,disposable:p}=Wr(e,n.defaultEOL);this._buffer=u,this._bufferDisposable=p,this._options=Pr.resolveOptions(this._buffer,n);const f="string"==typeof t?t:t.languageId;"string"!=typeof t&&(this._languageSelectionListener.value=t.onDidChange(()=>this._setLanguage(t.languageId))),this._bracketPairs=this._register(new yt(this,this._languageConfigurationService)),this._guidesTextModelPart=this._register(new qt(this,this._languageConfigurationService)),this._decorationProvider=this._register(new St(this)),this._tokenizationTextModelPart=this.instantiationService.createInstance(xr,this,this._bracketPairs,f,this._attachedViews);const g=this._buffer.getLineCount(),b=this._buffer.getValueLengthInRange(new m.Q(1,1,g,this._buffer.getLineLength(g)+1),0);n.largeFileOptimizations?(this._isTooLargeForTokenization=b>Pr.LARGE_FILE_SIZE_THRESHOLD||g>Pr.LARGE_FILE_LINE_COUNT_THRESHOLD,this._isTooLargeForHeapOperation=b>Pr.LARGE_FILE_HEAP_OPERATION_THRESHOLD):(this._isTooLargeForTokenization=!1,this._isTooLargeForHeapOperation=!1),this._isTooLargeForSyncing=b>Pr._MODEL_SYNC_LIMIT,this._versionId=1,this._alternativeVersionId=1,this._initialUndoRedoSnapshot=null,this._isDisposed=!1,this.__isDisposing=!1,this._instanceId=c.tk(Vr),this._lastDecorationId=0,this._decorations=Object.create(null),this._decorationsTree=new Hr,this._commandManager=new Pt(this,this._undoRedoService),this._isUndoing=!1,this._isRedoing=!1,this._trimAutoWhitespaceLines=null,this._register(this._decorationProvider.onDidChange(()=>{this._onDidChangeDecorations.beginDeferredEmit(),this._onDidChangeDecorations.fire(),this._onDidChangeDecorations.endDeferredEmit()})),this._languageService.requestRichLanguageFeatures(f),this._register(this._languageConfigurationService.onDidChange(e=>{this._bracketPairs.handleLanguageConfigurationServiceChange(e),this._tokenizationTextModelPart.handleLanguageConfigurationServiceChange(e)}))}dispose(){this.__isDisposing=!0,this._onWillDispose.fire(),this._tokenizationTextModelPart.dispose(),this._isDisposed=!0,super.dispose(),this._bufferDisposable.dispose(),this.__isDisposing=!1;const e=new $n([],"","\n",!1,!1,!0,!0);e.dispose(),this._buffer=e,this._bufferDisposable=i.jG.None}_assertNotDisposed(){if(this._isDisposed)throw new l.D7("Model is disposed!")}_emitContentChangedEvent(e,t){this.__isDisposing||(this._tokenizationTextModelPart.handleDidChangeContent(t),this._bracketPairs.handleDidChangeContent(t),this._eventEmitter.fire(new Ar(e,t)))}setValue(e){if(this._assertNotDisposed(),null==e)throw(0,l.Qg)();const{textBuffer:t,disposable:n}=Wr(e,this._options.defaultEOL);this._setValueFromTextBuffer(t,n)}_createContentChanged2(e,t,n,r,i,s,o,a){return{changes:[{range:e,rangeOffset:t,rangeLength:n,text:r}],eol:this._buffer.getEOL(),isEolChange:a,versionId:this.getVersionId(),isUndoing:i,isRedoing:s,isFlush:o}}_setValueFromTextBuffer(e,t){this._assertNotDisposed();const n=this.getFullModelRange(),r=this.getValueLengthInRange(n),i=this.getLineCount(),s=this.getLineMaxColumn(i);this._buffer=e,this._bufferDisposable.dispose(),this._bufferDisposable=t,this._increaseVersionId(),this._decorations=Object.create(null),this._decorationsTree=new Hr,this._commandManager.clear(),this._trimAutoWhitespaceLines=null,this._emitContentChangedEvent(new Rr([new Er],this._versionId,!1,!1),this._createContentChanged2(new m.Q(1,1,i,s),0,r,this.getValue(),!1,!1,!0,!1))}setEOL(e){this._assertNotDisposed();const t=1===e?"\r\n":"\n";if(this._buffer.getEOL()===t)return;const n=this.getFullModelRange(),r=this.getValueLengthInRange(n),i=this.getLineCount(),s=this.getLineMaxColumn(i);this._onBeforeEOLChange(),this._buffer.setEOL(t),this._increaseVersionId(),this._onAfterEOLChange(),this._emitContentChangedEvent(new Rr([new Nr],this._versionId,!1,!1),this._createContentChanged2(new m.Q(1,1,i,s),0,r,this.getValue(),!1,!1,!1,!0))}_onBeforeEOLChange(){this._decorationsTree.ensureAllNodesHaveRanges(this)}_onAfterEOLChange(){const e=this.getVersionId(),t=this._decorationsTree.collectNodesPostOrder();for(let n=0,r=t.length;n0}getAttachedEditorCount(){return this._attachedEditorCount}isTooLargeForSyncing(){return this._isTooLargeForSyncing}isTooLargeForTokenization(){return this._isTooLargeForTokenization}isTooLargeForHeapOperation(){return this._isTooLargeForHeapOperation}isDisposed(){return this._isDisposed}isDominatedByLongLines(){if(this._assertNotDisposed(),this.isTooLargeForTokenization())return!1;let e=0,t=0;const n=this._buffer.getLineCount();for(let r=1;r<=n;r++){const n=this._buffer.getLineLength(r);n>=1e4?t+=n:e+=n}return t>e}get uri(){return this._associatedResource}getOptions(){return this._assertNotDisposed(),this._options}getFormattingOptions(){return{tabSize:this._options.indentSize,insertSpaces:this._options.insertSpaces}}updateOptions(e){this._assertNotDisposed();const t=void 0!==e.tabSize?e.tabSize:this._options.tabSize,n=void 0!==e.indentSize?e.indentSize:this._options.originalIndentSize,r=void 0!==e.insertSpaces?e.insertSpaces:this._options.insertSpaces,i=void 0!==e.trimAutoWhitespace?e.trimAutoWhitespace:this._options.trimAutoWhitespace,s=void 0!==e.bracketColorizationOptions?e.bracketColorizationOptions:this._options.bracketPairColorizationOptions,o=new de.X2({tabSize:t,indentSize:n,insertSpaces:r,defaultEOL:this._options.defaultEOL,trimAutoWhitespace:i,bracketPairColorizationOptions:s});if(this._options.equals(o))return;const a=this._options.createChangeEvent(o);this._options=o,this._bracketPairs.handleDidChangeOptions(a),this._decorationProvider.handleDidChangeOptions(a),this._onDidChangeOptions.fire(a)}detectIndentation(e,t){this._assertNotDisposed();const n=Gt(this._buffer,t,e);this.updateOptions({insertSpaces:n.insertSpaces,tabSize:n.tabSize,indentSize:n.tabSize})}normalizeIndentation(e){return this._assertNotDisposed(),function(e,t,n){let r=c.HG(e);return-1===r&&(r=e.length),function(e,t,n){let r=0;for(let n=0;n({range:e.range,text:null})),()=>null)}mightContainNonBasicASCII(){return this._buffer.mightContainNonBasicASCII()}getAlternativeVersionId(){return this._assertNotDisposed(),this._alternativeVersionId}getInitialUndoRedoSnapshot(){return this._assertNotDisposed(),this._initialUndoRedoSnapshot}getOffsetAt(e){this._assertNotDisposed();const t=this._validatePosition(e.lineNumber,e.column,0);return this._buffer.getOffsetAt(t.lineNumber,t.column)}getPositionAt(e){this._assertNotDisposed();const t=Math.min(this._buffer.getLength(),Math.max(0,e));return this._buffer.getPositionAt(t)}_increaseVersionId(){this._versionId=this._versionId+1,this._alternativeVersionId=this._versionId}_overwriteVersionId(e){this._versionId=e}_overwriteAlternativeVersionId(e){this._alternativeVersionId=e}_overwriteInitialUndoRedoSnapshot(e){this._initialUndoRedoSnapshot=e}getValue(e,t=!1){if(this._assertNotDisposed(),this.isTooLargeForHeapOperation())throw new l.D7("Operation would exceed heap memory limits");const n=this.getFullModelRange(),r=this.getValueInRange(n,e);return t?this._buffer.getBOM()+r:r}createSnapshot(e=!1){return new Ur(this._buffer.createSnapshot(e))}getValueLength(e,t=!1){this._assertNotDisposed();const n=this.getFullModelRange(),r=this.getValueLengthInRange(n,e);return t?this._buffer.getBOM().length+r:r}getValueInRange(e,t=0){return this._assertNotDisposed(),this._buffer.getValueInRange(this.validateRange(e),t)}getValueLengthInRange(e,t=0){return this._assertNotDisposed(),this._buffer.getValueLengthInRange(this.validateRange(e),t)}getCharacterCountInRange(e,t=0){return this._assertNotDisposed(),this._buffer.getCharacterCountInRange(this.validateRange(e),t)}getLineCount(){return this._assertNotDisposed(),this._buffer.getLineCount()}getLineContent(e){if(this._assertNotDisposed(),e<1||e>this.getLineCount())throw new l.D7("Illegal value for lineNumber");return this._buffer.getLineContent(e)}getLineLength(e){if(this._assertNotDisposed(),e<1||e>this.getLineCount())throw new l.D7("Illegal value for lineNumber");return this._buffer.getLineLength(e)}getLinesContent(){if(this._assertNotDisposed(),this.isTooLargeForHeapOperation())throw new l.D7("Operation would exceed heap memory limits");return this._buffer.getLinesContent()}getEOL(){return this._assertNotDisposed(),this._buffer.getEOL()}getEndOfLineSequence(){return this._assertNotDisposed(),"\n"===this._buffer.getEOL()?0:1}getLineMinColumn(e){return this._assertNotDisposed(),1}getLineMaxColumn(e){if(this._assertNotDisposed(),e<1||e>this.getLineCount())throw new l.D7("Illegal value for lineNumber");return this._buffer.getLineLength(e)+1}getLineFirstNonWhitespaceColumn(e){if(this._assertNotDisposed(),e<1||e>this.getLineCount())throw new l.D7("Illegal value for lineNumber");return this._buffer.getLineFirstNonWhitespaceColumn(e)}getLineLastNonWhitespaceColumn(e){if(this._assertNotDisposed(),e<1||e>this.getLineCount())throw new l.D7("Illegal value for lineNumber");return this._buffer.getLineLastNonWhitespaceColumn(e)}_validateRangeRelaxedNoAllocations(e){const t=this._buffer.getLineCount(),n=e.startLineNumber,r=e.startColumn;let i=Math.floor("number"!=typeof n||isNaN(n)?1:n),s=Math.floor("number"!=typeof r||isNaN(r)?1:r);if(i<1)i=1,s=1;else if(i>t)i=t,s=this.getLineMaxColumn(i);else if(s<=1)s=1;else{const e=this.getLineMaxColumn(i);s>=e&&(s=e)}const o=e.endLineNumber,a=e.endColumn;let l=Math.floor("number"!=typeof o||isNaN(o)?1:o),c=Math.floor("number"!=typeof a||isNaN(a)?1:a);if(l<1)l=1,c=1;else if(l>t)l=t,c=this.getLineMaxColumn(l);else if(c<=1)c=1;else{const e=this.getLineMaxColumn(l);c>=e&&(c=e)}return n===i&&r===s&&o===l&&a===c&&e instanceof m.Q&&!(e instanceof f.L)?e:new m.Q(i,s,l,c)}_isValidPosition(e,t,n){if("number"!=typeof e||"number"!=typeof t)return!1;if(isNaN(e)||isNaN(t))return!1;if(e<1||t<1)return!1;if((0|e)!==e||(0|t)!==t)return!1;if(e>this._buffer.getLineCount())return!1;if(1===t)return!0;if(t>this.getLineMaxColumn(e))return!1;if(1===n){const n=this._buffer.getLineCharCode(e,t-2);if(c.pc(n))return!1}return!0}_validatePosition(e,t,n){const r=Math.floor("number"!=typeof e||isNaN(e)?1:e),i=Math.floor("number"!=typeof t||isNaN(t)?1:t),s=this._buffer.getLineCount();if(r<1)return new p.y(1,1);if(r>s)return new p.y(s,this.getLineMaxColumn(s));if(i<=1)return new p.y(r,1);const o=this.getLineMaxColumn(r);if(i>=o)return new p.y(r,o);if(1===n){const e=this._buffer.getLineCharCode(r,i-2);if(c.pc(e))return new p.y(r,i-1)}return new p.y(r,i)}validatePosition(e){return this._assertNotDisposed(),e instanceof p.y&&this._isValidPosition(e.lineNumber,e.column,1)?e:this._validatePosition(e.lineNumber,e.column,1)}_isValidRange(e,t){const n=e.startLineNumber,r=e.startColumn,i=e.endLineNumber,s=e.endColumn;if(!this._isValidPosition(n,r,0))return!1;if(!this._isValidPosition(i,s,0))return!1;if(1===t){const e=r>1?this._buffer.getLineCharCode(n,r-2):0,t=s>1&&s<=this._buffer.getLineLength(i)?this._buffer.getLineCharCode(i,s-2):0,o=c.pc(e),a=c.pc(t);return!o&&!a}return!0}validateRange(e){if(this._assertNotDisposed(),e instanceof m.Q&&!(e instanceof f.L)&&this._isValidRange(e,1))return e;const t=this._validatePosition(e.startLineNumber,e.startColumn,0),n=this._validatePosition(e.endLineNumber,e.endColumn,0),r=t.lineNumber,i=t.column,s=n.lineNumber,o=n.column;{const e=i>1?this._buffer.getLineCharCode(r,i-2):0,t=o>1&&o<=this._buffer.getLineLength(s)?this._buffer.getLineCharCode(s,o-2):0,n=c.pc(e),a=c.pc(t);return n||a?r===s&&i===o?new m.Q(r,i-1,s,o-1):n&&a?new m.Q(r,i-1,s,o+1):n?new m.Q(r,i-1,s,o):new m.Q(r,i,s,o+1):new m.Q(r,i,s,o)}}modifyPosition(e,t){this._assertNotDisposed();const n=this.getOffsetAt(e)+t;return this.getPositionAt(Math.min(this._buffer.getLength(),Math.max(0,n)))}getFullModelRange(){this._assertNotDisposed();const e=this.getLineCount();return new m.Q(1,1,e,this.getLineMaxColumn(e))}findMatchesLineByLine(e,t,n,r){return this._buffer.findMatchesLineByLine(e,t,n,r)}findMatches(e,t,n,r,i,s,o=999){this._assertNotDisposed();let a=null;null!==t&&(Array.isArray(t)||(t=[t]),t.every(e=>m.Q.isIRange(e))&&(a=t.map(e=>this.validateRange(e)))),null===a&&(a=[this.getFullModelRange()]),a=a.sort((e,t)=>e.startLineNumber-t.startLineNumber||e.startColumn-t.startColumn);const l=[];let c;if(l.push(a.reduce((e,t)=>m.Q.areIntersecting(e,t)?e.plusRange(t):(l.push(e),t))),!n&&e.indexOf("\n")<0){const t=new Dn.lt(e,n,r,i).parseSearchRequest();if(!t)return[];c=e=>this.findMatchesLineByLine(e,t,s,o)}else c=t=>Dn.hB.findMatches(this,new Dn.lt(e,n,r,i),t,s,o);return l.map(c).reduce((e,t)=>e.concat(t),[])}findNextMatch(e,t,n,r,i,s){this._assertNotDisposed();const o=this.validatePosition(t);if(!n&&e.indexOf("\n")<0){const t=new Dn.lt(e,n,r,i).parseSearchRequest();if(!t)return null;const a=this.getLineCount();let l=new m.Q(o.lineNumber,o.column,a,this.getLineMaxColumn(a)),c=this.findMatchesLineByLine(l,t,s,1);return Dn.hB.findNextMatch(this,new Dn.lt(e,n,r,i),o,s),c.length>0?c[0]:(l=new m.Q(1,1,o.lineNumber,this.getLineMaxColumn(o.lineNumber)),c=this.findMatchesLineByLine(l,t,s,1),c.length>0?c[0]:null)}return Dn.hB.findNextMatch(this,new Dn.lt(e,n,r,i),o,s)}findPreviousMatch(e,t,n,r,i,s){this._assertNotDisposed();const o=this.validatePosition(t);return Dn.hB.findPreviousMatch(this,new Dn.lt(e,n,r,i),o,s)}pushStackElement(){this._commandManager.pushStackElement()}popStackElement(){this._commandManager.popStackElement()}pushEOL(e){if(("\n"===this.getEOL()?0:1)!==e)try{this._onDidChangeDecorations.beginDeferredEmit(),this._eventEmitter.beginDeferredEmit(),null===this._initialUndoRedoSnapshot&&(this._initialUndoRedoSnapshot=this._undoRedoService.createSnapshot(this.uri)),this._commandManager.pushEOL(e)}finally{this._eventEmitter.endDeferredEmit(),this._onDidChangeDecorations.endDeferredEmit()}}_validateEditOperation(e){return e instanceof de.Wo?e:new de.Wo(e.identifier||null,this.validateRange(e.range),e.text,e.forceMoveMarkers||!1,e.isAutoWhitespaceEdit||!1,e._isTracked||!1)}_validateEditOperations(e){const t=[];for(let n=0,r=e.length;n({range:this.validateRange(e.range),text:e.text}));let r=!0;if(e)for(let t=0,i=e.length;ti.endLineNumber,o=i.startLineNumber>t.endLineNumber;if(!r&&!o){s=!0;break}}if(!s){r=!1;break}}if(r)for(let e=0,r=this._trimAutoWhitespaceLines.length;et.endLineNumber||r===t.startLineNumber&&t.startColumn===i&&t.isEmpty()&&o&&o.length>0&&"\n"===o.charAt(0)||r===t.startLineNumber&&1===t.startColumn&&t.isEmpty()&&o&&o.length>0&&"\n"===o.charAt(o.length-1))){s=!1;break}}if(s){const e=new m.Q(r,1,r,i);t.push(new de.Wo(null,e,null,!1,!1,!1))}}this._trimAutoWhitespaceLines=null}return null===this._initialUndoRedoSnapshot&&(this._initialUndoRedoSnapshot=this._undoRedoService.createSnapshot(this.uri)),this._commandManager.pushEditOperation(e,t,n,r)}_applyUndo(e,t,n,r){const i=e.map(e=>{const t=this.getPositionAt(e.newPosition),n=this.getPositionAt(e.newEnd);return{range:new m.Q(t.lineNumber,t.column,n.lineNumber,n.column),text:e.oldText}});this._applyUndoRedoEdits(i,t,!0,!1,n,r)}_applyRedo(e,t,n,r){const i=e.map(e=>{const t=this.getPositionAt(e.oldPosition),n=this.getPositionAt(e.oldEnd);return{range:new m.Q(t.lineNumber,t.column,n.lineNumber,n.column),text:e.newText}});this._applyUndoRedoEdits(i,t,!1,!0,n,r)}_applyUndoRedoEdits(e,t,n,r,i,s){try{this._onDidChangeDecorations.beginDeferredEmit(),this._eventEmitter.beginDeferredEmit(),this._isUndoing=n,this._isRedoing=r,this.applyEdits(e,!1),this.setEOL(t),this._overwriteAlternativeVersionId(i)}finally{this._isUndoing=!1,this._isRedoing=!1,this._eventEmitter.endDeferredEmit(s),this._onDidChangeDecorations.endDeferredEmit()}}applyEdits(e,t=!1){try{this._onDidChangeDecorations.beginDeferredEmit(),this._eventEmitter.beginDeferredEmit();const n=this._validateEditOperations(e);return this._doApplyEdits(n,t)}finally{this._eventEmitter.endDeferredEmit(),this._onDidChangeDecorations.endDeferredEmit()}}_doApplyEdits(e,t){const n=this._buffer.getLineCount(),r=this._buffer.applyEdits(e,this._options.trimAutoWhitespace,t),i=this._buffer.getLineCount(),s=r.changes;if(this._trimAutoWhitespaceLines=r.trimAutoWhitespaceLineNumbers,0!==s.length){for(let e=0,t=s.length;e=0;t--){const n=l+t,r=g+t;C.takeFromEndWhile(e=>e.lineNumber>r);const i=C.takeFromEndWhile(e=>e.lineNumber===r);e.push(new Lr(n,this.getLineContent(r),i))}if(me.lineNumbere.lineNumber===t)}e.push(new Tr(r+1,l+u,h,c))}t+=f}this._emitContentChangedEvent(new Rr(e,this.getVersionId(),this._isUndoing,this._isRedoing),{changes:s,eol:this._buffer.getEOL(),isEolChange:!1,versionId:this.getVersionId(),isUndoing:this._isUndoing,isRedoing:this._isRedoing,isFlush:!1})}return null===r.reverseEdits?void 0:r.reverseEdits}undo(){return this._undoRedoService.undo(this.uri)}canUndo(){return this._undoRedoService.canUndo(this.uri)}redo(){return this._undoRedoService.redo(this.uri)}canRedo(){return this._undoRedoService.canRedo(this.uri)}handleBeforeFireDecorationsChangedEvent(e){if(null===e||0===e.size)return;const t=Array.from(e).map(e=>new Lr(e,this.getLineContent(e),this._getInjectedTextInLine(e)));this._onDidChangeInjectedText.fire(new Dr(t))}changeDecorations(e,t=0){this._assertNotDisposed();try{return this._onDidChangeDecorations.beginDeferredEmit(),this._changeDecorations(t,e)}finally{this._onDidChangeDecorations.endDeferredEmit()}}_changeDecorations(e,t){const n={addDecoration:(t,n)=>this._deltaDecorationsImpl(e,[],[{range:t,options:n}])[0],changeDecoration:(e,t)=>{this._changeDecorationImpl(e,t)},changeDecorationOptions:(e,t)=>{this._changeDecorationOptionsImpl(e,ni(t))},removeDecoration:t=>{this._deltaDecorationsImpl(e,[t],[])},deltaDecorations:(t,n)=>0===t.length&&0===n.length?[]:this._deltaDecorationsImpl(e,t,n)};let r=null;try{r=t(n)}catch(e){(0,l.dz)(e)}return n.addDecoration=$r,n.changeDecoration=$r,n.changeDecorationOptions=$r,n.removeDecoration=$r,n.deltaDecorations=$r,r}deltaDecorations(e,t,n=0){if(this._assertNotDisposed(),e||(e=[]),0===e.length&&0===t.length)return[];try{return this._deltaDecorationCallCnt++,this._deltaDecorationCallCnt>1&&(console.warn("Invoking deltaDecorations recursively could lead to leaking decorations."),(0,l.dz)(new Error("Invoking deltaDecorations recursively could lead to leaking decorations."))),this._onDidChangeDecorations.beginDeferredEmit(),this._deltaDecorationsImpl(n,e,t)}finally{this._onDidChangeDecorations.endDeferredEmit(),this._deltaDecorationCallCnt--}}_getTrackedRange(e){return this.getDecorationRange(e)}_setTrackedRange(e,t,n){const r=e?this._decorations[e]:null;if(!r)return t?this._deltaDecorationsImpl(0,[],[{range:t,options:ti[n]}],!0)[0]:null;if(!t)return this._decorationsTree.delete(r),delete this._decorations[r.id],null;const i=this._validateRangeRelaxedNoAllocations(t),s=this._buffer.getOffsetAt(i.startLineNumber,i.startColumn),o=this._buffer.getOffsetAt(i.endLineNumber,i.endColumn);return this._decorationsTree.delete(r),r.reset(this.getVersionId(),s,o,i),r.setOptions(ti[n]),this._decorationsTree.insert(r),r.id}removeAllDecorationsWithOwnerId(e){if(this._isDisposed)return;const t=this._decorationsTree.collectNodesFromOwner(e);for(let e=0,n=t.length;ethis.getLineCount()?[]:this.getLinesDecorations(e,e,t,n)}getLinesDecorations(e,t,n=0,r=!1,i=!1){const s=this.getLineCount(),a=Math.min(s,Math.max(1,e)),l=Math.min(s,Math.max(1,t)),c=this.getLineMaxColumn(l),h=new m.Q(a,1,l,c),d=this._getDecorationsInRange(h,n,r,i);return(0,o.E4)(d,this._decorationProvider.getDecorationsInRange(h,n,r)),d}getDecorationsInRange(e,t=0,n=!1,r=!1,i=!1){const s=this.validateRange(e),a=this._getDecorationsInRange(s,t,n,i);return(0,o.E4)(a,this._decorationProvider.getDecorationsInRange(s,t,n,r)),a}getOverviewRulerDecorations(e=0,t=!1){return this._decorationsTree.getAll(this,e,t,!0,!1)}getInjectedTextDecorations(e=0){return this._decorationsTree.getAllInjectedText(this,e)}_getInjectedTextInLine(e){const t=this._buffer.getOffsetAt(e,1),n=t+this._buffer.getLineLength(e),r=this._decorationsTree.getInjectedTextInInterval(this,t,n,0);return Fr.fromDecorations(r).filter(t=>t.lineNumber===e)}getAllDecorations(e=0,t=!1){let n=this._decorationsTree.getAll(this,e,t,!1,!1);return n=n.concat(this._decorationProvider.getAllDecorations(e,t)),n}getAllMarginDecorations(e=0){return this._decorationsTree.getAll(this,e,!1,!1,!0)}_getDecorationsInRange(e,t,n,r){const i=this._buffer.getOffsetAt(e.startLineNumber,e.startColumn),s=this._buffer.getOffsetAt(e.endLineNumber,e.endColumn);return this._decorationsTree.getAllInInterval(this,i,s,t,n,r)}getRangeAt(e,t){return this._buffer.getRangeAt(e,t-e)}_changeDecorationImpl(e,t){const n=this._decorations[e];if(!n)return;if(n.options.after){const t=this.getDecorationRange(e);this._onDidChangeDecorations.recordLineAffectedByInjectedText(t.endLineNumber)}if(n.options.before){const t=this.getDecorationRange(e);this._onDidChangeDecorations.recordLineAffectedByInjectedText(t.startLineNumber)}const r=this._validateRangeRelaxedNoAllocations(t),i=this._buffer.getOffsetAt(r.startLineNumber,r.startColumn),s=this._buffer.getOffsetAt(r.endLineNumber,r.endColumn);this._decorationsTree.delete(n),n.reset(this.getVersionId(),i,s,r),this._decorationsTree.insert(n),this._onDidChangeDecorations.checkAffectedAndFire(n.options),n.options.after&&this._onDidChangeDecorations.recordLineAffectedByInjectedText(r.endLineNumber),n.options.before&&this._onDidChangeDecorations.recordLineAffectedByInjectedText(r.startLineNumber)}_changeDecorationOptionsImpl(e,t){const n=this._decorations[e];if(!n)return;const r=!(!n.options.overviewRuler||!n.options.overviewRuler.color),i=!(!t.overviewRuler||!t.overviewRuler.color);if(this._onDidChangeDecorations.checkAffectedAndFire(n.options),this._onDidChangeDecorations.checkAffectedAndFire(t),n.options.after||t.after){const e=this._decorationsTree.getNodeRange(this,n);this._onDidChangeDecorations.recordLineAffectedByInjectedText(e.endLineNumber)}if(n.options.before||t.before){const e=this._decorationsTree.getNodeRange(this,n);this._onDidChangeDecorations.recordLineAffectedByInjectedText(e.startLineNumber)}const s=r!==i,o=function(e){return!!e.after||!!e.before}(t)!==Kr(n);s||o?(this._decorationsTree.delete(n),n.setOptions(t),this._decorationsTree.insert(n)):n.setOptions(t)}_deltaDecorationsImpl(e,t,n,r=!1){const i=this.getVersionId(),s=t.length;let o=0;const a=n.length;let l=0;this._onDidChangeDecorations.beginDeferredEmit();try{const c=new Array(a);for(;othis._setLanguage(e.languageId,t)),this._setLanguage(e.languageId,t))}_setLanguage(e,t){this.tokenization.setLanguageId(e,t),this._languageService.requestRichLanguageFeatures(e)}getLanguageIdAtPosition(e,t){return this.tokenization.getLanguageIdAtPosition(e,t)}getWordAtPosition(e){return this._tokenizationTextModelPart.getWordAtPosition(e)}getWordUntilPosition(e){return this._tokenizationTextModelPart.getWordUntilPosition(e)}normalizePosition(e,t){return e}getLineIndentColumn(e){return function(e){let t=0;for(const n of e){if(" "!==n&&"\t"!==n)break;t++}return t}(this.getLineContent(e))+1}};function jr(e){return!(!e.options.overviewRuler||!e.options.overviewRuler.color)}function Kr(e){return!!e.options.after||!!e.options.before}qr=Pr=function(e,t,n,r){var i,s=arguments.length,o=s<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,n,r);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(o=(s<3?i(o):s>3?i(t,n,o):i(t,n))||o);return s>3&&o&&Object.defineProperty(t,n,o),o}([Br(4,Mr),Br(5,v.L),Br(6,te),Br(7,$._Y)],qr);class Hr{constructor(){this._decorationsTree0=new ln,this._decorationsTree1=new ln,this._injectedTextDecorationsTree=new ln}ensureAllNodesHaveRanges(e){this.getAll(e,0,!1,!1,!1)}_ensureNodesHaveRanges(e,t){for(const n of t)null===n.range&&(n.range=e.getRangeAt(n.cachedAbsoluteStart,n.cachedAbsoluteEnd));return t}getAllInInterval(e,t,n,r,i,s){const o=e.getVersionId(),a=this._intervalSearch(t,n,r,i,o,s);return this._ensureNodesHaveRanges(e,a)}_intervalSearch(e,t,n,r,i,s){const o=this._decorationsTree0.intervalSearch(e,t,n,r,i,s),a=this._decorationsTree1.intervalSearch(e,t,n,r,i,s),l=this._injectedTextDecorationsTree.intervalSearch(e,t,n,r,i,s);return o.concat(a).concat(l)}getInjectedTextInInterval(e,t,n,r){const i=e.getVersionId(),s=this._injectedTextDecorationsTree.intervalSearch(t,n,r,!1,i,!1);return this._ensureNodesHaveRanges(e,s).filter(e=>e.options.showIfCollapsed||!e.range.isEmpty())}getAllInjectedText(e,t){const n=e.getVersionId(),r=this._injectedTextDecorationsTree.search(t,!1,n,!1);return this._ensureNodesHaveRanges(e,r).filter(e=>e.options.showIfCollapsed||!e.range.isEmpty())}getAll(e,t,n,r,i){const s=e.getVersionId(),o=this._search(t,n,r,s,i);return this._ensureNodesHaveRanges(e,o)}_search(e,t,n,r,i){if(n)return this._decorationsTree1.search(e,t,r,i);{const n=this._decorationsTree0.search(e,t,r,i),s=this._decorationsTree1.search(e,t,r,i),o=this._injectedTextDecorationsTree.search(e,t,r,i);return n.concat(s).concat(o)}}collectNodesFromOwner(e){const t=this._decorationsTree0.collectNodesFromOwner(e),n=this._decorationsTree1.collectNodesFromOwner(e),r=this._injectedTextDecorationsTree.collectNodesFromOwner(e);return t.concat(n).concat(r)}collectNodesPostOrder(){const e=this._decorationsTree0.collectNodesPostOrder(),t=this._decorationsTree1.collectNodesPostOrder(),n=this._injectedTextDecorationsTree.collectNodesPostOrder();return e.concat(t).concat(n)}insert(e){Kr(e)?this._injectedTextDecorationsTree.insert(e):jr(e)?this._decorationsTree1.insert(e):this._decorationsTree0.insert(e)}delete(e){Kr(e)?this._injectedTextDecorationsTree.delete(e):jr(e)?this._decorationsTree1.delete(e):this._decorationsTree0.delete(e)}getNodeRange(e,t){const n=e.getVersionId();return t.cachedVersionId!==n&&this._resolveNode(t,n),null===t.range&&(t.range=e.getRangeAt(t.cachedAbsoluteStart,t.cachedAbsoluteEnd)),t.range}_resolveNode(e,t){Kr(e)?this._injectedTextDecorationsTree.resolveNode(e,t):jr(e)?this._decorationsTree1.resolveNode(e,t):this._decorationsTree0.resolveNode(e,t)}acceptReplace(e,t,n,r){this._decorationsTree0.acceptReplace(e,t,n,r),this._decorationsTree1.acceptReplace(e,t,n,r),this._injectedTextDecorationsTree.acceptReplace(e,t,n,r)}}function Gr(e){return e.replace(/[^a-z0-9\-_]/gi," ")}class Qr{constructor(e){this.color=e.color||"",this.darkColor=e.darkColor||""}}class Jr extends Qr{constructor(e){super(e),this._resolvedColor=null,this.position="number"==typeof e.position?e.position:de.A5.Center}getColor(e){return this._resolvedColor||("light"!==e.type&&this.darkColor?this._resolvedColor=this._resolveColor(this.darkColor,e):this._resolvedColor=this._resolveColor(this.color,e)),this._resolvedColor}invalidateCachedColor(){this._resolvedColor=null}_resolveColor(e,t){if("string"==typeof e)return e;const n=e?t.getColor(e.id):null;return n?n.toString():""}}class Yr{constructor(e){this.position=e?.position??de.ZS.Center,this.persistLane=e?.persistLane}}class Xr extends Qr{constructor(e){super(e),this.position=e.position,this.sectionHeaderStyle=e.sectionHeaderStyle??null,this.sectionHeaderText=e.sectionHeaderText??null}getColor(e){return this._resolvedColor||("light"!==e.type&&this.darkColor?this._resolvedColor=this._resolveColor(this.darkColor,e):this._resolvedColor=this._resolveColor(this.color,e)),this._resolvedColor}invalidateCachedColor(){this._resolvedColor=void 0}_resolveColor(e,t){return"string"==typeof e?a.Q1.fromHex(e):t.getColor(e.id)}}class Zr{static from(e){return e instanceof Zr?e:new Zr(e)}constructor(e){this.content=e.content||"",this.inlineClassName=e.inlineClassName||null,this.inlineClassNameAffectsLetterSpacing=e.inlineClassNameAffectsLetterSpacing||!1,this.attachedData=e.attachedData||null,this.cursorStops=e.cursorStops||null}}class ei{static register(e){return new ei(e)}static createDynamic(e){return new ei(e)}constructor(e){this.description=e.description,this.blockClassName=e.blockClassName?Gr(e.blockClassName):null,this.blockDoesNotCollapse=e.blockDoesNotCollapse??null,this.blockIsAfterEnd=e.blockIsAfterEnd??null,this.blockPadding=e.blockPadding??null,this.stickiness=e.stickiness||0,this.zIndex=e.zIndex||0,this.className=e.className?Gr(e.className):null,this.shouldFillLineOnLineBreak=e.shouldFillLineOnLineBreak??null,this.hoverMessage=e.hoverMessage||null,this.glyphMarginHoverMessage=e.glyphMarginHoverMessage||null,this.lineNumberHoverMessage=e.lineNumberHoverMessage||null,this.isWholeLine=e.isWholeLine||!1,this.showIfCollapsed=e.showIfCollapsed||!1,this.collapseOnReplaceEdit=e.collapseOnReplaceEdit||!1,this.overviewRuler=e.overviewRuler?new Jr(e.overviewRuler):null,this.minimap=e.minimap?new Xr(e.minimap):null,this.glyphMargin=e.glyphMarginClassName?new Yr(e.glyphMargin):null,this.glyphMarginClassName=e.glyphMarginClassName?Gr(e.glyphMarginClassName):null,this.linesDecorationsClassName=e.linesDecorationsClassName?Gr(e.linesDecorationsClassName):null,this.lineNumberClassName=e.lineNumberClassName?Gr(e.lineNumberClassName):null,this.linesDecorationsTooltip=e.linesDecorationsTooltip?c.jy(e.linesDecorationsTooltip):null,this.firstLineDecorationClassName=e.firstLineDecorationClassName?Gr(e.firstLineDecorationClassName):null,this.marginClassName=e.marginClassName?Gr(e.marginClassName):null,this.inlineClassName=e.inlineClassName?Gr(e.inlineClassName):null,this.inlineClassNameAffectsLetterSpacing=e.inlineClassNameAffectsLetterSpacing||!1,this.beforeContentClassName=e.beforeContentClassName?Gr(e.beforeContentClassName):null,this.afterContentClassName=e.afterContentClassName?Gr(e.afterContentClassName):null,this.after=e.after?Zr.from(e.after):null,this.before=e.before?Zr.from(e.before):null,this.hideInCommentTokens=e.hideInCommentTokens??!1,this.hideInStringTokens=e.hideInStringTokens??!1}}ei.EMPTY=ei.register({description:"empty"});const ti=[ei.register({description:"tracked-range-always-grows-when-typing-at-edges",stickiness:0}),ei.register({description:"tracked-range-never-grows-when-typing-at-edges",stickiness:1}),ei.register({description:"tracked-range-grows-only-when-typing-before",stickiness:2}),ei.register({description:"tracked-range-grows-only-when-typing-after",stickiness:3})];function ni(e){return e instanceof ei?e:ei.createDynamic(e)}class ri extends i.jG{constructor(e){super(),this.handleBeforeFire=e,this._actual=this._register(new r.vl),this.event=this._actual.event,this._affectedInjectedTextLines=null,this._deferredCnt=0,this._shouldFireDeferred=!1,this._affectsMinimap=!1,this._affectsOverviewRuler=!1,this._affectsGlyphMargin=!1,this._affectsLineNumber=!1}beginDeferredEmit(){this._deferredCnt++}endDeferredEmit(){this._deferredCnt--,0===this._deferredCnt&&(this._shouldFireDeferred&&this.doFire(),this._affectedInjectedTextLines?.clear(),this._affectedInjectedTextLines=null)}recordLineAffectedByInjectedText(e){this._affectedInjectedTextLines||(this._affectedInjectedTextLines=new Set),this._affectedInjectedTextLines.add(e)}checkAffectedAndFire(e){this._affectsMinimap||=!!e.minimap?.position,this._affectsOverviewRuler||=!!e.overviewRuler?.color,this._affectsGlyphMargin||=!!e.glyphMarginClassName,this._affectsLineNumber||=!!e.lineNumberClassName,this.tryFire()}fire(){this._affectsMinimap=!0,this._affectsOverviewRuler=!0,this._affectsGlyphMargin=!0,this.tryFire()}tryFire(){0===this._deferredCnt?this.doFire():this._shouldFireDeferred=!0}doFire(){this.handleBeforeFire(this._affectedInjectedTextLines);const e={affectsMinimap:this._affectsMinimap,affectsOverviewRuler:this._affectsOverviewRuler,affectsGlyphMargin:this._affectsGlyphMargin,affectsLineNumber:this._affectsLineNumber};this._shouldFireDeferred=!1,this._affectsMinimap=!1,this._affectsOverviewRuler=!1,this._affectsGlyphMargin=!1,this._actual.fire(e)}}class ii extends i.jG{constructor(){super(),this._fastEmitter=this._register(new r.vl),this.fastEvent=this._fastEmitter.event,this._slowEmitter=this._register(new r.vl),this.slowEvent=this._slowEmitter.event,this._deferredCnt=0,this._deferredEvent=null}beginDeferredEmit(){this._deferredCnt++}endDeferredEmit(e=null){if(this._deferredCnt--,0===this._deferredCnt&&null!==this._deferredEvent){this._deferredEvent.rawContentChangedEvent.resultingSelection=e;const t=this._deferredEvent;this._deferredEvent=null,this._fastEmitter.fire(t),this._slowEmitter.fire(t)}}fire(e){this._deferredCnt>0?this._deferredEvent?this._deferredEvent=this._deferredEvent.merge(e):this._deferredEvent=e:(this._fastEmitter.fire(e),this._slowEmitter.fire(e))}}var si,oi=n(6693),ai=n(9517),li=n(4427),ci=n(8581),hi=function(e,t){return function(n,r){t(n,r,e)}};function di(e){return e.toString()}class ui{constructor(e,t,n){this.model=e,this._modelEventListeners=new i.Cm,this.model=e,this._modelEventListeners.add(e.onWillDispose(()=>t(e))),this._modelEventListeners.add(e.onDidChangeLanguage(t=>n(e,t)))}dispose(){this._modelEventListeners.dispose()}}const pi=s.j9||s.zx?1:2;class mi{constructor(e,t,n,r,i,s,o,a){this.uri=e,this.initialUndoRedoSnapshot=t,this.time=n,this.sharesUndoRedoStack=r,this.heapSize=i,this.sha1=s,this.versionId=o,this.alternativeVersionId=a}}let fi=class extends i.jG{static{si=this}static{this.MAX_MEMORY_FOR_CLOSED_FILES_UNDO_STACK=20971520}constructor(e,t,n,i){super(),this._configurationService=e,this._resourcePropertiesService=t,this._undoRedoService=n,this._instantiationService=i,this._onModelAdded=this._register(new r.vl),this.onModelAdded=this._onModelAdded.event,this._onModelRemoved=this._register(new r.vl),this.onModelRemoved=this._onModelRemoved.event,this._onModelModeChanged=this._register(new r.vl),this.onModelLanguageChanged=this._onModelModeChanged.event,this._modelCreationOptionsByLanguageAndResource=Object.create(null),this._models={},this._disposedModels=new Map,this._disposedModelsHeapSize=0,this._register(this._configurationService.onDidChangeConfiguration(e=>this._updateModelOptions(e))),this._updateModelOptions(void 0)}static _readModelOptions(e,t){let n=g.tabSize;if(e.editor&&void 0!==e.editor.tabSize){const t=parseInt(e.editor.tabSize,10);isNaN(t)||(n=t),n<1&&(n=1)}let r="tabSize";if(e.editor&&void 0!==e.editor.indentSize&&"tabSize"!==e.editor.indentSize){const t=parseInt(e.editor.indentSize,10);isNaN(t)||(r=Math.max(t,1))}let i=g.insertSpaces;e.editor&&void 0!==e.editor.insertSpaces&&(i="false"!==e.editor.insertSpaces&&Boolean(e.editor.insertSpaces));let s=pi;const o=e.eol;"\r\n"===o?s=2:"\n"===o&&(s=1);let a=g.trimAutoWhitespace;e.editor&&void 0!==e.editor.trimAutoWhitespace&&(a="false"!==e.editor.trimAutoWhitespace&&Boolean(e.editor.trimAutoWhitespace));let l=g.detectIndentation;e.editor&&void 0!==e.editor.detectIndentation&&(l="false"!==e.editor.detectIndentation&&Boolean(e.editor.detectIndentation));let c=g.largeFileOptimizations;e.editor&&void 0!==e.editor.largeFileOptimizations&&(c="false"!==e.editor.largeFileOptimizations&&Boolean(e.editor.largeFileOptimizations));let h=g.bracketPairColorizationOptions;return e.editor?.bracketPairColorization&&"object"==typeof e.editor.bracketPairColorization&&(h={enabled:!!e.editor.bracketPairColorization.enabled,independentColorPoolPerBracketType:!!e.editor.bracketPairColorization.independentColorPoolPerBracketType}),{isForSimpleWidget:t,tabSize:n,indentSize:r,insertSpaces:i,detectIndentation:l,defaultEOL:s,trimAutoWhitespace:a,largeFileOptimizations:c,bracketPairColorizationOptions:h}}_getEOL(e,t){if(e)return this._resourcePropertiesService.getEOL(e,t);const n=this._configurationService.getValue("files.eol",{overrideIdentifier:t});return n&&"string"==typeof n&&"auto"!==n?n:3===s.OS||2===s.OS?"\n":"\r\n"}_shouldRestoreUndoStack(){const e=this._configurationService.getValue("files.restoreUndoStack");return"boolean"!=typeof e||e}getCreationOptions(e,t,n){const r="string"==typeof e?e:e.languageId;let i=this._modelCreationOptionsByLanguageAndResource[r+t];if(!i){const e=this._configurationService.getValue("editor",{overrideIdentifier:r,resource:t}),s=this._getEOL(t,r);i=si._readModelOptions({editor:e,eol:s},n),this._modelCreationOptionsByLanguageAndResource[r+t]=i}return i}_updateModelOptions(e){const t=this._modelCreationOptionsByLanguageAndResource;this._modelCreationOptionsByLanguageAndResource=Object.create(null);const n=Object.keys(this._models);for(let r=0,i=n.length;re){const t=[];for(this._disposedModels.forEach(e=>{e.sharesUndoRedoStack||t.push(e)}),t.sort((e,t)=>e.time-t.time);t.length>0&&this._disposedModelsHeapSize>e;){const e=t.shift();this._removeDisposedModel(e.uri),null!==e.initialUndoRedoSnapshot&&this._undoRedoService.restoreSnapshot(e.initialUndoRedoSnapshot)}}}_createModelData(e,t,n,r){const i=this.getCreationOptions(t,n,r),s=this._instantiationService.createInstance(qr,e,t,i,n);if(n&&this._disposedModels.has(di(n))){const e=this._removeDisposedModel(n),t=this._undoRedoService.getElements(n),r=this._getSHA1Computer(),i=!!r.canComputeSHA1(s)&&r.computeSHA1(s)===e.sha1;if(i||e.sharesUndoRedoStack){for(const e of t.past)zt(e)&&e.matchesResource(n)&&e.setModel(s);for(const e of t.future)zt(e)&&e.matchesResource(n)&&e.setModel(s);this._undoRedoService.setElementsValidFlag(n,!0,e=>zt(e)&&e.matchesResource(n)),i&&(s._overwriteVersionId(e.versionId),s._overwriteAlternativeVersionId(e.alternativeVersionId),s._overwriteInitialUndoRedoSnapshot(e.initialUndoRedoSnapshot))}else null!==e.initialUndoRedoSnapshot&&this._undoRedoService.restoreSnapshot(e.initialUndoRedoSnapshot)}const o=di(s.uri);if(this._models[o])throw new Error("ModelService: Cannot add model because it already exists!");const a=new ui(s,e=>this._onWillDispose(e),(e,t)=>this._onDidChangeLanguage(e,t));return this._models[o]=a,a}createModel(e,t,n,r=!1){let i;return i=t?this._createModelData(e,t,n,r):this._createModelData(e,K.vH,n,r),this._onModelAdded.fire(i.model),i.model}getModels(){const e=[],t=Object.keys(this._models);for(let n=0,r=t.length;n0||t.future.length>0){for(const n of t.past)zt(n)&&n.matchesResource(e.uri)&&(i=!0,s+=n.heapSize(e.uri),n.setModel(e.uri));for(const n of t.future)zt(n)&&n.matchesResource(e.uri)&&(i=!0,s+=n.heapSize(e.uri),n.setModel(e.uri))}}const o=si.MAX_MEMORY_FOR_CLOSED_FILES_UNDO_STACK,a=this._getSHA1Computer();if(i)if(r||!(s>o)&&a.canComputeSHA1(e))this._ensureDisposedModelsHeapSize(o-s),this._undoRedoService.setElementsValidFlag(e.uri,!1,t=>zt(t)&&t.matchesResource(e.uri)),this._insertDisposedModel(new mi(e.uri,n.model.getInitialUndoRedoSnapshot(),Date.now(),r,s,a.computeSHA1(e),e.getVersionId(),e.getAlternativeVersionId()));else{const e=n.model.getInitialUndoRedoSnapshot();null!==e&&this._undoRedoService.restoreSnapshot(e)}else if(!r){const e=n.model.getInitialUndoRedoSnapshot();null!==e&&this._undoRedoService.restoreSnapshot(e)}delete this._models[t],n.dispose(),delete this._modelCreationOptionsByLanguageAndResource[e.getLanguageId()+e.uri],this._onModelRemoved.fire(e)}_onDidChangeLanguage(e,t){const n=t.oldLanguage,r=e.getLanguageId(),i=this.getCreationOptions(n,e.uri,e.isForSimpleWidget),s=this.getCreationOptions(r,e.uri,e.isForSimpleWidget);si._setModelOptionsForModel(e,s,i),this._onModelModeChanged.fire({model:e,oldLanguageId:n})}_getSHA1Computer(){return new gi}};fi=si=function(e,t,n,r){var i,s=arguments.length,o=s<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,n,r);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(o=(s<3?i(o):s>3?i(t,n,o):i(t,n))||o);return s>3&&o&&Object.defineProperty(t,n,o),o}([hi(0,q.pG),hi(1,oi.ITextResourcePropertiesService),hi(2,Mr),hi(3,$._Y)],fi);class gi{static{this.MAX_MODEL_SIZE=10485760}canComputeSHA1(e){return e.getValueLength()<=gi.MAX_MODEL_SIZE}computeSHA1(e){const t=new ai.v7,n=e.createSnapshot();let r;for(;r=n.read();)t.update(r);return t.digest()}}},9956:(e,t,n)=>{"use strict";n.r(t),n.d(t,{MirrorModel:()=>b,STOP_SYNC_MODEL_DELTA_TIME_MS:()=>m,WorkerTextModelSyncClient:()=>f,WorkerTextModelSyncServer:()=>g});var r=n(2735),i=n(6274),s=n(695),o=n(8274),a=n(800),l=n(8281),c=n(5603),h=(n(1211),n(4901));class d{constructor(e){this.values=e,this.prefixSum=new Uint32Array(e.length),this.prefixSumValidIndex=new Int32Array(1),this.prefixSumValidIndex[0]=-1}insertValues(e,t){e=(0,h.j)(e);const n=this.values,r=this.prefixSum,i=t.length;return 0!==i&&(this.values=new Uint32Array(n.length+i),this.values.set(n.subarray(0,e),0),this.values.set(n.subarray(e),e+i),this.values.set(t,e),e-1=0&&this.prefixSum.set(r.subarray(0,this.prefixSumValidIndex[0]+1)),!0)}setValue(e,t){return e=(0,h.j)(e),t=(0,h.j)(t),this.values[e]!==t&&(this.values[e]=t,e-1=n.length)return!1;const i=n.length-e;return t>=i&&(t=i),0!==t&&(this.values=new Uint32Array(n.length-t),this.values.set(n.subarray(0,e),0),this.values.set(n.subarray(e+t),e),this.prefixSum=new Uint32Array(this.values.length),e-1=0&&this.prefixSum.set(r.subarray(0,this.prefixSumValidIndex[0]+1)),!0)}getTotalSum(){return 0===this.values.length?0:this._getPrefixSum(this.values.length-1)}getPrefixSum(e){return e<0?0:(e=(0,h.j)(e),this._getPrefixSum(e))}_getPrefixSum(e){if(e<=this.prefixSumValidIndex[0])return this.prefixSum[e];let t=this.prefixSumValidIndex[0]+1;0===t&&(this.prefixSum[0]=this.values[0],t++),e>=this.values.length&&(e=this.values.length-1);for(let n=t;n<=e;n++)this.prefixSum[n]=this.prefixSum[n-1]+this.values[n];return this.prefixSumValidIndex[0]=Math.max(this.prefixSumValidIndex[0],e),this.prefixSum[e]}getIndexOf(e){e=Math.floor(e),this.getTotalSum();let t=0,n=this.values.length-1,r=0,i=0,s=0;for(;t<=n;)if(r=t+(n-t)/2|0,i=this.prefixSum[r],s=i-this.values[r],e=i))break;t=r+1}return new u(r,e-s)}}class u{constructor(e,t){this.index=e,this.remainder=t,this._prefixSumIndexOfResultBrand=void 0,this.index=e,this.remainder=t}}class p{constructor(e,t,n,r){this._uri=e,this._lines=t,this._eol=n,this._versionId=r,this._lineStarts=null,this._cachedTextValue=null}dispose(){this._lines.length=0}get version(){return this._versionId}getText(){return null===this._cachedTextValue&&(this._cachedTextValue=this._lines.join(this._eol)),this._cachedTextValue}onEvents(e){e.eol&&e.eol!==this._eol&&(this._eol=e.eol,this._lineStarts=null);const t=e.changes;for(const e of t)this._acceptDeleteRange(e.range),this._acceptInsertText(new o.y(e.range.startLineNumber,e.range.startColumn),e.text);this._versionId=e.versionId,this._cachedTextValue=null}_ensureLineStarts(){if(!this._lineStarts){const e=this._eol.length,t=this._lines.length,n=new Uint32Array(t);for(let r=0;rthis._checkStopModelSync(),Math.round(m/2)),this._register(e)}}dispose(){for(const e in this._syncedModels)(0,i.AS)(this._syncedModels[e]);this._syncedModels=Object.create(null),this._syncedModelsLastUsedTime=Object.create(null),super.dispose()}ensureSyncedResources(e,t=!1){for(const n of e){const e=n.toString();this._syncedModels[e]||this._beginModelSync(n,t),this._syncedModels[e]&&(this._syncedModelsLastUsedTime[e]=(new Date).getTime())}}_checkStopModelSync(){const e=(new Date).getTime(),t=[];for(const n in this._syncedModelsLastUsedTime)e-this._syncedModelsLastUsedTime[n]>m&&t.push(n);for(const e of t)this._stopModelSync(e)}_beginModelSync(e,t){const n=this._modelService.getModel(e);if(!n)return;if(!t&&n.isTooLargeForSyncing())return;const r=e.toString();this._proxy.$acceptNewModel({url:n.uri.toString(),lines:n.getLinesContent(),EOL:n.getEOL(),versionId:n.getVersionId()});const s=new i.Cm;s.add(n.onDidChangeContent(e=>{this._proxy.$acceptModelChanged(r.toString(),e)})),s.add(n.onWillDispose(()=>{this._stopModelSync(r)})),s.add((0,i.s)(()=>{this._proxy.$acceptRemovedModel(r)})),this._syncedModels[r]=s}_stopModelSync(e){const t=this._syncedModels[e];delete this._syncedModels[e],delete this._syncedModelsLastUsedTime[e],(0,i.AS)(t)}}class g{constructor(){this._models=Object.create(null)}getModel(e){return this._models[e]}getModels(){const e=[];return Object.keys(this._models).forEach(t=>e.push(this._models[t])),e}$acceptNewModel(e){this._models[e.url]=new b(s.r.parse(e.url),e.lines,e.EOL,e.versionId)}$acceptModelChanged(e,t){this._models[e]&&this._models[e].onEvents(t)}$acceptRemovedModel(e){this._models[e]&&delete this._models[e]}}class b extends p{get uri(){return this._uri}get eol(){return this._eol}getValue(){return this.getText()}findMatches(e){const t=[];for(let n=0;nthis._lines.length)t=this._lines.length,n=this._lines[t-1].length+1,r=!0;else{const e=this._lines[t-1].length+1;n<1?(n=1,r=!0):n>e&&(n=e,r=!0)}return r?{lineNumber:t,column:n}:e}}},9996:(e,t,n)=>{"use strict";n.d(t,{B6:()=>f,P8:()=>u});var r=n(1905),i=n(4427),s=n(9130),o=n(6206),a=n(5603),l=n(695);function c(e){return(0,l.I)(e,!0)}class h{constructor(e){this._ignorePathCasing=e}compare(e,t,n=!1){return e===t?0:(0,a.UD)(this.getComparisonKey(e,n),this.getComparisonKey(t,n))}isEqual(e,t,n=!1){return e===t||!(!e||!t)&&this.getComparisonKey(e,n)===this.getComparisonKey(t,n)}getComparisonKey(e,t=!1){return e.with({path:this._ignorePathCasing(e)?e.path.toLowerCase():void 0,fragment:t?null:void 0}).toString()}isEqualOrParent(e,t,n=!1){if(e.scheme===t.scheme){if(e.scheme===i.ny.file)return r._1(c(e),c(t),this._ignorePathCasing(e))&&e.query===t.query&&(n||e.fragment===t.fragment);if(p(e.authority,t.authority))return r._1(e.path,t.path,this._ignorePathCasing(e),"/")&&e.query===t.query&&(n||e.fragment===t.fragment)}return!1}joinPath(e,...t){return l.r.joinPath(e,...t)}basenameOrAuthority(e){return u(e)||e.authority}basename(e){return s.SA.basename(e.path)}extname(e){return s.SA.extname(e.path)}dirname(e){if(0===e.path.length)return e;let t;return e.scheme===i.ny.file?t=l.r.file(s.pD(c(e))).path:(t=s.SA.dirname(e.path),e.authority&&t.length&&47!==t.charCodeAt(0)&&(console.error(`dirname("${e.toString})) resulted in a relative path`),t="/")),e.with({path:t})}normalizePath(e){if(!e.path.length)return e;let t;return t=e.scheme===i.ny.file?l.r.file(s.S8(c(e))).path:s.SA.normalize(e.path),e.with({path:t})}relativePath(e,t){if(e.scheme!==t.scheme||!p(e.authority,t.authority))return;if(e.scheme===i.ny.file){const n=s.V8(c(e),c(t));return o.uF?r.TH(n):n}let n=e.path||"/";const a=t.path||"/";if(this._ignorePathCasing(e)){let e=0;for(const t=Math.min(n.length,a.length);er.Zn(n).length&&n[n.length-1]===t}{const t=e.path;return t.length>1&&47===t.charCodeAt(t.length-1)&&!/^[a-zA-Z]:(\/$|\\$)/.test(e.fsPath)}}removeTrailingPathSeparator(e,t=s.Vn){return m(e,t)?e.with({path:e.path.substr(0,e.path.length-1)}):e}addTrailingPathSeparator(e,t=s.Vn){let n=!1;if(e.scheme===i.ny.file){const i=c(e);n=void 0!==i&&i.length===r.Zn(i).length&&i[i.length-1]===t}else{t="/";const r=e.path;n=1===r.length&&47===r.charCodeAt(r.length-1)}return n||m(e,t)?e:e.with({path:e.path+"/"})}}const d=new h(()=>!1),u=(new h(e=>e.scheme!==i.ny.file||!o.j9),new h(e=>!0),d.isEqual.bind(d),d.isEqualOrParent.bind(d),d.getComparisonKey.bind(d),d.basenameOrAuthority.bind(d),d.basename.bind(d)),p=(d.extname.bind(d),d.dirname.bind(d),d.joinPath.bind(d),d.normalizePath.bind(d),d.relativePath.bind(d),d.resolvePath.bind(d),d.isAbsolutePath.bind(d),d.isEqualAuthority.bind(d)),m=d.hasTrailingPathSeparator.bind(d);var f;d.removeTrailingPathSeparator.bind(d),d.addTrailingPathSeparator.bind(d),function(e){e.META_DATA_LABEL="label",e.META_DATA_DESCRIPTION="description",e.META_DATA_SIZE="size",e.META_DATA_MIME="mime",e.parseMetaData=function(t){const n=new Map;t.path.substring(t.path.indexOf(";")+1,t.path.lastIndexOf(";")).split(";").forEach(e=>{const[t,r]=e.split(":");t&&r&&n.set(t,r)});const r=t.path.substring(0,t.path.indexOf(";"));return r&&n.set(e.META_DATA_MIME,r),n}}(f||(f={}))}},t={};function n(r){var i=t[r];if(void 0!==i)return i.exports;var s=t[r]={exports:{}};return e[r](s,s.exports,n),s.exports}n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.e=()=>Promise.resolve(),n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{"use strict";var e=n(3142),t=n(2803),r=n(3085);let i=!1;function s(n){if(i)return;i=!0;const s=new e.SimpleWorkerServer(e=>{globalThis.postMessage(e)},e=>new t.EditorSimpleWorker(r.EditorWorkerHost.getChannel(e),n));globalThis.onmessage=e=>{s.onmessage(e.data)}}var o,a;globalThis.onmessage=e=>{i||s(null)},(a=o||(o={}))[a.Ident=0]="Ident",a[a.AtKeyword=1]="AtKeyword",a[a.String=2]="String",a[a.BadString=3]="BadString",a[a.UnquotedString=4]="UnquotedString",a[a.Hash=5]="Hash",a[a.Num=6]="Num",a[a.Percentage=7]="Percentage",a[a.Dimension=8]="Dimension",a[a.UnicodeRange=9]="UnicodeRange",a[a.CDO=10]="CDO",a[a.CDC=11]="CDC",a[a.Colon=12]="Colon",a[a.SemiColon=13]="SemiColon",a[a.CurlyL=14]="CurlyL",a[a.CurlyR=15]="CurlyR",a[a.ParenthesisL=16]="ParenthesisL",a[a.ParenthesisR=17]="ParenthesisR",a[a.BracketL=18]="BracketL",a[a.BracketR=19]="BracketR",a[a.Whitespace=20]="Whitespace",a[a.Includes=21]="Includes",a[a.Dashmatch=22]="Dashmatch",a[a.SubstringOperator=23]="SubstringOperator",a[a.PrefixOperator=24]="PrefixOperator",a[a.SuffixOperator=25]="SuffixOperator",a[a.Delim=26]="Delim",a[a.EMS=27]="EMS",a[a.EXS=28]="EXS",a[a.Length=29]="Length",a[a.Angle=30]="Angle",a[a.Time=31]="Time",a[a.Freq=32]="Freq",a[a.Exclamation=33]="Exclamation",a[a.Resolution=34]="Resolution",a[a.Comma=35]="Comma",a[a.Charset=36]="Charset",a[a.EscapedJavaScript=37]="EscapedJavaScript",a[a.BadEscapedJavaScript=38]="BadEscapedJavaScript",a[a.Comment=39]="Comment",a[a.SingleLineComment=40]="SingleLineComment",a[a.EOF=41]="EOF",a[a.ContainerQueryLength=42]="ContainerQueryLength",a[a.CustomToken=43]="CustomToken";var l=class{constructor(e){this.source=e,this.len=e.length,this.position=0}substring(e,t=this.position){return this.source.substring(e,t)}eos(){return this.len<=this.position}pos(){return this.position}goBackTo(e){this.position=e}goBack(e){this.position-=e}advance(e){this.position+=e}nextChar(){return this.source.charCodeAt(this.position++)||0}peekChar(e=0){return this.source.charCodeAt(this.position+e)||0}lookbackChar(e=0){return this.source.charCodeAt(this.position-e)||0}advanceIfChar(e){return e===this.source.charCodeAt(this.position)&&(this.position++,!0)}advanceIfChars(e){if(this.position+e.length>this.source.length)return!1;let t=0;for(;t".charCodeAt(0),I="@".charCodeAt(0),T="#".charCodeAt(0),N="$".charCodeAt(0),R="\\".charCodeAt(0),D="/".charCodeAt(0),A="\n".charCodeAt(0),M="\r".charCodeAt(0),O="\f".charCodeAt(0),z='"'.charCodeAt(0),P="'".charCodeAt(0),B=" ".charCodeAt(0),W="\t".charCodeAt(0),V=";".charCodeAt(0),U=":".charCodeAt(0),$="{".charCodeAt(0),q="}".charCodeAt(0),j="[".charCodeAt(0),K="]".charCodeAt(0),H=",".charCodeAt(0),G=".".charCodeAt(0),Q="!".charCodeAt(0),J="?".charCodeAt(0),Y="+".charCodeAt(0),X={};X[V]=o.SemiColon,X[U]=o.Colon,X[$]=o.CurlyL,X[q]=o.CurlyR,X[K]=o.BracketR,X[j]=o.BracketL,X[S]=o.ParenthesisL,X[E]=o.ParenthesisR,X[H]=o.Comma;var Z={};Z.em=o.EMS,Z.ex=o.EXS,Z.px=o.Length,Z.cm=o.Length,Z.mm=o.Length,Z.in=o.Length,Z.pt=o.Length,Z.pc=o.Length,Z.deg=o.Angle,Z.rad=o.Angle,Z.grad=o.Angle,Z.ms=o.Time,Z.s=o.Time,Z.hz=o.Freq,Z.khz=o.Freq,Z["%"]=o.Percentage,Z.fr=o.Percentage,Z.dpi=o.Resolution,Z.dpcm=o.Resolution,Z.cqw=o.ContainerQueryLength,Z.cqh=o.ContainerQueryLength,Z.cqi=o.ContainerQueryLength,Z.cqb=o.ContainerQueryLength,Z.cqmin=o.ContainerQueryLength,Z.cqmax=o.ContainerQueryLength;var ee,te,ne,re,ie=class{constructor(){this.stream=new l(""),this.ignoreComment=!0,this.ignoreWhitespace=!0,this.inURL=!1}setSource(e){this.stream=new l(e)}finishToken(e,t,n){return{offset:e,len:this.stream.pos()-e,type:t,text:n||this.stream.substring(e)}}substring(e,t){return this.stream.substring(e,e+t)}pos(){return this.stream.pos()}goBackTo(e){this.stream.goBackTo(e)}scanUnquotedString(){const e=this.stream.pos(),t=[];return this._unquotedString(t)?this.finishToken(e,o.UnquotedString,t.join("")):null}scan(){const e=this.trivia();if(null!==e)return e;const t=this.stream.pos();return this.stream.eos()?this.finishToken(t,o.EOF):this.scanNext(t)}tryScanUnicode(){const e=this.stream.pos();if(!this.stream.eos()&&this._unicodeRange())return this.finishToken(e,o.UnicodeRange);this.stream.goBackTo(e)}scanNext(e){if(this.stream.advanceIfChars([F,Q,C,C]))return this.finishToken(e,o.CDO);if(this.stream.advanceIfChars([C,C,L]))return this.finishToken(e,o.CDC);let t=[];if(this.ident(t))return this.finishToken(e,o.Ident,t.join(""));if(this.stream.advanceIfChar(I)){if(t=["@"],this._name(t)){const n=t.join("");return"@charset"===n?this.finishToken(e,o.Charset,n):this.finishToken(e,o.AtKeyword,n)}return this.finishToken(e,o.Delim)}if(this.stream.advanceIfChar(T))return t=["#"],this._name(t)?this.finishToken(e,o.Hash,t.join("")):this.finishToken(e,o.Delim);if(this.stream.advanceIfChar(Q))return this.finishToken(e,o.Exclamation);if(this._number()){const n=this.stream.pos();if(t=[this.stream.substring(e,n)],this.stream.advanceIfChar(k))return this.finishToken(e,o.Percentage);if(this.ident(t)){const r=this.stream.substring(n).toLowerCase(),i=Z[r];return void 0!==i?this.finishToken(e,i,t.join("")):this.finishToken(e,o.Dimension,t.join(""))}return this.finishToken(e,o.Num)}t=[];let n=this._string(t);return null!==n?this.finishToken(e,n,t.join("")):(n=X[this.stream.peekChar()],void 0!==n?(this.stream.advance(1),this.finishToken(e,n)):this.stream.peekChar(0)===b&&this.stream.peekChar(1)===y?(this.stream.advance(2),this.finishToken(e,o.Includes)):this.stream.peekChar(0)===w&&this.stream.peekChar(1)===y?(this.stream.advance(2),this.finishToken(e,o.Dashmatch)):this.stream.peekChar(0)===x&&this.stream.peekChar(1)===y?(this.stream.advance(2),this.finishToken(e,o.SubstringOperator)):this.stream.peekChar(0)===v&&this.stream.peekChar(1)===y?(this.stream.advance(2),this.finishToken(e,o.PrefixOperator)):this.stream.peekChar(0)===N&&this.stream.peekChar(1)===y?(this.stream.advance(2),this.finishToken(e,o.SuffixOperator)):(this.stream.nextChar(),this.finishToken(e,o.Delim)))}trivia(){for(;;){const e=this.stream.pos();if(this._whitespace()){if(!this.ignoreWhitespace)return this.finishToken(e,o.Whitespace)}else{if(!this.comment())return null;if(!this.ignoreComment)return this.finishToken(e,o.Comment)}}}comment(){if(this.stream.advanceIfChars([D,x])){let e=!1,t=!1;return this.stream.advanceWhileChar(n=>t&&n===D?(e=!0,!1):(t=n===x,!0)),e&&this.stream.advance(1),!0}return!1}_number(){let e,t=0;return this.stream.peekChar()===G&&(t=1),e=this.stream.peekChar(t),e>=f&&e<=g&&(this.stream.advance(t+1),this.stream.advanceWhileChar(e=>e>=f&&e<=g||0===t&&e===G),!0)}_newline(e){const t=this.stream.peekChar();switch(t){case M:case O:case A:return this.stream.advance(1),e.push(String.fromCharCode(t)),t===M&&this.stream.advanceIfChar(A)&&e.push("\n"),!0}return!1}_escape(e,t){let n=this.stream.peekChar();if(n===R){this.stream.advance(1),n=this.stream.peekChar();let r=0;for(;r<6&&(n>=f&&n<=g||n>=c&&n<=h||n>=u&&n<=p);)this.stream.advance(1),n=this.stream.peekChar(),r++;if(r>0){try{const t=parseInt(this.stream.substring(this.stream.pos()-r),16);t&&e.push(String.fromCharCode(t))}catch(e){}return n===B||n===W?this.stream.advance(1):this._newline([]),!0}if(n!==M&&n!==O&&n!==A)return this.stream.advance(1),e.push(String.fromCharCode(n)),!0;if(t)return this._newline(e)}return!1}_stringChar(e,t){const n=this.stream.peekChar();return 0!==n&&n!==e&&n!==R&&n!==M&&n!==O&&n!==A&&(this.stream.advance(1),t.push(String.fromCharCode(n)),!0)}_string(e){if(this.stream.peekChar()===P||this.stream.peekChar()===z){const t=this.stream.nextChar();for(e.push(String.fromCharCode(t));this._stringChar(t,e)||this._escape(e,!0););return this.stream.peekChar()===t?(this.stream.nextChar(),e.push(String.fromCharCode(t)),o.String):o.BadString}return null}_unquotedChar(e){const t=this.stream.peekChar();return 0!==t&&t!==R&&t!==P&&t!==z&&t!==S&&t!==E&&t!==B&&t!==W&&t!==A&&t!==O&&t!==M&&(this.stream.advance(1),e.push(String.fromCharCode(t)),!0)}_unquotedString(e){let t=!1;for(;this._unquotedChar(e)||this._escape(e);)t=!0;return t}_whitespace(){return this.stream.advanceWhileChar(e=>e===B||e===W||e===A||e===O||e===M)>0}_name(e){let t=!1;for(;this._identChar(e)||this._escape(e);)t=!0;return t}ident(e){const t=this.stream.pos();if(this._minus(e)){if(this._minus(e)||this._identFirstChar(e)||this._escape(e)){for(;this._identChar(e)||this._escape(e););return!0}}else if(this._identFirstChar(e)||this._escape(e)){for(;this._identChar(e)||this._escape(e););return!0}return this.stream.goBackTo(t),!1}_identFirstChar(e){const t=this.stream.peekChar();return(t===_||t>=c&&t<=d||t>=u&&t<=m||t>=128&&t<=65535)&&(this.stream.advance(1),e.push(String.fromCharCode(t)),!0)}_minus(e){const t=this.stream.peekChar();return t===C&&(this.stream.advance(1),e.push(String.fromCharCode(t)),!0)}_identChar(e){const t=this.stream.peekChar();return(t===_||t===C||t>=c&&t<=d||t>=u&&t<=m||t>=f&&t<=g||t>=128&&t<=65535)&&(this.stream.advance(1),e.push(String.fromCharCode(t)),!0)}_unicodeRange(){if(this.stream.advanceIfChar(Y)){const e=e=>e>=f&&e<=g||e>=c&&e<=h||e>=u&&e<=p,t=this.stream.advanceWhileChar(e)+this.stream.advanceWhileChar(e=>e===J);if(t>=1&&t<=6){if(!this.stream.advanceIfChar(C))return!0;{const t=this.stream.advanceWhileChar(e);if(t>=1&&t<=6)return!0}}}return!1}};function se(e,t){if(e.length0?e.lastIndexOf(t)===n:0===n&&e===t}function ae(e,t=!0){return e?e.length<140?e:e.slice(0,140)+(t?"…":""):""}function le(e,t){let n="";for(;t>0;)1&~t||(n+=e),e+=e,t>>>=1;return n}function ce(e,t){let n=null;return!e||te.end?null:(e.accept(e=>-1===e.offset&&-1===e.length||e.offset<=t&&e.end>=t&&(n?e.length<=n.length&&(n=e):n=e,!0)),n)}function he(e,t){let n=ce(e,t);const r=[];for(;n;)r.unshift(n),n=n.parent;return r}(te=ee||(ee={}))[te.Undefined=0]="Undefined",te[te.Identifier=1]="Identifier",te[te.Stylesheet=2]="Stylesheet",te[te.Ruleset=3]="Ruleset",te[te.Selector=4]="Selector",te[te.SimpleSelector=5]="SimpleSelector",te[te.SelectorInterpolation=6]="SelectorInterpolation",te[te.SelectorCombinator=7]="SelectorCombinator",te[te.SelectorCombinatorParent=8]="SelectorCombinatorParent",te[te.SelectorCombinatorSibling=9]="SelectorCombinatorSibling",te[te.SelectorCombinatorAllSiblings=10]="SelectorCombinatorAllSiblings",te[te.SelectorCombinatorShadowPiercingDescendant=11]="SelectorCombinatorShadowPiercingDescendant",te[te.Page=12]="Page",te[te.PageBoxMarginBox=13]="PageBoxMarginBox",te[te.ClassSelector=14]="ClassSelector",te[te.IdentifierSelector=15]="IdentifierSelector",te[te.ElementNameSelector=16]="ElementNameSelector",te[te.PseudoSelector=17]="PseudoSelector",te[te.AttributeSelector=18]="AttributeSelector",te[te.Declaration=19]="Declaration",te[te.Declarations=20]="Declarations",te[te.Property=21]="Property",te[te.Expression=22]="Expression",te[te.BinaryExpression=23]="BinaryExpression",te[te.Term=24]="Term",te[te.Operator=25]="Operator",te[te.Value=26]="Value",te[te.StringLiteral=27]="StringLiteral",te[te.URILiteral=28]="URILiteral",te[te.EscapedValue=29]="EscapedValue",te[te.Function=30]="Function",te[te.NumericValue=31]="NumericValue",te[te.HexColorValue=32]="HexColorValue",te[te.RatioValue=33]="RatioValue",te[te.MixinDeclaration=34]="MixinDeclaration",te[te.MixinReference=35]="MixinReference",te[te.VariableName=36]="VariableName",te[te.VariableDeclaration=37]="VariableDeclaration",te[te.Prio=38]="Prio",te[te.Interpolation=39]="Interpolation",te[te.NestedProperties=40]="NestedProperties",te[te.ExtendsReference=41]="ExtendsReference",te[te.SelectorPlaceholder=42]="SelectorPlaceholder",te[te.Debug=43]="Debug",te[te.If=44]="If",te[te.Else=45]="Else",te[te.For=46]="For",te[te.Each=47]="Each",te[te.While=48]="While",te[te.MixinContentReference=49]="MixinContentReference",te[te.MixinContentDeclaration=50]="MixinContentDeclaration",te[te.Media=51]="Media",te[te.Keyframe=52]="Keyframe",te[te.FontFace=53]="FontFace",te[te.Import=54]="Import",te[te.Namespace=55]="Namespace",te[te.Invocation=56]="Invocation",te[te.FunctionDeclaration=57]="FunctionDeclaration",te[te.ReturnStatement=58]="ReturnStatement",te[te.MediaQuery=59]="MediaQuery",te[te.MediaCondition=60]="MediaCondition",te[te.MediaFeature=61]="MediaFeature",te[te.FunctionParameter=62]="FunctionParameter",te[te.FunctionArgument=63]="FunctionArgument",te[te.KeyframeSelector=64]="KeyframeSelector",te[te.ViewPort=65]="ViewPort",te[te.Document=66]="Document",te[te.AtApplyRule=67]="AtApplyRule",te[te.CustomPropertyDeclaration=68]="CustomPropertyDeclaration",te[te.CustomPropertySet=69]="CustomPropertySet",te[te.ListEntry=70]="ListEntry",te[te.Supports=71]="Supports",te[te.SupportsCondition=72]="SupportsCondition",te[te.NamespacePrefix=73]="NamespacePrefix",te[te.GridLine=74]="GridLine",te[te.Plugin=75]="Plugin",te[te.UnknownAtRule=76]="UnknownAtRule",te[te.Use=77]="Use",te[te.ModuleConfiguration=78]="ModuleConfiguration",te[te.Forward=79]="Forward",te[te.ForwardVisibility=80]="ForwardVisibility",te[te.Module=81]="Module",te[te.UnicodeRange=82]="UnicodeRange",te[te.Layer=83]="Layer",te[te.LayerNameList=84]="LayerNameList",te[te.LayerName=85]="LayerName",te[te.PropertyAtRule=86]="PropertyAtRule",te[te.Container=87]="Container",(re=ne||(ne={}))[re.Mixin=0]="Mixin",re[re.Rule=1]="Rule",re[re.Variable=2]="Variable",re[re.Function=3]="Function",re[re.Keyframe=4]="Keyframe",re[re.Unknown=5]="Unknown",re[re.Module=6]="Module",re[re.Forward=7]="Forward",re[re.ForwardVisibility=8]="ForwardVisibility",re[re.Property=9]="Property";var de,ue,pe=class{get end(){return this.offset+this.length}constructor(e=-1,t=-1,n){this.parent=null,this.offset=e,this.length=t,n&&(this.nodeType=n)}set type(e){this.nodeType=e}get type(){return this.nodeType||ee.Undefined}getTextProvider(){let e=this;for(;e&&!e.textProvider;)e=e.parent;return e?e.textProvider:()=>"unknown"}getText(){return this.getTextProvider()(this.offset,this.length)}matches(e){return this.length===e.length&&this.getTextProvider()(this.offset,this.length)===e}startsWith(e){return this.length>=e.length&&this.getTextProvider()(this.offset,e.length)===e}endsWith(e){return this.length>=e.length&&this.getTextProvider()(this.end-e.length,e.length)===e}accept(e){if(e(this)&&this.children)for(const t of this.children)t.accept(e)}acceptVisitor(e){this.accept(e.visitNode.bind(e))}adoptChild(e,t=-1){if(e.parent&&e.parent.children){const t=e.parent.children.indexOf(e);t>=0&&e.parent.children.splice(t,1)}e.parent=this;let n=this.children;return n||(n=this.children=[]),-1!==t?n.splice(t,0,e):n.push(e),e}attachTo(e,t=-1){return e&&e.adoptChild(this,t),this}collectIssues(e){this.issues&&e.push.apply(e,this.issues)}addIssue(e){this.issues||(this.issues=[]),this.issues.push(e)}hasIssue(e){return Array.isArray(this.issues)&&this.issues.some(t=>t.getRule()===e)}isErroneous(e=!1){return!!(this.issues&&this.issues.length>0)||e&&Array.isArray(this.children)&&this.children.some(e=>e.isErroneous(!0))}setNode(e,t,n=-1){return!!t&&(t.attachTo(this,n),this[e]=t,!0)}addChild(e){return!!e&&(this.children||(this.children=[]),e.attachTo(this),this.updateOffsetAndLength(e),!0)}updateOffsetAndLength(e){(e.offsetthis.end||-1===this.length)&&(this.length=t-this.offset)}hasChildren(){return!!this.children&&this.children.length>0}getChildren(){return this.children?this.children.slice(0):[]}getChild(e){return this.children&&e=0;n--)if(t=this.children[n],t.offset<=e)return t}return null}findChildAtOffset(e,t){const n=this.findFirstChildBeforeOffset(e);return n&&n.end>=e?t&&n.findChildAtOffset(e,!0)||n:null}encloses(e){return this.offset<=e.offset&&this.offset+this.length>=e.offset+e.length}getParent(){let e=this.parent;for(;e instanceof me;)e=e.parent;return e}findParent(e){let t=this;for(;t&&t.type!==e;)t=t.parent;return t}findAParent(...e){let t=this;for(;t&&!e.some(e=>t.type===e);)t=t.parent;return t}setData(e,t){this.options||(this.options={}),this.options[e]=t}getData(e){return this.options&&this.options.hasOwnProperty(e)?this.options[e]:null}},me=class extends pe{constructor(e,t=-1){super(-1,-1),this.attachTo(e,t),this.offset=-1,this.length=-1}},fe=class extends pe{constructor(e,t){super(e,t)}get type(){return ee.UnicodeRange}setRangeStart(e){return this.setNode("rangeStart",e)}getRangeStart(){return this.rangeStart}setRangeEnd(e){return this.setNode("rangeEnd",e)}getRangeEnd(){return this.rangeEnd}},ge=class extends pe{constructor(e,t){super(e,t),this.isCustomProperty=!1}get type(){return ee.Identifier}containsInterpolation(){return this.hasChildren()}},be=class extends pe{constructor(e,t){super(e,t)}get type(){return ee.Stylesheet}},ve=class extends pe{constructor(e,t){super(e,t)}get type(){return ee.Declarations}},ye=class extends pe{constructor(e,t){super(e,t)}getDeclarations(){return this.declarations}setDeclarations(e){return this.setNode("declarations",e)}},we=class extends ye{constructor(e,t){super(e,t)}get type(){return ee.Ruleset}getSelectors(){return this.selectors||(this.selectors=new me(this)),this.selectors}isNested(){return!!this.parent&&null!==this.parent.findParent(ee.Declarations)}},Ce=class extends pe{constructor(e,t){super(e,t)}get type(){return ee.Selector}},_e=class extends pe{constructor(e,t){super(e,t)}get type(){return ee.SimpleSelector}},ke=class extends pe{constructor(e,t){super(e,t)}},xe=class extends ye{constructor(e,t){super(e,t)}get type(){return ee.CustomPropertySet}},Se=class e extends ke{constructor(e,t){super(e,t),this.property=null}get type(){return ee.Declaration}setProperty(e){return this.setNode("property",e)}getProperty(){return this.property}getFullPropertyName(){const t=this.property?this.property.getName():"unknown";if(this.parent instanceof ve&&this.parent.getParent()instanceof We){const n=this.parent.getParent().getParent();if(n instanceof e)return n.getFullPropertyName()+t}return t}getNonPrefixedPropertyName(){const e=this.getFullPropertyName();if(e&&"-"===e.charAt(0)){const t=e.indexOf("-",1);if(-1!==t)return e.substring(t+1)}return e}setValue(e){return this.setNode("value",e)}getValue(){return this.value}setNestedProperties(e){return this.setNode("nestedProperties",e)}getNestedProperties(){return this.nestedProperties}},Ee=class extends Se{constructor(e,t){super(e,t)}get type(){return ee.CustomPropertyDeclaration}setPropertySet(e){return this.setNode("propertySet",e)}getPropertySet(){return this.propertySet}},Fe=class extends pe{constructor(e,t){super(e,t)}get type(){return ee.Property}setIdentifier(e){return this.setNode("identifier",e)}getIdentifier(){return this.identifier}getName(){return function(e){const t=/[_\+]+$/.exec(e);return t&&t[0].length?e.substr(0,e.length-t[0].length):e}(this.getText())}isCustomProperty(){return!!this.identifier&&this.identifier.isCustomProperty}},Le=class extends pe{constructor(e,t){super(e,t)}get type(){return ee.Invocation}getArguments(){return this.arguments||(this.arguments=new me(this)),this.arguments}},Ie=class extends Le{constructor(e,t){super(e,t)}get type(){return ee.Function}setIdentifier(e){return this.setNode("identifier",e,0)}getIdentifier(){return this.identifier}getName(){return this.identifier?this.identifier.getText():""}},Te=class extends pe{constructor(e,t){super(e,t)}get type(){return ee.FunctionParameter}setIdentifier(e){return this.setNode("identifier",e,0)}getIdentifier(){return this.identifier}getName(){return this.identifier?this.identifier.getText():""}setDefaultValue(e){return this.setNode("defaultValue",e,0)}getDefaultValue(){return this.defaultValue}},Ne=class extends pe{constructor(e,t){super(e,t)}get type(){return ee.FunctionArgument}setIdentifier(e){return this.setNode("identifier",e,0)}getIdentifier(){return this.identifier}getName(){return this.identifier?this.identifier.getText():""}setValue(e){return this.setNode("value",e,0)}getValue(){return this.value}},Re=class extends ye{constructor(e,t){super(e,t)}get type(){return ee.If}setExpression(e){return this.setNode("expression",e,0)}setElseClause(e){return this.setNode("elseClause",e)}},De=class extends ye{constructor(e,t){super(e,t)}get type(){return ee.For}setVariable(e){return this.setNode("variable",e,0)}},Ae=class extends ye{constructor(e,t){super(e,t)}get type(){return ee.Each}getVariables(){return this.variables||(this.variables=new me(this)),this.variables}},Me=class extends ye{constructor(e,t){super(e,t)}get type(){return ee.While}},Oe=class extends ye{constructor(e,t){super(e,t)}get type(){return ee.Else}},ze=class extends ye{constructor(e,t){super(e,t)}get type(){return ee.FunctionDeclaration}setIdentifier(e){return this.setNode("identifier",e,0)}getIdentifier(){return this.identifier}getName(){return this.identifier?this.identifier.getText():""}getParameters(){return this.parameters||(this.parameters=new me(this)),this.parameters}},Pe=class extends ye{constructor(e,t){super(e,t)}get type(){return ee.ViewPort}},Be=class extends ye{constructor(e,t){super(e,t)}get type(){return ee.FontFace}},We=class extends ye{constructor(e,t){super(e,t)}get type(){return ee.NestedProperties}},Ve=class extends ye{constructor(e,t){super(e,t)}get type(){return ee.Keyframe}setKeyword(e){return this.setNode("keyword",e,0)}getKeyword(){return this.keyword}setIdentifier(e){return this.setNode("identifier",e,0)}getIdentifier(){return this.identifier}getName(){return this.identifier?this.identifier.getText():""}},Ue=class extends ye{constructor(e,t){super(e,t)}get type(){return ee.KeyframeSelector}},$e=class extends pe{constructor(e,t){super(e,t)}get type(){return ee.Import}setMedialist(e){return!!e&&(e.attachTo(this),!0)}},qe=class extends pe{get type(){return ee.Use}getParameters(){return this.parameters||(this.parameters=new me(this)),this.parameters}setIdentifier(e){return this.setNode("identifier",e,0)}getIdentifier(){return this.identifier}},je=class extends pe{get type(){return ee.ModuleConfiguration}setIdentifier(e){return this.setNode("identifier",e,0)}getIdentifier(){return this.identifier}getName(){return this.identifier?this.identifier.getText():""}setValue(e){return this.setNode("value",e,0)}getValue(){return this.value}},Ke=class extends pe{get type(){return ee.Forward}setIdentifier(e){return this.setNode("identifier",e,0)}getIdentifier(){return this.identifier}getMembers(){return this.members||(this.members=new me(this)),this.members}getParameters(){return this.parameters||(this.parameters=new me(this)),this.parameters}},He=class extends pe{get type(){return ee.ForwardVisibility}setIdentifier(e){return this.setNode("identifier",e,0)}getIdentifier(){return this.identifier}},Ge=class extends pe{constructor(e,t){super(e,t)}get type(){return ee.Namespace}},Qe=class extends ye{constructor(e,t){super(e,t)}get type(){return ee.Media}},Je=class extends ye{constructor(e,t){super(e,t)}get type(){return ee.Supports}},Ye=class extends ye{constructor(e,t){super(e,t)}get type(){return ee.Layer}setNames(e){return this.setNode("names",e)}getNames(){return this.names}},Xe=class extends ye{constructor(e,t){super(e,t)}get type(){return ee.PropertyAtRule}setName(e){return!!e&&(e.attachTo(this),this.name=e,!0)}getName(){return this.name}},Ze=class extends ye{constructor(e,t){super(e,t)}get type(){return ee.Document}},et=class extends ye{constructor(e,t){super(e,t)}get type(){return ee.Container}},tt=class extends pe{constructor(e,t){super(e,t)}},nt=class extends pe{constructor(e,t){super(e,t)}get type(){return ee.MediaQuery}},rt=class extends pe{constructor(e,t){super(e,t)}get type(){return ee.MediaCondition}},it=class extends pe{constructor(e,t){super(e,t)}get type(){return ee.MediaFeature}},st=class extends pe{constructor(e,t){super(e,t)}get type(){return ee.SupportsCondition}},ot=class extends ye{constructor(e,t){super(e,t)}get type(){return ee.Page}},at=class extends ye{constructor(e,t){super(e,t)}get type(){return ee.PageBoxMarginBox}},lt=class extends pe{constructor(e,t){super(e,t)}get type(){return ee.Expression}},ct=class extends pe{constructor(e,t){super(e,t)}get type(){return ee.BinaryExpression}setLeft(e){return this.setNode("left",e)}getLeft(){return this.left}setRight(e){return this.setNode("right",e)}getRight(){return this.right}setOperator(e){return this.setNode("operator",e)}getOperator(){return this.operator}},ht=class extends pe{constructor(e,t){super(e,t)}get type(){return ee.Term}setOperator(e){return this.setNode("operator",e)}getOperator(){return this.operator}setExpression(e){return this.setNode("expression",e)}getExpression(){return this.expression}},dt=class extends pe{constructor(e,t){super(e,t)}get type(){return ee.AttributeSelector}setNamespacePrefix(e){return this.setNode("namespacePrefix",e)}getNamespacePrefix(){return this.namespacePrefix}setIdentifier(e){return this.setNode("identifier",e)}getIdentifier(){return this.identifier}setOperator(e){return this.setNode("operator",e)}getOperator(){return this.operator}setValue(e){return this.setNode("value",e)}getValue(){return this.value}},ut=class extends pe{constructor(e,t){super(e,t)}get type(){return ee.HexColorValue}},pt=class extends pe{constructor(e,t){super(e,t)}get type(){return ee.RatioValue}},mt=".".charCodeAt(0),ft="0".charCodeAt(0),gt="9".charCodeAt(0),bt=class extends pe{constructor(e,t){super(e,t)}get type(){return ee.NumericValue}getValue(){const e=this.getText();let t,n=0;for(let r=0,i=e.length;r0&&(n+=`/${Array.isArray(t.comment)?t.comment.join(""):t.comment}`),i=t.args??{}}return s=r,o=i,0===Object.keys(o).length?s:s.replace(At,(e,t)=>o[t]??e);var s,o}var At=/{([^}]+)}/g;var Mt,Ot,zt,Pt,Bt,Wt,Vt,Ut,$t,qt,jt,Kt,Ht,Gt,Qt,Jt,Yt,Xt,Zt,en,tn,nn,rn,sn,on,an,ln,cn,hn,dn,un,pn,mn,fn,gn,bn,vn,yn,wn,Cn,_n,kn,xn,Sn,En,Fn,Ln,In,Tn,Nn,Rn,Dn,An,Mn,On,zn,Pn,Bn,Wn,Vn,Un,$n,qn,jn,Kn,Hn,Gn,Qn,Jn,Yn,Xn,Zn,er,tr,nr,rr,ir,sr,or,ar,lr,cr,hr,dr,ur,pr,mr,fr,gr,br,vr,yr,wr,Cr,_r,kr,xr,Sr,Er,Fr,Lr,Ir,Tr,Nr,Rr,Dr,Ar,Mr,Or,zr,Pr,Br,Wr,Vr,Ur,$r,qr,jr,Kr,Hr,Gr,Qr,Jr,Yr,Xr,Zr,ei,ti,ni,ri,ii,si,oi,ai=class{constructor(e,t){this.id=e,this.message=t}},li={NumberExpected:new ai("css-numberexpected",Dt("number expected")),ConditionExpected:new ai("css-conditionexpected",Dt("condition expected")),RuleOrSelectorExpected:new ai("css-ruleorselectorexpected",Dt("at-rule or selector expected")),DotExpected:new ai("css-dotexpected",Dt("dot expected")),ColonExpected:new ai("css-colonexpected",Dt("colon expected")),SemiColonExpected:new ai("css-semicolonexpected",Dt("semi-colon expected")),TermExpected:new ai("css-termexpected",Dt("term expected")),ExpressionExpected:new ai("css-expressionexpected",Dt("expression expected")),OperatorExpected:new ai("css-operatorexpected",Dt("operator expected")),IdentifierExpected:new ai("css-identifierexpected",Dt("identifier expected")),PercentageExpected:new ai("css-percentageexpected",Dt("percentage expected")),URIOrStringExpected:new ai("css-uriorstringexpected",Dt("uri or string expected")),URIExpected:new ai("css-uriexpected",Dt("URI expected")),VariableNameExpected:new ai("css-varnameexpected",Dt("variable name expected")),VariableValueExpected:new ai("css-varvalueexpected",Dt("variable value expected")),PropertyValueExpected:new ai("css-propertyvalueexpected",Dt("property value expected")),LeftCurlyExpected:new ai("css-lcurlyexpected",Dt("{ expected")),RightCurlyExpected:new ai("css-rcurlyexpected",Dt("} expected")),LeftSquareBracketExpected:new ai("css-rbracketexpected",Dt("[ expected")),RightSquareBracketExpected:new ai("css-lbracketexpected",Dt("] expected")),LeftParenthesisExpected:new ai("css-lparentexpected",Dt("( expected")),RightParenthesisExpected:new ai("css-rparentexpected",Dt(") expected")),CommaExpected:new ai("css-commaexpected",Dt("comma expected")),PageDirectiveOrDeclarationExpected:new ai("css-pagedirordeclexpected",Dt("page directive or declaraton expected")),UnknownAtRule:new ai("css-unknownatrule",Dt("at-rule unknown")),UnknownKeyword:new ai("css-unknownkeyword",Dt("unknown keyword")),SelectorExpected:new ai("css-selectorexpected",Dt("selector expected")),StringLiteralExpected:new ai("css-stringliteralexpected",Dt("string literal expected")),WhitespaceExpected:new ai("css-whitespaceexpected",Dt("whitespace expected")),MediaQueryExpected:new ai("css-mediaqueryexpected",Dt("media query expected")),IdentifierOrWildcardExpected:new ai("css-idorwildcardexpected",Dt("identifier or wildcard expected")),WildcardExpected:new ai("css-wildcardexpected",Dt("wildcard expected")),IdentifierOrVariableExpected:new ai("css-idorvarexpected",Dt("identifier or variable expected"))};(Mt||(Mt={})).is=function(e){return"string"==typeof e},(Ot||(Ot={})).is=function(e){return"string"==typeof e},(Pt=zt||(zt={})).MIN_VALUE=-2147483648,Pt.MAX_VALUE=2147483647,Pt.is=function(e){return"number"==typeof e&&Pt.MIN_VALUE<=e&&e<=Pt.MAX_VALUE},(Wt=Bt||(Bt={})).MIN_VALUE=0,Wt.MAX_VALUE=2147483647,Wt.is=function(e){return"number"==typeof e&&Wt.MIN_VALUE<=e&&e<=Wt.MAX_VALUE},(Ut=Vt||(Vt={})).create=function(e,t){return e===Number.MAX_VALUE&&(e=Bt.MAX_VALUE),t===Number.MAX_VALUE&&(t=Bt.MAX_VALUE),{line:e,character:t}},Ut.is=function(e){let t=e;return ci.objectLiteral(t)&&ci.uinteger(t.line)&&ci.uinteger(t.character)},(qt=$t||($t={})).create=function(e,t,n,r){if(ci.uinteger(e)&&ci.uinteger(t)&&ci.uinteger(n)&&ci.uinteger(r))return{start:Vt.create(e,t),end:Vt.create(n,r)};if(Vt.is(e)&&Vt.is(t))return{start:e,end:t};throw new Error(`Range#create called with invalid arguments[${e}, ${t}, ${n}, ${r}]`)},qt.is=function(e){let t=e;return ci.objectLiteral(t)&&Vt.is(t.start)&&Vt.is(t.end)},(Kt=jt||(jt={})).create=function(e,t){return{uri:e,range:t}},Kt.is=function(e){let t=e;return ci.objectLiteral(t)&&$t.is(t.range)&&(ci.string(t.uri)||ci.undefined(t.uri))},(Gt=Ht||(Ht={})).create=function(e,t,n,r){return{targetUri:e,targetRange:t,targetSelectionRange:n,originSelectionRange:r}},Gt.is=function(e){let t=e;return ci.objectLiteral(t)&&$t.is(t.targetRange)&&ci.string(t.targetUri)&&$t.is(t.targetSelectionRange)&&($t.is(t.originSelectionRange)||ci.undefined(t.originSelectionRange))},(Jt=Qt||(Qt={})).create=function(e,t,n,r){return{red:e,green:t,blue:n,alpha:r}},Jt.is=function(e){const t=e;return ci.objectLiteral(t)&&ci.numberRange(t.red,0,1)&&ci.numberRange(t.green,0,1)&&ci.numberRange(t.blue,0,1)&&ci.numberRange(t.alpha,0,1)},(Xt=Yt||(Yt={})).create=function(e,t){return{range:e,color:t}},Xt.is=function(e){const t=e;return ci.objectLiteral(t)&&$t.is(t.range)&&Qt.is(t.color)},(en=Zt||(Zt={})).create=function(e,t,n){return{label:e,textEdit:t,additionalTextEdits:n}},en.is=function(e){const t=e;return ci.objectLiteral(t)&&ci.string(t.label)&&(ci.undefined(t.textEdit)||bn.is(t))&&(ci.undefined(t.additionalTextEdits)||ci.typedArray(t.additionalTextEdits,bn.is))},(nn=tn||(tn={})).Comment="comment",nn.Imports="imports",nn.Region="region",(sn=rn||(rn={})).create=function(e,t,n,r,i,s){const o={startLine:e,endLine:t};return ci.defined(n)&&(o.startCharacter=n),ci.defined(r)&&(o.endCharacter=r),ci.defined(i)&&(o.kind=i),ci.defined(s)&&(o.collapsedText=s),o},sn.is=function(e){const t=e;return ci.objectLiteral(t)&&ci.uinteger(t.startLine)&&ci.uinteger(t.startLine)&&(ci.undefined(t.startCharacter)||ci.uinteger(t.startCharacter))&&(ci.undefined(t.endCharacter)||ci.uinteger(t.endCharacter))&&(ci.undefined(t.kind)||ci.string(t.kind))},(an=on||(on={})).create=function(e,t){return{location:e,message:t}},an.is=function(e){let t=e;return ci.defined(t)&&jt.is(t.location)&&ci.string(t.message)},(cn=ln||(ln={})).Error=1,cn.Warning=2,cn.Information=3,cn.Hint=4,(dn=hn||(hn={})).Unnecessary=1,dn.Deprecated=2,(un||(un={})).is=function(e){const t=e;return ci.objectLiteral(t)&&ci.string(t.href)},(mn=pn||(pn={})).create=function(e,t,n,r,i,s){let o={range:e,message:t};return ci.defined(n)&&(o.severity=n),ci.defined(r)&&(o.code=r),ci.defined(i)&&(o.source=i),ci.defined(s)&&(o.relatedInformation=s),o},mn.is=function(e){var t;let n=e;return ci.defined(n)&&$t.is(n.range)&&ci.string(n.message)&&(ci.number(n.severity)||ci.undefined(n.severity))&&(ci.integer(n.code)||ci.string(n.code)||ci.undefined(n.code))&&(ci.undefined(n.codeDescription)||ci.string(null===(t=n.codeDescription)||void 0===t?void 0:t.href))&&(ci.string(n.source)||ci.undefined(n.source))&&(ci.undefined(n.relatedInformation)||ci.typedArray(n.relatedInformation,on.is))},(gn=fn||(fn={})).create=function(e,t,...n){let r={title:e,command:t};return ci.defined(n)&&n.length>0&&(r.arguments=n),r},gn.is=function(e){let t=e;return ci.defined(t)&&ci.string(t.title)&&ci.string(t.command)},(vn=bn||(bn={})).replace=function(e,t){return{range:e,newText:t}},vn.insert=function(e,t){return{range:{start:e,end:e},newText:t}},vn.del=function(e){return{range:e,newText:""}},vn.is=function(e){const t=e;return ci.objectLiteral(t)&&ci.string(t.newText)&&$t.is(t.range)},(wn=yn||(yn={})).create=function(e,t,n){const r={label:e};return void 0!==t&&(r.needsConfirmation=t),void 0!==n&&(r.description=n),r},wn.is=function(e){const t=e;return ci.objectLiteral(t)&&ci.string(t.label)&&(ci.boolean(t.needsConfirmation)||void 0===t.needsConfirmation)&&(ci.string(t.description)||void 0===t.description)},(Cn||(Cn={})).is=function(e){const t=e;return ci.string(t)},(kn=_n||(_n={})).replace=function(e,t,n){return{range:e,newText:t,annotationId:n}},kn.insert=function(e,t,n){return{range:{start:e,end:e},newText:t,annotationId:n}},kn.del=function(e,t){return{range:e,newText:"",annotationId:t}},kn.is=function(e){const t=e;return bn.is(t)&&(yn.is(t.annotationId)||Cn.is(t.annotationId))},(Sn=xn||(xn={})).create=function(e,t){return{textDocument:e,edits:t}},Sn.is=function(e){let t=e;return ci.defined(t)&&zn.is(t.textDocument)&&Array.isArray(t.edits)},(Fn=En||(En={})).create=function(e,t,n){let r={kind:"create",uri:e};return void 0===t||void 0===t.overwrite&&void 0===t.ignoreIfExists||(r.options=t),void 0!==n&&(r.annotationId=n),r},Fn.is=function(e){let t=e;return t&&"create"===t.kind&&ci.string(t.uri)&&(void 0===t.options||(void 0===t.options.overwrite||ci.boolean(t.options.overwrite))&&(void 0===t.options.ignoreIfExists||ci.boolean(t.options.ignoreIfExists)))&&(void 0===t.annotationId||Cn.is(t.annotationId))},(In=Ln||(Ln={})).create=function(e,t,n,r){let i={kind:"rename",oldUri:e,newUri:t};return void 0===n||void 0===n.overwrite&&void 0===n.ignoreIfExists||(i.options=n),void 0!==r&&(i.annotationId=r),i},In.is=function(e){let t=e;return t&&"rename"===t.kind&&ci.string(t.oldUri)&&ci.string(t.newUri)&&(void 0===t.options||(void 0===t.options.overwrite||ci.boolean(t.options.overwrite))&&(void 0===t.options.ignoreIfExists||ci.boolean(t.options.ignoreIfExists)))&&(void 0===t.annotationId||Cn.is(t.annotationId))},(Nn=Tn||(Tn={})).create=function(e,t,n){let r={kind:"delete",uri:e};return void 0===t||void 0===t.recursive&&void 0===t.ignoreIfNotExists||(r.options=t),void 0!==n&&(r.annotationId=n),r},Nn.is=function(e){let t=e;return t&&"delete"===t.kind&&ci.string(t.uri)&&(void 0===t.options||(void 0===t.options.recursive||ci.boolean(t.options.recursive))&&(void 0===t.options.ignoreIfNotExists||ci.boolean(t.options.ignoreIfNotExists)))&&(void 0===t.annotationId||Cn.is(t.annotationId))},(Rn||(Rn={})).is=function(e){let t=e;return t&&(void 0!==t.changes||void 0!==t.documentChanges)&&(void 0===t.documentChanges||t.documentChanges.every(e=>ci.string(e.kind)?En.is(e)||Ln.is(e)||Tn.is(e):xn.is(e)))},(An=Dn||(Dn={})).create=function(e){return{uri:e}},An.is=function(e){let t=e;return ci.defined(t)&&ci.string(t.uri)},(On=Mn||(Mn={})).create=function(e,t){return{uri:e,version:t}},On.is=function(e){let t=e;return ci.defined(t)&&ci.string(t.uri)&&ci.integer(t.version)},(Pn=zn||(zn={})).create=function(e,t){return{uri:e,version:t}},Pn.is=function(e){let t=e;return ci.defined(t)&&ci.string(t.uri)&&(null===t.version||ci.integer(t.version))},(Wn=Bn||(Bn={})).create=function(e,t,n,r){return{uri:e,languageId:t,version:n,text:r}},Wn.is=function(e){let t=e;return ci.defined(t)&&ci.string(t.uri)&&ci.string(t.languageId)&&ci.integer(t.version)&&ci.string(t.text)},(Un=Vn||(Vn={})).PlainText="plaintext",Un.Markdown="markdown",Un.is=function(e){const t=e;return t===Un.PlainText||t===Un.Markdown},($n||($n={})).is=function(e){const t=e;return ci.objectLiteral(e)&&Vn.is(t.kind)&&ci.string(t.value)},(jn=qn||(qn={})).Text=1,jn.Method=2,jn.Function=3,jn.Constructor=4,jn.Field=5,jn.Variable=6,jn.Class=7,jn.Interface=8,jn.Module=9,jn.Property=10,jn.Unit=11,jn.Value=12,jn.Enum=13,jn.Keyword=14,jn.Snippet=15,jn.Color=16,jn.File=17,jn.Reference=18,jn.Folder=19,jn.EnumMember=20,jn.Constant=21,jn.Struct=22,jn.Event=23,jn.Operator=24,jn.TypeParameter=25,(Hn=Kn||(Kn={})).PlainText=1,Hn.Snippet=2,(Gn||(Gn={})).Deprecated=1,(Jn=Qn||(Qn={})).create=function(e,t,n){return{newText:e,insert:t,replace:n}},Jn.is=function(e){const t=e;return t&&ci.string(t.newText)&&$t.is(t.insert)&&$t.is(t.replace)},(Xn=Yn||(Yn={})).asIs=1,Xn.adjustIndentation=2,(Zn||(Zn={})).is=function(e){const t=e;return t&&(ci.string(t.detail)||void 0===t.detail)&&(ci.string(t.description)||void 0===t.description)},(er||(er={})).create=function(e){return{label:e}},(tr||(tr={})).create=function(e,t){return{items:e||[],isIncomplete:!!t}},(rr=nr||(nr={})).fromPlainText=function(e){return e.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")},rr.is=function(e){const t=e;return ci.string(t)||ci.objectLiteral(t)&&ci.string(t.language)&&ci.string(t.value)},(ir||(ir={})).is=function(e){let t=e;return!!t&&ci.objectLiteral(t)&&($n.is(t.contents)||nr.is(t.contents)||ci.typedArray(t.contents,nr.is))&&(void 0===e.range||$t.is(e.range))},(sr||(sr={})).create=function(e,t){return t?{label:e,documentation:t}:{label:e}},(or||(or={})).create=function(e,t,...n){let r={label:e};return ci.defined(t)&&(r.documentation=t),ci.defined(n)?r.parameters=n:r.parameters=[],r},(lr=ar||(ar={})).Text=1,lr.Read=2,lr.Write=3,(cr||(cr={})).create=function(e,t){let n={range:e};return ci.number(t)&&(n.kind=t),n},(dr=hr||(hr={})).File=1,dr.Module=2,dr.Namespace=3,dr.Package=4,dr.Class=5,dr.Method=6,dr.Property=7,dr.Field=8,dr.Constructor=9,dr.Enum=10,dr.Interface=11,dr.Function=12,dr.Variable=13,dr.Constant=14,dr.String=15,dr.Number=16,dr.Boolean=17,dr.Array=18,dr.Object=19,dr.Key=20,dr.Null=21,dr.EnumMember=22,dr.Struct=23,dr.Event=24,dr.Operator=25,dr.TypeParameter=26,(ur||(ur={})).Deprecated=1,(pr||(pr={})).create=function(e,t,n,r,i){let s={name:e,kind:t,location:{uri:r,range:n}};return i&&(s.containerName=i),s},(mr||(mr={})).create=function(e,t,n,r){return void 0!==r?{name:e,kind:t,location:{uri:n,range:r}}:{name:e,kind:t,location:{uri:n}}},(gr=fr||(fr={})).create=function(e,t,n,r,i,s){let o={name:e,detail:t,kind:n,range:r,selectionRange:i};return void 0!==s&&(o.children=s),o},gr.is=function(e){let t=e;return t&&ci.string(t.name)&&ci.number(t.kind)&&$t.is(t.range)&&$t.is(t.selectionRange)&&(void 0===t.detail||ci.string(t.detail))&&(void 0===t.deprecated||ci.boolean(t.deprecated))&&(void 0===t.children||Array.isArray(t.children))&&(void 0===t.tags||Array.isArray(t.tags))},(vr=br||(br={})).Empty="",vr.QuickFix="quickfix",vr.Refactor="refactor",vr.RefactorExtract="refactor.extract",vr.RefactorInline="refactor.inline",vr.RefactorRewrite="refactor.rewrite",vr.Source="source",vr.SourceOrganizeImports="source.organizeImports",vr.SourceFixAll="source.fixAll",(wr=yr||(yr={})).Invoked=1,wr.Automatic=2,(_r=Cr||(Cr={})).create=function(e,t,n){let r={diagnostics:e};return null!=t&&(r.only=t),null!=n&&(r.triggerKind=n),r},_r.is=function(e){let t=e;return ci.defined(t)&&ci.typedArray(t.diagnostics,pn.is)&&(void 0===t.only||ci.typedArray(t.only,ci.string))&&(void 0===t.triggerKind||t.triggerKind===yr.Invoked||t.triggerKind===yr.Automatic)},(xr=kr||(kr={})).create=function(e,t,n){let r={title:e},i=!0;return"string"==typeof t?(i=!1,r.kind=t):fn.is(t)?r.command=t:r.edit=t,i&&void 0!==n&&(r.kind=n),r},xr.is=function(e){let t=e;return t&&ci.string(t.title)&&(void 0===t.diagnostics||ci.typedArray(t.diagnostics,pn.is))&&(void 0===t.kind||ci.string(t.kind))&&(void 0!==t.edit||void 0!==t.command)&&(void 0===t.command||fn.is(t.command))&&(void 0===t.isPreferred||ci.boolean(t.isPreferred))&&(void 0===t.edit||Rn.is(t.edit))},(Er=Sr||(Sr={})).create=function(e,t){let n={range:e};return ci.defined(t)&&(n.data=t),n},Er.is=function(e){let t=e;return ci.defined(t)&&$t.is(t.range)&&(ci.undefined(t.command)||fn.is(t.command))},(Lr=Fr||(Fr={})).create=function(e,t){return{tabSize:e,insertSpaces:t}},Lr.is=function(e){let t=e;return ci.defined(t)&&ci.uinteger(t.tabSize)&&ci.boolean(t.insertSpaces)},(Tr=Ir||(Ir={})).create=function(e,t,n){return{range:e,target:t,data:n}},Tr.is=function(e){let t=e;return ci.defined(t)&&$t.is(t.range)&&(ci.undefined(t.target)||ci.string(t.target))},(Rr=Nr||(Nr={})).create=function(e,t){return{range:e,parent:t}},Rr.is=function(e){let t=e;return ci.objectLiteral(t)&&$t.is(t.range)&&(void 0===t.parent||Rr.is(t.parent))},(Ar=Dr||(Dr={})).namespace="namespace",Ar.type="type",Ar.class="class",Ar.enum="enum",Ar.interface="interface",Ar.struct="struct",Ar.typeParameter="typeParameter",Ar.parameter="parameter",Ar.variable="variable",Ar.property="property",Ar.enumMember="enumMember",Ar.event="event",Ar.function="function",Ar.method="method",Ar.macro="macro",Ar.keyword="keyword",Ar.modifier="modifier",Ar.comment="comment",Ar.string="string",Ar.number="number",Ar.regexp="regexp",Ar.operator="operator",Ar.decorator="decorator",(Or=Mr||(Mr={})).declaration="declaration",Or.definition="definition",Or.readonly="readonly",Or.static="static",Or.deprecated="deprecated",Or.abstract="abstract",Or.async="async",Or.modification="modification",Or.documentation="documentation",Or.defaultLibrary="defaultLibrary",(zr||(zr={})).is=function(e){const t=e;return ci.objectLiteral(t)&&(void 0===t.resultId||"string"==typeof t.resultId)&&Array.isArray(t.data)&&(0===t.data.length||"number"==typeof t.data[0])},(Br=Pr||(Pr={})).create=function(e,t){return{range:e,text:t}},Br.is=function(e){const t=e;return null!=t&&$t.is(t.range)&&ci.string(t.text)},(Vr=Wr||(Wr={})).create=function(e,t,n){return{range:e,variableName:t,caseSensitiveLookup:n}},Vr.is=function(e){const t=e;return null!=t&&$t.is(t.range)&&ci.boolean(t.caseSensitiveLookup)&&(ci.string(t.variableName)||void 0===t.variableName)},($r=Ur||(Ur={})).create=function(e,t){return{range:e,expression:t}},$r.is=function(e){const t=e;return null!=t&&$t.is(t.range)&&(ci.string(t.expression)||void 0===t.expression)},(jr=qr||(qr={})).create=function(e,t){return{frameId:e,stoppedLocation:t}},jr.is=function(e){const t=e;return ci.defined(t)&&$t.is(e.stoppedLocation)},(Hr=Kr||(Kr={})).Type=1,Hr.Parameter=2,Hr.is=function(e){return 1===e||2===e},(Qr=Gr||(Gr={})).create=function(e){return{value:e}},Qr.is=function(e){const t=e;return ci.objectLiteral(t)&&(void 0===t.tooltip||ci.string(t.tooltip)||$n.is(t.tooltip))&&(void 0===t.location||jt.is(t.location))&&(void 0===t.command||fn.is(t.command))},(Yr=Jr||(Jr={})).create=function(e,t,n){const r={position:e,label:t};return void 0!==n&&(r.kind=n),r},Yr.is=function(e){const t=e;return ci.objectLiteral(t)&&Vt.is(t.position)&&(ci.string(t.label)||ci.typedArray(t.label,Gr.is))&&(void 0===t.kind||Kr.is(t.kind))&&void 0===t.textEdits||ci.typedArray(t.textEdits,bn.is)&&(void 0===t.tooltip||ci.string(t.tooltip)||$n.is(t.tooltip))&&(void 0===t.paddingLeft||ci.boolean(t.paddingLeft))&&(void 0===t.paddingRight||ci.boolean(t.paddingRight))},(Xr||(Xr={})).createSnippet=function(e){return{kind:"snippet",value:e}},(Zr||(Zr={})).create=function(e,t,n,r){return{insertText:e,filterText:t,range:n,command:r}},(ei||(ei={})).create=function(e){return{items:e}},(ni=ti||(ti={})).Invoked=0,ni.Automatic=1,(ri||(ri={})).create=function(e,t){return{range:e,text:t}},(ii||(ii={})).create=function(e,t){return{triggerKind:e,selectedCompletionInfo:t}},(si||(si={})).is=function(e){const t=e;return ci.objectLiteral(t)&&Ot.is(t.uri)&&ci.string(t.name)},function(e){function t(e,n){if(e.length<=1)return e;const r=e.length/2|0,i=e.slice(0,r),s=e.slice(r);t(i,n),t(s,n);let o=0,a=0,l=0;for(;o{let n=e.range.start.line-t.range.start.line;return 0===n?e.range.start.character-t.range.start.character:n}),s=r.length;for(let t=i.length-1;t>=0;t--){let n=i[t],o=e.offsetAt(n.range.start),a=e.offsetAt(n.range.end);if(!(a<=s))throw new Error("Overlapping edit");r=r.substring(0,o)+n.newText+r.substring(a,r.length),s=o}return r}}(oi||(oi={}));var ci,hi=class{constructor(e,t,n,r){this._uri=e,this._languageId=t,this._version=n,this._content=r,this._lineOffsets=void 0}get uri(){return this._uri}get languageId(){return this._languageId}get version(){return this._version}getText(e){if(e){let t=this.offsetAt(e.start),n=this.offsetAt(e.end);return this._content.substring(t,n)}return this._content}update(e,t){this._content=e.text,this._version=t,this._lineOffsets=void 0}getLineOffsets(){if(void 0===this._lineOffsets){let e=[],t=this._content,n=!0;for(let r=0;r0&&e.push(t.length),this._lineOffsets=e}return this._lineOffsets}positionAt(e){e=Math.max(Math.min(e,this._content.length),0);let t=this.getLineOffsets(),n=0,r=t.length;if(0===r)return Vt.create(0,e);for(;ne?r=i:n=i+1}let i=n-1;return Vt.create(i,e-t[i])}offsetAt(e){let t=this.getLineOffsets();if(e.line>=t.length)return this._content.length;if(e.line<0)return 0;let n=t[e.line],r=e.line+1e?r=i:n=i+1}let i=n-1;return{line:i,character:e-t[i]}}offsetAt(e){let t=this.getLineOffsets();if(e.line>=t.length)return this._content.length;if(e.line<0)return 0;let n=t[e.line],r=e.line+1n.line||t.line===n.line&&t.character>n.character?{start:n,end:t}:e}function wi(e){const t=yi(e.range);return t!==e.range?{newText:e.newText,range:t}:e}(ui=di||(di={})).create=function(e,t,n,r){return new gi(e,t,n,r)},ui.update=function(e,t,n){if(e instanceof gi)return e.update(t,n),e;throw new Error("TextDocument.update: document must be created by TextDocument.create")},ui.applyEdits=function(e,t){let n=e.getText(),r=bi(t.map(wi),(e,t)=>{let n=e.range.start.line-t.range.start.line;return 0===n?e.range.start.character-t.range.start.character:n}),i=0;const s=[];for(const t of r){let r=e.offsetAt(t.range.start);if(ri&&s.push(n.substring(i,r)),t.newText.length&&s.push(t.newText),i=e.offsetAt(t.range.end)}return s.push(n.substr(i)),s.join("")},(pi||(pi={})).LATEST={textDocument:{completion:{completionItem:{documentationFormat:[Vn.Markdown,Vn.PlainText]}},hover:{contentFormat:[Vn.Markdown,Vn.PlainText]}}},(fi=mi||(mi={}))[fi.Unknown=0]="Unknown",fi[fi.File=1]="File",fi[fi.Directory=2]="Directory",fi[fi.SymbolicLink=64]="SymbolicLink";var Ci={E:"Edge",FF:"Firefox",S:"Safari",C:"Chrome",IE:"IE",O:"Opera"};function _i(e){switch(e){case"experimental":return"⚠️ Property is experimental. Be cautious when using it.️\n\n";case"nonstandard":return"🚨️ Property is nonstandard. Avoid using it.\n\n";case"obsolete":return"🚨️️️ Property is obsolete. Avoid using it.\n\n";default:return""}}function ki(e,t,n){let r;if(r=t?{kind:"markdown",value:Ei(e,n)}:{kind:"plaintext",value:Si(e,n)},""!==r.value)return r}function xi(e){return(e=e.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")).replace(//g,">")}function Si(e,t){if(!e.description||""===e.description)return"";if("string"!=typeof e.description)return e.description.value;let n="";if(!1!==t?.documentation){e.status&&(n+=_i(e.status)),n+=e.description;const t=Fi(e.browsers);t&&(n+="\n("+t+")"),"syntax"in e&&(n+=`\n\nSyntax: ${e.syntax}`)}return e.references&&e.references.length>0&&!1!==t?.references&&(n.length>0&&(n+="\n\n"),n+=e.references.map(e=>`${e.name}: ${e.url}`).join(" | ")),n}function Ei(e,t){if(!e.description||""===e.description)return"";let n="";if(!1!==t?.documentation){e.status&&(n+=_i(e.status)),"string"==typeof e.description?n+=xi(e.description):n+=e.description.kind===Vn.Markdown?e.description.value:xi(e.description.value);const t=Fi(e.browsers);t&&(n+="\n\n("+xi(t)+")"),"syntax"in e&&e.syntax&&(n+=`\n\nSyntax: ${xi(e.syntax)}`)}return e.references&&e.references.length>0&&!1!==t?.references&&(n.length>0&&(n+="\n\n"),n+=e.references.map(e=>`[${e.name}](${e.url})`).join(" | ")),n}function Fi(e=[]){return 0===e.length?null:e.map(e=>{let t="";const n=e.match(/([A-Z]+)(\d+)?/),r=n[1],i=n[2];return r in Ci&&(t+=Ci[r]),i&&(t+=" "+i),t}).join(", ")}var Li=/(^#([0-9A-F]{3}){1,2}$)|(^#([0-9A-F]{4}){1,2}$)/i,Ii=[{label:"rgb",func:"rgb($red, $green, $blue)",insertText:"rgb(${1:red}, ${2:green}, ${3:blue})",desc:Dt("Creates a Color from red, green, and blue values.")},{label:"rgba",func:"rgba($red, $green, $blue, $alpha)",insertText:"rgba(${1:red}, ${2:green}, ${3:blue}, ${4:alpha})",desc:Dt("Creates a Color from red, green, blue, and alpha values.")},{label:"rgb relative",func:"rgb(from $color $red $green $blue)",insertText:"rgb(from ${1:color} ${2:r} ${3:g} ${4:b})",desc:Dt("Creates a Color from the red, green, and blue values of another Color.")},{label:"hsl",func:"hsl($hue, $saturation, $lightness)",insertText:"hsl(${1:hue}, ${2:saturation}, ${3:lightness})",desc:Dt("Creates a Color from hue, saturation, and lightness values.")},{label:"hsla",func:"hsla($hue, $saturation, $lightness, $alpha)",insertText:"hsla(${1:hue}, ${2:saturation}, ${3:lightness}, ${4:alpha})",desc:Dt("Creates a Color from hue, saturation, lightness, and alpha values.")},{label:"hsl relative",func:"hsl(from $color $hue $saturation $lightness)",insertText:"hsl(from ${1:color} ${2:h} ${3:s} ${4:l})",desc:Dt("Creates a Color from the hue, saturation, and lightness values of another Color.")},{label:"hwb",func:"hwb($hue $white $black)",insertText:"hwb(${1:hue} ${2:white} ${3:black})",desc:Dt("Creates a Color from hue, white, and black values.")},{label:"hwb relative",func:"hwb(from $color $hue $white $black)",insertText:"hwb(from ${1:color} ${2:h} ${3:w} ${4:b})",desc:Dt("Creates a Color from the hue, white, and black values of another Color.")},{label:"lab",func:"lab($lightness $a $b)",insertText:"lab(${1:lightness} ${2:a} ${3:b})",desc:Dt("Creates a Color from lightness, a, and b values.")},{label:"lab relative",func:"lab(from $color $lightness $a $b)",insertText:"lab(from ${1:color} ${2:l} ${3:a} ${4:b})",desc:Dt("Creates a Color from the lightness, a, and b values of another Color.")},{label:"oklab",func:"oklab($lightness $a $b)",insertText:"oklab(${1:lightness} ${2:a} ${3:b})",desc:Dt("Creates a Color from lightness, a, and b values.")},{label:"oklab relative",func:"oklab(from $color $lightness $a $b)",insertText:"oklab(from ${1:color} ${2:l} ${3:a} ${4:b})",desc:Dt("Creates a Color from the lightness, a, and b values of another Color.")},{label:"lch",func:"lch($lightness $chroma $hue)",insertText:"lch(${1:lightness} ${2:chroma} ${3:hue})",desc:Dt("Creates a Color from lightness, chroma, and hue values.")},{label:"lch relative",func:"lch(from $color $lightness $chroma $hue)",insertText:"lch(from ${1:color} ${2:l} ${3:c} ${4:h})",desc:Dt("Creates a Color from the lightness, chroma, and hue values of another Color.")},{label:"oklch",func:"oklch($lightness $chroma $hue)",insertText:"oklch(${1:lightness} ${2:chroma} ${3:hue})",desc:Dt("Creates a Color from lightness, chroma, and hue values.")},{label:"oklch relative",func:"oklch(from $color $lightness $chroma $hue)",insertText:"oklch(from ${1:color} ${2:l} ${3:c} ${4:h})",desc:Dt("Creates a Color from the lightness, chroma, and hue values of another Color.")},{label:"color",func:"color($color-space $red $green $blue)",insertText:"color(${1|srgb,srgb-linear,display-p3,a98-rgb,prophoto-rgb,rec2020,xyx,xyz-d50,xyz-d65|} ${2:red} ${3:green} ${4:blue})",desc:Dt("Creates a Color in a specific color space from red, green, and blue values.")},{label:"color relative",func:"color(from $color $color-space $red $green $blue)",insertText:"color(from ${1:color} ${2|srgb,srgb-linear,display-p3,a98-rgb,prophoto-rgb,rec2020,xyx,xyz-d50,xyz-d65|} ${3:r} ${4:g} ${5:b})",desc:Dt("Creates a Color in a specific color space from the red, green, and blue values of another Color.")},{label:"color-mix",func:"color-mix(in $color-space, $color $percentage, $color $percentage)",insertText:"color-mix(in ${1|srgb,srgb-linear,lab,oklab,xyz,xyz-d50,xyz-d65|}, ${3:color} ${4:percentage}, ${5:color} ${6:percentage})",desc:Dt("Mix two colors together in a rectangular color space.")},{label:"color-mix hue",func:"color-mix(in $color-space $interpolation-method hue, $color $percentage, $color $percentage)",insertText:"color-mix(in ${1|hsl,hwb,lch,oklch|} ${2|shorter hue,longer hue,increasing hue,decreasing hue|}, ${3:color} ${4:percentage}, ${5:color} ${6:percentage})",desc:Dt("Mix two colors together in a polar color space.")}],Ti=/^(rgb|rgba|hsl|hsla|hwb)$/i,Ni={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgrey:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",grey:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rebeccapurple:"#663399",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},Ri=new RegExp(`^(${Object.keys(Ni).join("|")})$`,"i"),Di={currentColor:"The value of the 'color' property. The computed value of the 'currentColor' keyword is the computed value of the 'color' property. If the 'currentColor' keyword is set on the 'color' property itself, it is treated as 'color:inherit' at parse time.",transparent:"Fully transparent. This keyword can be considered a shorthand for rgba(0,0,0,0) which is its computed value."},Ai=new RegExp(`^(${Object.keys(Di).join("|")})$`,"i");function Mi(e,t){const n=e.getText().match(/^([-+]?[0-9]*\.?[0-9]+)(%?)$/);if(n){n[2]&&(t=100);const e=parseFloat(n[1])/t;if(e>=0&&e<=1)return e}throw new Error}function Oi(e){const t=e.getText(),n=t.match(/^([-+]?[0-9]*\.?[0-9]+)(deg|rad|grad|turn)?$/);if(n)switch(n[2]){case"deg":return parseFloat(t)%360;case"rad":return 180*parseFloat(t)/Math.PI%360;case"grad":return.9*parseFloat(t)%360;case"turn":return 360*parseFloat(t)%360;default:if(void 0===n[2])return parseFloat(t)%360}throw new Error}function zi(e){return Li.test(e)||Ri.test(e)||Ai.test(e)}function Pi(e){return e<48?0:e<=57?e-48:(e<97&&(e+=32),e>=97&&e<=102?e-97+10:0)}function Bi(e){if("#"!==e[0])return null;switch(e.length){case 4:return{red:17*Pi(e.charCodeAt(1))/255,green:17*Pi(e.charCodeAt(2))/255,blue:17*Pi(e.charCodeAt(3))/255,alpha:1};case 5:return{red:17*Pi(e.charCodeAt(1))/255,green:17*Pi(e.charCodeAt(2))/255,blue:17*Pi(e.charCodeAt(3))/255,alpha:17*Pi(e.charCodeAt(4))/255};case 7:return{red:(16*Pi(e.charCodeAt(1))+Pi(e.charCodeAt(2)))/255,green:(16*Pi(e.charCodeAt(3))+Pi(e.charCodeAt(4)))/255,blue:(16*Pi(e.charCodeAt(5))+Pi(e.charCodeAt(6)))/255,alpha:1};case 9:return{red:(16*Pi(e.charCodeAt(1))+Pi(e.charCodeAt(2)))/255,green:(16*Pi(e.charCodeAt(3))+Pi(e.charCodeAt(4)))/255,blue:(16*Pi(e.charCodeAt(5))+Pi(e.charCodeAt(6)))/255,alpha:(16*Pi(e.charCodeAt(7))+Pi(e.charCodeAt(8)))/255}}return null}function Wi(e,t,n,r=1){if(0===t)return{red:n,green:n,blue:n,alpha:r};{const i=(e,t,n)=>{for(;n<0;)n+=6;for(;n>=6;)n-=6;return n<1?(t-e)*n+e:n<3?t:n<4?(t-e)*(4-n)+e:e},s=n<=.5?n*(t+1):n+t-n*t,o=2*n-s;return{red:i(o,s,2+(e/=60)),green:i(o,s,e),blue:i(o,s,e-2),alpha:r}}}function Vi(e){const t=e.red,n=e.green,r=e.blue,i=e.alpha,s=Math.max(t,n,r),o=Math.min(t,n,r);let a=0,l=0;const c=(o+s)/2,h=s-o;if(h>0){switch(l=Math.min(c<=.5?h/(2*c):h/(2-2*c),1),s){case t:a=(n-r)/h+(ne[t])}function is(e){return void 0!==e}var ss=class{constructor(e=new ie){this.keyframeRegex=/^@(\-(webkit|ms|moz|o)\-)?keyframes$/i,this.scanner=e,this.token={type:o.EOF,offset:-1,len:0,text:""},this.prevToken=void 0}peekIdent(e){return o.Ident===this.token.type&&e.length===this.token.text.length&&e===this.token.text.toLowerCase()}peekKeyword(e){return o.AtKeyword===this.token.type&&e.length===this.token.text.length&&e===this.token.text.toLowerCase()}peekDelim(e){return o.Delim===this.token.type&&e===this.token.text}peek(e){return e===this.token.type}peekOne(...e){return-1!==e.indexOf(this.token.type)}peekRegExp(e,t){return e===this.token.type&&t.test(this.token.text)}hasWhitespace(){return!!this.prevToken&&this.prevToken.offset+this.prevToken.len!==this.token.offset}consumeToken(){this.prevToken=this.token,this.token=this.scanner.scan()}acceptUnicodeRange(){const e=this.scanner.tryScanUnicode();return!!e&&(this.prevToken=e,this.token=this.scanner.scan(),!0)}mark(){return{prev:this.prevToken,curr:this.token,pos:this.scanner.pos()}}restoreAtMark(e){this.prevToken=e.prev,this.token=e.curr,this.scanner.goBackTo(e.pos)}try(e){const t=this.mark();return e()||(this.restoreAtMark(t),null)}acceptOneKeyword(e){if(o.AtKeyword===this.token.type)for(const t of e)if(t.length===this.token.text.length&&t===this.token.text.toLowerCase())return this.consumeToken(),!0;return!1}accept(e){return e===this.token.type&&(this.consumeToken(),!0)}acceptIdent(e){return!!this.peekIdent(e)&&(this.consumeToken(),!0)}acceptKeyword(e){return!!this.peekKeyword(e)&&(this.consumeToken(),!0)}acceptDelim(e){return!!this.peekDelim(e)&&(this.consumeToken(),!0)}acceptRegexp(e){return!!e.test(this.token.text)&&(this.consumeToken(),!0)}_parseRegexp(e){let t=this.createNode(ee.Identifier);do{}while(this.acceptRegexp(e));return this.finish(t)}acceptUnquotedString(){const e=this.scanner.pos();this.scanner.goBackTo(this.token.offset);const t=this.scanner.scanUnquotedString();return t?(this.token=t,this.consumeToken(),!0):(this.scanner.goBackTo(e),!1)}resync(e,t){for(;;){if(e&&-1!==e.indexOf(this.token.type))return this.consumeToken(),!0;if(t&&-1!==t.indexOf(this.token.type))return!0;if(this.token.type===o.EOF)return!1;this.token=this.scanner.scan()}}createNode(e){return new pe(this.token.offset,this.token.len,e)}create(e){return new e(this.token.offset,this.token.len)}finish(e,t,n,r){if(!(e instanceof me)&&(t&&this.markError(e,t,n,r),this.prevToken)){const t=this.prevToken.offset+this.prevToken.len;e.length=t>e.offset?t-e.offset:0}return e}markError(e,t,n,r){this.token!==this.lastErrorToken&&(e.addIssue(new Nt(e,t,de.Error,void 0,this.token.offset,this.token.len)),this.lastErrorToken=this.token),(n||r)&&this.resync(n,r)}parseStylesheet(e){const t=e.version,n=e.getText();return this.internalParse(n,this._parseStylesheet,(r,i)=>{if(e.version!==t)throw new Error("Underlying model has changed, AST is no longer valid");return n.substr(r,i)})}internalParse(e,t,n){this.scanner.setSource(e),this.token=this.scanner.scan();const r=t.bind(this)();return r&&(r.textProvider=n||((t,n)=>e.substr(t,n))),r}_parseStylesheet(){const e=this.create(be);for(;e.addChild(this._parseStylesheetStart()););let t=!1;do{let n=!1;do{n=!1;const r=this._parseStylesheetStatement();for(r&&(e.addChild(r),n=!0,t=!1,this.peek(o.EOF)||!this._needsSemicolonAfter(r)||this.accept(o.SemiColon)||this.markError(e,li.SemiColonExpected));this.accept(o.SemiColon)||this.accept(o.CDO)||this.accept(o.CDC);)n=!0,t=!1}while(n);if(this.peek(o.EOF))break;t||(this.peek(o.AtKeyword)?this.markError(e,li.UnknownAtRule):this.markError(e,li.RuleOrSelectorExpected),t=!0),this.consumeToken()}while(!this.peek(o.EOF));return this.finish(e)}_parseStylesheetStart(){return this._parseCharset()}_parseStylesheetStatement(e=!1){return this.peek(o.AtKeyword)?this._parseStylesheetAtStatement(e):this._parseRuleset(e)}_parseStylesheetAtStatement(e=!1){return this._parseImport()||this._parseMedia(e)||this._parsePage()||this._parseFontFace()||this._parseKeyframe()||this._parseSupports(e)||this._parseLayer(e)||this._parsePropertyAtRule()||this._parseViewPort()||this._parseNamespace()||this._parseDocument()||this._parseContainer(e)||this._parseUnknownAtRule()}_tryParseRuleset(e){const t=this.mark();if(this._parseSelector(e)){for(;this.accept(o.Comma)&&this._parseSelector(e););if(this.accept(o.CurlyL))return this.restoreAtMark(t),this._parseRuleset(e)}return this.restoreAtMark(t),null}_parseRuleset(e=!1){const t=this.create(we),n=t.getSelectors();if(!n.addChild(this._parseSelector(e)))return null;for(;this.accept(o.Comma);)if(!n.addChild(this._parseSelector(e)))return this.finish(t,li.SelectorExpected);return this._parseBody(t,this._parseRuleSetDeclaration.bind(this))}_parseRuleSetDeclarationAtStatement(){return this._parseMedia(!0)||this._parseSupports(!0)||this._parseLayer(!0)||this._parseContainer(!0)||this._parseUnknownAtRule()}_parseRuleSetDeclaration(){return this.peek(o.AtKeyword)?this._parseRuleSetDeclarationAtStatement():this.peek(o.Ident)?this._tryParseRuleset(!0)||this._parseDeclaration():this._parseRuleset(!0)}_needsSemicolonAfter(e){switch(e.type){case ee.Keyframe:case ee.ViewPort:case ee.Media:case ee.Ruleset:case ee.Namespace:case ee.If:case ee.For:case ee.Each:case ee.While:case ee.MixinDeclaration:case ee.FunctionDeclaration:case ee.MixinContentDeclaration:return!1;case ee.ExtendsReference:case ee.MixinContentReference:case ee.ReturnStatement:case ee.MediaQuery:case ee.Debug:case ee.Import:case ee.AtApplyRule:case ee.CustomPropertyDeclaration:return!0;case ee.VariableDeclaration:return e.needsSemicolon;case ee.MixinReference:return!e.getContent();case ee.Declaration:return!e.getNestedProperties()}return!1}_parseDeclarations(e){const t=this.create(ve);if(!this.accept(o.CurlyL))return null;let n=e();for(;t.addChild(n)&&!this.peek(o.CurlyR);){if(this._needsSemicolonAfter(n)&&!this.accept(o.SemiColon))return this.finish(t,li.SemiColonExpected,[o.SemiColon,o.CurlyR]);for(n&&this.prevToken&&this.prevToken.type===o.SemiColon&&(n.semicolonPosition=this.prevToken.offset);this.accept(o.SemiColon););n=e()}return this.accept(o.CurlyR)?this.finish(t):this.finish(t,li.RightCurlyExpected,[o.CurlyR,o.SemiColon])}_parseBody(e,t){return e.setDeclarations(this._parseDeclarations(t))?this.finish(e):this.finish(e,li.LeftCurlyExpected,[o.CurlyR,o.SemiColon])}_parseSelector(e){const t=this.create(Ce);let n=!1;for(e&&(n=t.addChild(this._parseCombinator()));t.addChild(this._parseSimpleSelector());)n=!0,t.addChild(this._parseCombinator());return n?this.finish(t):null}_parseDeclaration(e){const t=this._tryParseCustomPropertyDeclaration(e);if(t)return t;const n=this.create(Se);return n.setProperty(this._parseProperty())?this.accept(o.Colon)?(this.prevToken&&(n.colonPosition=this.prevToken.offset),n.setValue(this._parseExpr())?(n.addChild(this._parsePrio()),this.peek(o.SemiColon)&&(n.semicolonPosition=this.token.offset),this.finish(n)):this.finish(n,li.PropertyValueExpected)):this.finish(n,li.ColonExpected,[o.Colon],e||[o.SemiColon]):null}_tryParseCustomPropertyDeclaration(e){if(!this.peekRegExp(o.Ident,/^--/))return null;const t=this.create(Ee);if(!t.setProperty(this._parseProperty()))return null;if(!this.accept(o.Colon))return this.finish(t,li.ColonExpected,[o.Colon]);this.prevToken&&(t.colonPosition=this.prevToken.offset);const n=this.mark();if(this.peek(o.CurlyL)){const e=this.create(xe),r=this._parseDeclarations(this._parseRuleSetDeclaration.bind(this));if(e.setDeclarations(r)&&!r.isErroneous(!0)&&(e.addChild(this._parsePrio()),this.peek(o.SemiColon)))return this.finish(e),t.setPropertySet(e),t.semicolonPosition=this.token.offset,this.finish(t);this.restoreAtMark(n)}const r=this._parseExpr();return r&&!r.isErroneous(!0)&&(this._parsePrio(),this.peekOne(...e||[],o.SemiColon,o.EOF))?(t.setValue(r),this.peek(o.SemiColon)&&(t.semicolonPosition=this.token.offset),this.finish(t)):(this.restoreAtMark(n),t.addChild(this._parseCustomPropertyValue(e)),t.addChild(this._parsePrio()),is(t.colonPosition)&&this.token.offset===t.colonPosition+1?this.finish(t,li.PropertyValueExpected):this.finish(t))}_parseCustomPropertyValue(e=[o.CurlyR]){const t=this.create(pe),n=()=>0===i&&0===s&&0===a,r=()=>-1!==e.indexOf(this.token.type);let i=0,s=0,a=0;e:for(;;){switch(this.token.type){case o.SemiColon:case o.Exclamation:if(n())break e;break;case o.CurlyL:i++;break;case o.CurlyR:if(i--,i<0){if(r()&&0===s&&0===a)break e;return this.finish(t,li.LeftCurlyExpected)}break;case o.ParenthesisL:s++;break;case o.ParenthesisR:if(s--,s<0){if(r()&&0===a&&0===i)break e;return this.finish(t,li.LeftParenthesisExpected)}break;case o.BracketL:a++;break;case o.BracketR:if(a--,a<0)return this.finish(t,li.LeftSquareBracketExpected);break;case o.BadString:break e;case o.EOF:let e=li.RightCurlyExpected;return a>0?e=li.RightSquareBracketExpected:s>0&&(e=li.RightParenthesisExpected),this.finish(t,e)}this.consumeToken()}return this.finish(t)}_tryToParseDeclaration(e){const t=this.mark();return this._parseProperty()&&this.accept(o.Colon)?(this.restoreAtMark(t),this._parseDeclaration(e)):(this.restoreAtMark(t),null)}_parseProperty(){const e=this.create(Fe),t=this.mark();return(this.acceptDelim("*")||this.acceptDelim("_"))&&this.hasWhitespace()?(this.restoreAtMark(t),null):e.setIdentifier(this._parsePropertyIdentifier())?this.finish(e):null}_parsePropertyIdentifier(){return this._parseIdent()}_parseCharset(){if(!this.peek(o.Charset))return null;const e=this.create(pe);return this.consumeToken(),this.accept(o.String)?this.accept(o.SemiColon)?this.finish(e):this.finish(e,li.SemiColonExpected):this.finish(e,li.IdentifierExpected)}_parseImport(){if(!this.peekKeyword("@import"))return null;const e=this.create($e);return this.consumeToken(),e.addChild(this._parseURILiteral())||e.addChild(this._parseStringLiteral())?this._completeParseImport(e):this.finish(e,li.URIOrStringExpected)}_completeParseImport(e){if(this.acceptIdent("layer")&&this.accept(o.ParenthesisL)){if(!e.addChild(this._parseLayerName()))return this.finish(e,li.IdentifierExpected,[o.SemiColon]);if(!this.accept(o.ParenthesisR))return this.finish(e,li.RightParenthesisExpected,[o.ParenthesisR],[])}return this.acceptIdent("supports")&&this.accept(o.ParenthesisL)&&(e.addChild(this._tryToParseDeclaration()||this._parseSupportsCondition()),!this.accept(o.ParenthesisR))?this.finish(e,li.RightParenthesisExpected,[o.ParenthesisR],[]):(this.peek(o.SemiColon)||this.peek(o.EOF)||e.setMedialist(this._parseMediaQueryList()),this.finish(e))}_parseNamespace(){if(!this.peekKeyword("@namespace"))return null;const e=this.create(Ge);return this.consumeToken(),e.addChild(this._parseURILiteral())||(e.addChild(this._parseIdent()),e.addChild(this._parseURILiteral())||e.addChild(this._parseStringLiteral()))?this.accept(o.SemiColon)?this.finish(e):this.finish(e,li.SemiColonExpected):this.finish(e,li.URIExpected,[o.SemiColon])}_parseFontFace(){if(!this.peekKeyword("@font-face"))return null;const e=this.create(Be);return this.consumeToken(),this._parseBody(e,this._parseRuleSetDeclaration.bind(this))}_parseViewPort(){if(!this.peekKeyword("@-ms-viewport")&&!this.peekKeyword("@-o-viewport")&&!this.peekKeyword("@viewport"))return null;const e=this.create(Pe);return this.consumeToken(),this._parseBody(e,this._parseRuleSetDeclaration.bind(this))}_parseKeyframe(){if(!this.peekRegExp(o.AtKeyword,this.keyframeRegex))return null;const e=this.create(Ve),t=this.create(pe);return this.consumeToken(),e.setKeyword(this.finish(t)),t.matches("@-ms-keyframes")&&this.markError(t,li.UnknownKeyword),e.setIdentifier(this._parseKeyframeIdent())?this._parseBody(e,this._parseKeyframeSelector.bind(this)):this.finish(e,li.IdentifierExpected,[o.CurlyR])}_parseKeyframeIdent(){return this._parseIdent([ne.Keyframe])}_parseKeyframeSelector(){const e=this.create(Ue);let t=!1;if(e.addChild(this._parseIdent())&&(t=!0),this.accept(o.Percentage)&&(t=!0),!t)return null;for(;this.accept(o.Comma);)if(t=!1,e.addChild(this._parseIdent())&&(t=!0),this.accept(o.Percentage)&&(t=!0),!t)return this.finish(e,li.PercentageExpected);return this._parseBody(e,this._parseRuleSetDeclaration.bind(this))}_tryParseKeyframeSelector(){const e=this.create(Ue),t=this.mark();let n=!1;if(e.addChild(this._parseIdent())&&(n=!0),this.accept(o.Percentage)&&(n=!0),!n)return null;for(;this.accept(o.Comma);)if(n=!1,e.addChild(this._parseIdent())&&(n=!0),this.accept(o.Percentage)&&(n=!0),!n)return this.restoreAtMark(t),null;return this.peek(o.CurlyL)?this._parseBody(e,this._parseRuleSetDeclaration.bind(this)):(this.restoreAtMark(t),null)}_parsePropertyAtRule(){if(!this.peekKeyword("@property"))return null;const e=this.create(Xe);return this.consumeToken(),this.peekRegExp(o.Ident,/^--/)&&e.setName(this._parseIdent([ne.Property]))?this._parseBody(e,this._parseDeclaration.bind(this)):this.finish(e,li.IdentifierExpected)}_parseLayer(e=!1){if(!this.peekKeyword("@layer"))return null;const t=this.create(Ye);this.consumeToken();const n=this._parseLayerNameList();return n&&t.setNames(n),n&&1!==n.getChildren().length||!this.peek(o.CurlyL)?this.accept(o.SemiColon)?this.finish(t):this.finish(t,li.SemiColonExpected):this._parseBody(t,this._parseLayerDeclaration.bind(this,e))}_parseLayerDeclaration(e=!1){return e?this._tryParseRuleset(!0)||this._tryToParseDeclaration()||this._parseStylesheetStatement(!0):this._parseStylesheetStatement(!1)}_parseLayerNameList(){const e=this.createNode(ee.LayerNameList);if(!e.addChild(this._parseLayerName()))return null;for(;this.accept(o.Comma);)if(!e.addChild(this._parseLayerName()))return this.finish(e,li.IdentifierExpected);return this.finish(e)}_parseLayerName(){const e=this.createNode(ee.LayerName);if(!e.addChild(this._parseIdent()))return null;for(;!this.hasWhitespace()&&this.acceptDelim(".");)if(this.hasWhitespace()||!e.addChild(this._parseIdent()))return this.finish(e,li.IdentifierExpected);return this.finish(e)}_parseSupports(e=!1){if(!this.peekKeyword("@supports"))return null;const t=this.create(Je);return this.consumeToken(),t.addChild(this._parseSupportsCondition()),this._parseBody(t,this._parseSupportsDeclaration.bind(this,e))}_parseSupportsDeclaration(e=!1){return e?this._tryParseRuleset(!0)||this._tryToParseDeclaration()||this._parseStylesheetStatement(!0):this._parseStylesheetStatement(!1)}_parseSupportsCondition(){const e=this.create(st);if(this.acceptIdent("not"))e.addChild(this._parseSupportsConditionInParens());else if(e.addChild(this._parseSupportsConditionInParens()),this.peekRegExp(o.Ident,/^(and|or)$/i)){const t=this.token.text.toLowerCase();for(;this.acceptIdent(t);)e.addChild(this._parseSupportsConditionInParens())}return this.finish(e)}_parseSupportsConditionInParens(){const e=this.create(st);if(this.accept(o.ParenthesisL))return this.prevToken&&(e.lParent=this.prevToken.offset),e.addChild(this._tryToParseDeclaration([o.ParenthesisR]))||this._parseSupportsCondition()?this.accept(o.ParenthesisR)?(this.prevToken&&(e.rParent=this.prevToken.offset),this.finish(e)):this.finish(e,li.RightParenthesisExpected,[o.ParenthesisR],[]):this.finish(e,li.ConditionExpected);if(this.peek(o.Ident)){const t=this.mark();if(this.consumeToken(),!this.hasWhitespace()&&this.accept(o.ParenthesisL)){let t=1;for(;this.token.type!==o.EOF&&0!==t;)this.token.type===o.ParenthesisL?t++:this.token.type===o.ParenthesisR&&t--,this.consumeToken();return this.finish(e)}this.restoreAtMark(t)}return this.finish(e,li.LeftParenthesisExpected,[],[o.ParenthesisL])}_parseMediaDeclaration(e=!1){return e?this._tryParseRuleset(!0)||this._tryToParseDeclaration()||this._parseStylesheetStatement(!0):this._parseStylesheetStatement(!1)}_parseMedia(e=!1){if(!this.peekKeyword("@media"))return null;const t=this.create(Qe);return this.consumeToken(),t.addChild(this._parseMediaQueryList())?this._parseBody(t,this._parseMediaDeclaration.bind(this,e)):this.finish(t,li.MediaQueryExpected)}_parseMediaQueryList(){const e=this.create(tt);if(!e.addChild(this._parseMediaQuery()))return this.finish(e,li.MediaQueryExpected);for(;this.accept(o.Comma);)if(!e.addChild(this._parseMediaQuery()))return this.finish(e,li.MediaQueryExpected);return this.finish(e)}_parseMediaQuery(){const e=this.create(nt),t=this.mark();if(this.acceptIdent("not"),this.peek(o.ParenthesisL))this.restoreAtMark(t),e.addChild(this._parseMediaCondition());else{if(this.acceptIdent("only"),!e.addChild(this._parseIdent()))return null;this.acceptIdent("and")&&e.addChild(this._parseMediaCondition())}return this.finish(e)}_parseRatio(){const e=this.mark(),t=this.create(pt);return this._parseNumeric()?this.acceptDelim("/")?this._parseNumeric()?this.finish(t):this.finish(t,li.NumberExpected):(this.restoreAtMark(e),null):null}_parseMediaCondition(){const e=this.create(rt);this.acceptIdent("not");let t=!0;for(;t;){if(!this.accept(o.ParenthesisL))return this.finish(e,li.LeftParenthesisExpected,[],[o.CurlyL]);if(this.peek(o.ParenthesisL)||this.peekIdent("not")?e.addChild(this._parseMediaCondition()):e.addChild(this._parseMediaFeature()),!this.accept(o.ParenthesisR))return this.finish(e,li.RightParenthesisExpected,[],[o.CurlyL]);t=this.acceptIdent("and")||this.acceptIdent("or")}return this.finish(e)}_parseMediaFeature(){const e=[o.ParenthesisR],t=this.create(it);if(t.addChild(this._parseMediaFeatureName())){if(this.accept(o.Colon)){if(!t.addChild(this._parseMediaFeatureValue()))return this.finish(t,li.TermExpected,[],e)}else if(this._parseMediaFeatureRangeOperator()){if(!t.addChild(this._parseMediaFeatureValue()))return this.finish(t,li.TermExpected,[],e);if(this._parseMediaFeatureRangeOperator()&&!t.addChild(this._parseMediaFeatureValue()))return this.finish(t,li.TermExpected,[],e)}}else{if(!t.addChild(this._parseMediaFeatureValue()))return this.finish(t,li.IdentifierExpected,[],e);if(!this._parseMediaFeatureRangeOperator())return this.finish(t,li.OperatorExpected,[],e);if(!t.addChild(this._parseMediaFeatureName()))return this.finish(t,li.IdentifierExpected,[],e);if(this._parseMediaFeatureRangeOperator()&&!t.addChild(this._parseMediaFeatureValue()))return this.finish(t,li.TermExpected,[],e)}return this.finish(t)}_parseMediaFeatureRangeOperator(){return this.acceptDelim("<")||this.acceptDelim(">")?(this.hasWhitespace()||this.acceptDelim("="),!0):!!this.acceptDelim("=")}_parseMediaFeatureName(){return this._parseIdent()}_parseMediaFeatureValue(){return this._parseRatio()||this._parseTermExpression()}_parseMedium(){const e=this.create(pe);return e.addChild(this._parseIdent())?this.finish(e):null}_parsePageDeclaration(){return this._parsePageMarginBox()||this._parseRuleSetDeclaration()}_parsePage(){if(!this.peekKeyword("@page"))return null;const e=this.create(ot);if(this.consumeToken(),e.addChild(this._parsePageSelector()))for(;this.accept(o.Comma);)if(!e.addChild(this._parsePageSelector()))return this.finish(e,li.IdentifierExpected);return this._parseBody(e,this._parsePageDeclaration.bind(this))}_parsePageMarginBox(){if(!this.peek(o.AtKeyword))return null;const e=this.create(at);return this.acceptOneKeyword(ns)||this.markError(e,li.UnknownAtRule,[],[o.CurlyL]),this._parseBody(e,this._parseRuleSetDeclaration.bind(this))}_parsePageSelector(){if(!this.peek(o.Ident)&&!this.peek(o.Colon))return null;const e=this.create(pe);return e.addChild(this._parseIdent()),this.accept(o.Colon)&&!e.addChild(this._parseIdent())?this.finish(e,li.IdentifierExpected):this.finish(e)}_parseDocument(){if(!this.peekKeyword("@-moz-document"))return null;const e=this.create(Ze);return this.consumeToken(),this.resync([],[o.CurlyL]),this._parseBody(e,this._parseStylesheetStatement.bind(this))}_parseContainerDeclaration(e=!1){return e?this._tryParseRuleset(!0)||this._tryToParseDeclaration()||this._parseStylesheetStatement(!0):this._parseStylesheetStatement(!1)}_parseContainer(e=!1){if(!this.peekKeyword("@container"))return null;const t=this.create(et);return this.consumeToken(),t.addChild(this._parseIdent()),t.addChild(this._parseContainerQuery()),this._parseBody(t,this._parseContainerDeclaration.bind(this,e))}_parseContainerQuery(){const e=this.create(pe);if(this.acceptIdent("not"))e.addChild(this._parseContainerQueryInParens());else if(e.addChild(this._parseContainerQueryInParens()),this.peekIdent("and"))for(;this.acceptIdent("and");)e.addChild(this._parseContainerQueryInParens());else if(this.peekIdent("or"))for(;this.acceptIdent("or");)e.addChild(this._parseContainerQueryInParens());return this.finish(e)}_parseContainerQueryInParens(){const e=this.create(pe);if(this.accept(o.ParenthesisL)){if(this.peekIdent("not")||this.peek(o.ParenthesisL)?e.addChild(this._parseContainerQuery()):e.addChild(this._parseMediaFeature()),!this.accept(o.ParenthesisR))return this.finish(e,li.RightParenthesisExpected,[],[o.CurlyL])}else{if(!this.acceptIdent("style"))return this.finish(e,li.LeftParenthesisExpected,[],[o.CurlyL]);if(this.hasWhitespace()||!this.accept(o.ParenthesisL))return this.finish(e,li.LeftParenthesisExpected,[],[o.CurlyL]);if(e.addChild(this._parseStyleQuery()),!this.accept(o.ParenthesisR))return this.finish(e,li.RightParenthesisExpected,[],[o.CurlyL])}return this.finish(e)}_parseStyleQuery(){const e=this.create(pe);if(this.acceptIdent("not"))e.addChild(this._parseStyleInParens());else if(this.peek(o.ParenthesisL)){if(e.addChild(this._parseStyleInParens()),this.peekIdent("and"))for(;this.acceptIdent("and");)e.addChild(this._parseStyleInParens());else if(this.peekIdent("or"))for(;this.acceptIdent("or");)e.addChild(this._parseStyleInParens())}else e.addChild(this._parseDeclaration([o.ParenthesisR]));return this.finish(e)}_parseStyleInParens(){const e=this.create(pe);return this.accept(o.ParenthesisL)?(e.addChild(this._parseStyleQuery()),this.accept(o.ParenthesisR)?this.finish(e):this.finish(e,li.RightParenthesisExpected,[],[o.CurlyL])):this.finish(e,li.LeftParenthesisExpected,[],[o.CurlyL])}_parseUnknownAtRule(){if(!this.peek(o.AtKeyword))return null;const e=this.create(Et);e.addChild(this._parseUnknownAtRuleName());const t=()=>0===r&&0===i&&0===s;let n=0,r=0,i=0,s=0;e:for(;;){switch(this.token.type){case o.SemiColon:if(t())break e;break;case o.EOF:return r>0?this.finish(e,li.RightCurlyExpected):s>0?this.finish(e,li.RightSquareBracketExpected):i>0?this.finish(e,li.RightParenthesisExpected):this.finish(e);case o.CurlyL:n++,r++;break;case o.CurlyR:if(r--,n>0&&0===r){if(this.consumeToken(),s>0)return this.finish(e,li.RightSquareBracketExpected);if(i>0)return this.finish(e,li.RightParenthesisExpected);break e}if(r<0){if(0===i&&0===s)break e;return this.finish(e,li.LeftCurlyExpected)}break;case o.ParenthesisL:i++;break;case o.ParenthesisR:if(i--,i<0)return this.finish(e,li.LeftParenthesisExpected);break;case o.BracketL:s++;break;case o.BracketR:if(s--,s<0)return this.finish(e,li.LeftSquareBracketExpected)}this.consumeToken()}return e}_parseUnknownAtRuleName(){const e=this.create(pe);return this.accept(o.AtKeyword)?this.finish(e):e}_parseOperator(){if(this.peekDelim("/")||this.peekDelim("*")||this.peekDelim("+")||this.peekDelim("-")||this.peek(o.Dashmatch)||this.peek(o.Includes)||this.peek(o.SubstringOperator)||this.peek(o.PrefixOperator)||this.peek(o.SuffixOperator)||this.peekDelim("=")){const e=this.createNode(ee.Operator);return this.consumeToken(),this.finish(e)}return null}_parseUnaryOperator(){if(!this.peekDelim("+")&&!this.peekDelim("-"))return null;const e=this.create(pe);return this.consumeToken(),this.finish(e)}_parseCombinator(){if(this.peekDelim(">")){const e=this.create(pe);this.consumeToken();const t=this.mark();if(!this.hasWhitespace()&&this.acceptDelim(">")){if(!this.hasWhitespace()&&this.acceptDelim(">"))return e.type=ee.SelectorCombinatorShadowPiercingDescendant,this.finish(e);this.restoreAtMark(t)}return e.type=ee.SelectorCombinatorParent,this.finish(e)}if(this.peekDelim("+")){const e=this.create(pe);return this.consumeToken(),e.type=ee.SelectorCombinatorSibling,this.finish(e)}if(this.peekDelim("~")){const e=this.create(pe);return this.consumeToken(),e.type=ee.SelectorCombinatorAllSiblings,this.finish(e)}if(this.peekDelim("/")){const e=this.create(pe);this.consumeToken();const t=this.mark();if(!this.hasWhitespace()&&this.acceptIdent("deep")&&!this.hasWhitespace()&&this.acceptDelim("/"))return e.type=ee.SelectorCombinatorShadowPiercingDescendant,this.finish(e);this.restoreAtMark(t)}return null}_parseSimpleSelector(){const e=this.create(_e);let t=0;for(e.addChild(this._parseElementName()||this._parseNestingSelector())&&t++;(0===t||!this.hasWhitespace())&&e.addChild(this._parseSimpleSelectorBody());)t++;return t>0?this.finish(e):null}_parseNestingSelector(){if(this.peekDelim("&")){const e=this.createNode(ee.SelectorCombinator);return this.consumeToken(),this.finish(e)}return null}_parseSimpleSelectorBody(){return this._parsePseudo()||this._parseHash()||this._parseClass()||this._parseAttrib()}_parseSelectorIdent(){return this._parseIdent()}_parseHash(){if(!this.peek(o.Hash)&&!this.peekDelim("#"))return null;const e=this.createNode(ee.IdentifierSelector);if(this.acceptDelim("#")){if(this.hasWhitespace()||!e.addChild(this._parseSelectorIdent()))return this.finish(e,li.IdentifierExpected)}else this.consumeToken();return this.finish(e)}_parseClass(){if(!this.peekDelim("."))return null;const e=this.createNode(ee.ClassSelector);return this.consumeToken(),this.hasWhitespace()||!e.addChild(this._parseSelectorIdent())?this.finish(e,li.IdentifierExpected):this.finish(e)}_parseElementName(){const e=this.mark(),t=this.createNode(ee.ElementNameSelector);return t.addChild(this._parseNamespacePrefix()),t.addChild(this._parseSelectorIdent())||this.acceptDelim("*")?this.finish(t):(this.restoreAtMark(e),null)}_parseNamespacePrefix(){const e=this.mark(),t=this.createNode(ee.NamespacePrefix);return!t.addChild(this._parseIdent())&&this.acceptDelim("*"),this.acceptDelim("|")?this.finish(t):(this.restoreAtMark(e),null)}_parseAttrib(){if(!this.peek(o.BracketL))return null;const e=this.create(dt);return this.consumeToken(),e.setNamespacePrefix(this._parseNamespacePrefix()),e.setIdentifier(this._parseIdent())?(e.setOperator(this._parseOperator())&&(e.setValue(this._parseBinaryExpr()),this.acceptIdent("i"),this.acceptIdent("s")),this.accept(o.BracketR)?this.finish(e):this.finish(e,li.RightSquareBracketExpected)):this.finish(e,li.IdentifierExpected)}_parsePseudo(){const e=this._tryParsePseudoIdentifier();if(e){if(!this.hasWhitespace()&&this.accept(o.ParenthesisL)){const t=()=>{const e=this.create(pe);if(!e.addChild(this._parseSelector(!0)))return null;for(;this.accept(o.Comma)&&e.addChild(this._parseSelector(!0)););return this.peek(o.ParenthesisR)?this.finish(e):null};if(!e.addChild(this.try(t))&&e.addChild(this._parseBinaryExpr())&&this.acceptIdent("of")&&!e.addChild(this.try(t)))return this.finish(e,li.SelectorExpected);if(!this.accept(o.ParenthesisR))return this.finish(e,li.RightParenthesisExpected)}return this.finish(e)}return null}_tryParsePseudoIdentifier(){if(!this.peek(o.Colon))return null;const e=this.mark(),t=this.createNode(ee.PseudoSelector);return this.consumeToken(),this.hasWhitespace()?(this.restoreAtMark(e),null):(this.accept(o.Colon),this.hasWhitespace()||!t.addChild(this._parseIdent())?this.finish(t,li.IdentifierExpected):this.finish(t))}_tryParsePrio(){const e=this.mark();return this._parsePrio()||(this.restoreAtMark(e),null)}_parsePrio(){if(!this.peek(o.Exclamation))return null;const e=this.createNode(ee.Prio);return this.accept(o.Exclamation)&&this.acceptIdent("important")?this.finish(e):null}_parseExpr(e=!1){const t=this.create(lt);if(!t.addChild(this._parseBinaryExpr()))return null;for(;;){if(this.peek(o.Comma)){if(e)return this.finish(t);this.consumeToken()}if(!t.addChild(this._parseBinaryExpr()))break}return this.finish(t)}_parseUnicodeRange(){if(!this.peekIdent("u"))return null;const e=this.create(fe);return this.acceptUnicodeRange()?this.finish(e):null}_parseNamedLine(){if(!this.peek(o.BracketL))return null;const e=this.createNode(ee.GridLine);for(this.consumeToken();e.addChild(this._parseIdent()););return this.accept(o.BracketR)?this.finish(e):this.finish(e,li.RightSquareBracketExpected)}_parseBinaryExpr(e,t){let n=this.create(ct);if(!n.setLeft(e||this._parseTerm()))return null;if(!n.setOperator(t||this._parseOperator()))return this.finish(n);if(!n.setRight(this._parseTerm()))return this.finish(n,li.TermExpected);n=this.finish(n);const r=this._parseOperator();return r&&(n=this._parseBinaryExpr(n,r)),this.finish(n)}_parseTerm(){let e=this.create(ht);return e.setOperator(this._parseUnaryOperator()),e.setExpression(this._parseTermExpression())?this.finish(e):null}_parseTermExpression(){return this._parseURILiteral()||this._parseUnicodeRange()||this._parseFunction()||this._parseIdent()||this._parseStringLiteral()||this._parseNumeric()||this._parseHexColor()||this._parseOperation()||this._parseNamedLine()}_parseOperation(){if(!this.peek(o.ParenthesisL))return null;const e=this.create(pe);return this.consumeToken(),e.addChild(this._parseExpr()),this.accept(o.ParenthesisR)?this.finish(e):this.finish(e,li.RightParenthesisExpected)}_parseNumeric(){if(this.peek(o.Num)||this.peek(o.Percentage)||this.peek(o.Resolution)||this.peek(o.Length)||this.peek(o.EMS)||this.peek(o.EXS)||this.peek(o.Angle)||this.peek(o.Time)||this.peek(o.Dimension)||this.peek(o.ContainerQueryLength)||this.peek(o.Freq)){const e=this.create(bt);return this.consumeToken(),this.finish(e)}return null}_parseStringLiteral(){if(!this.peek(o.String)&&!this.peek(o.BadString))return null;const e=this.createNode(ee.StringLiteral);return this.consumeToken(),this.finish(e)}_parseURILiteral(){if(!this.peekRegExp(o.Ident,/^url(-prefix)?$/i))return null;const e=this.mark(),t=this.createNode(ee.URILiteral);return this.accept(o.Ident),this.hasWhitespace()||!this.peek(o.ParenthesisL)?(this.restoreAtMark(e),null):(this.scanner.inURL=!0,this.consumeToken(),t.addChild(this._parseURLArgument()),this.scanner.inURL=!1,this.accept(o.ParenthesisR)?this.finish(t):this.finish(t,li.RightParenthesisExpected))}_parseURLArgument(){const e=this.create(pe);return this.accept(o.String)||this.accept(o.BadString)||this.acceptUnquotedString()?this.finish(e):null}_parseIdent(e){if(!this.peek(o.Ident))return null;const t=this.create(ge);return e&&(t.referenceTypes=e),t.isCustomProperty=this.peekRegExp(o.Ident,/^--/),this.consumeToken(),this.finish(t)}_parseFunction(){const e=this.mark(),t=this.create(Ie);if(!t.setIdentifier(this._parseFunctionIdentifier()))return null;if(this.hasWhitespace()||!this.accept(o.ParenthesisL))return this.restoreAtMark(e),null;if(t.getArguments().addChild(this._parseFunctionArgument()))for(;this.accept(o.Comma)&&!this.peek(o.ParenthesisR);)t.getArguments().addChild(this._parseFunctionArgument())||this.markError(t,li.ExpressionExpected);return this.accept(o.ParenthesisR)?this.finish(t):this.finish(t,li.RightParenthesisExpected)}_parseFunctionIdentifier(){if(!this.peek(o.Ident))return null;const e=this.create(ge);if(e.referenceTypes=[ne.Function],this.acceptIdent("progid")){if(this.accept(o.Colon))for(;this.accept(o.Ident)&&this.acceptDelim("."););return this.finish(e)}return this.consumeToken(),this.finish(e)}_parseFunctionArgument(){const e=this.create(Ne);return e.setValue(this._parseExpr(!0))?this.finish(e):null}_parseHexColor(){if(this.peekRegExp(o.Hash,/^#([A-Fa-f0-9]{3}|[A-Fa-f0-9]{4}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$/g)){const e=this.create(ut);return this.consumeToken(),this.finish(e)}return null}};function os(e,t){return-1!==e.indexOf(t)}function as(...e){const t=[];for(const n of e)for(const e of n)os(t,e)||t.push(e);return t}var ls,cs=class{constructor(e,t){this.offset=e,this.length=t,this.symbols=[],this.parent=null,this.children=[]}addChild(e){this.children.push(e),e.setParent(this)}setParent(e){this.parent=e}findScope(e,t=0){return this.offset<=e&&this.offset+this.length>e+t||this.offset===e&&this.length===t?this.findInScope(e,t):null}findInScope(e,t=0){const n=e+t,r=function(e,t){let n=0,r=e.length;if(0===r)return 0;for(;ne.offset>n);if(0===r)return this;const i=this.children[r-1];return i.offset<=e&&i.offset+i.length>=e+t?i.findInScope(e,t):this}addSymbol(e){this.symbols.push(e)}getSymbol(e,t){for(let n=0;n{var e={470:e=>{function t(e){if("string"!=typeof e)throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}function n(e,t){for(var n,r="",i=0,s=-1,o=0,a=0;a<=e.length;++a){if(a2){var l=r.lastIndexOf("/");if(l!==r.length-1){-1===l?(r="",i=0):i=(r=r.slice(0,l)).length-1-r.lastIndexOf("/"),s=a,o=0;continue}}else if(2===r.length||1===r.length){r="",i=0,s=a,o=0;continue}t&&(r.length>0?r+="/..":r="..",i=2)}else r.length>0?r+="/"+e.slice(s+1,a):r=e.slice(s+1,a),i=a-s-1;s=a,o=0}else 46===n&&-1!==o?++o:o=-1}return r}var r={resolve:function(){for(var e,r="",i=!1,s=arguments.length-1;s>=-1&&!i;s--){var o;s>=0?o=arguments[s]:(void 0===e&&(e=process.cwd()),o=e),t(o),0!==o.length&&(r=o+"/"+r,i=47===o.charCodeAt(0))}return r=n(r,!i),i?r.length>0?"/"+r:"/":r.length>0?r:"."},normalize:function(e){if(t(e),0===e.length)return".";var r=47===e.charCodeAt(0),i=47===e.charCodeAt(e.length-1);return 0!==(e=n(e,!r)).length||r||(e="."),e.length>0&&i&&(e+="/"),r?"/"+e:e},isAbsolute:function(e){return t(e),e.length>0&&47===e.charCodeAt(0)},join:function(){if(0===arguments.length)return".";for(var e,n=0;n0&&(void 0===e?e=i:e+="/"+i)}return void 0===e?".":r.normalize(e)},relative:function(e,n){if(t(e),t(n),e===n)return"";if((e=r.resolve(e))===(n=r.resolve(n)))return"";for(var i=1;ic){if(47===n.charCodeAt(a+d))return n.slice(a+d+1);if(0===d)return n.slice(a+d)}else o>c&&(47===e.charCodeAt(i+d)?h=d:0===d&&(h=0));break}var u=e.charCodeAt(i+d);if(u!==n.charCodeAt(a+d))break;47===u&&(h=d)}var p="";for(d=i+h+1;d<=s;++d)d!==s&&47!==e.charCodeAt(d)||(0===p.length?p+="..":p+="/..");return p.length>0?p+n.slice(a+h):(a+=h,47===n.charCodeAt(a)&&++a,n.slice(a))},_makeLong:function(e){return e},dirname:function(e){if(t(e),0===e.length)return".";for(var n=e.charCodeAt(0),r=47===n,i=-1,s=!0,o=e.length-1;o>=1;--o)if(47===(n=e.charCodeAt(o))){if(!s){i=o;break}}else s=!1;return-1===i?r?"/":".":r&&1===i?"//":e.slice(0,i)},basename:function(e,n){if(void 0!==n&&"string"!=typeof n)throw new TypeError('"ext" argument must be a string');t(e);var r,i=0,s=-1,o=!0;if(void 0!==n&&n.length>0&&n.length<=e.length){if(n.length===e.length&&n===e)return"";var a=n.length-1,l=-1;for(r=e.length-1;r>=0;--r){var c=e.charCodeAt(r);if(47===c){if(!o){i=r+1;break}}else-1===l&&(o=!1,l=r+1),a>=0&&(c===n.charCodeAt(a)?-1==--a&&(s=r):(a=-1,s=l))}return i===s?s=l:-1===s&&(s=e.length),e.slice(i,s)}for(r=e.length-1;r>=0;--r)if(47===e.charCodeAt(r)){if(!o){i=r+1;break}}else-1===s&&(o=!1,s=r+1);return-1===s?"":e.slice(i,s)},extname:function(e){t(e);for(var n=-1,r=0,i=-1,s=!0,o=0,a=e.length-1;a>=0;--a){var l=e.charCodeAt(a);if(47!==l)-1===i&&(s=!1,i=a+1),46===l?-1===n?n=a:1!==o&&(o=1):-1!==n&&(o=-1);else if(!s){r=a+1;break}}return-1===n||-1===i||0===o||1===o&&n===i-1&&n===r+1?"":e.slice(n,i)},format:function(e){if(null===e||"object"!=typeof e)throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof e);return n=(t=e).dir||t.root,r=t.base||(t.name||"")+(t.ext||""),n?n===t.root?n+r:n+"/"+r:r;var t,n,r},parse:function(e){t(e);var n={root:"",dir:"",base:"",ext:"",name:""};if(0===e.length)return n;var r,i=e.charCodeAt(0),s=47===i;s?(n.root="/",r=1):r=0;for(var o=-1,a=0,l=-1,c=!0,h=e.length-1,d=0;h>=r;--h)if(47!==(i=e.charCodeAt(h)))-1===l&&(c=!1,l=h+1),46===i?-1===o?o=h:1!==d&&(d=1):-1!==o&&(d=-1);else if(!c){a=h+1;break}return-1===o||-1===l||0===d||1===d&&o===l-1&&o===a+1?-1!==l&&(n.base=n.name=0===a&&s?e.slice(1,l):e.slice(a,l)):(0===a&&s?(n.name=e.slice(1,o),n.base=e.slice(1,l)):(n.name=e.slice(a,o),n.base=e.slice(a,l)),n.ext=e.slice(o,l)),a>0?n.dir=e.slice(0,a-1):s&&(n.dir="/"),n},sep:"/",delimiter:":",win32:null,posix:null};r.posix=r,e.exports=r}},t={};function n(r){var i=t[r];if(void 0!==i)return i.exports;var s=t[r]={exports:{}};return e[r](s,s.exports,n),s.exports}n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var r={};(()=>{let e;if(n.r(r),n.d(r,{URI:()=>h,Utils:()=>x}),"object"==typeof process)e="win32"===process.platform;else if("object"==typeof navigator){let t=navigator.userAgent;e=t.indexOf("Windows")>=0}const t=/^\w[\w\d+.-]*$/,i=/^\//,s=/^\/\//;function o(e,n){if(!e.scheme&&n)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${e.authority}", path: "${e.path}", query: "${e.query}", fragment: "${e.fragment}"}`);if(e.scheme&&!t.test(e.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(e.path)if(e.authority){if(!i.test(e.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(s.test(e.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}const a="",l="/",c=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class h{static isUri(e){return e instanceof h||!!e&&"string"==typeof e.authority&&"string"==typeof e.fragment&&"string"==typeof e.path&&"string"==typeof e.query&&"string"==typeof e.scheme&&"string"==typeof e.fsPath&&"function"==typeof e.with&&"function"==typeof e.toString}scheme;authority;path;query;fragment;constructor(e,t,n,r,i,s=!1){"object"==typeof e?(this.scheme=e.scheme||a,this.authority=e.authority||a,this.path=e.path||a,this.query=e.query||a,this.fragment=e.fragment||a):(this.scheme=function(e,t){return e||t?e:"file"}(e,s),this.authority=t||a,this.path=function(e,t){switch(e){case"https":case"http":case"file":t?t[0]!==l&&(t=l+t):t=l}return t}(this.scheme,n||a),this.query=r||a,this.fragment=i||a,o(this,s))}get fsPath(){return g(this,!1)}with(e){if(!e)return this;let{scheme:t,authority:n,path:r,query:i,fragment:s}=e;return void 0===t?t=this.scheme:null===t&&(t=a),void 0===n?n=this.authority:null===n&&(n=a),void 0===r?r=this.path:null===r&&(r=a),void 0===i?i=this.query:null===i&&(i=a),void 0===s?s=this.fragment:null===s&&(s=a),t===this.scheme&&n===this.authority&&r===this.path&&i===this.query&&s===this.fragment?this:new u(t,n,r,i,s)}static parse(e,t=!1){const n=c.exec(e);return n?new u(n[2]||a,w(n[4]||a),w(n[5]||a),w(n[7]||a),w(n[9]||a),t):new u(a,a,a,a,a)}static file(t){let n=a;if(e&&(t=t.replace(/\\/g,l)),t[0]===l&&t[1]===l){const e=t.indexOf(l,2);-1===e?(n=t.substring(2),t=l):(n=t.substring(2,e),t=t.substring(e)||l)}return new u("file",n,t,a,a)}static from(e){const t=new u(e.scheme,e.authority,e.path,e.query,e.fragment);return o(t,!0),t}toString(e=!1){return b(this,e)}toJSON(){return this}static revive(e){if(e){if(e instanceof h)return e;{const t=new u(e);return t._formatted=e.external,t._fsPath=e._sep===d?e.fsPath:null,t}}return e}}const d=e?1:void 0;class u extends h{_formatted=null;_fsPath=null;get fsPath(){return this._fsPath||(this._fsPath=g(this,!1)),this._fsPath}toString(e=!1){return e?b(this,!0):(this._formatted||(this._formatted=b(this,!1)),this._formatted)}toJSON(){const e={$mid:1};return this._fsPath&&(e.fsPath=this._fsPath,e._sep=d),this._formatted&&(e.external=this._formatted),this.path&&(e.path=this.path),this.scheme&&(e.scheme=this.scheme),this.authority&&(e.authority=this.authority),this.query&&(e.query=this.query),this.fragment&&(e.fragment=this.fragment),e}}const p={58:"%3A",47:"%2F",63:"%3F",35:"%23",91:"%5B",93:"%5D",64:"%40",33:"%21",36:"%24",38:"%26",39:"%27",40:"%28",41:"%29",42:"%2A",43:"%2B",44:"%2C",59:"%3B",61:"%3D",32:"%20"};function m(e,t,n){let r,i=-1;for(let s=0;s=97&&o<=122||o>=65&&o<=90||o>=48&&o<=57||45===o||46===o||95===o||126===o||t&&47===o||n&&91===o||n&&93===o||n&&58===o)-1!==i&&(r+=encodeURIComponent(e.substring(i,s)),i=-1),void 0!==r&&(r+=e.charAt(s));else{void 0===r&&(r=e.substr(0,s));const t=p[o];void 0!==t?(-1!==i&&(r+=encodeURIComponent(e.substring(i,s)),i=-1),r+=t):-1===i&&(i=s)}}return-1!==i&&(r+=encodeURIComponent(e.substring(i))),void 0!==r?r:e}function f(e){let t;for(let n=0;n1&&"file"===t.scheme?`//${t.authority}${t.path}`:47===t.path.charCodeAt(0)&&(t.path.charCodeAt(1)>=65&&t.path.charCodeAt(1)<=90||t.path.charCodeAt(1)>=97&&t.path.charCodeAt(1)<=122)&&58===t.path.charCodeAt(2)?n?t.path.substr(1):t.path[1].toLowerCase()+t.path.substr(2):t.path,e&&(r=r.replace(/\//g,"\\")),r}function b(e,t){const n=t?f:m;let r="",{scheme:i,authority:s,path:o,query:a,fragment:c}=e;if(i&&(r+=i,r+=":"),(s||"file"===i)&&(r+=l,r+=l),s){let e=s.indexOf("@");if(-1!==e){const t=s.substr(0,e);s=s.substr(e+1),e=t.lastIndexOf(":"),-1===e?r+=n(t,!1,!1):(r+=n(t.substr(0,e),!1,!1),r+=":",r+=n(t.substr(e+1),!1,!0)),r+="@"}s=s.toLowerCase(),e=s.lastIndexOf(":"),-1===e?r+=n(s,!1,!0):(r+=n(s.substr(0,e),!1,!0),r+=s.substr(e))}if(o){if(o.length>=3&&47===o.charCodeAt(0)&&58===o.charCodeAt(2)){const e=o.charCodeAt(1);e>=65&&e<=90&&(o=`/${String.fromCharCode(e+32)}:${o.substr(3)}`)}else if(o.length>=2&&58===o.charCodeAt(1)){const e=o.charCodeAt(0);e>=65&&e<=90&&(o=`${String.fromCharCode(e+32)}:${o.substr(2)}`)}r+=n(o,!0,!1)}return a&&(r+="?",r+=n(a,!1,!1)),c&&(r+="#",r+=t?c:m(c,!1,!1)),r}function v(e){try{return decodeURIComponent(e)}catch{return e.length>3?e.substr(0,3)+v(e.substr(3)):e}}const y=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function w(e){return e.match(y)?e.replace(y,e=>v(e)):e}var C=n(470);const _=C.posix||C,k="/";var x,S;(S=x||(x={})).joinPath=function(e,...t){return e.with({path:_.join(e.path,...t)})},S.resolvePath=function(e,...t){let n=e.path,r=!1;n[0]!==k&&(n=k+n,r=!0);let i=_.resolve(n,...t);return r&&i[0]===k&&!e.authority&&(i=i.substring(1)),e.with({path:i})},S.dirname=function(e){if(0===e.path.length||e.path===k)return e;let t=_.dirname(e.path);return 1===t.length&&46===t.charCodeAt(0)&&(t=""),e.with({path:t})},S.basename=function(e){return _.basename(e.path)},S.extname=function(e){return _.extname(e.path)}})(),ls=r})();var{URI:ms,Utils:fs}=ls;function gs(e){return fs.dirname(ms.parse(e)).toString(!0)}function bs(e,...t){return fs.joinPath(ms.parse(e),...t).toString(!0)}var vs=class{constructor(e){this.readDirectory=e,this.literalCompletions=[],this.importCompletions=[]}onCssURILiteralValue(e){this.literalCompletions.push(e)}onCssImportPath(e){this.importCompletions.push(e)}async computeCompletions(e,t){const n={items:[],isIncomplete:!1};for(const r of this.literalCompletions){const i=r.uriValue,s=ws(i);if("."===s||".."===s)n.isIncomplete=!0;else{const s=await this.providePathSuggestions(i,r.position,r.range,e,t);for(let e of s)n.items.push(e)}}for(const r of this.importCompletions){const i=r.pathValue,s=ws(i);if("."===s||".."===s)n.isIncomplete=!0;else{let s=await this.providePathSuggestions(i,r.position,r.range,e,t);"scss"===e.languageId&&s.forEach(e=>{se(e.label,"_")&&oe(e.label,".scss")&&(e.textEdit?e.textEdit.newText=e.label.slice(1,-5):e.label=e.label.slice(1,-5))});for(let e of s)n.items.push(e)}}return n}async providePathSuggestions(e,t,n,r,i){const s=ws(e),o=se(e,"'")||se(e,'"'),a=o?s.slice(0,t.character-(n.start.character+1)):s.slice(0,t.character-n.start.character),l=r.uri,c=function(e,t,n){let r;const i=e.lastIndexOf("/");if(-1===i)r=n;else{const e=t.slice(i+1),s=ks(n.end,-e.length),o=e.indexOf(" ");let a;a=-1!==o?ks(s,o):n.end,r=$t.create(s,a)}return r}(a,s,o?function(e){const t=ks(e.start,1),n=ks(e.end,-1);return $t.create(t,n)}(n):n),h=a.substring(0,a.lastIndexOf("/")+1);let d=i.resolveReference(h||".",l);if(d)try{const e=[],t=await this.readDirectory(d);for(const[n,r]of t)n.charCodeAt(0)===ys||r!==mi.Directory&&bs(d,n)===l||e.push(Cs(n,r===mi.Directory,c));return e}catch(e){}return[]}},ys=".".charCodeAt(0);function ws(e){return se(e,"'")||se(e,'"')?e.slice(1,-1):e}function Cs(e,t,n){return t?{label:_s(e+="/"),kind:qn.Folder,textEdit:bn.replace(n,_s(e)),command:{title:"Suggest",command:"editor.action.triggerSuggest"}}:{label:_s(e),kind:qn.File,textEdit:bn.replace(n,_s(e))}}function _s(e){return e.replace(/(\s|\(|\)|,|"|')/g,"\\$1")}function ks(e,t){return Vt.create(e.line,e.character+t)}var xs,Ss,Es=Kn.Snippet,Fs={title:"Suggest",command:"editor.action.triggerSuggest"};(Ss=xs||(xs={})).Enums=" ",Ss.Normal="d",Ss.VendorPrefixed="x",Ss.Term="y",Ss.Variable="z";var Ls=class{constructor(e=null,t,n){this.variablePrefix=e,this.lsOptions=t,this.cssDataManager=n,this.completionParticipants=[]}configure(e){this.defaultSettings=e}getSymbolContext(){return this.symbolContext||(this.symbolContext=new ps(this.styleSheet)),this.symbolContext}setCompletionParticipants(e){this.completionParticipants=e||[]}async doComplete2(e,t,n,r,i=this.defaultSettings){if(!this.lsOptions.fileSystemProvider||!this.lsOptions.fileSystemProvider.readDirectory)return this.doComplete(e,t,n,i);const s=new vs(this.lsOptions.fileSystemProvider.readDirectory),o=this.completionParticipants;this.completionParticipants=[s].concat(o);const a=this.doComplete(e,t,n,i);try{const t=await s.computeCompletions(e,r);return{isIncomplete:a.isIncomplete||t.isIncomplete,itemDefaults:a.itemDefaults,items:t.items.concat(a.items)}}finally{this.completionParticipants=o}}doComplete(e,t,n,r){this.offset=e.offsetAt(t),this.position=t,this.currentWord=function(e,t){let n=t-1;const r=e.getText();for(;n>=0&&-1===' \t\n\r":{[()]},*>+'.indexOf(r.charAt(n));)n--;return r.substring(n+1,t)}(e,this.offset),this.defaultReplaceRange=$t.create(Vt.create(this.position.line,this.position.character-this.currentWord.length),this.position),this.textDocument=e,this.styleSheet=n,this.documentSettings=r;try{const e={isIncomplete:!1,itemDefaults:{editRange:{start:{line:t.line,character:t.character-this.currentWord.length},end:t}},items:[]};this.nodePath=he(this.styleSheet,this.offset);for(let t=this.nodePath.length-1;t>=0;t--){const n=this.nodePath[t];if(n instanceof Fe)this.getCompletionsForDeclarationProperty(n.getParent(),e);else if(n instanceof lt)n.parent instanceof yt?this.getVariableProposals(null,e):this.getCompletionsForExpression(n,e);else if(n instanceof _e){const t=n.findAParent(ee.ExtendsReference,ee.Ruleset);if(t)if(t.type===ee.ExtendsReference)this.getCompletionsForExtendsReference(t,n,e);else{const n=t;this.getCompletionsForSelector(n,n&&n.isNested(),e)}}else if(n instanceof Ne)this.getCompletionsForFunctionArgument(n,n.getParent(),e);else if(n instanceof ve)this.getCompletionsForDeclarations(n,e);else if(n instanceof vt)this.getCompletionsForVariableDeclaration(n,e);else if(n instanceof we)this.getCompletionsForRuleSet(n,e);else if(n instanceof yt)this.getCompletionsForInterpolation(n,e);else if(n instanceof ze)this.getCompletionsForFunctionDeclaration(n,e);else if(n instanceof xt)this.getCompletionsForMixinReference(n,e);else if(n instanceof Ie)this.getCompletionsForFunctionArgument(null,n,e);else if(n instanceof Je)this.getCompletionsForSupports(n,e);else if(n instanceof st)this.getCompletionsForSupportsCondition(n,e);else if(n instanceof Ct)this.getCompletionsForExtendsReference(n,null,e);else if(n.type===ee.URILiteral)this.getCompletionForUriLiteralValue(n,e);else if(null===n.parent)this.getCompletionForTopLevel(e);else{if(n.type!==ee.StringLiteral||!this.isImportPathParent(n.parent.type))continue;this.getCompletionForImportPath(n,e)}if(e.items.length>0||this.offset>n.offset)return this.finalize(e)}return this.getCompletionsForStylesheet(e),0===e.items.length&&this.variablePrefix&&0===this.currentWord.indexOf(this.variablePrefix)&&this.getVariableProposals(null,e),this.finalize(e)}finally{this.position=null,this.currentWord=null,this.textDocument=null,this.styleSheet=null,this.symbolContext=null,this.defaultReplaceRange=null,this.nodePath=null}}isImportPathParent(e){return e===ee.Import}finalize(e){return e}findInNodePath(...e){for(let t=this.nodePath.length-1;t>=0;t--){const n=this.nodePath[t];if(-1!==e.indexOf(n.type))return n}return null}getCompletionsForDeclarationProperty(e,t){return this.getPropertyProposals(e,t)}getPropertyProposals(e,t){const n=this.isTriggerPropertyValueCompletionEnabled,r=this.isCompletePropertyWithSemicolonEnabled;return this.cssDataManager.getProperties().forEach(i=>{let s,o,a=!1;e?(s=this.getCompletionRange(e.getProperty()),o=i.name,is(e.colonPosition)||(o+=": ",a=!0)):(s=this.getCompletionRange(null),o=i.name+": ",a=!0),!e&&r&&(o+="$0;"),e&&!e.semicolonPosition&&r&&this.offset>=this.textDocument.offsetAt(s.end)&&(o+="$0;");const l={label:i.name,documentation:ki(i,this.doesSupportMarkdown()),tags:Is(i)?[Gn.Deprecated]:[],textEdit:bn.replace(s,o),insertTextFormat:Kn.Snippet,kind:qn.Property};i.restrictions||(a=!1),n&&a&&(l.command=Fs);const c=(255-("number"==typeof i.relevance?Math.min(Math.max(i.relevance,0),99):50)).toString(16),h=se(i.name,"-")?xs.VendorPrefixed:xs.Normal;l.sortText=h+"_"+c,t.items.push(l)}),this.completionParticipants.forEach(e=>{e.onCssProperty&&e.onCssProperty({propertyName:this.currentWord,range:this.defaultReplaceRange})}),t}get isTriggerPropertyValueCompletionEnabled(){return this.documentSettings?.triggerPropertyValueCompletion??!0}get isCompletePropertyWithSemicolonEnabled(){return this.documentSettings?.completePropertyWithSemicolon??!0}getCompletionsForDeclarationValue(e,t){const n=e.getFullPropertyName(),r=this.cssDataManager.getProperty(n);let i=e.getValue()||null;for(;i&&i.hasChildren();)i=i.findChildAtOffset(this.offset,!1);if(this.completionParticipants.forEach(e=>{e.onCssPropertyValue&&e.onCssPropertyValue({propertyName:n,propertyValue:this.currentWord,range:this.getCompletionRange(i)})}),r){if(r.restrictions)for(const e of r.restrictions)switch(e){case"color":this.getColorProposals(r,i,t);break;case"position":this.getPositionProposals(r,i,t);break;case"repeat":this.getRepeatStyleProposals(r,i,t);break;case"line-style":this.getLineStyleProposals(r,i,t);break;case"line-width":this.getLineWidthProposals(r,i,t);break;case"geometry-box":this.getGeometryBoxProposals(r,i,t);break;case"box":this.getBoxProposals(r,i,t);break;case"image":this.getImageProposals(r,i,t);break;case"timing-function":this.getTimingFunctionProposals(r,i,t);break;case"shape":this.getBasicShapeProposals(r,i,t)}this.getValueEnumProposals(r,i,t),this.getCSSWideKeywordProposals(r,i,t),this.getUnitProposals(r,i,t)}else{const n=function(e,t){const n=t.getFullPropertyName(),r=new Ts;function i(e){return(e instanceof ge||e instanceof bt||e instanceof ut)&&r.add(e.getText()),!0}return e.accept(function(e){if(e instanceof Se&&e!==t&&function(e){const t=e.getFullPropertyName();return n===t}(e)){const t=e.getValue();t&&t.accept(i)}return!0}),r}(this.styleSheet,e);for(const e of n.getEntries())t.items.push({label:e,textEdit:bn.replace(this.getCompletionRange(i),e),kind:qn.Value})}return this.getVariableProposals(i,t),this.getTermProposals(r,i,t),t}getValueEnumProposals(e,t,n){if(e.values)for(const r of e.values){let i,s=r.name;if(oe(s,")")){const e=s.lastIndexOf("(");-1!==e&&(s=s.substring(0,e+1)+"$1"+s.substring(e+1),i=Es)}let o=xs.Enums;se(r.name,"-")&&(o+=xs.VendorPrefixed);const a={label:r.name,documentation:ki(r,this.doesSupportMarkdown()),tags:Is(e)?[Gn.Deprecated]:[],textEdit:bn.replace(this.getCompletionRange(t),s),sortText:o,kind:qn.Value,insertTextFormat:i};n.items.push(a)}return n}getCSSWideKeywordProposals(e,t,n){for(const e in Gi)n.items.push({label:e,documentation:Gi[e],textEdit:bn.replace(this.getCompletionRange(t),e),kind:qn.Value});for(const e in Qi){const r=Ns(e);n.items.push({label:e,documentation:Qi[e],textEdit:bn.replace(this.getCompletionRange(t),r),kind:qn.Function,insertTextFormat:Es,command:se(e,"var")?Fs:void 0})}return n}getCompletionsForInterpolation(e,t){return this.offset>=e.offset+2&&this.getVariableProposals(null,t),t}getVariableProposals(e,t){const n=this.getSymbolContext().findSymbolsAtOffset(this.offset,ne.Variable);for(const r of n){const n=se(r.name,"--")?`var(${r.name})`:r.name,i={label:r.name,documentation:r.value?ae(r.value):r.value,textEdit:bn.replace(this.getCompletionRange(e),n),kind:qn.Variable,sortText:xs.Variable};if("string"==typeof i.documentation&&zi(i.documentation)&&(i.kind=qn.Color),r.node.type===ee.FunctionParameter){const e=r.node.getParent();e.type===ee.MixinDeclaration&&(i.detail=Dt("argument from '{0}'",e.getName()))}t.items.push(i)}return t}getVariableProposalsForCSSVarFunction(e){const t=new Ts;this.styleSheet.acceptVisitor(new As(t,this.offset));let n=this.getSymbolContext().findSymbolsAtOffset(this.offset,ne.Variable);for(const r of n){if(se(r.name,"--")){const t={label:r.name,documentation:r.value?ae(r.value):r.value,textEdit:bn.replace(this.getCompletionRange(null),r.name),kind:qn.Variable};"string"==typeof t.documentation&&zi(t.documentation)&&(t.kind=qn.Color),e.items.push(t)}t.remove(r.name)}for(const n of t.getEntries())if(se(n,"--")){const t={label:n,textEdit:bn.replace(this.getCompletionRange(null),n),kind:qn.Variable};e.items.push(t)}return e}getUnitProposals(e,t,n){let r="0";if(this.currentWord.length>0){const e=this.currentWord.match(/^-?\d[\.\d+]*/);e&&(r=e[0],n.isIncomplete=r.length===this.currentWord.length)}else 0===this.currentWord.length&&(n.isIncomplete=!0);if(t&&t.parent&&t.parent.type===ee.Term&&(t=t.getParent()),e.restrictions)for(const i of e.restrictions){const e=Zi[i];if(e)for(const i of e){const e=r+i;n.items.push({label:e,textEdit:bn.replace(this.getCompletionRange(t),e),kind:qn.Unit})}}return n}getCompletionRange(e){if(e&&e.offset<=this.offset&&this.offset<=e.end){const t=-1!==e.end?this.textDocument.positionAt(e.end):this.position,n=this.textDocument.positionAt(e.offset);if(n.line===t.line)return $t.create(n,t)}return this.defaultReplaceRange}getColorProposals(e,t,n){for(const e in Ni)n.items.push({label:e,documentation:Ni[e],textEdit:bn.replace(this.getCompletionRange(t),e),kind:qn.Color});for(const e in Di)n.items.push({label:e,documentation:Di[e],textEdit:bn.replace(this.getCompletionRange(t),e),kind:qn.Value});const r=new Ts;this.styleSheet.acceptVisitor(new Ds(r,this.offset));for(const e of r.getEntries())n.items.push({label:e,textEdit:bn.replace(this.getCompletionRange(t),e),kind:qn.Color});for(const e of Ii)n.items.push({label:e.label,detail:e.func,documentation:e.desc,textEdit:bn.replace(this.getCompletionRange(t),e.insertText),insertTextFormat:Es,kind:qn.Function});return n}getPositionProposals(e,t,n){for(const e in Ui)n.items.push({label:e,documentation:Ui[e],textEdit:bn.replace(this.getCompletionRange(t),e),kind:qn.Value});return n}getRepeatStyleProposals(e,t,n){for(const e in $i)n.items.push({label:e,documentation:$i[e],textEdit:bn.replace(this.getCompletionRange(t),e),kind:qn.Value});return n}getLineStyleProposals(e,t,n){for(const e in qi)n.items.push({label:e,documentation:qi[e],textEdit:bn.replace(this.getCompletionRange(t),e),kind:qn.Value});return n}getLineWidthProposals(e,t,n){for(const e of ji)n.items.push({label:e,textEdit:bn.replace(this.getCompletionRange(t),e),kind:qn.Value});return n}getGeometryBoxProposals(e,t,n){for(const e in Hi)n.items.push({label:e,documentation:Hi[e],textEdit:bn.replace(this.getCompletionRange(t),e),kind:qn.Value});return n}getBoxProposals(e,t,n){for(const e in Ki)n.items.push({label:e,documentation:Ki[e],textEdit:bn.replace(this.getCompletionRange(t),e),kind:qn.Value});return n}getImageProposals(e,t,n){for(const e in Ji){const r=Ns(e);n.items.push({label:e,documentation:Ji[e],textEdit:bn.replace(this.getCompletionRange(t),r),kind:qn.Function,insertTextFormat:e!==r?Es:void 0})}return n}getTimingFunctionProposals(e,t,n){for(const e in Yi){const r=Ns(e);n.items.push({label:e,documentation:Yi[e],textEdit:bn.replace(this.getCompletionRange(t),r),kind:qn.Function,insertTextFormat:e!==r?Es:void 0})}return n}getBasicShapeProposals(e,t,n){for(const e in Xi){const r=Ns(e);n.items.push({label:e,documentation:Xi[e],textEdit:bn.replace(this.getCompletionRange(t),r),kind:qn.Function,insertTextFormat:e!==r?Es:void 0})}return n}getCompletionsForStylesheet(e){const t=this.styleSheet.findFirstChildBeforeOffset(this.offset);return t?t instanceof we?this.getCompletionsForRuleSet(t,e):t instanceof Je?this.getCompletionsForSupports(t,e):e:this.getCompletionForTopLevel(e)}getCompletionForTopLevel(e){return this.cssDataManager.getAtDirectives().forEach(t=>{e.items.push({label:t.name,textEdit:bn.replace(this.getCompletionRange(null),t.name),documentation:ki(t,this.doesSupportMarkdown()),tags:Is(t)?[Gn.Deprecated]:[],kind:qn.Keyword})}),this.getCompletionsForSelector(null,!1,e),e}getCompletionsForRuleSet(e,t){const n=e.getDeclarations();return n&&n.endsWith("}")&&this.offset>=n.end?this.getCompletionForTopLevel(t):!n||this.offset<=n.offset?this.getCompletionsForSelector(e,e.isNested(),t):this.getCompletionsForDeclarations(e.getDeclarations(),t)}getCompletionsForSelector(e,t,n){const r=this.findInNodePath(ee.PseudoSelector,ee.IdentifierSelector,ee.ClassSelector,ee.ElementNameSelector);if(!r&&this.hasCharacterAtPosition(this.offset-this.currentWord.length-1,":")&&(this.currentWord=":"+this.currentWord,this.hasCharacterAtPosition(this.offset-this.currentWord.length-1,":")&&(this.currentWord=":"+this.currentWord),this.defaultReplaceRange=$t.create(Vt.create(this.position.line,this.position.character-this.currentWord.length),this.position)),this.cssDataManager.getPseudoClasses().forEach(e=>{const t=Ns(e.name),i={label:e.name,textEdit:bn.replace(this.getCompletionRange(r),t),documentation:ki(e,this.doesSupportMarkdown()),tags:Is(e)?[Gn.Deprecated]:[],kind:qn.Function,insertTextFormat:e.name!==t?Es:void 0};se(e.name,":-")&&(i.sortText=xs.VendorPrefixed),n.items.push(i)}),this.cssDataManager.getPseudoElements().forEach(e=>{const t=Ns(e.name),i={label:e.name,textEdit:bn.replace(this.getCompletionRange(r),t),documentation:ki(e,this.doesSupportMarkdown()),tags:Is(e)?[Gn.Deprecated]:[],kind:qn.Function,insertTextFormat:e.name!==t?Es:void 0};se(e.name,"::-")&&(i.sortText=xs.VendorPrefixed),n.items.push(i)}),!t){for(const e of es)n.items.push({label:e,textEdit:bn.replace(this.getCompletionRange(r),e),kind:qn.Keyword});for(const e of ts)n.items.push({label:e,textEdit:bn.replace(this.getCompletionRange(r),e),kind:qn.Keyword})}const i={};i[this.currentWord]=!0;const s=this.textDocument.getText();if(this.styleSheet.accept(e=>{if(e.type===ee.SimpleSelector&&e.length>0){const t=s.substr(e.offset,e.length);return"."!==t.charAt(0)||i[t]||(i[t]=!0,n.items.push({label:t,textEdit:bn.replace(this.getCompletionRange(r),t),kind:qn.Keyword})),!1}return!0}),e&&e.isNested()){const t=e.getSelectors().findFirstChildBeforeOffset(this.offset);t&&0===e.getSelectors().getChildren().indexOf(t)&&this.getPropertyProposals(null,n)}return n}getCompletionsForDeclarations(e,t){if(!e||this.offset===e.offset)return t;const n=e.findFirstChildBeforeOffset(this.offset);if(!n)return this.getCompletionsForDeclarationProperty(null,t);if(n instanceof ke){const e=n;if(!is(e.colonPosition)||this.offset<=e.colonPosition)return this.getCompletionsForDeclarationProperty(e,t);if(is(e.semicolonPosition)&&e.semicolonPositione.colonPosition&&this.getVariableProposals(e.getValue()||null,t),t}getCompletionsForExpression(e,t){const n=e.getParent();if(n instanceof Ne)return this.getCompletionsForFunctionArgument(n,n.getParent(),t),t;const r=e.findParent(ee.Declaration);if(!r)return this.getTermProposals(void 0,null,t),t;const i=e.findChildAtOffset(this.offset,!0);return i?i instanceof bt||i instanceof ge?this.getCompletionsForDeclarationValue(r,t):t:this.getCompletionsForDeclarationValue(r,t)}getCompletionsForFunctionArgument(e,t,n){const r=t.getIdentifier();return r&&r.matches("var")&&(t.getArguments().hasChildren()&&t.getArguments().getChild(0)!==e||this.getVariableProposalsForCSSVarFunction(n)),n}getCompletionsForFunctionDeclaration(e,t){const n=e.getDeclarations();return n&&this.offset>n.offset&&this.offset{e.onCssMixinReference&&e.onCssMixinReference({mixinName:this.currentWord,range:this.getCompletionRange(r)})}),t}getTermProposals(e,t,n){const r=this.getSymbolContext().findSymbolsAtOffset(this.offset,ne.Function);for(const e of r)e.node instanceof ze&&n.items.push(this.makeTermProposal(e,e.node.getParameters(),t));return n}makeTermProposal(e,t,n){e.node;const r=t.getChildren().map(e=>e instanceof Te?e.getName():e.getText()),i=e.name+"("+r.map((e,t)=>"${"+(t+1)+":"+e+"}").join(", ")+")";return{label:e.name,detail:e.name+"("+r.join(", ")+")",textEdit:bn.replace(this.getCompletionRange(n),i),insertTextFormat:Es,kind:qn.Function,sortText:xs.Term}}getCompletionsForSupportsCondition(e,t){const n=e.findFirstChildBeforeOffset(this.offset);if(n){if(n instanceof Se)return!is(n.colonPosition)||this.offset<=n.colonPosition?this.getCompletionsForDeclarationProperty(n,t):this.getCompletionsForDeclarationValue(n,t);if(n instanceof st)return this.getCompletionsForSupportsCondition(n,t)}return is(e.lParent)&&this.offset>e.lParent&&(!is(e.rParent)||this.offset<=e.rParent)?this.getCompletionsForDeclarationProperty(null,t):t}getCompletionsForSupports(e,t){const n=e.getDeclarations();if(!n||this.offset<=n.offset){const n=e.findFirstChildBeforeOffset(this.offset);return n instanceof st?this.getCompletionsForSupportsCondition(n,t):t}return this.getCompletionForTopLevel(t)}getCompletionsForExtendsReference(e,t,n){return n}getCompletionForUriLiteralValue(e,t){let n,r,i;if(e.hasChildren()){const t=e.getChild(0);n=t.getText(),r=this.position,i=this.getCompletionRange(t)}else{n="",r=this.position;const t=this.textDocument.positionAt(e.offset+4);i=$t.create(t,t)}return this.completionParticipants.forEach(e=>{e.onCssURILiteralValue&&e.onCssURILiteralValue({uriValue:n,position:r,range:i})}),t}getCompletionForImportPath(e,t){return this.completionParticipants.forEach(t=>{t.onCssImportPath&&t.onCssImportPath({pathValue:e.getText(),position:this.position,range:this.getCompletionRange(e)})}),t}hasCharacterAtPosition(e,t){const n=this.textDocument.getText();return e>=0&&e"),this.writeLine(t,r.join(""))}};!function(e){function t(e){const t=e.match(/^['"](.*)["']$/);return t?t[1]:e}e.ensure=function(e,n){return n+t(e)+n},e.remove=t}(Rs||(Rs={}));var Bs=class{constructor(){this.id=0,this.attr=0,this.tag=0}};function Ws(e,t){let n=new Ms;for(const r of e.getChildren())switch(r.type){case ee.SelectorCombinator:if(t){const e=r.getText().split("&");if(1===e.length){n.addAttr("name",e[0]);break}n=t.cloneWithParent(),e[0]&&n.findRoot().prepend(e[0]);for(let r=1;r1){const e=t.cloneWithParent();n.addChild(e.findRoot()),n=e}n.append(e[r])}}break;case ee.SelectorPlaceholder:if(r.matches("@at-root"))return n;case ee.ElementNameSelector:const e=r.getText();n.addAttr("name","*"===e?"element":Vs(e));break;case ee.ClassSelector:n.addAttr("class",Vs(r.getText().substring(1)));break;case ee.IdentifierSelector:n.addAttr("id",Vs(r.getText().substring(1)));break;case ee.MixinDeclaration:n.addAttr("class",r.getName());break;case ee.PseudoSelector:n.addAttr(Vs(r.getText()),"");break;case ee.AttributeSelector:const i=r,s=i.getIdentifier();if(s){const e=i.getValue(),t=i.getOperator();let r;if(e&&t)switch(Vs(t.getText())){case"|=":r=`${Rs.remove(Vs(e.getText()))}-…`;break;case"^=":r=`${Rs.remove(Vs(e.getText()))}…`;break;case"$=":r=`…${Rs.remove(Vs(e.getText()))}`;break;case"~=":r=` … ${Rs.remove(Vs(e.getText()))} … `;break;case"*=":r=`…${Rs.remove(Vs(e.getText()))}…`;break;default:r=Rs.remove(Vs(e.getText()))}n.addAttr(Vs(s.getText()),r)}}return n}function Vs(e){const t=new ie;t.setSource(e);const n=t.scanUnquotedString();return n?n.text:e}var Us=class{constructor(e){this.cssDataManager=e}selectorToMarkedString(e,t){const n=function(e){if(e.matches("@at-root"))return null;const t=new Os,n=[],r=e.getParent();if(r instanceof we){let e=r.getParent();for(;e&&!qs(e);){if(e instanceof we){if(e.getSelectors().matches("@at-root"))break;n.push(e)}e=e.getParent()}}const i=new $s(t);for(let e=n.length-1;e>=0;e--){const t=n[e].getSelectors().getChild(0);t&&i.processSelector(t)}return i.processSelector(e),t}(e);if(n){const r=new Ps('"').print(n,t);return r.push(this.selectorToSpecificityMarkedString(e)),r}return[]}simpleSelectorToMarkedString(e){const t=Ws(e),n=new Ps('"').print(t);return n.push(this.selectorToSpecificityMarkedString(e)),n}isPseudoElementIdentifier(e){const t=e.match(/^::?([\w-]+)/);return!!t&&!!this.cssDataManager.getPseudoElement("::"+t[1])}selectorToSpecificityMarkedString(e){const t=e=>{const t=new Bs;let r=new Bs;for(const t of e)for(const e of t.getChildren()){const t=n(e);t.id>r.id?r=t:t.idr.attr?r=t:t.attrr.tag&&(r=t))}return t.id+=r.id,t.attr+=r.attr,t.tag+=r.tag,t},n=e=>{const r=new Bs;e:for(const i of e.getChildren()){switch(i.type){case ee.IdentifierSelector:r.id++;break;case ee.ClassSelector:case ee.AttributeSelector:r.attr++;break;case ee.ElementNameSelector:if(i.matches("*"))break;r.tag++;break;case ee.PseudoSelector:const e=i.getText(),n=i.getChildren();if(this.isPseudoElementIdentifier(e)){if(e.match(/^::slotted/i)&&n.length>0){r.tag++;let e=t(n);r.id+=e.id,r.attr+=e.attr,r.tag+=e.tag;continue e}r.tag++;continue e}if(e.match(/^:where/i))continue e;if(e.match(/^:(?:not|has|is)/i)&&n.length>0){let e=t(n);r.id+=e.id,r.attr+=e.attr,r.tag+=e.tag;continue e}if(e.match(/^:(?:host|host-context)/i)&&n.length>0){r.attr++;let e=t(n);r.id+=e.id,r.attr+=e.attr,r.tag+=e.tag;continue e}if(e.match(/^:(?:nth-child|nth-last-child)/i)&&n.length>0){if(r.attr++,3===n.length&&23===n[1].type){let e=t(n[2].getChildren());r.id+=e.id,r.attr+=e.attr,r.tag+=e.tag;continue e}const e=new ss,i=n[1].getText();e.scanner.setSource(i);const s=e.scanner.scan(),o=e.scanner.scan();if("n"===s.text||"-n"===s.text&&"of"===o.text){const n=[],s=i.slice(o.offset+2).split(",");for(const t of s){const r=e.internalParse(t,e._parseSelector);r&&n.push(r)}let a=t(n);r.id+=a.id,r.attr+=a.attr,r.tag+=a.tag;continue e}continue e}r.attr++;continue e}if(i.getChildren().length>0){const e=n(i);r.id+=e.id,r.attr+=e.attr,r.tag+=e.tag}}return r},r=n(e);return`[${Dt("Selector Specificity")}](https://developer.mozilla.org/docs/Web/CSS/Specificity): (${r.id}, ${r.attr}, ${r.tag})`}},$s=class{constructor(e){this.prev=null,this.element=e}processSelector(e){let t=null;if(!(this.element instanceof Os)&&e.getChildren().some(e=>e.hasChildren()&&e.getChild(0).type===ee.SelectorCombinator)){const e=this.element.findRoot();e.parent instanceof Os&&(t=this.element,this.element=e.parent,this.element.removeChild(e),this.prev=null)}for(const n of e.getChildren()){if(n instanceof _e){if(this.prev instanceof _e){const e=new zs("…");this.element.addChild(e),this.element=e}else this.prev&&(this.prev.matches("+")||this.prev.matches("~"))&&this.element.parent&&(this.element=this.element.parent);this.prev&&this.prev.matches("~")&&this.element.addChild(new zs("⋮"));const e=Ws(n,t),r=e.findRoot();this.element.addChild(r),this.element=e}(n instanceof _e||n.type===ee.SelectorCombinatorParent||n.type===ee.SelectorCombinatorShadowPiercingDescendant||n.type===ee.SelectorCombinatorSibling||n.type===ee.SelectorCombinatorAllSiblings)&&(this.prev=n)}}};function qs(e){switch(e.type){case ee.MixinDeclaration:case ee.Stylesheet:return!0}return!1}var js=class{constructor(e,t){this.clientCapabilities=e,this.cssDataManager=t,this.selectorPrinting=new Us(t)}configure(e){this.defaultSettings=e}doHover(e,t,n,r=this.defaultSettings){function i(t){return $t.create(e.positionAt(t.offset),e.positionAt(t.end))}const s=he(n,e.offsetAt(t));let o,a=null;for(let e=0;e"string"==typeof e?e:e.value):e.value}doesSupportMarkdown(){if(!is(this.supportsMarkdown)){if(!is(this.clientCapabilities))return this.supportsMarkdown=!0,this.supportsMarkdown;const e=this.clientCapabilities.textDocument&&this.clientCapabilities.textDocument.hover;this.supportsMarkdown=e&&e.contentFormat&&Array.isArray(e.contentFormat)&&-1!==e.contentFormat.indexOf(Vn.Markdown)}return this.supportsMarkdown}},Ks=/^\w+:\/\//,Hs=/^data:/,Gs=class{constructor(e,t){this.fileSystemProvider=e,this.resolveModuleReferences=t}configure(e){this.defaultSettings=e}findDefinition(e,t,n){const r=new ps(n),i=ce(n,e.offsetAt(t));if(!i)return null;const s=r.findSymbolFromNode(i);return s?{uri:e.uri,range:Qs(s.node,e)}:null}findReferences(e,t,n){return this.findDocumentHighlights(e,t,n).map(t=>({uri:e.uri,range:t.range}))}getHighlightNode(e,t,n){let r=ce(n,e.offsetAt(t));if(r&&r.type!==ee.Stylesheet&&r.type!==ee.Declarations)return r.type===ee.Identifier&&r.parent&&r.parent.type===ee.ClassSelector&&(r=r.parent),r}findDocumentHighlights(e,t,n){const r=[],i=this.getHighlightNode(e,t,n);if(!i)return r;const s=new ps(n),o=s.findSymbolFromNode(i),a=i.getText();return n.accept(t=>{if(o){if(s.matchesSymbol(t,o))return r.push({kind:Ys(t),range:Qs(t,e)}),!1}else i&&i.type===t.type&&t.matches(a)&&r.push({kind:Ys(t),range:Qs(t,e)});return!0}),r}isRawStringDocumentLinkNode(e){return e.type===ee.Import}findDocumentLinks(e,t,n){const r=this.findUnresolvedLinks(e,t),i=[];for(let t of r){const r=t.link,s=r.target;if(!s||Hs.test(s));else if(Ks.test(s))i.push(r);else{const t=n.resolveReference(s,e.uri);t&&(r.target=t),i.push(r)}}return i}async findDocumentLinks2(e,t,n){const r=this.findUnresolvedLinks(e,t),i=[];for(let t of r){const r=t.link,s=r.target;if(!s||Hs.test(s));else if(Ks.test(s))i.push(r);else{const o=await this.resolveReference(s,e.uri,n,t.isRawLink);void 0!==o&&(r.target=o,i.push(r))}}return i}findUnresolvedLinks(e,t){const n=[],r=t=>{let r=t.getText();const i=Qs(t,e);if(i.start.line===i.end.line&&i.start.character===i.end.character)return;(se(r,"'")||se(r,'"'))&&(r=r.slice(1,-1));const s=!!t.parent&&this.isRawStringDocumentLinkNode(t.parent);n.push({link:{target:r,range:i},isRawLink:s})};return t.accept(e=>{if(e.type===ee.URILiteral){const t=e.getChild(0);return t&&r(t),!1}if(e.parent&&this.isRawStringDocumentLinkNode(e.parent)){const t=e.getText();return(se(t,"'")||se(t,'"'))&&r(e),!1}return!0}),n}findSymbolInformations(e,t){const n=[];return this.collectDocumentSymbols(e,t,(t,r,i)=>{const s=i instanceof pe?Qs(i,e):i,o={name:t||Dt(""),kind:r,location:jt.create(e.uri,s)};n.push(o)}),n}findDocumentSymbols(e,t){const n=[],r=[];return this.collectDocumentSymbols(e,t,(t,i,s,o,a)=>{const l=s instanceof pe?Qs(s,e):s;let c=o instanceof pe?Qs(o,e):o;c&&Js(l,c)||(c=$t.create(l.start,l.start));const h={name:t||Dt(""),kind:i,range:l,selectionRange:c};let d=r.pop();for(;d&&!Js(d[1],l);)d=r.pop();if(d){const e=d[0];e.children||(e.children=[]),e.children.push(h),r.push(d)}else n.push(h);a&&r.push([h,Qs(a,e)])}),n}collectDocumentSymbols(e,t,n){t.accept(t=>{if(t instanceof we){for(const r of t.getSelectors().getChildren())if(r instanceof Ce){const i=$t.create(e.positionAt(r.offset),e.positionAt(t.end));n(r.getText(),hr.Class,i,r,t.getDeclarations())}}else if(t instanceof vt)n(t.getName(),hr.Variable,t,t.getVariable(),void 0);else if(t instanceof St)n(t.getName(),hr.Method,t,t.getIdentifier(),t.getDeclarations());else if(t instanceof ze)n(t.getName(),hr.Function,t,t.getIdentifier(),t.getDeclarations());else if(t instanceof Ve){const e=Dt("@keyframes {0}",t.getName());n(e,hr.Class,t,t.getIdentifier(),t.getDeclarations())}else if(t instanceof Be){const e=Dt("@font-face");n(e,hr.Class,t,void 0,t.getDeclarations())}else if(t instanceof Qe){const e=t.getChild(0);if(e instanceof tt){const r="@media "+e.getText();n(r,hr.Module,t,e,t.getDeclarations())}}return!0})}findDocumentColors(e,t){const n=[];return t.accept(t=>{const r=function(e,t){const n=function(e){if(e.type===ee.HexColorValue)return Bi(e.getText());if(e.type===ee.Function){const t=e,n=t.getName();let r=t.getArguments().getChildren();if(1===r.length){const e=r[0].getChildren();if(1===e.length&&e[0].type===ee.Expression&&(r=e[0].getChildren(),3===r.length)){const e=r[2];if(e instanceof ct){const t=e.getLeft(),n=e.getRight(),i=e.getOperator();t&&n&&i&&i.matches("/")&&(r=[r[0],r[1],t,n])}}}if(!n||r.length<3||r.length>4)return null;try{const e=4===r.length?Mi(r[3],1):1;if("rgb"===n||"rgba"===n)return{red:Mi(r[0],255),green:Mi(r[1],255),blue:Mi(r[2],255),alpha:e};if("hsl"===n||"hsla"===n){return Wi(Oi(r[0]),Mi(r[1],100),Mi(r[2],100),e)}if("hwb"===n){return function(e,t,n,r=1){if(t+n>=1){const e=t/(t+n);return{red:e,green:e,blue:e,alpha:r}}const i=Wi(e,1,.5,r);let s=i.red;s*=1-t-n,s+=t;let o=i.green;o*=1-t-n,o+=t;let a=i.blue;return a*=1-t-n,a+=t,{red:s,green:o,blue:a,alpha:r}}(Oi(r[0]),Mi(r[1],100),Mi(r[2],100),e)}}catch(e){return null}}else if(e.type===ee.Identifier){if(e.parent&&e.parent.type!==ee.Term)return null;const t=e.parent;if(t&&t.parent&&t.parent.type===ee.BinaryExpression){const e=t.parent;if(e.parent&&e.parent.type===ee.ListEntry&&e.parent.key===e)return null}const n=e.getText().toLowerCase();if("none"===n)return null;const r=Ni[n];if(r)return Bi(r)}return null}(e);return n?{color:n,range:Qs(e,t)}:null}(t,e);return r&&n.push(r),!0}),n}getColorPresentations(e,t,n,r){const i=[],s=Math.round(255*n.red),o=Math.round(255*n.green),a=Math.round(255*n.blue);let l;l=1===n.alpha?`rgb(${s}, ${o}, ${a})`:`rgba(${s}, ${o}, ${a}, ${n.alpha})`,i.push({label:l,textEdit:bn.replace(r,l)}),l=1===n.alpha?`#${Xs(s)}${Xs(o)}${Xs(a)}`:`#${Xs(s)}${Xs(o)}${Xs(a)}${Xs(Math.round(255*n.alpha))}`,i.push({label:l,textEdit:bn.replace(r,l)});const c=Vi(n);l=1===c.a?`hsl(${c.h}, ${Math.round(100*c.s)}%, ${Math.round(100*c.l)}%)`:`hsla(${c.h}, ${Math.round(100*c.s)}%, ${Math.round(100*c.l)}%, ${c.a})`,i.push({label:l,textEdit:bn.replace(r,l)});const h=function(e){const t=Vi(e),n=Math.min(e.red,e.green,e.blue),r=1-Math.max(e.red,e.green,e.blue);return{h:t.h,w:n,b:r,a:t.a}}(n);return l=1===h.a?`hwb(${h.h} ${Math.round(100*h.w)}% ${Math.round(100*h.b)}%)`:`hwb(${h.h} ${Math.round(100*h.w)}% ${Math.round(100*h.b)}% / ${h.a})`,i.push({label:l,textEdit:bn.replace(r,l)}),i}prepareRename(e,t,n){const r=this.getHighlightNode(e,t,n);if(r)return $t.create(e.positionAt(r.offset),e.positionAt(r.end))}doRename(e,t,n,r){const i=this.findDocumentHighlights(e,t,r).map(e=>bn.replace(e.range,n));return{changes:{[e.uri]:i}}}async resolveModuleReference(e,t,n){if(se(t,"file://")){const r=function(e){const t=e.indexOf("/");if(-1===t)return"";if("@"===e[0]){const n=e.indexOf("/",t+1);return-1===n?e:e.substring(0,n)}return e.substring(0,t)}(e);if(r&&"."!==r&&".."!==r){const i=n.resolveReference("/",t),s=gs(t),o=await this.resolvePathToModule(r,s,i);if(o)return bs(o,e.substring(r.length+1))}}}async mapReference(e,t){return e}async resolveReference(e,t,n,r=!1,i=this.defaultSettings){if("~"===e[0]&&"/"!==e[1]&&this.fileSystemProvider)return e=e.substring(1),this.mapReference(await this.resolveModuleReference(e,t,n),r);const s=await this.mapReference(n.resolveReference(e,t),r);if(this.resolveModuleReferences){if(s&&await this.fileExists(s))return s;const i=await this.mapReference(await this.resolveModuleReference(e,t,n),r);if(i)return i}if(s&&!await this.fileExists(s)){const s=n.resolveReference("/",t);if(i&&s){if(e in i)return this.mapReference(bs(s,i[e]),r);const t=e.indexOf("/"),n=`${e.substring(0,t)}/`;if(n in i){let t=bs(s,i[n].slice(0,-1));return this.mapReference(t=bs(t,e.substring(n.length-1)),r)}}}return s}async resolvePathToModule(e,t,n){const r=bs(t,"node_modules",e,"package.json");return await this.fileExists(r)?gs(r):n&&t.startsWith(n)&&t.length!==n.length?this.resolvePathToModule(e,gs(t),n):void 0}async fileExists(e){if(!this.fileSystemProvider)return!1;try{const t=await this.fileSystemProvider.stat(e);return t.type!==mi.Unknown||-1!==t.size}catch(e){return!1}}};function Qs(e,t){return $t.create(t.positionAt(e.offset),t.positionAt(e.end))}function Js(e,t){const n=t.start.line,r=t.end.line,i=e.start.line,s=e.end.line;return!(ns||r>s||n===i&&t.start.charactere.end.character)}function Ys(e){if(e.type===ee.Selector)return ar.Write;if(e instanceof ge&&e.parent&&e.parent instanceof Fe&&e.isCustomProperty)return ar.Write;if(e.parent)switch(e.parent.type){case ee.FunctionDeclaration:case ee.MixinDeclaration:case ee.Keyframe:case ee.VariableDeclaration:case ee.FunctionParameter:return ar.Write}return ar.Read}function Xs(e){const t=e.toString(16);return 2!==t.length?"0"+t:t}var Zs=de.Warning,eo=de.Error,to=de.Ignore,no=class{constructor(e,t,n){this.id=e,this.message=t,this.defaultValue=n}},ro={AllVendorPrefixes:new no("compatibleVendorPrefixes",Dt("When using a vendor-specific prefix make sure to also include all other vendor-specific properties"),to),IncludeStandardPropertyWhenUsingVendorPrefix:new no("vendorPrefix",Dt("When using a vendor-specific prefix also include the standard property"),Zs),DuplicateDeclarations:new no("duplicateProperties",Dt("Do not use duplicate style definitions"),to),EmptyRuleSet:new no("emptyRules",Dt("Do not use empty rulesets"),Zs),ImportStatemement:new no("importStatement",Dt("Import statements do not load in parallel"),to),BewareOfBoxModelSize:new no("boxModel",Dt("Do not use width or height when using padding or border"),to),UniversalSelector:new no("universalSelector",Dt("The universal selector (*) is known to be slow"),to),ZeroWithUnit:new no("zeroUnits",Dt("No unit for zero needed"),to),RequiredPropertiesForFontFace:new no("fontFaceProperties",Dt("@font-face rule must define 'src' and 'font-family' properties"),Zs),HexColorLength:new no("hexColorLength",Dt("Hex colors must consist of three, four, six or eight hex numbers"),eo),ArgsInColorFunction:new no("argumentsInColorFunction",Dt("Invalid number of parameters"),eo),UnknownProperty:new no("unknownProperties",Dt("Unknown property."),Zs),UnknownAtRules:new no("unknownAtRules",Dt("Unknown at-rule."),Zs),IEStarHack:new no("ieHack",Dt("IE hacks are only necessary when supporting IE7 and older"),to),UnknownVendorSpecificProperty:new no("unknownVendorSpecificProperties",Dt("Unknown vendor specific property."),to),PropertyIgnoredDueToDisplay:new no("propertyIgnoredDueToDisplay",Dt("Property is ignored due to the display."),Zs),AvoidImportant:new no("important",Dt("Avoid using !important. It is an indication that the specificity of the entire CSS has gotten out of control and needs to be refactored."),to),AvoidFloat:new no("float",Dt("Avoid using 'float'. Floats lead to fragile CSS that is easy to break if one aspect of the layout changes."),to),AvoidIdSelector:new no("idSelector",Dt("Selectors should not contain IDs because these rules are too tightly coupled with the HTML."),to)},io={ValidProperties:new class{constructor(e,t,n){this.id=e,this.message=t,this.defaultValue=n}}("validProperties",Dt("A list of properties that are not validated against the `unknownProperties` rule."),[])},so=class{constructor(e={}){this.conf=e}getRule(e){if(this.conf.hasOwnProperty(e.id)){const t=function(e){switch(e){case"ignore":return de.Ignore;case"warning":return de.Warning;case"error":return de.Error}return null}(this.conf[e.id]);if(t)return t}return e.defaultValue}getSetting(e){return this.conf[e.id]}},oo=class{constructor(e){this.cssDataManager=e}doCodeActions(e,t,n,r){return this.doCodeActions2(e,t,n,r).map(t=>{const n=t.edit&&t.edit.documentChanges&&t.edit.documentChanges[0];return fn.create(t.title,"_css.applyCodeAction",e.uri,e.version,n&&n.edits)})}doCodeActions2(e,t,n,r){const i=[];if(n.diagnostics)for(const t of n.diagnostics)this.appendFixesForMarker(e,r,t,i);return i}getFixesForUnknownProperty(e,t,n,r){const i=t.getName(),s=[];this.cssDataManager.getProperties().forEach(e=>{const t=function(e,t,n=4){let r=Math.abs(e.length-t.length);if(r>n)return 0;let i,s,o=[],a=[];for(i=0;i=i.length/2&&s.push({property:e.name,score:t})}),s.sort((e,t)=>t.score-e.score||e.property.localeCompare(t.property));let o=3;for(const t of s){const i=t.property,s=Dt("Rename to '{0}'",i),a=bn.replace(n.range,i),l=Mn.create(e.uri,e.version),c={documentChanges:[xn.create(l,[a])]},h=kr.create(s,c,br.QuickFix);if(h.diagnostics=[n],r.push(h),--o<=0)return}}appendFixesForMarker(e,t,n,r){if(n.code!==ro.UnknownProperty.id)return;const i=e.offsetAt(n.range.start),s=e.offsetAt(n.range.end),o=he(t,i);for(let t=o.length-1;t>=0;t--){const a=o[t];if(a instanceof Se){const t=a.getProperty();if(t&&t.offset===i&&t.end===s)return void this.getFixesForUnknownProperty(e,t,n,r)}}}},ao=class{constructor(e){this.fullPropertyName=e.getFullPropertyName().toLowerCase(),this.node=e}};function lo(e,t,n,r){const i=e[t];i.value=n,n&&(os(i.properties,r)||i.properties.push(r))}function co(e,t,n,r){"top"===t||"right"===t||"bottom"===t||"left"===t?lo(e,t,n,r):function(e,t,n){lo(e,"top",t,n),lo(e,"right",t,n),lo(e,"bottom",t,n),lo(e,"left",t,n)}(e,n,r)}function ho(e,t,n){switch(t.length){case 1:co(e,void 0,t[0],n);break;case 2:co(e,"top",t[0],n),co(e,"bottom",t[0],n),co(e,"right",t[1],n),co(e,"left",t[1],n);break;case 3:co(e,"top",t[0],n),co(e,"right",t[1],n),co(e,"left",t[1],n),co(e,"bottom",t[2],n);break;case 4:co(e,"top",t[0],n),co(e,"right",t[1],n),co(e,"bottom",t[2],n),co(e,"left",t[3],n)}}function uo(e,t){for(let n of t)if(e.matches(n))return!0;return!1}function po(e,t=!0){return!(t&&uo(e,["initial","unset"])||0===parseFloat(e.getText()))}function mo(e,t=!0){return e.map(e=>po(e,t))}function fo(e,t=!0){return!(uo(e,["none","hidden"])||t&&uo(e,["initial","unset"]))}function go(e,t=!0){return e.map(e=>fo(e,t))}function bo(e){const t=e.getChildren();if(1===t.length){const e=t[0];return po(e)&&fo(e)}for(const e of t){const t=e;if(!po(t,!1)||!fo(t,!1))return!1}return!0}var vo=class{constructor(){this.data={}}add(e,t,n){let r=this.data[e];r||(r={nodes:[],names:[]},this.data[e]=r),r.names.push(t),n&&r.nodes.push(n)}},yo=class e{static entries(t,n,r,i,s){const o=new e(n,r,i);return t.acceptVisitor(o),o.completeValidations(),o.getEntries(s)}constructor(e,t,n){this.cssDataManager=n,this.warnings=[],this.settings=t,this.documentText=e.getText(),this.keyframes=new vo,this.validProperties={};const r=t.getSetting(io.ValidProperties);Array.isArray(r)&&r.forEach(e=>{if("string"==typeof e){const t=e.trim().toLowerCase();t.length&&(this.validProperties[t]=!0)}})}isValidPropertyDeclaration(e){const t=e.fullPropertyName;return this.validProperties[t]}fetch(e,t){const n=[];for(const r of e)r.fullPropertyName===t&&n.push(r);return n}fetchWithValue(e,t,n){const r=[];for(const i of e)if(i.fullPropertyName===t){const e=i.node.getValue();e&&this.findValueInExpression(e,n)&&r.push(i)}return r}findValueInExpression(e,t){let n=!1;return e.accept(e=>(e.type===ee.Identifier&&e.matches(t)&&(n=!0),!n)),n}getEntries(e=de.Warning|de.Error){return this.warnings.filter(t=>0!==(t.getLevel()&e))}addEntry(e,t,n){const r=new Nt(e,t,this.settings.getRule(t),n);this.warnings.push(r)}getMissingNames(e,t){const n=e.slice(0);for(let e=0;e0){const e=this.fetch(r,"float");for(let t=0;t0){const e=this.fetch(r,"vertical-align");for(let t=0;t1)for(let n=0;ne.startsWith(i))&&a.delete(t)}}const l=[];for(let t=0,n=e.prefixes.length;t!(e instanceof ct&&(r+=1,1))),r!==n&&this.addEntry(e,ro.ArgsInColorFunction)),!0}};yo.prefixes=["-ms-","-moz-","-o-","-webkit-"];var wo=class{constructor(e){this.cssDataManager=e}configure(e){this.settings=e}doValidation(e,t,n=this.settings){if(n&&!1===n.validate)return[];const r=[];r.push.apply(r,Rt.entries(t)),r.push.apply(r,yo.entries(t,e,new so(n&&n.lint),this.cssDataManager));const i=[];for(const e in ro)i.push(ro[e].id);return r.filter(e=>e.getLevel()!==de.Ignore).map(function(t){const n=$t.create(e.positionAt(t.getOffset()),e.positionAt(t.getOffset()+t.getLength())),r=e.languageId;return{code:t.getRule().id,source:r,message:t.getMessage(),severity:t.getLevel()===de.Warning?ln.Warning:ln.Error,range:n}})}},Co="/".charCodeAt(0),_o="\n".charCodeAt(0),ko="\r".charCodeAt(0),xo="\f".charCodeAt(0),So="$".charCodeAt(0),Eo="#".charCodeAt(0),Fo="{".charCodeAt(0),Lo="=".charCodeAt(0),Io="!".charCodeAt(0),To="<".charCodeAt(0),No=">".charCodeAt(0),Ro=".".charCodeAt(0),Do=("@".charCodeAt(0),o.CustomToken),Ao=Do++,Mo=Do++,Oo=(Do++,Do++),zo=Do++,Po=Do++,Bo=Do++,Wo=Do++,Vo=(Do++,class extends ie{scanNext(e){if(this.stream.advanceIfChar(So)){const t=["$"];if(this.ident(t))return this.finishToken(e,Ao,t.join(""));this.stream.goBackTo(e)}return this.stream.advanceIfChars([Eo,Fo])?this.finishToken(e,Mo):this.stream.advanceIfChars([Lo,Lo])?this.finishToken(e,Oo):this.stream.advanceIfChars([Io,Lo])?this.finishToken(e,zo):this.stream.advanceIfChar(To)?this.stream.advanceIfChar(Lo)?this.finishToken(e,Bo):this.finishToken(e,o.Delim):this.stream.advanceIfChar(No)?this.stream.advanceIfChar(Lo)?this.finishToken(e,Po):this.finishToken(e,o.Delim):this.stream.advanceIfChars([Ro,Ro,Ro])?this.finishToken(e,Wo):super.scanNext(e)}comment(){return!!super.comment()||!(this.inURL||!this.stream.advanceIfChars([Co,Co]))&&(this.stream.advanceWhileChar(e=>{switch(e){case _o:case ko:case xo:return!1;default:return!0}}),!0)}}),Uo=class{constructor(e,t){this.id=e,this.message=t}},$o={FromExpected:new Uo("scss-fromexpected",Dt("'from' expected")),ThroughOrToExpected:new Uo("scss-throughexpected",Dt("'through' or 'to' expected")),InExpected:new Uo("scss-fromexpected",Dt("'in' expected"))},qo=class extends ss{constructor(){super(new Vo)}_parseStylesheetStatement(e=!1){return this.peek(o.AtKeyword)?this._parseWarnAndDebug()||this._parseControlStatement()||this._parseMixinDeclaration()||this._parseMixinContent()||this._parseMixinReference()||this._parseFunctionDeclaration()||this._parseForward()||this._parseUse()||this._parseRuleset(e)||super._parseStylesheetAtStatement(e):this._parseRuleset(!0)||this._parseVariableDeclaration()}_parseImport(){if(!this.peekKeyword("@import"))return null;const e=this.create($e);if(this.consumeToken(),!e.addChild(this._parseURILiteral())&&!e.addChild(this._parseStringLiteral()))return this.finish(e,li.URIOrStringExpected);for(;this.accept(o.Comma);)if(!e.addChild(this._parseURILiteral())&&!e.addChild(this._parseStringLiteral()))return this.finish(e,li.URIOrStringExpected);return this._completeParseImport(e)}_parseVariableDeclaration(e=[]){if(!this.peek(Ao))return null;const t=this.create(vt);if(!t.setVariable(this._parseVariable()))return null;if(!this.accept(o.Colon))return this.finish(t,li.ColonExpected);if(this.prevToken&&(t.colonPosition=this.prevToken.offset),!t.setValue(this._parseExpr()))return this.finish(t,li.VariableValueExpected,[],e);for(;this.peek(o.Exclamation);)if(t.addChild(this._tryParsePrio()));else{if(this.consumeToken(),!this.peekRegExp(o.Ident,/^(default|global)$/))return this.finish(t,li.UnknownKeyword);this.consumeToken()}return this.peek(o.SemiColon)&&(t.semicolonPosition=this.token.offset),this.finish(t)}_parseMediaCondition(){return this._parseInterpolation()||super._parseMediaCondition()}_parseMediaFeatureRangeOperator(){return this.accept(Bo)||this.accept(Po)||super._parseMediaFeatureRangeOperator()}_parseMediaFeatureName(){return this._parseModuleMember()||this._parseFunction()||this._parseIdent()||this._parseVariable()}_parseKeyframeSelector(){return this._tryParseKeyframeSelector()||this._parseControlStatement(this._parseKeyframeSelector.bind(this))||this._parseWarnAndDebug()||this._parseMixinReference()||this._parseFunctionDeclaration()||this._parseVariableDeclaration()||this._parseMixinContent()}_parseVariable(){if(!this.peek(Ao))return null;const e=this.create(wt);return this.consumeToken(),e}_parseModuleMember(){const e=this.mark(),t=this.create(Tt);return t.setIdentifier(this._parseIdent([ne.Module]))?this.hasWhitespace()||!this.acceptDelim(".")||this.hasWhitespace()?(this.restoreAtMark(e),null):t.addChild(this._parseVariable()||this._parseFunction())?t:this.finish(t,li.IdentifierOrVariableExpected):null}_parseIdent(e){if(!this.peek(o.Ident)&&!this.peek(Mo)&&!this.peekDelim("-"))return null;const t=this.create(ge);t.referenceTypes=e,t.isCustomProperty=this.peekRegExp(o.Ident,/^--/);let n=!1;const r=()=>{const e=this.mark();return this.acceptDelim("-")&&(this.hasWhitespace()||this.acceptDelim("-"),this.hasWhitespace())?(this.restoreAtMark(e),null):this._parseInterpolation()};for(;(this.accept(o.Ident)||t.addChild(r())||n&&this.acceptRegexp(/^[\w-]/))&&(n=!0,!this.hasWhitespace()););return n?this.finish(t):null}_parseTermExpression(){return this._parseModuleMember()||this._parseVariable()||this._parseNestingSelector()||super._parseTermExpression()}_parseInterpolation(){if(this.peek(Mo)){const e=this.create(yt);return this.consumeToken(),e.addChild(this._parseExpr())||this._parseNestingSelector()?this.accept(o.CurlyR)?this.finish(e):this.finish(e,li.RightCurlyExpected):this.accept(o.CurlyR)?this.finish(e):this.finish(e,li.ExpressionExpected)}return null}_parseOperator(){if(this.peek(Oo)||this.peek(zo)||this.peek(Po)||this.peek(Bo)||this.peekDelim(">")||this.peekDelim("<")||this.peekIdent("and")||this.peekIdent("or")||this.peekDelim("%")){const e=this.createNode(ee.Operator);return this.consumeToken(),this.finish(e)}return super._parseOperator()}_parseUnaryOperator(){if(this.peekIdent("not")){const e=this.create(pe);return this.consumeToken(),this.finish(e)}return super._parseUnaryOperator()}_parseRuleSetDeclaration(){return this.peek(o.AtKeyword)?this._parseKeyframe()||this._parseImport()||this._parseMedia(!0)||this._parseFontFace()||this._parseWarnAndDebug()||this._parseControlStatement()||this._parseFunctionDeclaration()||this._parseExtends()||this._parseMixinReference()||this._parseMixinContent()||this._parseMixinDeclaration()||this._parseRuleset(!0)||this._parseSupports(!0)||this._parseLayer()||this._parsePropertyAtRule()||this._parseContainer(!0)||this._parseRuleSetDeclarationAtStatement():this._parseVariableDeclaration()||this._tryParseRuleset(!0)||this._parseDeclaration()}_parseDeclaration(e){const t=this._tryParseCustomPropertyDeclaration(e);if(t)return t;const n=this.create(Se);if(!n.setProperty(this._parseProperty()))return null;if(!this.accept(o.Colon))return this.finish(n,li.ColonExpected,[o.Colon],e||[o.SemiColon]);this.prevToken&&(n.colonPosition=this.prevToken.offset);let r=!1;if(n.setValue(this._parseExpr())&&(r=!0,n.addChild(this._parsePrio())),this.peek(o.CurlyL))n.setNestedProperties(this._parseNestedProperties());else if(!r)return this.finish(n,li.PropertyValueExpected);return this.peek(o.SemiColon)&&(n.semicolonPosition=this.token.offset),this.finish(n)}_parseNestedProperties(){const e=this.create(We);return this._parseBody(e,this._parseDeclaration.bind(this))}_parseExtends(){if(this.peekKeyword("@extend")){const e=this.create(Ct);if(this.consumeToken(),!e.getSelectors().addChild(this._parseSimpleSelector()))return this.finish(e,li.SelectorExpected);for(;this.accept(o.Comma);)e.getSelectors().addChild(this._parseSimpleSelector());return this.accept(o.Exclamation)&&!this.acceptIdent("optional")?this.finish(e,li.UnknownKeyword):this.finish(e)}return null}_parseSimpleSelectorBody(){return this._parseSelectorPlaceholder()||super._parseSimpleSelectorBody()}_parseNestingSelector(){if(this.peekDelim("&")){const e=this.createNode(ee.SelectorCombinator);for(this.consumeToken();!this.hasWhitespace()&&(this.acceptDelim("-")||this.accept(o.Num)||this.accept(o.Dimension)||e.addChild(this._parseIdent())||this.acceptDelim("&")););return this.finish(e)}return null}_parseSelectorPlaceholder(){if(this.peekDelim("%")){const e=this.createNode(ee.SelectorPlaceholder);return this.consumeToken(),this._parseIdent(),this.finish(e)}if(this.peekKeyword("@at-root")){const e=this.createNode(ee.SelectorPlaceholder);if(this.consumeToken(),this.accept(o.ParenthesisL)){if(!this.acceptIdent("with")&&!this.acceptIdent("without"))return this.finish(e,li.IdentifierExpected);if(!this.accept(o.Colon))return this.finish(e,li.ColonExpected);if(!e.addChild(this._parseIdent()))return this.finish(e,li.IdentifierExpected);if(!this.accept(o.ParenthesisR))return this.finish(e,li.RightParenthesisExpected,[o.CurlyR])}return this.finish(e)}return null}_parseElementName(){const e=this.mark(),t=super._parseElementName();return t&&!this.hasWhitespace()&&this.peek(o.ParenthesisL)?(this.restoreAtMark(e),null):t}_tryParsePseudoIdentifier(){return this._parseInterpolation()||super._tryParsePseudoIdentifier()}_parseWarnAndDebug(){if(!this.peekKeyword("@debug")&&!this.peekKeyword("@warn")&&!this.peekKeyword("@error"))return null;const e=this.createNode(ee.Debug);return this.consumeToken(),e.addChild(this._parseExpr()),this.finish(e)}_parseControlStatement(e=this._parseRuleSetDeclaration.bind(this)){return this.peek(o.AtKeyword)?this._parseIfStatement(e)||this._parseForStatement(e)||this._parseEachStatement(e)||this._parseWhileStatement(e):null}_parseIfStatement(e){return this.peekKeyword("@if")?this._internalParseIfStatement(e):null}_internalParseIfStatement(e){const t=this.create(Re);if(this.consumeToken(),!t.setExpression(this._parseExpr(!0)))return this.finish(t,li.ExpressionExpected);if(this._parseBody(t,e),this.acceptKeyword("@else"))if(this.peekIdent("if"))t.setElseClause(this._internalParseIfStatement(e));else if(this.peek(o.CurlyL)){const n=this.create(Oe);this._parseBody(n,e),t.setElseClause(n)}return this.finish(t)}_parseForStatement(e){if(!this.peekKeyword("@for"))return null;const t=this.create(De);return this.consumeToken(),t.setVariable(this._parseVariable())?this.acceptIdent("from")?t.addChild(this._parseBinaryExpr())?this.acceptIdent("to")||this.acceptIdent("through")?t.addChild(this._parseBinaryExpr())?this._parseBody(t,e):this.finish(t,li.ExpressionExpected,[o.CurlyR]):this.finish(t,$o.ThroughOrToExpected,[o.CurlyR]):this.finish(t,li.ExpressionExpected,[o.CurlyR]):this.finish(t,$o.FromExpected,[o.CurlyR]):this.finish(t,li.VariableNameExpected,[o.CurlyR])}_parseEachStatement(e){if(!this.peekKeyword("@each"))return null;const t=this.create(Ae);this.consumeToken();const n=t.getVariables();if(!n.addChild(this._parseVariable()))return this.finish(t,li.VariableNameExpected,[o.CurlyR]);for(;this.accept(o.Comma);)if(!n.addChild(this._parseVariable()))return this.finish(t,li.VariableNameExpected,[o.CurlyR]);return this.finish(n),this.acceptIdent("in")?t.addChild(this._parseExpr())?this._parseBody(t,e):this.finish(t,li.ExpressionExpected,[o.CurlyR]):this.finish(t,$o.InExpected,[o.CurlyR])}_parseWhileStatement(e){if(!this.peekKeyword("@while"))return null;const t=this.create(Me);return this.consumeToken(),t.addChild(this._parseBinaryExpr())?this._parseBody(t,e):this.finish(t,li.ExpressionExpected,[o.CurlyR])}_parseFunctionBodyDeclaration(){return this._parseVariableDeclaration()||this._parseReturnStatement()||this._parseWarnAndDebug()||this._parseControlStatement(this._parseFunctionBodyDeclaration.bind(this))}_parseFunctionDeclaration(){if(!this.peekKeyword("@function"))return null;const e=this.create(ze);if(this.consumeToken(),!e.setIdentifier(this._parseIdent([ne.Function])))return this.finish(e,li.IdentifierExpected,[o.CurlyR]);if(!this.accept(o.ParenthesisL))return this.finish(e,li.LeftParenthesisExpected,[o.CurlyR]);if(e.getParameters().addChild(this._parseParameterDeclaration()))for(;this.accept(o.Comma)&&!this.peek(o.ParenthesisR);)if(!e.getParameters().addChild(this._parseParameterDeclaration()))return this.finish(e,li.VariableNameExpected);return this.accept(o.ParenthesisR)?this._parseBody(e,this._parseFunctionBodyDeclaration.bind(this)):this.finish(e,li.RightParenthesisExpected,[o.CurlyR])}_parseReturnStatement(){if(!this.peekKeyword("@return"))return null;const e=this.createNode(ee.ReturnStatement);return this.consumeToken(),e.addChild(this._parseExpr())?this.finish(e):this.finish(e,li.ExpressionExpected)}_parseMixinDeclaration(){if(!this.peekKeyword("@mixin"))return null;const e=this.create(St);if(this.consumeToken(),!e.setIdentifier(this._parseIdent([ne.Mixin])))return this.finish(e,li.IdentifierExpected,[o.CurlyR]);if(this.accept(o.ParenthesisL)){if(e.getParameters().addChild(this._parseParameterDeclaration()))for(;this.accept(o.Comma)&&!this.peek(o.ParenthesisR);)if(!e.getParameters().addChild(this._parseParameterDeclaration()))return this.finish(e,li.VariableNameExpected);if(!this.accept(o.ParenthesisR))return this.finish(e,li.RightParenthesisExpected,[o.CurlyR])}return this._parseBody(e,this._parseRuleSetDeclaration.bind(this))}_parseParameterDeclaration(){const e=this.create(Te);return e.setIdentifier(this._parseVariable())?(this.accept(Wo),this.accept(o.Colon)&&!e.setDefaultValue(this._parseExpr(!0))?this.finish(e,li.VariableValueExpected,[],[o.Comma,o.ParenthesisR]):this.finish(e)):null}_parseMixinContent(){if(!this.peekKeyword("@content"))return null;const e=this.create(_t);if(this.consumeToken(),this.accept(o.ParenthesisL)){if(e.getArguments().addChild(this._parseFunctionArgument()))for(;this.accept(o.Comma)&&!this.peek(o.ParenthesisR);)if(!e.getArguments().addChild(this._parseFunctionArgument()))return this.finish(e,li.ExpressionExpected);if(!this.accept(o.ParenthesisR))return this.finish(e,li.RightParenthesisExpected)}return this.finish(e)}_parseMixinReference(){if(!this.peekKeyword("@include"))return null;const e=this.create(xt);this.consumeToken();const t=this._parseIdent([ne.Mixin]);if(!e.setIdentifier(t))return this.finish(e,li.IdentifierExpected,[o.CurlyR]);if(!this.hasWhitespace()&&this.acceptDelim(".")&&!this.hasWhitespace()){const n=this._parseIdent([ne.Mixin]);if(!n)return this.finish(e,li.IdentifierExpected,[o.CurlyR]);const r=this.create(Tt);t.referenceTypes=[ne.Module],r.setIdentifier(t),e.setIdentifier(n),e.addChild(r)}if(this.accept(o.ParenthesisL)){if(e.getArguments().addChild(this._parseFunctionArgument()))for(;this.accept(o.Comma)&&!this.peek(o.ParenthesisR);)if(!e.getArguments().addChild(this._parseFunctionArgument()))return this.finish(e,li.ExpressionExpected);if(!this.accept(o.ParenthesisR))return this.finish(e,li.RightParenthesisExpected)}return(this.peekIdent("using")||this.peek(o.CurlyL))&&e.setContent(this._parseMixinContentDeclaration()),this.finish(e)}_parseMixinContentDeclaration(){const e=this.create(kt);if(this.acceptIdent("using")){if(!this.accept(o.ParenthesisL))return this.finish(e,li.LeftParenthesisExpected,[o.CurlyL]);if(e.getParameters().addChild(this._parseParameterDeclaration()))for(;this.accept(o.Comma)&&!this.peek(o.ParenthesisR);)if(!e.getParameters().addChild(this._parseParameterDeclaration()))return this.finish(e,li.VariableNameExpected);if(!this.accept(o.ParenthesisR))return this.finish(e,li.RightParenthesisExpected,[o.CurlyL])}return this.peek(o.CurlyL)&&this._parseBody(e,this._parseMixinReferenceBodyStatement.bind(this)),this.finish(e)}_parseMixinReferenceBodyStatement(){return this._tryParseKeyframeSelector()||this._parseRuleSetDeclaration()}_parseFunctionArgument(){const e=this.create(Ne),t=this.mark(),n=this._parseVariable();if(n)if(this.accept(o.Colon))e.setIdentifier(n);else{if(this.accept(Wo))return e.setValue(n),this.finish(e);this.restoreAtMark(t)}return e.setValue(this._parseExpr(!0))?(this.accept(Wo),e.addChild(this._parsePrio()),this.finish(e)):e.setValue(this._tryParsePrio())?this.finish(e):null}_parseURLArgument(){const e=this.mark(),t=super._parseURLArgument();if(!t||!this.peek(o.ParenthesisR)){this.restoreAtMark(e);const t=this.create(pe);return t.addChild(this._parseBinaryExpr()),this.finish(t)}return t}_parseOperation(){if(!this.peek(o.ParenthesisL))return null;const e=this.create(pe);for(this.consumeToken();e.addChild(this._parseListElement());)this.accept(o.Comma);return this.accept(o.ParenthesisR)?this.finish(e):this.finish(e,li.RightParenthesisExpected)}_parseListElement(){const e=this.create(Ft),t=this._parseBinaryExpr();if(!t)return null;if(this.accept(o.Colon)){if(e.setKey(t),!e.setValue(this._parseBinaryExpr()))return this.finish(e,li.ExpressionExpected)}else e.setValue(t);return this.finish(e)}_parseUse(){if(!this.peekKeyword("@use"))return null;const e=this.create(qe);if(this.consumeToken(),!e.addChild(this._parseStringLiteral()))return this.finish(e,li.StringLiteralExpected);if(!this.peek(o.SemiColon)&&!this.peek(o.EOF)){if(!this.peekRegExp(o.Ident,/as|with/))return this.finish(e,li.UnknownKeyword);if(this.acceptIdent("as")&&!e.setIdentifier(this._parseIdent([ne.Module]))&&!this.acceptDelim("*"))return this.finish(e,li.IdentifierOrWildcardExpected);if(this.acceptIdent("with")){if(!this.accept(o.ParenthesisL))return this.finish(e,li.LeftParenthesisExpected,[o.ParenthesisR]);if(!e.getParameters().addChild(this._parseModuleConfigDeclaration()))return this.finish(e,li.VariableNameExpected);for(;this.accept(o.Comma)&&!this.peek(o.ParenthesisR);)if(!e.getParameters().addChild(this._parseModuleConfigDeclaration()))return this.finish(e,li.VariableNameExpected);if(!this.accept(o.ParenthesisR))return this.finish(e,li.RightParenthesisExpected)}}return this.accept(o.SemiColon)||this.accept(o.EOF)?this.finish(e):this.finish(e,li.SemiColonExpected)}_parseModuleConfigDeclaration(){const e=this.create(je);return e.setIdentifier(this._parseVariable())?this.accept(o.Colon)&&e.setValue(this._parseExpr(!0))?!this.accept(o.Exclamation)||!this.hasWhitespace()&&this.acceptIdent("default")?this.finish(e):this.finish(e,li.UnknownKeyword):this.finish(e,li.VariableValueExpected,[],[o.Comma,o.ParenthesisR]):null}_parseForward(){if(!this.peekKeyword("@forward"))return null;const e=this.create(Ke);if(this.consumeToken(),!e.addChild(this._parseStringLiteral()))return this.finish(e,li.StringLiteralExpected);if(this.acceptIdent("as")){const t=this._parseIdent([ne.Forward]);if(!e.setIdentifier(t))return this.finish(e,li.IdentifierExpected);if(this.hasWhitespace()||!this.acceptDelim("*"))return this.finish(e,li.WildcardExpected)}if(this.acceptIdent("with")){if(!this.accept(o.ParenthesisL))return this.finish(e,li.LeftParenthesisExpected,[o.ParenthesisR]);if(!e.getParameters().addChild(this._parseModuleConfigDeclaration()))return this.finish(e,li.VariableNameExpected);for(;this.accept(o.Comma)&&!this.peek(o.ParenthesisR);)if(!e.getParameters().addChild(this._parseModuleConfigDeclaration()))return this.finish(e,li.VariableNameExpected);if(!this.accept(o.ParenthesisR))return this.finish(e,li.RightParenthesisExpected)}else if((this.peekIdent("hide")||this.peekIdent("show"))&&!e.addChild(this._parseForwardVisibility()))return this.finish(e,li.IdentifierOrVariableExpected);return this.accept(o.SemiColon)||this.accept(o.EOF)?this.finish(e):this.finish(e,li.SemiColonExpected)}_parseForwardVisibility(){const e=this.create(He);for(e.setIdentifier(this._parseIdent());e.addChild(this._parseVariable()||this._parseIdent());)this.accept(o.Comma);return e.getChildren().length>1?e:null}_parseSupportsCondition(){return this._parseInterpolation()||super._parseSupportsCondition()}},jo=Dt("Sass documentation"),Ko=class e extends Ls{constructor(t,n){super("$",t,n),Ho(e.scssModuleLoaders),Ho(e.scssModuleBuiltIns)}isImportPathParent(e){return e===ee.Forward||e===ee.Use||super.isImportPathParent(e)}getCompletionForImportPath(t,n){const r=t.getParent().type;if(r===ee.Forward||r===ee.Use)for(let r of e.scssModuleBuiltIns){const e={label:r.label,documentation:r.documentation,textEdit:bn.replace(this.getCompletionRange(t),`'${r.label}'`),kind:qn.Module};n.items.push(e)}return super.getCompletionForImportPath(t,n)}createReplaceFunction(){let t=1;return(n,r)=>"\\"+r+": ${"+t+++":"+(e.variableDefaults[r]||"")+"}"}createFunctionProposals(e,t,n,r){for(const i of e){const e=i.func.replace(/\[?(\$\w+)\]?/g,this.createReplaceFunction()),s={label:i.func.substr(0,i.func.indexOf("(")),detail:i.func,documentation:i.desc,textEdit:bn.replace(this.getCompletionRange(t),e),insertTextFormat:Kn.Snippet,kind:qn.Function};n&&(s.sortText="z"),r.items.push(s)}return r}getCompletionsForSelector(t,n,r){return this.createFunctionProposals(e.selectorFuncs,null,!0,r),super.getCompletionsForSelector(t,n,r)}getTermProposals(t,n,r){let i=e.builtInFuncs;return t&&(i=i.filter(e=>!e.type||!t.restrictions||-1!==t.restrictions.indexOf(e.type))),this.createFunctionProposals(i,n,!0,r),super.getTermProposals(t,n,r)}getColorProposals(t,n,r){return this.createFunctionProposals(e.colorProposals,n,!1,r),super.getColorProposals(t,n,r)}getCompletionsForDeclarationProperty(e,t){return this.getCompletionForAtDirectives(t),this.getCompletionsForSelector(null,!0,t),super.getCompletionsForDeclarationProperty(e,t)}getCompletionsForExtendsReference(e,t,n){const r=this.getSymbolContext().findSymbolsAtOffset(this.offset,ne.Rule);for(const e of r){const r={label:e.name,textEdit:bn.replace(this.getCompletionRange(t),e.name),kind:qn.Function};n.items.push(r)}return n}getCompletionForAtDirectives(t){return t.items.push(...e.scssAtDirectives),t}getCompletionForTopLevel(e){return this.getCompletionForAtDirectives(e),this.getCompletionForModuleLoaders(e),super.getCompletionForTopLevel(e),e}getCompletionForModuleLoaders(t){return t.items.push(...e.scssModuleLoaders),t}};function Ho(e){e.forEach(e=>{if(e.documentation&&e.references&&e.references.length>0){const t="string"==typeof e.documentation?{kind:"markdown",value:e.documentation}:{kind:"markdown",value:e.documentation.value};t.value+="\n\n",t.value+=e.references.map(e=>`[${e.name}](${e.url})`).join(" | "),e.documentation=t}})}Ko.variableDefaults={$red:"1",$green:"2",$blue:"3",$alpha:"1.0",$color:"#000000",$weight:"0.5",$hue:"0",$saturation:"0%",$lightness:"0%",$degrees:"0",$amount:"0",$string:'""',$substring:'"s"',$number:"0",$limit:"1"},Ko.colorProposals=[{func:"red($color)",desc:Dt("Gets the red component of a color.")},{func:"green($color)",desc:Dt("Gets the green component of a color.")},{func:"blue($color)",desc:Dt("Gets the blue component of a color.")},{func:"mix($color, $color, [$weight])",desc:Dt("Mixes two colors together.")},{func:"hue($color)",desc:Dt("Gets the hue component of a color.")},{func:"saturation($color)",desc:Dt("Gets the saturation component of a color.")},{func:"lightness($color)",desc:Dt("Gets the lightness component of a color.")},{func:"adjust-hue($color, $degrees)",desc:Dt("Changes the hue of a color.")},{func:"lighten($color, $amount)",desc:Dt("Makes a color lighter.")},{func:"darken($color, $amount)",desc:Dt("Makes a color darker.")},{func:"saturate($color, $amount)",desc:Dt("Makes a color more saturated.")},{func:"desaturate($color, $amount)",desc:Dt("Makes a color less saturated.")},{func:"grayscale($color)",desc:Dt("Converts a color to grayscale.")},{func:"complement($color)",desc:Dt("Returns the complement of a color.")},{func:"invert($color)",desc:Dt("Returns the inverse of a color.")},{func:"alpha($color)",desc:Dt("Gets the opacity component of a color.")},{func:"opacity($color)",desc:"Gets the alpha component (opacity) of a color."},{func:"rgba($color, $alpha)",desc:Dt("Changes the alpha component for a color.")},{func:"opacify($color, $amount)",desc:Dt("Makes a color more opaque.")},{func:"fade-in($color, $amount)",desc:Dt("Makes a color more opaque.")},{func:"transparentize($color, $amount)",desc:Dt("Makes a color more transparent.")},{func:"fade-out($color, $amount)",desc:Dt("Makes a color more transparent.")},{func:"adjust-color($color, [$red], [$green], [$blue], [$hue], [$saturation], [$lightness], [$alpha])",desc:Dt("Increases or decreases one or more components of a color.")},{func:"scale-color($color, [$red], [$green], [$blue], [$saturation], [$lightness], [$alpha])",desc:Dt("Fluidly scales one or more properties of a color.")},{func:"change-color($color, [$red], [$green], [$blue], [$hue], [$saturation], [$lightness], [$alpha])",desc:Dt("Changes one or more properties of a color.")},{func:"ie-hex-str($color)",desc:Dt("Converts a color into the format understood by IE filters.")}],Ko.selectorFuncs=[{func:"selector-nest($selectors…)",desc:Dt("Nests selector beneath one another like they would be nested in the stylesheet.")},{func:"selector-append($selectors…)",desc:Dt("Appends selectors to one another without spaces in between.")},{func:"selector-extend($selector, $extendee, $extender)",desc:Dt("Extends $extendee with $extender within $selector.")},{func:"selector-replace($selector, $original, $replacement)",desc:Dt("Replaces $original with $replacement within $selector.")},{func:"selector-unify($selector1, $selector2)",desc:Dt("Unifies two selectors to produce a selector that matches elements matched by both.")},{func:"is-superselector($super, $sub)",desc:Dt("Returns whether $super matches all the elements $sub does, and possibly more.")},{func:"simple-selectors($selector)",desc:Dt("Returns the simple selectors that comprise a compound selector.")},{func:"selector-parse($selector)",desc:Dt("Parses a selector into the format returned by &.")}],Ko.builtInFuncs=[{func:"unquote($string)",desc:Dt("Removes quotes from a string.")},{func:"quote($string)",desc:Dt("Adds quotes to a string.")},{func:"str-length($string)",desc:Dt("Returns the number of characters in a string.")},{func:"str-insert($string, $insert, $index)",desc:Dt("Inserts $insert into $string at $index.")},{func:"str-index($string, $substring)",desc:Dt("Returns the index of the first occurance of $substring in $string.")},{func:"str-slice($string, $start-at, [$end-at])",desc:Dt("Extracts a substring from $string.")},{func:"to-upper-case($string)",desc:Dt("Converts a string to upper case.")},{func:"to-lower-case($string)",desc:Dt("Converts a string to lower case.")},{func:"percentage($number)",desc:Dt("Converts a unitless number to a percentage."),type:"percentage"},{func:"round($number)",desc:Dt("Rounds a number to the nearest whole number.")},{func:"ceil($number)",desc:Dt("Rounds a number up to the next whole number.")},{func:"floor($number)",desc:Dt("Rounds a number down to the previous whole number.")},{func:"abs($number)",desc:Dt("Returns the absolute value of a number.")},{func:"min($numbers)",desc:Dt("Finds the minimum of several numbers.")},{func:"max($numbers)",desc:Dt("Finds the maximum of several numbers.")},{func:"random([$limit])",desc:Dt("Returns a random number.")},{func:"length($list)",desc:Dt("Returns the length of a list.")},{func:"nth($list, $n)",desc:Dt("Returns a specific item in a list.")},{func:"set-nth($list, $n, $value)",desc:Dt("Replaces the nth item in a list.")},{func:"join($list1, $list2, [$separator])",desc:Dt("Joins together two lists into one.")},{func:"append($list1, $val, [$separator])",desc:Dt("Appends a single value onto the end of a list.")},{func:"zip($lists)",desc:Dt("Combines several lists into a single multidimensional list.")},{func:"index($list, $value)",desc:Dt("Returns the position of a value within a list.")},{func:"list-separator(#list)",desc:Dt("Returns the separator of a list.")},{func:"map-get($map, $key)",desc:Dt("Returns the value in a map associated with a given key.")},{func:"map-merge($map1, $map2)",desc:Dt("Merges two maps together into a new map.")},{func:"map-remove($map, $keys)",desc:Dt("Returns a new map with keys removed.")},{func:"map-keys($map)",desc:Dt("Returns a list of all keys in a map.")},{func:"map-values($map)",desc:Dt("Returns a list of all values in a map.")},{func:"map-has-key($map, $key)",desc:Dt("Returns whether a map has a value associated with a given key.")},{func:"keywords($args)",desc:Dt("Returns the keywords passed to a function that takes variable arguments.")},{func:"feature-exists($feature)",desc:Dt("Returns whether a feature exists in the current Sass runtime.")},{func:"variable-exists($name)",desc:Dt("Returns whether a variable with the given name exists in the current scope.")},{func:"global-variable-exists($name)",desc:Dt("Returns whether a variable with the given name exists in the global scope.")},{func:"function-exists($name)",desc:Dt("Returns whether a function with the given name exists.")},{func:"mixin-exists($name)",desc:Dt("Returns whether a mixin with the given name exists.")},{func:"inspect($value)",desc:Dt("Returns the string representation of a value as it would be represented in Sass.")},{func:"type-of($value)",desc:Dt("Returns the type of a value.")},{func:"unit($number)",desc:Dt("Returns the unit(s) associated with a number.")},{func:"unitless($number)",desc:Dt("Returns whether a number has units.")},{func:"comparable($number1, $number2)",desc:Dt("Returns whether two numbers can be added, subtracted, or compared.")},{func:"call($name, $args…)",desc:Dt("Dynamically calls a Sass function.")}],Ko.scssAtDirectives=[{label:"@extend",documentation:Dt("Inherits the styles of another selector."),kind:qn.Keyword},{label:"@at-root",documentation:Dt("Causes one or more rules to be emitted at the root of the document."),kind:qn.Keyword},{label:"@debug",documentation:Dt("Prints the value of an expression to the standard error output stream. Useful for debugging complicated Sass files."),kind:qn.Keyword},{label:"@warn",documentation:Dt("Prints the value of an expression to the standard error output stream. Useful for libraries that need to warn users of deprecations or recovering from minor mixin usage mistakes. Warnings can be turned off with the `--quiet` command-line option or the `:quiet` Sass option."),kind:qn.Keyword},{label:"@error",documentation:Dt("Throws the value of an expression as a fatal error with stack trace. Useful for validating arguments to mixins and functions."),kind:qn.Keyword},{label:"@if",documentation:Dt("Includes the body if the expression does not evaluate to `false` or `null`."),insertText:"@if ${1:expr} {\n\t$0\n}",insertTextFormat:Kn.Snippet,kind:qn.Keyword},{label:"@for",documentation:Dt("For loop that repeatedly outputs a set of styles for each `$var` in the `from/through` or `from/to` clause."),insertText:"@for \\$${1:var} from ${2:start} ${3|to,through|} ${4:end} {\n\t$0\n}",insertTextFormat:Kn.Snippet,kind:qn.Keyword},{label:"@each",documentation:Dt("Each loop that sets `$var` to each item in the list or map, then outputs the styles it contains using that value of `$var`."),insertText:"@each \\$${1:var} in ${2:list} {\n\t$0\n}",insertTextFormat:Kn.Snippet,kind:qn.Keyword},{label:"@while",documentation:Dt("While loop that takes an expression and repeatedly outputs the nested styles until the statement evaluates to `false`."),insertText:"@while ${1:condition} {\n\t$0\n}",insertTextFormat:Kn.Snippet,kind:qn.Keyword},{label:"@mixin",documentation:Dt("Defines styles that can be re-used throughout the stylesheet with `@include`."),insertText:"@mixin ${1:name} {\n\t$0\n}",insertTextFormat:Kn.Snippet,kind:qn.Keyword},{label:"@include",documentation:Dt("Includes the styles defined by another mixin into the current rule."),kind:qn.Keyword},{label:"@function",documentation:Dt("Defines complex operations that can be re-used throughout stylesheets."),kind:qn.Keyword}],Ko.scssModuleLoaders=[{label:"@use",documentation:Dt("Loads mixins, functions, and variables from other Sass stylesheets as 'modules', and combines CSS from multiple stylesheets together."),references:[{name:jo,url:"https://sass-lang.com/documentation/at-rules/use"}],insertText:"@use $0;",insertTextFormat:Kn.Snippet,kind:qn.Keyword},{label:"@forward",documentation:Dt("Loads a Sass stylesheet and makes its mixins, functions, and variables available when this stylesheet is loaded with the @use rule."),references:[{name:jo,url:"https://sass-lang.com/documentation/at-rules/forward"}],insertText:"@forward $0;",insertTextFormat:Kn.Snippet,kind:qn.Keyword}],Ko.scssModuleBuiltIns=[{label:"sass:math",documentation:Dt("Provides functions that operate on numbers."),references:[{name:jo,url:"https://sass-lang.com/documentation/modules/math"}]},{label:"sass:string",documentation:Dt("Makes it easy to combine, search, or split apart strings."),references:[{name:jo,url:"https://sass-lang.com/documentation/modules/string"}]},{label:"sass:color",documentation:Dt("Generates new colors based on existing ones, making it easy to build color themes."),references:[{name:jo,url:"https://sass-lang.com/documentation/modules/color"}]},{label:"sass:list",documentation:Dt("Lets you access and modify values in lists."),references:[{name:jo,url:"https://sass-lang.com/documentation/modules/list"}]},{label:"sass:map",documentation:Dt("Makes it possible to look up the value associated with a key in a map, and much more."),references:[{name:jo,url:"https://sass-lang.com/documentation/modules/map"}]},{label:"sass:selector",documentation:Dt("Provides access to Sass’s powerful selector engine."),references:[{name:jo,url:"https://sass-lang.com/documentation/modules/selector"}]},{label:"sass:meta",documentation:Dt("Exposes the details of Sass’s inner workings."),references:[{name:jo,url:"https://sass-lang.com/documentation/modules/meta"}]}];var Go,Qo="/".charCodeAt(0),Jo="\n".charCodeAt(0),Yo="\r".charCodeAt(0),Xo="\f".charCodeAt(0),Zo="`".charCodeAt(0),ea=".".charCodeAt(0),ta=o.CustomToken,na=ta++,ra=class extends ie{scanNext(e){const t=this.escapedJavaScript();return null!==t?this.finishToken(e,t):this.stream.advanceIfChars([ea,ea,ea])?this.finishToken(e,na):super.scanNext(e)}comment(){return!!super.comment()||!(this.inURL||!this.stream.advanceIfChars([Qo,Qo]))&&(this.stream.advanceWhileChar(e=>{switch(e){case Jo:case Yo:case Xo:return!1;default:return!0}}),!0)}escapedJavaScript(){return this.stream.peekChar()===Zo?(this.stream.advance(1),this.stream.advanceWhileChar(e=>e!==Zo),this.stream.advanceIfChar(Zo)?o.EscapedJavaScript:o.BadEscapedJavaScript):null}},ia=class extends ss{constructor(){super(new ra)}_parseStylesheetStatement(e=!1){return this.peek(o.AtKeyword)?this._parseVariableDeclaration()||this._parsePlugin()||super._parseStylesheetAtStatement(e):this._tryParseMixinDeclaration()||this._tryParseMixinReference()||this._parseFunction()||this._parseRuleset(!0)}_parseImport(){if(!this.peekKeyword("@import")&&!this.peekKeyword("@import-once"))return null;const e=this.create($e);if(this.consumeToken(),this.accept(o.ParenthesisL)){if(!this.accept(o.Ident))return this.finish(e,li.IdentifierExpected,[o.SemiColon]);do{if(!this.accept(o.Comma))break}while(this.accept(o.Ident));if(!this.accept(o.ParenthesisR))return this.finish(e,li.RightParenthesisExpected,[o.SemiColon])}return e.addChild(this._parseURILiteral())||e.addChild(this._parseStringLiteral())?(this.peek(o.SemiColon)||this.peek(o.EOF)||e.setMedialist(this._parseMediaQueryList()),this._completeParseImport(e)):this.finish(e,li.URIOrStringExpected,[o.SemiColon])}_parsePlugin(){if(!this.peekKeyword("@plugin"))return null;const e=this.createNode(ee.Plugin);return this.consumeToken(),e.addChild(this._parseStringLiteral())?this.accept(o.SemiColon)?this.finish(e):this.finish(e,li.SemiColonExpected):this.finish(e,li.StringLiteralExpected)}_parseMediaQuery(){const e=super._parseMediaQuery();if(!e){const e=this.create(nt);return e.addChild(this._parseVariable())?this.finish(e):null}return e}_parseMediaDeclaration(e=!1){return this._tryParseRuleset(e)||this._tryToParseDeclaration()||this._tryParseMixinDeclaration()||this._tryParseMixinReference()||this._parseDetachedRuleSetMixin()||this._parseStylesheetStatement(e)}_parseMediaFeatureName(){return this._parseIdent()||this._parseVariable()}_parseVariableDeclaration(e=[]){const t=this.create(vt),n=this.mark();if(!t.setVariable(this._parseVariable(!0)))return null;if(!this.accept(o.Colon))return this.restoreAtMark(n),null;if(this.prevToken&&(t.colonPosition=this.prevToken.offset),t.setValue(this._parseDetachedRuleSet()))t.needsSemicolon=!1;else if(!t.setValue(this._parseExpr()))return this.finish(t,li.VariableValueExpected,[],e);return t.addChild(this._parsePrio()),this.peek(o.SemiColon)&&(t.semicolonPosition=this.token.offset),this.finish(t)}_parseDetachedRuleSet(){let e=this.mark();if(this.peekDelim("#")||this.peekDelim(".")){if(this.consumeToken(),this.hasWhitespace()||!this.accept(o.ParenthesisL))return this.restoreAtMark(e),null;{let t=this.create(St);if(t.getParameters().addChild(this._parseMixinParameter()))for(;(this.accept(o.Comma)||this.accept(o.SemiColon))&&!this.peek(o.ParenthesisR);)t.getParameters().addChild(this._parseMixinParameter())||this.markError(t,li.IdentifierExpected,[],[o.ParenthesisR]);if(!this.accept(o.ParenthesisR))return this.restoreAtMark(e),null}}if(!this.peek(o.CurlyL))return null;const t=this.create(ye);return this._parseBody(t,this._parseDetachedRuleSetBody.bind(this)),this.finish(t)}_parseDetachedRuleSetBody(){return this._tryParseKeyframeSelector()||this._parseRuleSetDeclaration()}_addLookupChildren(e){if(!e.addChild(this._parseLookupValue()))return!1;let t=!1;for(;this.peek(o.BracketL)&&(t=!0),e.addChild(this._parseLookupValue());)t=!1;return!t}_parseLookupValue(){const e=this.create(pe),t=this.mark();return this.accept(o.BracketL)&&((e.addChild(this._parseVariable(!1,!0))||e.addChild(this._parsePropertyIdentifier()))&&this.accept(o.BracketR)||this.accept(o.BracketR))?e:(this.restoreAtMark(t),null)}_parseVariable(e=!1,t=!1){const n=!e&&this.peekDelim("$");if(!this.peekDelim("@")&&!n&&!this.peek(o.AtKeyword))return null;const r=this.create(wt),i=this.mark();for(;this.acceptDelim("@")||!e&&this.acceptDelim("$");)if(this.hasWhitespace())return this.restoreAtMark(i),null;return!this.accept(o.AtKeyword)&&!this.accept(o.Ident)||!t&&this.peek(o.BracketL)&&!this._addLookupChildren(r)?(this.restoreAtMark(i),null):r}_parseTermExpression(){return this._parseVariable()||this._parseEscaped()||super._parseTermExpression()||this._tryParseMixinReference(!1)}_parseEscaped(){if(this.peek(o.EscapedJavaScript)||this.peek(o.BadEscapedJavaScript)){const e=this.createNode(ee.EscapedValue);return this.consumeToken(),this.finish(e)}if(this.peekDelim("~")){const e=this.createNode(ee.EscapedValue);return this.consumeToken(),this.accept(o.String)||this.accept(o.EscapedJavaScript)?this.finish(e):this.finish(e,li.TermExpected)}return null}_parseOperator(){return this._parseGuardOperator()||super._parseOperator()}_parseGuardOperator(){if(this.peekDelim(">")){const e=this.createNode(ee.Operator);return this.consumeToken(),this.acceptDelim("="),e}if(this.peekDelim("=")){const e=this.createNode(ee.Operator);return this.consumeToken(),this.acceptDelim("<"),e}if(this.peekDelim("<")){const e=this.createNode(ee.Operator);return this.consumeToken(),this.acceptDelim("="),e}return null}_parseRuleSetDeclaration(){return this.peek(o.AtKeyword)?this._parseKeyframe()||this._parseMedia(!0)||this._parseImport()||this._parseSupports(!0)||this._parseLayer()||this._parsePropertyAtRule()||this._parseContainer(!0)||this._parseDetachedRuleSetMixin()||this._parseVariableDeclaration()||this._parseRuleSetDeclarationAtStatement():this._tryParseMixinDeclaration()||this._tryParseRuleset(!0)||this._tryParseMixinReference()||this._parseFunction()||this._parseExtend()||this._parseDeclaration()}_parseKeyframeIdent(){return this._parseIdent([ne.Keyframe])||this._parseVariable()}_parseKeyframeSelector(){return this._parseDetachedRuleSetMixin()||super._parseKeyframeSelector()}_parseSelector(e){const t=this.create(Ce);let n=!1;for(e&&(n=t.addChild(this._parseCombinator()));t.addChild(this._parseSimpleSelector());){n=!0;const e=this.mark();if(t.addChild(this._parseGuard())&&this.peek(o.CurlyL))break;this.restoreAtMark(e),t.addChild(this._parseCombinator())}return n?this.finish(t):null}_parseNestingSelector(){if(this.peekDelim("&")){const e=this.createNode(ee.SelectorCombinator);for(this.consumeToken();!this.hasWhitespace()&&(this.acceptDelim("-")||this.accept(o.Num)||this.accept(o.Dimension)||e.addChild(this._parseIdent())||this.acceptDelim("&")););return this.finish(e)}return null}_parseSelectorIdent(){if(!this.peekInterpolatedIdent())return null;const e=this.createNode(ee.SelectorInterpolation);return this._acceptInterpolatedIdent(e)?this.finish(e):null}_parsePropertyIdentifier(e=!1){const t=/^[\w-]+/;if(!this.peekInterpolatedIdent()&&!this.peekRegExp(this.token.type,t))return null;const n=this.mark(),r=this.create(ge);r.isCustomProperty=this.acceptDelim("-")&&this.acceptDelim("-");let i=!1;return i=e?r.isCustomProperty?r.addChild(this._parseIdent()):r.addChild(this._parseRegexp(t)):r.isCustomProperty?this._acceptInterpolatedIdent(r):this._acceptInterpolatedIdent(r,t),i?(e||this.hasWhitespace()||(this.acceptDelim("+"),this.hasWhitespace()||this.acceptIdent("_")),this.finish(r)):(this.restoreAtMark(n),null)}peekInterpolatedIdent(){return this.peek(o.Ident)||this.peekDelim("@")||this.peekDelim("$")||this.peekDelim("-")}_acceptInterpolatedIdent(e,t){let n=!1;const r=()=>{const e=this.mark();return this.acceptDelim("-")&&(this.hasWhitespace()||this.acceptDelim("-"),this.hasWhitespace())?(this.restoreAtMark(e),null):this._parseInterpolation()},i=t?()=>this.acceptRegexp(t):()=>this.accept(o.Ident);for(;(i()||e.addChild(this._parseInterpolation()||this.try(r)))&&(n=!0,!this.hasWhitespace()););return n}_parseInterpolation(){const e=this.mark();if(this.peekDelim("@")||this.peekDelim("$")){const t=this.createNode(ee.Interpolation);return this.consumeToken(),this.hasWhitespace()||!this.accept(o.CurlyL)?(this.restoreAtMark(e),null):t.addChild(this._parseIdent())?this.accept(o.CurlyR)?this.finish(t):this.finish(t,li.RightCurlyExpected):this.finish(t,li.IdentifierExpected)}return null}_tryParseMixinDeclaration(){const e=this.mark(),t=this.create(St);if(!t.setIdentifier(this._parseMixinDeclarationIdentifier())||!this.accept(o.ParenthesisL))return this.restoreAtMark(e),null;if(t.getParameters().addChild(this._parseMixinParameter()))for(;(this.accept(o.Comma)||this.accept(o.SemiColon))&&!this.peek(o.ParenthesisR);)t.getParameters().addChild(this._parseMixinParameter())||this.markError(t,li.IdentifierExpected,[],[o.ParenthesisR]);return this.accept(o.ParenthesisR)?(t.setGuard(this._parseGuard()),this.peek(o.CurlyL)?this._parseBody(t,this._parseMixInBodyDeclaration.bind(this)):(this.restoreAtMark(e),null)):(this.restoreAtMark(e),null)}_parseMixInBodyDeclaration(){return this._parseFontFace()||this._parseRuleSetDeclaration()}_parseMixinDeclarationIdentifier(){let e;if(this.peekDelim("#")||this.peekDelim(".")){if(e=this.create(ge),this.consumeToken(),this.hasWhitespace()||!e.addChild(this._parseIdent()))return null}else{if(!this.peek(o.Hash))return null;e=this.create(ge),this.consumeToken()}return e.referenceTypes=[ne.Mixin],this.finish(e)}_parsePseudo(){if(!this.peek(o.Colon))return null;const e=this.mark(),t=this.create(Ct);return this.consumeToken(),this.acceptIdent("extend")?this._completeExtends(t):(this.restoreAtMark(e),super._parsePseudo())}_parseExtend(){if(!this.peekDelim("&"))return null;const e=this.mark(),t=this.create(Ct);return this.consumeToken(),!this.hasWhitespace()&&this.accept(o.Colon)&&this.acceptIdent("extend")?this._completeExtends(t):(this.restoreAtMark(e),null)}_completeExtends(e){if(!this.accept(o.ParenthesisL))return this.finish(e,li.LeftParenthesisExpected);const t=e.getSelectors();if(!t.addChild(this._parseSelector(!0)))return this.finish(e,li.SelectorExpected);for(;this.accept(o.Comma);)if(!t.addChild(this._parseSelector(!0)))return this.finish(e,li.SelectorExpected);return this.accept(o.ParenthesisR)?this.finish(e):this.finish(e,li.RightParenthesisExpected)}_parseDetachedRuleSetMixin(){if(!this.peek(o.AtKeyword))return null;const e=this.mark(),t=this.create(xt);return!t.addChild(this._parseVariable(!0))||!this.hasWhitespace()&&this.accept(o.ParenthesisL)?this.accept(o.ParenthesisR)?this.finish(t):this.finish(t,li.RightParenthesisExpected):(this.restoreAtMark(e),null)}_tryParseMixinReference(e=!0){const t=this.mark(),n=this.create(xt);let r=this._parseMixinDeclarationIdentifier();for(;r;){this.acceptDelim(">");const e=this._parseMixinDeclarationIdentifier();if(!e)break;n.getNamespaces().addChild(r),r=e}if(!n.setIdentifier(r))return this.restoreAtMark(t),null;let i=!1;if(this.accept(o.ParenthesisL)){if(i=!0,n.getArguments().addChild(this._parseMixinArgument()))for(;(this.accept(o.Comma)||this.accept(o.SemiColon))&&!this.peek(o.ParenthesisR);)if(!n.getArguments().addChild(this._parseMixinArgument()))return this.finish(n,li.ExpressionExpected);if(!this.accept(o.ParenthesisR))return this.finish(n,li.RightParenthesisExpected);r.referenceTypes=[ne.Mixin]}else r.referenceTypes=[ne.Mixin,ne.Rule];return this.peek(o.BracketL)?e||this._addLookupChildren(n):n.addChild(this._parsePrio()),i||this.peek(o.SemiColon)||this.peek(o.CurlyR)||this.peek(o.EOF)?this.finish(n):(this.restoreAtMark(t),null)}_parseMixinArgument(){const e=this.create(Ne),t=this.mark(),n=this._parseVariable();return n&&(this.accept(o.Colon)?e.setIdentifier(n):this.restoreAtMark(t)),e.setValue(this._parseDetachedRuleSet()||this._parseExpr(!0))?this.finish(e):(this.restoreAtMark(t),null)}_parseMixinParameter(){const e=this.create(Te);if(this.peekKeyword("@rest")){const t=this.create(pe);return this.consumeToken(),this.accept(na)?(e.setIdentifier(this.finish(t)),this.finish(e)):this.finish(e,li.DotExpected,[],[o.Comma,o.ParenthesisR])}if(this.peek(na)){const t=this.create(pe);return this.consumeToken(),e.setIdentifier(this.finish(t)),this.finish(e)}let t=!1;return e.setIdentifier(this._parseVariable())&&(this.accept(o.Colon),t=!0),e.setDefaultValue(this._parseDetachedRuleSet()||this._parseExpr(!0))||t?this.finish(e):null}_parseGuard(){if(!this.peekIdent("when"))return null;const e=this.create(Lt);if(this.consumeToken(),!e.getConditions().addChild(this._parseGuardCondition()))return this.finish(e,li.ConditionExpected);for(;this.acceptIdent("and")||this.accept(o.Comma);)if(!e.getConditions().addChild(this._parseGuardCondition()))return this.finish(e,li.ConditionExpected);return this.finish(e)}_parseGuardCondition(){const e=this.create(It);return e.isNegated=this.acceptIdent("not"),this.accept(o.ParenthesisL)?(e.addChild(this._parseExpr()),this.accept(o.ParenthesisR)?this.finish(e):this.finish(e,li.RightParenthesisExpected)):e.isNegated?this.finish(e,li.LeftParenthesisExpected):null}_parseFunction(){const e=this.mark(),t=this.create(Ie);if(!t.setIdentifier(this._parseFunctionIdentifier()))return null;if(this.hasWhitespace()||!this.accept(o.ParenthesisL))return this.restoreAtMark(e),null;if(t.getArguments().addChild(this._parseMixinArgument()))for(;(this.accept(o.Comma)||this.accept(o.SemiColon))&&!this.peek(o.ParenthesisR);)if(!t.getArguments().addChild(this._parseMixinArgument()))return this.finish(t,li.ExpressionExpected);return this.accept(o.ParenthesisR)?this.finish(t):this.finish(t,li.RightParenthesisExpected)}_parseFunctionIdentifier(){if(this.peekDelim("%")){const e=this.create(ge);return e.referenceTypes=[ne.Function],this.consumeToken(),this.finish(e)}return super._parseFunctionIdentifier()}_parseURLArgument(){const e=this.mark(),t=super._parseURLArgument();if(!t||!this.peek(o.ParenthesisR)){this.restoreAtMark(e);const t=this.create(pe);return t.addChild(this._parseBinaryExpr()),this.finish(t)}return t}},sa=class e extends Ls{constructor(e,t){super("@",e,t)}createFunctionProposals(e,t,n,r){for(const i of e){const e={label:i.name,detail:i.example,documentation:i.description,textEdit:bn.replace(this.getCompletionRange(t),i.name+"($0)"),insertTextFormat:Kn.Snippet,kind:qn.Function};n&&(e.sortText="z"),r.items.push(e)}return r}getTermProposals(t,n,r){let i=e.builtInProposals;return t&&(i=i.filter(e=>!e.type||!t.restrictions||-1!==t.restrictions.indexOf(e.type))),this.createFunctionProposals(i,n,!0,r),super.getTermProposals(t,n,r)}getColorProposals(t,n,r){return this.createFunctionProposals(e.colorProposals,n,!1,r),super.getColorProposals(t,n,r)}getCompletionsForDeclarationProperty(e,t){return this.getCompletionsForSelector(null,!0,t),super.getCompletionsForDeclarationProperty(e,t)}};function oa(e,t){const n=function(e){function t(t){return e.positionAt(t.offset).line}function n(t){return e.positionAt(t.offset+t.len).line}function r(e,r){const i=t(e),s=n(e);return i!==s?{startLine:i,endLine:s,kind:r}:null}const i=[],s=[],a=function(){switch(e.languageId){case"scss":return new Vo;case"less":return new ra;default:return new ie}}();a.ignoreComment=!1,a.setSource(e.getText());let l=a.scan(),c=null;for(;l.type!==o.EOF;){switch(l.type){case o.CurlyL:case Mo:s.push({line:t(l),type:"brace",isStart:!0});break;case o.CurlyR:if(0!==s.length){const e=aa(s,"brace");if(!e)break;let t=n(l);"brace"===e.type&&(c&&n(c)!==t&&t--,e.line!==t&&i.push({startLine:e.line,endLine:t,kind:void 0}))}break;case o.Comment:{const o=e=>"#region"===e?{line:t(l),type:"comment",isStart:!0}:{line:n(l),type:"comment",isStart:!1},a=(t=>{const n=t.text.match(/^\s*\/\*\s*(#region|#endregion)\b\s*(.*?)\s*\*\//);if(n)return o(n[1]);if("scss"===e.languageId||"less"===e.languageId){const e=t.text.match(/^\s*\/\/\s*(#region|#endregion)\b\s*(.*?)\s*/);if(e)return o(e[1])}return null})(l);if(a)if(a.isStart)s.push(a);else{const e=aa(s,"comment");if(!e)break;"comment"===e.type&&e.line!==a.line&&i.push({startLine:e.line,endLine:a.line,kind:"region"})}else{const e=r(l,"comment");e&&i.push(e)}break}}c=l,l=a.scan()}return i}(e);return function(e,t){const n=t&&t.rangeLimit||Number.MAX_VALUE,r=e.sort((e,t)=>{let n=e.startLine-t.startLine;return 0===n&&(n=e.endLine-t.endLine),n}),i=[];let s=-1;return r.forEach(e=>{e.startLine=0;n--)if(e[n].type===t&&e[n].isStart)return e.splice(n,1)[0];return null}sa.builtInProposals=[{name:"if",example:"if(condition, trueValue [, falseValue]);",description:Dt("returns one of two values depending on a condition.")},{name:"boolean",example:"boolean(condition);",description:Dt('"store" a boolean test for later evaluation in a guard or if().')},{name:"length",example:"length(@list);",description:Dt("returns the number of elements in a value list")},{name:"extract",example:"extract(@list, index);",description:Dt("returns a value at the specified position in the list")},{name:"range",example:"range([start, ] end [, step]);",description:Dt("generate a list spanning a range of values")},{name:"each",example:"each(@list, ruleset);",description:Dt("bind the evaluation of a ruleset to each member of a list.")},{name:"escape",example:"escape(@string);",description:Dt("URL encodes a string")},{name:"e",example:"e(@string);",description:Dt("escape string content")},{name:"replace",example:"replace(@string, @pattern, @replacement[, @flags]);",description:Dt("string replace")},{name:"unit",example:"unit(@dimension, [@unit: '']);",description:Dt("remove or change the unit of a dimension")},{name:"color",example:"color(@string);",description:Dt("parses a string to a color"),type:"color"},{name:"convert",example:"convert(@value, unit);",description:Dt("converts numbers from one type into another")},{name:"data-uri",example:"data-uri([mimetype,] url);",description:Dt("inlines a resource and falls back to `url()`"),type:"url"},{name:"abs",description:Dt("absolute value of a number"),example:"abs(number);"},{name:"acos",description:Dt("arccosine - inverse of cosine function"),example:"acos(number);"},{name:"asin",description:Dt("arcsine - inverse of sine function"),example:"asin(number);"},{name:"ceil",example:"ceil(@number);",description:Dt("rounds up to an integer")},{name:"cos",description:Dt("cosine function"),example:"cos(number);"},{name:"floor",description:Dt("rounds down to an integer"),example:"floor(@number);"},{name:"percentage",description:Dt("converts to a %, e.g. 0.5 > 50%"),example:"percentage(@number);",type:"percentage"},{name:"round",description:Dt("rounds a number to a number of places"),example:"round(number, [places: 0]);"},{name:"sqrt",description:Dt("calculates square root of a number"),example:"sqrt(number);"},{name:"sin",description:Dt("sine function"),example:"sin(number);"},{name:"tan",description:Dt("tangent function"),example:"tan(number);"},{name:"atan",description:Dt("arctangent - inverse of tangent function"),example:"atan(number);"},{name:"pi",description:Dt("returns pi"),example:"pi();"},{name:"pow",description:Dt("first argument raised to the power of the second argument"),example:"pow(@base, @exponent);"},{name:"mod",description:Dt("first argument modulus second argument"),example:"mod(number, number);"},{name:"min",description:Dt("returns the lowest of one or more values"),example:"min(@x, @y);"},{name:"max",description:Dt("returns the lowest of one or more values"),example:"max(@x, @y);"}],sa.colorProposals=[{name:"argb",example:"argb(@color);",description:Dt("creates a #AARRGGBB")},{name:"hsl",example:"hsl(@hue, @saturation, @lightness);",description:Dt("creates a color")},{name:"hsla",example:"hsla(@hue, @saturation, @lightness, @alpha);",description:Dt("creates a color")},{name:"hsv",example:"hsv(@hue, @saturation, @value);",description:Dt("creates a color")},{name:"hsva",example:"hsva(@hue, @saturation, @value, @alpha);",description:Dt("creates a color")},{name:"hue",example:"hue(@color);",description:Dt("returns the `hue` channel of `@color` in the HSL space")},{name:"saturation",example:"saturation(@color);",description:Dt("returns the `saturation` channel of `@color` in the HSL space")},{name:"lightness",example:"lightness(@color);",description:Dt("returns the `lightness` channel of `@color` in the HSL space")},{name:"hsvhue",example:"hsvhue(@color);",description:Dt("returns the `hue` channel of `@color` in the HSV space")},{name:"hsvsaturation",example:"hsvsaturation(@color);",description:Dt("returns the `saturation` channel of `@color` in the HSV space")},{name:"hsvvalue",example:"hsvvalue(@color);",description:Dt("returns the `value` channel of `@color` in the HSV space")},{name:"red",example:"red(@color);",description:Dt("returns the `red` channel of `@color`")},{name:"green",example:"green(@color);",description:Dt("returns the `green` channel of `@color`")},{name:"blue",example:"blue(@color);",description:Dt("returns the `blue` channel of `@color`")},{name:"alpha",example:"alpha(@color);",description:Dt("returns the `alpha` channel of `@color`")},{name:"luma",example:"luma(@color);",description:Dt("returns the `luma` value (perceptual brightness) of `@color`")},{name:"saturate",example:"saturate(@color, 10%);",description:Dt("return `@color` 10% points more saturated")},{name:"desaturate",example:"desaturate(@color, 10%);",description:Dt("return `@color` 10% points less saturated")},{name:"lighten",example:"lighten(@color, 10%);",description:Dt("return `@color` 10% points lighter")},{name:"darken",example:"darken(@color, 10%);",description:Dt("return `@color` 10% points darker")},{name:"fadein",example:"fadein(@color, 10%);",description:Dt("return `@color` 10% points less transparent")},{name:"fadeout",example:"fadeout(@color, 10%);",description:Dt("return `@color` 10% points more transparent")},{name:"fade",example:"fade(@color, 50%);",description:Dt("return `@color` with 50% transparency")},{name:"spin",example:"spin(@color, 10);",description:Dt("return `@color` with a 10 degree larger in hue")},{name:"mix",example:"mix(@color1, @color2, [@weight: 50%]);",description:Dt("return a mix of `@color1` and `@color2`")},{name:"greyscale",example:"greyscale(@color);",description:Dt("returns a grey, 100% desaturated color")},{name:"contrast",example:"contrast(@color1, [@darkcolor: black], [@lightcolor: white], [@threshold: 43%]);",description:Dt("return `@darkcolor` if `@color1 is> 43% luma` otherwise return `@lightcolor`, see notes")},{name:"multiply",example:"multiply(@color1, @color2);"},{name:"screen",example:"screen(@color1, @color2);"},{name:"overlay",example:"overlay(@color1, @color2);"},{name:"softlight",example:"softlight(@color1, @color2);"},{name:"hardlight",example:"hardlight(@color1, @color2);"},{name:"difference",example:"difference(@color1, @color2);"},{name:"exclusion",example:"exclusion(@color1, @color2);"},{name:"average",example:"average(@color1, @color2);"},{name:"negation",example:"negation(@color1, @color2);"}],function(){var e=[,,function(e){function t(e){this.__parent=e,this.__character_count=0,this.__indent_count=-1,this.__alignment_count=0,this.__wrap_point_index=0,this.__wrap_point_character_count=0,this.__wrap_point_indent_count=-1,this.__wrap_point_alignment_count=0,this.__items=[]}function n(e,t){this.__cache=[""],this.__indent_size=e.indent_size,this.__indent_string=e.indent_char,e.indent_with_tabs||(this.__indent_string=new Array(e.indent_size+1).join(e.indent_char)),t=t||"",e.indent_level>0&&(t=new Array(e.indent_level+1).join(this.__indent_string)),this.__base_string=t,this.__base_string_length=t.length}function r(e,r){this.__indent_cache=new n(e,r),this.raw=!1,this._end_with_newline=e.end_with_newline,this.indent_size=e.indent_size,this.wrap_line_length=e.wrap_line_length,this.indent_empty_lines=e.indent_empty_lines,this.__lines=[],this.previous_line=null,this.current_line=null,this.next_line=new t(this),this.space_before_token=!1,this.non_breaking_space=!1,this.previous_token_wrapped=!1,this.__add_outputline()}t.prototype.clone_empty=function(){var e=new t(this.__parent);return e.set_indent(this.__indent_count,this.__alignment_count),e},t.prototype.item=function(e){return e<0?this.__items[this.__items.length+e]:this.__items[e]},t.prototype.has_match=function(e){for(var t=this.__items.length-1;t>=0;t--)if(this.__items[t].match(e))return!0;return!1},t.prototype.set_indent=function(e,t){this.is_empty()&&(this.__indent_count=e||0,this.__alignment_count=t||0,this.__character_count=this.__parent.get_indent_size(this.__indent_count,this.__alignment_count))},t.prototype._set_wrap_point=function(){this.__parent.wrap_line_length&&(this.__wrap_point_index=this.__items.length,this.__wrap_point_character_count=this.__character_count,this.__wrap_point_indent_count=this.__parent.next_line.__indent_count,this.__wrap_point_alignment_count=this.__parent.next_line.__alignment_count)},t.prototype._should_wrap=function(){return this.__wrap_point_index&&this.__character_count>this.__parent.wrap_line_length&&this.__wrap_point_character_count>this.__parent.next_line.__character_count},t.prototype._allow_wrap=function(){if(this._should_wrap()){this.__parent.add_new_line();var e=this.__parent.current_line;return e.set_indent(this.__wrap_point_indent_count,this.__wrap_point_alignment_count),e.__items=this.__items.slice(this.__wrap_point_index),this.__items=this.__items.slice(0,this.__wrap_point_index),e.__character_count+=this.__character_count-this.__wrap_point_character_count,this.__character_count=this.__wrap_point_character_count," "===e.__items[0]&&(e.__items.splice(0,1),e.__character_count-=1),!0}return!1},t.prototype.is_empty=function(){return 0===this.__items.length},t.prototype.last=function(){return this.is_empty()?null:this.__items[this.__items.length-1]},t.prototype.push=function(e){this.__items.push(e);var t=e.lastIndexOf("\n");-1!==t?this.__character_count=e.length-t:this.__character_count+=e.length},t.prototype.pop=function(){var e=null;return this.is_empty()||(e=this.__items.pop(),this.__character_count-=e.length),e},t.prototype._remove_indent=function(){this.__indent_count>0&&(this.__indent_count-=1,this.__character_count-=this.__parent.indent_size)},t.prototype._remove_wrap_indent=function(){this.__wrap_point_indent_count>0&&(this.__wrap_point_indent_count-=1)},t.prototype.trim=function(){for(;" "===this.last();)this.__items.pop(),this.__character_count-=1},t.prototype.toString=function(){var e="";return this.is_empty()?this.__parent.indent_empty_lines&&(e=this.__parent.get_indent_string(this.__indent_count)):(e=this.__parent.get_indent_string(this.__indent_count,this.__alignment_count),e+=this.__items.join("")),e},n.prototype.get_indent_size=function(e,t){var n=this.__base_string_length;return t=t||0,e<0&&(n=0),(n+=e*this.__indent_size)+t},n.prototype.get_indent_string=function(e,t){var n=this.__base_string;return t=t||0,e<0&&(e=0,n=""),t+=e*this.__indent_size,this.__ensure_cache(t),n+this.__cache[t]},n.prototype.__ensure_cache=function(e){for(;e>=this.__cache.length;)this.__add_column()},n.prototype.__add_column=function(){var e=this.__cache.length,t=0,n="";this.__indent_size&&e>=this.__indent_size&&(e-=(t=Math.floor(e/this.__indent_size))*this.__indent_size,n=new Array(t+1).join(this.__indent_string)),e&&(n+=new Array(e+1).join(" ")),this.__cache.push(n)},r.prototype.__add_outputline=function(){this.previous_line=this.current_line,this.current_line=this.next_line.clone_empty(),this.__lines.push(this.current_line)},r.prototype.get_line_number=function(){return this.__lines.length},r.prototype.get_indent_string=function(e,t){return this.__indent_cache.get_indent_string(e,t)},r.prototype.get_indent_size=function(e,t){return this.__indent_cache.get_indent_size(e,t)},r.prototype.is_empty=function(){return!this.previous_line&&this.current_line.is_empty()},r.prototype.add_new_line=function(e){return!(this.is_empty()||!e&&this.just_added_newline()||(this.raw||this.__add_outputline(),0))},r.prototype.get_code=function(e){this.trim(!0);var t=this.current_line.pop();t&&("\n"===t[t.length-1]&&(t=t.replace(/\n+$/g,"")),this.current_line.push(t)),this._end_with_newline&&this.__add_outputline();var n=this.__lines.join("\n");return"\n"!==e&&(n=n.replace(/[\n]/g,e)),n},r.prototype.set_wrap_point=function(){this.current_line._set_wrap_point()},r.prototype.set_indent=function(e,t){return e=e||0,t=t||0,this.next_line.set_indent(e,t),this.__lines.length>1?(this.current_line.set_indent(e,t),!0):(this.current_line.set_indent(),!1)},r.prototype.add_raw_token=function(e){for(var t=0;t1&&this.current_line.is_empty();)this.__lines.pop(),this.current_line=this.__lines[this.__lines.length-1],this.current_line.trim();this.previous_line=this.__lines.length>1?this.__lines[this.__lines.length-2]:null},r.prototype.just_added_newline=function(){return this.current_line.is_empty()},r.prototype.just_added_blankline=function(){return this.is_empty()||this.current_line.is_empty()&&this.previous_line.is_empty()},r.prototype.ensure_empty_line_above=function(e,n){for(var r=this.__lines.length-2;r>=0;){var i=this.__lines[r];if(i.is_empty())break;if(0!==i.item(0).indexOf(e)&&i.item(-1)!==n){this.__lines.splice(r+1,0,new t(this)),this.previous_line=this.__lines[this.__lines.length-2];break}r--}},e.exports.Output=r},,,,function(e){function t(e,t){this.raw_options=n(e,t),this.disabled=this._get_boolean("disabled"),this.eol=this._get_characters("eol","auto"),this.end_with_newline=this._get_boolean("end_with_newline"),this.indent_size=this._get_number("indent_size",4),this.indent_char=this._get_characters("indent_char"," "),this.indent_level=this._get_number("indent_level"),this.preserve_newlines=this._get_boolean("preserve_newlines",!0),this.max_preserve_newlines=this._get_number("max_preserve_newlines",32786),this.preserve_newlines||(this.max_preserve_newlines=0),this.indent_with_tabs=this._get_boolean("indent_with_tabs","\t"===this.indent_char),this.indent_with_tabs&&(this.indent_char="\t",1===this.indent_size&&(this.indent_size=4)),this.wrap_line_length=this._get_number("wrap_line_length",this._get_number("max_char")),this.indent_empty_lines=this._get_boolean("indent_empty_lines"),this.templating=this._get_selection_list("templating",["auto","none","angular","django","erb","handlebars","php","smarty"],["auto"])}function n(e,t){var n,i={};for(n in e=r(e))n!==t&&(i[n]=e[n]);if(t&&e[t])for(n in e[t])i[n]=e[t][n];return i}function r(e){var t,n={};for(t in e)n[t.replace(/-/g,"_")]=e[t];return n}t.prototype._get_array=function(e,t){var n=this.raw_options[e],r=t||[];return"object"==typeof n?null!==n&&"function"==typeof n.concat&&(r=n.concat()):"string"==typeof n&&(r=n.split(/[^a-zA-Z0-9_\/\-]+/)),r},t.prototype._get_boolean=function(e,t){var n=this.raw_options[e];return void 0===n?!!t:!!n},t.prototype._get_characters=function(e,t){var n=this.raw_options[e],r=t||"";return"string"==typeof n&&(r=n.replace(/\\r/,"\r").replace(/\\n/,"\n").replace(/\\t/,"\t")),r},t.prototype._get_number=function(e,t){var n=this.raw_options[e];t=parseInt(t,10),isNaN(t)&&(t=0);var r=parseInt(n,10);return isNaN(r)&&(r=t),r},t.prototype._get_selection=function(e,t,n){var r=this._get_selection_list(e,t,n);if(1!==r.length)throw new Error("Invalid Option Value: The option '"+e+"' can only be one of the following values:\n"+t+"\nYou passed in: '"+this.raw_options[e]+"'");return r[0]},t.prototype._get_selection_list=function(e,t,n){if(!t||0===t.length)throw new Error("Selection list cannot be empty.");if(n=n||[t[0]],!this._is_valid_selection(n,t))throw new Error("Invalid Default Value!");var r=this._get_array(e,n);if(!this._is_valid_selection(r,t))throw new Error("Invalid Option Value: The option '"+e+"' can contain only the following values:\n"+t+"\nYou passed in: '"+this.raw_options[e]+"'");return r},t.prototype._is_valid_selection=function(e,t){return e.length&&t.length&&!e.some(function(e){return-1===t.indexOf(e)})},e.exports.Options=t,e.exports.normalizeOpts=r,e.exports.mergeOpts=n},,function(e){var t=RegExp.prototype.hasOwnProperty("sticky");function n(e){this.__input=e||"",this.__input_length=this.__input.length,this.__position=0}n.prototype.restart=function(){this.__position=0},n.prototype.back=function(){this.__position>0&&(this.__position-=1)},n.prototype.hasNext=function(){return this.__position=0&&e=0&&t=e.length&&this.__input.substring(t-e.length,t).toLowerCase()===e},e.exports.InputScanner=n},,,,,function(e){function t(e,t){e="string"==typeof e?e:e.source,t="string"==typeof t?t:t.source,this.__directives_block_pattern=new RegExp(e+/ beautify( \w+[:]\w+)+ /.source+t,"g"),this.__directive_pattern=/ (\w+)[:](\w+)/g,this.__directives_end_ignore_pattern=new RegExp(e+/\sbeautify\signore:end\s/.source+t,"g")}t.prototype.get_directives=function(e){if(!e.match(this.__directives_block_pattern))return null;var t={};this.__directive_pattern.lastIndex=0;for(var n=this.__directive_pattern.exec(e);n;)t[n[1]]=n[2],n=this.__directive_pattern.exec(e);return t},t.prototype.readIgnored=function(e){return e.readUntilAfter(this.__directives_end_ignore_pattern)},e.exports.Directives=t},,function(e,t,n){var r=n(16).Beautifier,i=n(17).Options;e.exports=function(e,t){return new r(e,t).beautify()},e.exports.defaultOptions=function(){return new i}},function(e,t,n){var r=n(17).Options,i=n(2).Output,s=n(8).InputScanner,o=new(0,n(13).Directives)(/\/\*/,/\*\//),a=/\r\n|[\r\n]/,l=/\r\n|[\r\n]/g,c=/\s/,h=/(?:\s|\n)+/g,d=/\/\*(?:[\s\S]*?)((?:\*\/)|$)/g,u=/\/\/(?:[^\n\r\u2028\u2029]*)/g;function p(e,t){this._source_text=e||"",this._options=new r(t),this._ch=null,this._input=null,this.NESTED_AT_RULE={page:!0,"font-face":!0,keyframes:!0,media:!0,supports:!0,document:!0},this.CONDITIONAL_GROUP_RULE={media:!0,supports:!0,document:!0},this.NON_SEMICOLON_NEWLINE_PROPERTY=["grid-template-areas","grid-template"]}p.prototype.eatString=function(e){var t="";for(this._ch=this._input.next();this._ch;){if(t+=this._ch,"\\"===this._ch)t+=this._input.next();else if(-1!==e.indexOf(this._ch)||"\n"===this._ch)break;this._ch=this._input.next()}return t},p.prototype.eatWhitespace=function(e){for(var t=c.test(this._input.peek()),n=0;c.test(this._input.peek());)this._ch=this._input.next(),e&&"\n"===this._ch&&(0===n||n0&&this._indentLevel--},p.prototype.beautify=function(){if(this._options.disabled)return this._source_text;var e=this._source_text,t=this._options.eol;"auto"===t&&(t="\n",e&&a.test(e||"")&&(t=e.match(a)[0]));var n=(e=e.replace(l,"\n")).match(/^[\t ]*/)[0];this._output=new i(this._options,n),this._input=new s(e),this._indentLevel=0,this._nestedLevel=0,this._ch=null;for(var r,p,m=0,f=!1,g=!1,b=!1,v=!1,y=!1,w=this._ch,C=!1;r=""!==this._input.read(h),p=w,this._ch=this._input.next(),"\\"===this._ch&&this._input.hasNext()&&(this._ch+=this._input.next()),w=this._ch,this._ch;)if("/"===this._ch&&"*"===this._input.peek()){this._output.add_new_line(),this._input.back();var _=this._input.read(d),k=o.get_directives(_);k&&"start"===k.ignore&&(_+=o.readIgnored(this._input)),this.print_string(_),this.eatWhitespace(!0),this._output.add_new_line()}else if("/"===this._ch&&"/"===this._input.peek())this._output.space_before_token=!0,this._input.back(),this.print_string(this._input.read(u)),this.eatWhitespace(!0);else if("$"===this._ch){this.preserveSingleSpace(r),this.print_string(this._ch);var x=this._input.peekUntilAfter(/[: ,;{}()[\]\/='"]/g);x.match(/[ :]$/)&&(x=this.eatString(": ").replace(/\s+$/,""),this.print_string(x),this._output.space_before_token=!0),0===m&&-1!==x.indexOf(":")&&(g=!0,this.indent())}else if("@"===this._ch)if(this.preserveSingleSpace(r),"{"===this._input.peek())this.print_string(this._ch+this.eatString("}"));else{this.print_string(this._ch);var S=this._input.peekUntilAfter(/[: ,;{}()[\]\/='"]/g);S.match(/[ :]$/)&&(S=this.eatString(": ").replace(/\s+$/,""),this.print_string(S),this._output.space_before_token=!0),0===m&&-1!==S.indexOf(":")?(g=!0,this.indent()):S in this.NESTED_AT_RULE?(this._nestedLevel+=1,S in this.CONDITIONAL_GROUP_RULE&&(b=!0)):0!==m||g||(v=!0)}else if("#"===this._ch&&"{"===this._input.peek())this.preserveSingleSpace(r),this.print_string(this._ch+this.eatString("}"));else if("{"===this._ch)g&&(g=!1,this.outdent()),v=!1,b?(b=!1,f=this._indentLevel>=this._nestedLevel):f=this._indentLevel>=this._nestedLevel-1,this._options.newline_between_rules&&f&&this._output.previous_line&&"{"!==this._output.previous_line.item(-1)&&this._output.ensure_empty_line_above("/",","),this._output.space_before_token=!0,"expand"===this._options.brace_style?(this._output.add_new_line(),this.print_string(this._ch),this.indent(),this._output.set_indent(this._indentLevel)):("("===p?this._output.space_before_token=!1:","!==p&&this.indent(),this.print_string(this._ch)),this.eatWhitespace(!0),this._output.add_new_line();else if("}"===this._ch)this.outdent(),this._output.add_new_line(),"{"===p&&this._output.trim(!0),g&&(this.outdent(),g=!1),this.print_string(this._ch),f=!1,this._nestedLevel&&this._nestedLevel--,this.eatWhitespace(!0),this._output.add_new_line(),this._options.newline_between_rules&&!this._output.just_added_blankline()&&"}"!==this._input.peek()&&this._output.add_new_line(!0),")"===this._input.peek()&&(this._output.trim(!0),"expand"===this._options.brace_style&&this._output.add_new_line(!0));else if(":"===this._ch){for(var E=0;E"!==this._ch&&"+"!==this._ch&&"~"!==this._ch||g||0!==m)if("]"===this._ch)this.print_string(this._ch);else if("["===this._ch)this.preserveSingleSpace(r),this.print_string(this._ch);else if("="===this._ch)this.eatWhitespace(),this.print_string("="),c.test(this._ch)&&(this._ch="");else if("!"!==this._ch||this._input.lookBack("\\")){var I='"'===p||"'"===p;this.preserveSingleSpace(I||r),this.print_string(this._ch),!this._output.just_added_newline()&&"\n"===this._input.peek()&&C&&this._output.add_new_line()}else this._output.space_before_token=!0,this.print_string(this._ch);else this._options.space_around_combinator?(this._output.space_before_token=!0,this.print_string(this._ch),this._output.space_before_token=!0):(this.print_string(this._ch),this.eatWhitespace(),this._ch&&c.test(this._ch)&&(this._ch=""));return this._output.get_code(t)},e.exports.Beautifier=p},function(e,t,n){var r=n(6).Options;function i(e){r.call(this,e,"css"),this.selector_separator_newline=this._get_boolean("selector_separator_newline",!0),this.newline_between_rules=this._get_boolean("newline_between_rules",!0);var t=this._get_boolean("space_around_selector_separator");this.space_around_combinator=this._get_boolean("space_around_combinator")||t;var n=this._get_selection_list("brace_style",["collapse","expand","end-expand","none","preserve-inline"]);this.brace_style="collapse";for(var i=0;i0&&fa(r,l-1);)l--;0===l||ma(r,l-1)?a=l:l=0;){const n=e.charCodeAt(t);if(n===da)return!0;if(n===ua)return!1;t--}return!1}(r,a),i=c===r.length,r=r.substring(a,c),0!==a){const r=e.offsetAt(Vt.create(t.start.line,0));s=function(e,t,n){let r=t,i=0;const s=n.tabSize||4;for(;r0){const e=n.insertSpaces?le(" ",a*s):le("\t",s);c=c.split("\n").join("\n"+e),0===t.start.character&&(c=e+c)}return[{range:t,newText:c}]}function ha(e){return e.replace(/^\s+/,"")}var da="{".charCodeAt(0),ua="}".charCodeAt(0);function pa(e,t,n){if(e&&e.hasOwnProperty(t)){const n=e[t];if(null!==n)return n}return n}function ma(e,t){return-1!=="\r\n".indexOf(e.charAt(t))}function fa(e,t){return-1!==" \t".indexOf(e.charAt(t))}var ga={version:1.1,properties:[{name:"additive-symbols",browsers:["FF33"],atRule:"@counter-style",syntax:"[ && ]#",relevance:50,description:"@counter-style descriptor. Specifies the symbols used by the marker-construction algorithm specified by the system descriptor. Needs to be specified if the counter system is 'additive'.",restrictions:["integer","string","image","identifier"]},{name:"align-content",browsers:["E12","FF28","S9","C29","IE11","O16"],values:[{name:"center",description:"Lines are packed toward the center of the flex container."},{name:"flex-end",description:"Lines are packed toward the end of the flex container."},{name:"flex-start",description:"Lines are packed toward the start of the flex container."},{name:"space-around",description:"Lines are evenly distributed in the flex container, with half-size spaces on either end."},{name:"space-between",description:"Lines are evenly distributed in the flex container."},{name:"stretch",description:"Lines stretch to take up the remaining space."},{name:"start"},{name:"end"},{name:"normal"},{name:"baseline"},{name:"first baseline"},{name:"last baseline"},{name:"space-around"},{name:"space-between"},{name:"space-evenly"},{name:"stretch"},{name:"safe"},{name:"unsafe"}],syntax:"normal | | | ? ",relevance:66,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/align-content"}],description:"Aligns a flex container's lines within the flex container when there is extra space in the cross-axis, similar to how 'justify-content' aligns individual items within the main-axis.",restrictions:["enum"]},{name:"align-items",browsers:["E12","FF20","S9","C29","IE11","O16"],values:[{name:"baseline",description:"If the flex item's inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment."},{name:"center",description:"The flex item's margin box is centered in the cross axis within the line."},{name:"flex-end",description:"The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line."},{name:"flex-start",description:"The cross-start margin edge of the flex item is placed flush with the cross-start edge of the line."},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."},{name:"normal"},{name:"start"},{name:"end"},{name:"self-start"},{name:"self-end"},{name:"first baseline"},{name:"last baseline"},{name:"stretch"},{name:"safe"},{name:"unsafe"}],syntax:"normal | stretch | | [ ? ]",relevance:87,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/align-items"}],description:"Aligns flex items along the cross axis of the current line of the flex container.",restrictions:["enum"]},{name:"justify-items",browsers:["E12","FF20","S9","C52","IE11","O12.1"],values:[{name:"auto"},{name:"normal"},{name:"end"},{name:"start"},{name:"flex-end",description:'"Flex items are packed toward the end of the line."'},{name:"flex-start",description:'"Flex items are packed toward the start of the line."'},{name:"self-end",description:"The item is packed flush to the edge of the alignment container of the end side of the item, in the appropriate axis."},{name:"self-start",description:"The item is packed flush to the edge of the alignment container of the start side of the item, in the appropriate axis.."},{name:"center",description:"The items are packed flush to each other toward the center of the of the alignment container."},{name:"left"},{name:"right"},{name:"baseline"},{name:"first baseline"},{name:"last baseline"},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."},{name:"safe"},{name:"unsafe"},{name:"legacy"}],syntax:"normal | stretch | | ? [ | left | right ] | legacy | legacy && [ left | right | center ]",relevance:53,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/justify-items"}],description:"Defines the default justify-self for all items of the box, giving them the default way of justifying each box along the appropriate axis",restrictions:["enum"]},{name:"justify-self",browsers:["E16","FF45","S10.1","C57","IE10","O44"],values:[{name:"auto"},{name:"normal"},{name:"end"},{name:"start"},{name:"flex-end",description:'"Flex items are packed toward the end of the line."'},{name:"flex-start",description:'"Flex items are packed toward the start of the line."'},{name:"self-end",description:"The item is packed flush to the edge of the alignment container of the end side of the item, in the appropriate axis."},{name:"self-start",description:"The item is packed flush to the edge of the alignment container of the start side of the item, in the appropriate axis.."},{name:"center",description:"The items are packed flush to each other toward the center of the of the alignment container."},{name:"left"},{name:"right"},{name:"baseline"},{name:"first baseline"},{name:"last baseline"},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."},{name:"save"},{name:"unsave"}],syntax:"auto | normal | stretch | | ? [ | left | right ]",relevance:55,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/justify-self"}],description:"Defines the way of justifying a box inside its container along the appropriate axis.",restrictions:["enum"]},{name:"align-self",browsers:["E12","FF20","S9","C29","IE10","O12.1"],values:[{name:"auto",description:"Computes to the value of 'align-items' on the element's parent, or 'stretch' if the element has no parent. On absolutely positioned elements, it computes to itself."},{name:"normal"},{name:"self-end"},{name:"self-start"},{name:"baseline",description:"If the flex item's inline axis is the same as the cross axis, this value is identical to 'flex-start'. Otherwise, it participates in baseline alignment."},{name:"center",description:"The flex item's margin box is centered in the cross axis within the line."},{name:"flex-end",description:"The cross-end margin edge of the flex item is placed flush with the cross-end edge of the line."},{name:"flex-start",description:"The cross-start margin edge of the flex item is placed flush with the cross-start edge of the line."},{name:"stretch",description:"If the cross size property of the flex item computes to auto, and neither of the cross-axis margins are auto, the flex item is stretched."},{name:"baseline"},{name:"first baseline"},{name:"last baseline"},{name:"safe"},{name:"unsafe"}],syntax:"auto | normal | stretch | | ? ",relevance:73,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/align-self"}],description:"Allows the default alignment along the cross axis to be overridden for individual flex items.",restrictions:["enum"]},{name:"all",browsers:["E79","FF27","S9.1","C37","O24"],values:[],syntax:"initial | inherit | unset | revert | revert-layer",relevance:53,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/all"}],description:"Shorthand that resets all properties except 'direction' and 'unicode-bidi'.",restrictions:["enum"]},{name:"alt",browsers:["S9"],values:[],relevance:50,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/alt"}],description:"Provides alternative text for assistive technology to replace the generated content of a ::before or ::after element.",restrictions:["string","enum"]},{name:"animation",browsers:["E12","FF16","S9","C43","IE10","O30"],values:[{name:"alternate",description:"The animation cycle iterations that are odd counts are played in the normal direction, and the animation cycle iterations that are even counts are played in a reverse direction."},{name:"alternate-reverse",description:"The animation cycle iterations that are odd counts are played in the reverse direction, and the animation cycle iterations that are even counts are played in a normal direction."},{name:"backwards",description:"The beginning property value (as defined in the first @keyframes at-rule) is applied before the animation is displayed, during the period defined by 'animation-delay'."},{name:"both",description:"Both forwards and backwards fill modes are applied."},{name:"forwards",description:"The final property value (as defined in the last @keyframes at-rule) is maintained after the animation completes."},{name:"infinite",description:"Causes the animation to repeat forever."},{name:"none",description:"No animation is performed"},{name:"normal",description:"Normal playback."},{name:"reverse",description:"All iterations of the animation are played in the reverse direction from the way they were specified."}],syntax:"#",relevance:82,references:[{name:"MDN Reference",url:"https://developer.mozilla.org/docs/Web/CSS/animation"}],description:"Shorthand property combines six of the animation properties into a single property.",restrictions:["time","timing-function","enum","identifier","number"]},{name:"animation-delay",browsers:["E12","FF16","S9","C43","IE10","O30"],syntax:"