clone

a browser-first diagram editor with live svg previews, local drafts and encrypted, accountless sharing

keep TikZ rendering inside the secure client frame

Dami committed b122898
commit
b122898acaa2d022c46a73b82ee99a0d44cdee53
parent
75d455c8fe6f2695aed806e052bf6611b38d7237
author
Dami <dami.etoile@gmail.com>
7 files changed, +27 -12
Mdiagramzip-client-units/tikz/scripts/build.mjs11++++++++++-
Mdiagramzip-client-units/tikz/src/frame.js4++--
Mdiagramzip-client-units/tikz/unit/worker.js2+-
Mdiagramzip-docs/scripts/check-rendered-examples.mjs16+++++++++++-----
Mdiagramzip-docs/src/components/DiagramExample/index.js2+-
Mdiagramzip/src/client-renderers.js2+-
Mserver/src/main/resources/web/diagramzip/assets/index-CzBQjn0p.js2+-
M diagramzip-client-units/tikz/scripts/build.mjs +10 -1
M diagramzip-client-units/tikz/src/frame.js +2 -2
M diagramzip-client-units/tikz/unit/worker.js +1 -1
M diagramzip-docs/scripts/check-rendered-examples.mjs +11 -5
M diagramzip-docs/src/components/DiagramExample/index.js +1 -1
M diagramzip/src/client-renderers.js +1 -1
M server/src/main/resources/web/diagramzip/assets/index-CzBQjn0p.js +1 -1
@@ -1627,7 +1627,7 @@ Rel(bob, tandem, "Completes tasks")
16271627 +--------+--------+16281628 | Shared Tasks |16291629 | {s} |1630- +-----------------+`,d2:c,nwdiag:h,packetdiag:ee,rackdiag:g,bpmn:o.replaceAll(`Examine Situation`,`Bob Agent tests Tandem`).replaceAll(`Things OK?`,`Tests pass?`).replaceAll(`Notification Sent`,`Alice and Bob share tasks`).replaceAll(`Error Propagated`,`Alice Agent revises flow`).replaceAll(`Klaus`,`Alice`).replaceAll(`Walter`,`Bob`),bytefield:s,dbml:l,diagramsnet:u,erd:d,excalidraw:f,goat:p,nomnoml:m,pikchr:te,svgbob:_,symbolator:ne,tikz:re,umlet:ie,vega:ae,vegalite:v,wavedrom:oe,wireviz:se},st={plantuml:[`Tandem task sync`,`Alice and Bob coordinate shared tasks through their agents.`],mermaid:[`Shared task flow`,`A compact view of ideas moving through the Tandem team.`],graphviz:[`Tandem collaboration graph`,`People and agents converge on one synchronized task list.`],d2:[`Connection styles`,`D2 connection, arrowhead, shape, and animation syntax.`],c4plantuml:[`Tandem system context`,`The people and software systems surrounding Tandem.`],blockdiag:[`Tandem block flow`,`A block-oriented view of the shared task workflow.`],seqdiag:[`Tandem task sequence`,`A task moves from Alice to Bob and back through Tandem.`],actdiag:[`Tandem delivery activities`,`Work crosses Alice, Alice Agent, and Bob Agent lanes.`],nwdiag:[`Network layout`,`A sample network topology and its connected address ranges.`],packetdiag:[`TCP packet structure`,`The bit-level layout of a TCP packet header.`],rackdiag:[`Rack layout`,`A sample equipment rack rendered from rackdiag syntax.`],bpmn:[`Agent-assisted review`,`A BPMN review flow that branches on test results.`],bytefield:[`Byte field layout`,`A compact byte-oriented protocol field example.`],dbml:[`Database schema`,`Tables and relationships expressed with DBML.`],diagramsnet:[`Venn diagram`,`An overlapping-set example imported from diagrams.net.`],ditaa:[`Tandem ASCII architecture`,`An ASCII sketch becomes a rendered system diagram.`],erd:[`Data model`,`Entities and relationships in a small relational schema.`],excalidraw:[`Venn sketch`,`A hand-drawn overlapping-set diagram.`],goat:[`Component shapes`,`GoAT exercises boxes, connectors, curves, and symbols.`],nomnoml:[`Pirate class diagram`,`A playful class diagram demonstrating Nomnoml syntax.`],pikchr:[`Cardinal points`,`A diamond marks north, east, south, and west.`],structurizr:[`Tandem landscape`,`A software landscape linking people, agents, and Tandem.`],svgbob:[`Cloud network`,`An ASCII cloud connects clients and services.`],symbolator:[`Hardware component`,`A component symbol generated from interface declarations.`],tikz:[`Periodic table`,`A color-coded periodic table rendered with TikZ.`],umlet:[`UML example`,`A UMLet document rendered directly from its XML form.`],vega:[`Bar chart`,`A declarative bar chart expressed with Vega.`],vegalite:[`Discretizing scale`,`A Vega-Lite example comparing discretized values.`],wavedrom:[`Timing diagram`,`Digital signals and timing relationships rendered by WaveDrom.`],wireviz:[`Wiring harness`,`Connections, cables, and pins described with WireViz.`]};function ct(e){return ot[e]??at}function lt(e){let t=n.findIndex(t=>t.id===e),[r,i]=st[e]??[`Diagram example`,`A diagram.zip catalog example.`];return{type:e,source:ct(e),options:{},...le(Math.max(t,0),{title:r,description:i})}}function ut({search:e=globalThis.location?.search??``,coarsePointer:t=globalThis.matchMedia?.(`(pointer: coarse)`).matches??!1}={}){let n=new URLSearchParams(e).get(`editor`);return n===`textarea`||n===`monaco`?n:t?`textarea`:`monaco`}async function dt(e){let t=ut();try{return await ft(t,e)}catch(n){if(t===`textarea`)throw n;return console.warn(`Monaco Editor is unavailable; using the basic text editor.`,n),ft(`textarea`,e)}}async function ft(e,n){let r=await(e===`textarea`?await t(()=>import(`./textarea-editor-BTXrLHn4.js`),[]):await t(()=>import(`./monaco-editor-C7iaFm9N.js`),__vite__mapDeps([0,1,2,3,4,5]))).createEditor(n);return n.element.dataset.editorBackend=e,r}function pt(e,t,n,r,i){return e.set(t,{...r,type:t}),e.get(n)??i(n)}var mt=`/api/v1`,U=/^[A-Za-z0-9_-]{16}$/,ht=/^[A-Za-z0-9_-]{43}$/;function gt(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t).replaceAll(`+`,`-`).replaceAll(`/`,`_`).replace(/=+$/,``)}function _t(){return gt(crypto.getRandomValues(new Uint8Array(32)))}function vt(e){return e.match(/^\/d\/([A-Za-z0-9_-]{16})\/?$/)?.[1]??null}function yt(e,t){if(!U.test(t))throw Error(`Invalid diagram alias.`);return new URL(`/d/${t}`,e).toString()}function bt(e,t,n){if(!ht.test(n))throw Error(`Invalid write capability.`);let r=new URL(yt(e,t));return r.hash=`w=${n}`,r.toString()}function xt(e,t,n=`svg`){if(!U.test(t))throw Error(`Invalid diagram alias.`);if(n!==`svg`&&n!==`png`)throw Error(`Invalid render format.`);return new URL(`${mt}/aliases/${t}/renders/${n}`,e).toString()}function St(e){return e.match(/^#w=([A-Za-z0-9_-]{43})$/)?.[1]??null}var Ct=class extends Error{constructor(e,{status:t,code:n}={}){super(e),this.status=t,this.code=n}};function wt(e){if(!e||typeof e!=`object`||typeof e.type!=`string`||typeof e.source!=`string`)throw Error(`Invalid diagram state.`);return{mode:`open`,diagram:{type:e.type,source:e.source,options:e.options??{},presentation:H(e.presentation)},metadata:V(e.meta)}}function Tt(e){if(!e||typeof e!=`object`||!U.test(e.aliasId)||!ht.test(e.contentId)||!ht.test(e.renderId)||!Number.isSafeInteger(e.revision)||e.mode!==`open`&&e.mode!==`locked`)throw new Ct(`The persistence service returned an invalid response.`,{code:`invalid_response`});let t={aliasId:e.aliasId,contentId:e.contentId,renderId:e.renderId,revision:e.revision,mode:e.mode,createdAt:e.createdAt,updatedAt:e.updatedAt};if(e.mode===`locked`){if(!e.encryptedContent||!e.encryptedMetadata||!e.keyEnvelope)throw new Ct(`The persistence service returned an invalid locked diagram.`,{code:`invalid_response`});return{...t,encryptedContent:e.encryptedContent,encryptedMetadata:e.encryptedMetadata,keyEnvelope:e.keyEnvelope}}if(!e.diagram||typeof e.diagram!=`object`)throw new Ct(`The persistence service returned an invalid open diagram.`,{code:`invalid_response`});return{...t,state:{type:e.diagram.type,source:e.diagram.source,options:e.diagram.options??{},presentation:H(e.diagram.presentation),meta:V(e.metadata)}}}var Et=class{constructor({fetchImpl:e=globalThis.fetch,origin:t=globalThis.location?.origin??`http://localhost`,apiPrefix:n=mt}={}){this.fetch=(...t)=>e(...t),this.origin=t,this.apiPrefix=n.replace(/\/$/,``)}url(e=``){return new URL(`${this.apiPrefix}/aliases${e}`,this.origin)}async request(e,t){let n=await this.fetch(e,t),r=await n.json().catch(()=>null);if(!n.ok)throw new Ct(r?.error?.message||`Persistence request failed with HTTP ${n.status}.`,{status:n.status,code:r?.error?.code});return Tt(r)}async errorFor(e){let t=await e.json().catch(()=>null);return new Ct(t?.error?.message||`Persistence request failed with HTTP ${e.status}.`,{status:e.status,code:t?.error?.code})}async createPayload(e){let t=_t();return{...await this.request(this.url(),{method:`POST`,headers:{Authorization:`Bearer ${t}`,"Content-Type":`application/json`},body:JSON.stringify(e)}),writeCapability:t}}createAlias(e){return this.createPayload(wt(e))}createLockedAlias(e){if(e?.mode!==`locked`)throw Error(`Invalid locked diagram payload.`);return this.createPayload(e)}getAlias(e){if(!U.test(e))throw Error(`Invalid diagram alias.`);return this.request(this.url(`/${e}`),{headers:{Accept:`application/json`}})}updatePayload(e,t,n,r){if(!U.test(e))throw Error(`Invalid diagram alias.`);if(!Number.isSafeInteger(n)||n<1)throw Error(`Invalid alias revision.`);if(!ht.test(r))throw Error(`Invalid write capability.`);return this.request(this.url(`/${e}`),{method:`PUT`,headers:{Accept:`application/json`,Authorization:`Bearer ${r}`,"Content-Type":`application/json`,"If-Match":`"${n}"`},body:JSON.stringify(t)})}updateAlias(e,t,n,r){return this.updatePayload(e,wt(t),n,r)}updateLockedAlias(e,t,n,r){if(t?.mode!==`locked`)throw Error(`Invalid locked diagram payload.`);return this.updatePayload(e,t,n,r)}async uploadRender({aliasId:e,renderId:t,revision:n,writeCapability:r,format:i,mode:a,render:o,renderer:s}){if(!U.test(e))throw Error(`Invalid diagram alias.`);if(!ht.test(t))throw Error(`Invalid render ID.`);if(!Number.isSafeInteger(n)||n<1)throw Error(`Invalid alias revision.`);if(!ht.test(r))throw Error(`Invalid write capability.`);if(i!==`svg`&&i!==`png`)throw Error(`Invalid render format.`);if(a!==`open`&&a!==`locked`)throw Error(`Invalid diagram mode.`);if(!s||!/^[a-z][a-z0-9-]{0,31}$/.test(s.unit)||typeof s.build!=`string`||!/^[A-Za-z0-9][A-Za-z0-9._@+-]{0,127}$/.test(s.build)||!Array.isArray(s.pipeline)||s.pipeline.length<1||s.pipeline.some(e=>!/^[a-z][a-z0-9-]{0,31}$/.test(e)))throw Error(`Invalid renderer identity.`);let c=a===`locked`?`application/json`:i===`svg`?`image/svg+xml`:`image/png`,l=a===`locked`?JSON.stringify(o):o,u=await this.fetch(this.url(`/${e}/renders/${i}`),{method:`PUT`,headers:{Authorization:`Bearer ${r}`,"Content-Type":c,"If-Match":`"${n}"`,"X-Render-Id":t,"X-Renderer-Unit":s.unit,"X-Renderer-Build":s.build,"X-Renderer-Pipeline":s.pipeline.join(`,`)},body:l});if(!u.ok)throw await this.errorFor(u)}async getEncryptedRender(e,t){if(!U.test(e))throw Error(`Invalid diagram alias.`);if(t!==`svg`&&t!==`png`)throw Error(`Invalid render format.`);let n=this.url(`/${e}/renders/${t}`);n.searchParams.set(`encrypted`,`1`);let r=await this.fetch(n,{headers:{Accept:`application/json`}});if(!r.ok)throw await this.errorFor(r);return r.json()}},Dt=6e5,Ot=new TextEncoder,kt=new TextDecoder,At=Ot.encode(`diagram.zip:content:v1`),jt=Ot.encode(`diagram.zip:metadata:v1`),Mt=Ot.encode(`diagram.zip:bundle-key:v1`);function Nt(e){if(e!==`svg`&&e!==`png`)throw Error(`Invalid render format.`);return Ot.encode(`diagram.zip:render:${e}:v1`)}function Pt(e){let t=``,n=32768;for(let r=0;r<e.length;r+=n)t+=String.fromCharCode(...e.subarray(r,r+n));return btoa(t).replaceAll(`+`,`-`).replaceAll(`/`,`_`).replace(/=+$/,``)}function Ft(e){if(typeof e!=`string`||!/^[A-Za-z0-9_-]+$/.test(e))throw Error(`Invalid encrypted diagram.`);let t=e.replaceAll(`-`,`+`).replaceAll(`_`,`/`),n=t+`=`.repeat((4-t.length%4)%4),r=atob(n),i=Uint8Array.from(r,e=>e.charCodeAt(0));if(Pt(i)!==e)throw Error(`Invalid encrypted diagram.`);return i}function It(e){return crypto.getRandomValues(new Uint8Array(e))}async function Lt(e,t){if(!(e instanceof Uint8Array)||e.byteLength!==32)throw Error(`Invalid diagram key.`);return crypto.subtle.importKey(`raw`,e,{name:`AES-GCM`},!1,t)}async function Rt(e,{iterations:t,salt:n}){if(typeof e!=`string`)throw Error(`Password is required.`);let r=await crypto.subtle.importKey(`raw`,Ot.encode(e),`PBKDF2`,!1,[`deriveKey`]);return crypto.subtle.deriveKey({name:`PBKDF2`,hash:`SHA-256`,iterations:t,salt:n},r,{name:`AES-GCM`,length:256},!1,[`encrypt`,`decrypt`])}async function zt(e,t,n){let r=It(12),i=await crypto.subtle.encrypt({name:`AES-GCM`,iv:r,additionalData:n,tagLength:128},t,e);return{v:1,alg:`A256GCM`,iv:Pt(r),ciphertext:Pt(new Uint8Array(i))}}async function Bt(e,t,n){if(!e||e.v!==1||e.alg!==`A256GCM`)throw Error(`Invalid encrypted diagram.`);let r=Ft(e.iv);if(r.byteLength!==12)throw Error(`Invalid encrypted diagram.`);let i=Ft(e.ciphertext);if(i.byteLength<16)throw Error(`Invalid encrypted diagram.`);return new Uint8Array(await crypto.subtle.decrypt({name:`AES-GCM`,iv:r,additionalData:n,tagLength:128},t,i))}async function Vt(e,t,n){return zt(Ot.encode(JSON.stringify(e)),t,n)}async function Ht(e,t,n){return JSON.parse(kt.decode(await Bt(e,t,n)))}function Ut(e,t){if(!e||typeof e!=`object`||!r(e.type)||typeof e.source!=`string`||!e.options||typeof e.options!=`object`||Array.isArray(e.options))throw Error(`Invalid encrypted diagram.`);return{type:e.type,source:e.source,options:e.options,presentation:H(e.presentation),meta:V(t)}}async function Wt(e,t){if(typeof t!=`string`||t.length<8)throw Error(`Password must be at least 8 characters.`);let n=It(16),r={name:`PBKDF2`,hash:`SHA-256`,iterations:Dt,salt:Pt(n)};return{v:1,kdf:r,wrap:await zt(e,await Rt(t,{iterations:r.iterations,salt:n}),Mt)}}async function Gt(e,t){if(!e||e.v!==1||e.kdf?.name!==`PBKDF2`||e.kdf.hash!==`SHA-256`||!Number.isInteger(e.kdf.iterations)||e.kdf.iterations<1e5||e.kdf.iterations>5e6)throw Error(`Invalid encrypted diagram.`);let n=Ft(e.kdf.salt);if(n.byteLength!==16)throw Error(`Invalid encrypted diagram.`);let r=await Rt(t,{iterations:e.kdf.iterations,salt:n}),i=await Bt(e.wrap,r,Mt);if(i.byteLength!==32)throw Error(`Invalid encrypted diagram.`);return i}async function Kt(e,t,n){let r=Ut({type:e.type,source:e.source,options:e.options??{},presentation:e.presentation},e.meta),i=await Lt(t,[`encrypt`]);return{mode:`locked`,encryptedContent:await Vt({type:r.type,source:r.source,options:r.options,presentation:r.presentation},i,At),encryptedMetadata:await Vt(r.meta,i,jt),keyEnvelope:n}}async function qt(e,t){let n=It(32);return{bundleKey:n,payload:await Kt(e,n,await Wt(n,t))}}async function Jt(e,t){if(!e||e.mode!==`locked`)throw Error(`Invalid encrypted diagram.`);try{let n=await Gt(e.keyEnvelope,t),r=await Lt(n,[`decrypt`]),[i,a]=await Promise.all([Ht(e.encryptedContent,r,At),Ht(e.encryptedMetadata,r,jt)]);return{bundleKey:n,state:Ut(i,a)}}catch{throw Error(`Wrong password or damaged diagram.`)}}async function Yt(e,t,n){if(!(e instanceof Blob))throw Error(`Invalid rendered image.`);let r=await Lt(t,[`encrypt`]);return zt(new Uint8Array(await e.arrayBuffer()),r,Nt(n))}var Xt=`diagram.zip:renderer:v1`,Zt=2e4,Qt=Object.freeze({mermaid:Object.freeze({frameUrl:`https://mermaid.render.diagram.zip/index.html?v=1`}),bpmn:Object.freeze({frameUrl:`https://bpmn.render.diagram.zip/index.html?v=1`}),excalidraw:Object.freeze({frameUrl:`https://excalidraw.render.diagram.zip/index.html?v=3`}),diagramsnet:Object.freeze({frameUrl:`https://diagramsnet.render.diagram.zip/index.html?v=1`}),tikz:Object.freeze({frameUrl:`https://tikz.render.diagram.zip/index.html?v=1`})});Object.freeze(Object.keys(Qt));function $t(e){return e?.name===`AbortError`?e:new DOMException(`Render superseded.`,`AbortError`)}var en=class{constructor({documentObject:e=document,windowObject:t=window,frameUrl:n}={}){this.document=e,this.window=t,this.frameUrl=n,this.frame=null,this.ready=null,this.resolveReady=null,this.rejectReady=null,this.sequence=0,this.pending=new Map,this.handleMessage=e=>this.receive(e),this.window.addEventListener(`message`,this.handleMessage)}ensureFrame(){if(this.frame)return this.ready;let e=this.document.createElement(`iframe`);return e.title=`Diagram renderer`,e.setAttribute(`sandbox`,`allow-scripts`),e.setAttribute(`aria-hidden`,`true`),e.tabIndex=-1,Object.assign(e.style,{position:`fixed`,left:`-200vw`,top:`0`,width:`1280px`,height:`800px`,border:`0`,pointerEvents:`none`,visibility:`hidden`}),this.ready=new Promise((e,t)=>{this.resolveReady=e,this.rejectReady=t}),e.addEventListener(`error`,()=>this.rejectReady?.(Error(`The client renderer could not be loaded.`)),{once:!0}),e.src=this.frameUrl,this.frame=e,this.document.body.append(e),this.ready}receive(e){if(!this.frame||e.source!==this.frame.contentWindow||e.data?.channel!==Xt)return;if(e.data.type===`ready`){this.resolveReady?.(),this.resolveReady=null,this.rejectReady=null;return}if(e.data.type!==`result`)return;let t=this.pending.get(e.data.requestId);t&&(this.pending.delete(e.data.requestId),t.finish(),e.data.ok&&typeof e.data.svg==`string`?t.resolve({body:e.data.svg,version:e.data.version,build:e.data.build,pipeline:e.data.pipeline,runtime:`client`}):t.reject(Error(e.data.error||`Client rendering failed.`)))}async render(e,t,n){let r;try{await Promise.race([this.ensureFrame(),new Promise((e,t)=>{r=setTimeout(()=>t(Error(`The client renderer timed out while loading.`)),Zt)})])}finally{clearTimeout(r)}if(n.aborted)throw $t(n.reason);let i=`${Date.now().toString(36)}-${++this.sequence}`;return new Promise((r,a)=>{let o=setTimeout(()=>{this.pending.delete(i),n.removeEventListener(`abort`,s),a(Error(`The client renderer timed out.`))},Zt),s=()=>{this.pending.delete(i),clearTimeout(o),a($t(n.reason))};n.addEventListener(`abort`,s,{once:!0}),this.pending.set(i,{resolve:r,reject:a,finish:()=>{clearTimeout(o),n.removeEventListener(`abort`,s)}}),this.frame.contentWindow.postMessage({channel:Xt,type:`render`,requestId:i,engine:e,source:t},`*`)})}},tn=new Map;function nn(e){let t=Qt[e];if(!t)return null;let n=tn.get(t.frameUrl);return n||(n=new en({frameUrl:t.frameUrl}),tn.set(t.frameUrl,n)),{id:e,runtime:`client`,render:({source:t},r)=>n.render(e,t,r)}}var rn=e((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.CHAR=` 1630+ +-----------------+`,d2:c,nwdiag:h,packetdiag:ee,rackdiag:g,bpmn:o.replaceAll(`Examine Situation`,`Bob Agent tests Tandem`).replaceAll(`Things OK?`,`Tests pass?`).replaceAll(`Notification Sent`,`Alice and Bob share tasks`).replaceAll(`Error Propagated`,`Alice Agent revises flow`).replaceAll(`Klaus`,`Alice`).replaceAll(`Walter`,`Bob`),bytefield:s,dbml:l,diagramsnet:u,erd:d,excalidraw:f,goat:p,nomnoml:m,pikchr:te,svgbob:_,symbolator:ne,tikz:re,umlet:ie,vega:ae,vegalite:v,wavedrom:oe,wireviz:se},st={plantuml:[`Tandem task sync`,`Alice and Bob coordinate shared tasks through their agents.`],mermaid:[`Shared task flow`,`A compact view of ideas moving through the Tandem team.`],graphviz:[`Tandem collaboration graph`,`People and agents converge on one synchronized task list.`],d2:[`Connection styles`,`D2 connection, arrowhead, shape, and animation syntax.`],c4plantuml:[`Tandem system context`,`The people and software systems surrounding Tandem.`],blockdiag:[`Tandem block flow`,`A block-oriented view of the shared task workflow.`],seqdiag:[`Tandem task sequence`,`A task moves from Alice to Bob and back through Tandem.`],actdiag:[`Tandem delivery activities`,`Work crosses Alice, Alice Agent, and Bob Agent lanes.`],nwdiag:[`Network layout`,`A sample network topology and its connected address ranges.`],packetdiag:[`TCP packet structure`,`The bit-level layout of a TCP packet header.`],rackdiag:[`Rack layout`,`A sample equipment rack rendered from rackdiag syntax.`],bpmn:[`Agent-assisted review`,`A BPMN review flow that branches on test results.`],bytefield:[`Byte field layout`,`A compact byte-oriented protocol field example.`],dbml:[`Database schema`,`Tables and relationships expressed with DBML.`],diagramsnet:[`Venn diagram`,`An overlapping-set example imported from diagrams.net.`],ditaa:[`Tandem ASCII architecture`,`An ASCII sketch becomes a rendered system diagram.`],erd:[`Data model`,`Entities and relationships in a small relational schema.`],excalidraw:[`Venn sketch`,`A hand-drawn overlapping-set diagram.`],goat:[`Component shapes`,`GoAT exercises boxes, connectors, curves, and symbols.`],nomnoml:[`Pirate class diagram`,`A playful class diagram demonstrating Nomnoml syntax.`],pikchr:[`Cardinal points`,`A diamond marks north, east, south, and west.`],structurizr:[`Tandem landscape`,`A software landscape linking people, agents, and Tandem.`],svgbob:[`Cloud network`,`An ASCII cloud connects clients and services.`],symbolator:[`Hardware component`,`A component symbol generated from interface declarations.`],tikz:[`Periodic table`,`A color-coded periodic table rendered with TikZ.`],umlet:[`UML example`,`A UMLet document rendered directly from its XML form.`],vega:[`Bar chart`,`A declarative bar chart expressed with Vega.`],vegalite:[`Discretizing scale`,`A Vega-Lite example comparing discretized values.`],wavedrom:[`Timing diagram`,`Digital signals and timing relationships rendered by WaveDrom.`],wireviz:[`Wiring harness`,`Connections, cables, and pins described with WireViz.`]};function ct(e){return ot[e]??at}function lt(e){let t=n.findIndex(t=>t.id===e),[r,i]=st[e]??[`Diagram example`,`A diagram.zip catalog example.`];return{type:e,source:ct(e),options:{},...le(Math.max(t,0),{title:r,description:i})}}function ut({search:e=globalThis.location?.search??``,coarsePointer:t=globalThis.matchMedia?.(`(pointer: coarse)`).matches??!1}={}){let n=new URLSearchParams(e).get(`editor`);return n===`textarea`||n===`monaco`?n:t?`textarea`:`monaco`}async function dt(e){let t=ut();try{return await ft(t,e)}catch(n){if(t===`textarea`)throw n;return console.warn(`Monaco Editor is unavailable; using the basic text editor.`,n),ft(`textarea`,e)}}async function ft(e,n){let r=await(e===`textarea`?await t(()=>import(`./textarea-editor-BTXrLHn4.js`),[]):await t(()=>import(`./monaco-editor-C7iaFm9N.js`),__vite__mapDeps([0,1,2,3,4,5]))).createEditor(n);return n.element.dataset.editorBackend=e,r}function pt(e,t,n,r,i){return e.set(t,{...r,type:t}),e.get(n)??i(n)}var mt=`/api/v1`,U=/^[A-Za-z0-9_-]{16}$/,ht=/^[A-Za-z0-9_-]{43}$/;function gt(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t).replaceAll(`+`,`-`).replaceAll(`/`,`_`).replace(/=+$/,``)}function _t(){return gt(crypto.getRandomValues(new Uint8Array(32)))}function vt(e){return e.match(/^\/d\/([A-Za-z0-9_-]{16})\/?$/)?.[1]??null}function yt(e,t){if(!U.test(t))throw Error(`Invalid diagram alias.`);return new URL(`/d/${t}`,e).toString()}function bt(e,t,n){if(!ht.test(n))throw Error(`Invalid write capability.`);let r=new URL(yt(e,t));return r.hash=`w=${n}`,r.toString()}function xt(e,t,n=`svg`){if(!U.test(t))throw Error(`Invalid diagram alias.`);if(n!==`svg`&&n!==`png`)throw Error(`Invalid render format.`);return new URL(`${mt}/aliases/${t}/renders/${n}`,e).toString()}function St(e){return e.match(/^#w=([A-Za-z0-9_-]{43})$/)?.[1]??null}var Ct=class extends Error{constructor(e,{status:t,code:n}={}){super(e),this.status=t,this.code=n}};function wt(e){if(!e||typeof e!=`object`||typeof e.type!=`string`||typeof e.source!=`string`)throw Error(`Invalid diagram state.`);return{mode:`open`,diagram:{type:e.type,source:e.source,options:e.options??{},presentation:H(e.presentation)},metadata:V(e.meta)}}function Tt(e){if(!e||typeof e!=`object`||!U.test(e.aliasId)||!ht.test(e.contentId)||!ht.test(e.renderId)||!Number.isSafeInteger(e.revision)||e.mode!==`open`&&e.mode!==`locked`)throw new Ct(`The persistence service returned an invalid response.`,{code:`invalid_response`});let t={aliasId:e.aliasId,contentId:e.contentId,renderId:e.renderId,revision:e.revision,mode:e.mode,createdAt:e.createdAt,updatedAt:e.updatedAt};if(e.mode===`locked`){if(!e.encryptedContent||!e.encryptedMetadata||!e.keyEnvelope)throw new Ct(`The persistence service returned an invalid locked diagram.`,{code:`invalid_response`});return{...t,encryptedContent:e.encryptedContent,encryptedMetadata:e.encryptedMetadata,keyEnvelope:e.keyEnvelope}}if(!e.diagram||typeof e.diagram!=`object`)throw new Ct(`The persistence service returned an invalid open diagram.`,{code:`invalid_response`});return{...t,state:{type:e.diagram.type,source:e.diagram.source,options:e.diagram.options??{},presentation:H(e.diagram.presentation),meta:V(e.metadata)}}}var Et=class{constructor({fetchImpl:e=globalThis.fetch,origin:t=globalThis.location?.origin??`http://localhost`,apiPrefix:n=mt}={}){this.fetch=(...t)=>e(...t),this.origin=t,this.apiPrefix=n.replace(/\/$/,``)}url(e=``){return new URL(`${this.apiPrefix}/aliases${e}`,this.origin)}async request(e,t){let n=await this.fetch(e,t),r=await n.json().catch(()=>null);if(!n.ok)throw new Ct(r?.error?.message||`Persistence request failed with HTTP ${n.status}.`,{status:n.status,code:r?.error?.code});return Tt(r)}async errorFor(e){let t=await e.json().catch(()=>null);return new Ct(t?.error?.message||`Persistence request failed with HTTP ${e.status}.`,{status:e.status,code:t?.error?.code})}async createPayload(e){let t=_t();return{...await this.request(this.url(),{method:`POST`,headers:{Authorization:`Bearer ${t}`,"Content-Type":`application/json`},body:JSON.stringify(e)}),writeCapability:t}}createAlias(e){return this.createPayload(wt(e))}createLockedAlias(e){if(e?.mode!==`locked`)throw Error(`Invalid locked diagram payload.`);return this.createPayload(e)}getAlias(e){if(!U.test(e))throw Error(`Invalid diagram alias.`);return this.request(this.url(`/${e}`),{headers:{Accept:`application/json`}})}updatePayload(e,t,n,r){if(!U.test(e))throw Error(`Invalid diagram alias.`);if(!Number.isSafeInteger(n)||n<1)throw Error(`Invalid alias revision.`);if(!ht.test(r))throw Error(`Invalid write capability.`);return this.request(this.url(`/${e}`),{method:`PUT`,headers:{Accept:`application/json`,Authorization:`Bearer ${r}`,"Content-Type":`application/json`,"If-Match":`"${n}"`},body:JSON.stringify(t)})}updateAlias(e,t,n,r){return this.updatePayload(e,wt(t),n,r)}updateLockedAlias(e,t,n,r){if(t?.mode!==`locked`)throw Error(`Invalid locked diagram payload.`);return this.updatePayload(e,t,n,r)}async uploadRender({aliasId:e,renderId:t,revision:n,writeCapability:r,format:i,mode:a,render:o,renderer:s}){if(!U.test(e))throw Error(`Invalid diagram alias.`);if(!ht.test(t))throw Error(`Invalid render ID.`);if(!Number.isSafeInteger(n)||n<1)throw Error(`Invalid alias revision.`);if(!ht.test(r))throw Error(`Invalid write capability.`);if(i!==`svg`&&i!==`png`)throw Error(`Invalid render format.`);if(a!==`open`&&a!==`locked`)throw Error(`Invalid diagram mode.`);if(!s||!/^[a-z][a-z0-9-]{0,31}$/.test(s.unit)||typeof s.build!=`string`||!/^[A-Za-z0-9][A-Za-z0-9._@+-]{0,127}$/.test(s.build)||!Array.isArray(s.pipeline)||s.pipeline.length<1||s.pipeline.some(e=>!/^[a-z][a-z0-9-]{0,31}$/.test(e)))throw Error(`Invalid renderer identity.`);let c=a===`locked`?`application/json`:i===`svg`?`image/svg+xml`:`image/png`,l=a===`locked`?JSON.stringify(o):o,u=await this.fetch(this.url(`/${e}/renders/${i}`),{method:`PUT`,headers:{Authorization:`Bearer ${r}`,"Content-Type":c,"If-Match":`"${n}"`,"X-Render-Id":t,"X-Renderer-Unit":s.unit,"X-Renderer-Build":s.build,"X-Renderer-Pipeline":s.pipeline.join(`,`)},body:l});if(!u.ok)throw await this.errorFor(u)}async getEncryptedRender(e,t){if(!U.test(e))throw Error(`Invalid diagram alias.`);if(t!==`svg`&&t!==`png`)throw Error(`Invalid render format.`);let n=this.url(`/${e}/renders/${t}`);n.searchParams.set(`encrypted`,`1`);let r=await this.fetch(n,{headers:{Accept:`application/json`}});if(!r.ok)throw await this.errorFor(r);return r.json()}},Dt=6e5,Ot=new TextEncoder,kt=new TextDecoder,At=Ot.encode(`diagram.zip:content:v1`),jt=Ot.encode(`diagram.zip:metadata:v1`),Mt=Ot.encode(`diagram.zip:bundle-key:v1`);function Nt(e){if(e!==`svg`&&e!==`png`)throw Error(`Invalid render format.`);return Ot.encode(`diagram.zip:render:${e}:v1`)}function Pt(e){let t=``,n=32768;for(let r=0;r<e.length;r+=n)t+=String.fromCharCode(...e.subarray(r,r+n));return btoa(t).replaceAll(`+`,`-`).replaceAll(`/`,`_`).replace(/=+$/,``)}function Ft(e){if(typeof e!=`string`||!/^[A-Za-z0-9_-]+$/.test(e))throw Error(`Invalid encrypted diagram.`);let t=e.replaceAll(`-`,`+`).replaceAll(`_`,`/`),n=t+`=`.repeat((4-t.length%4)%4),r=atob(n),i=Uint8Array.from(r,e=>e.charCodeAt(0));if(Pt(i)!==e)throw Error(`Invalid encrypted diagram.`);return i}function It(e){return crypto.getRandomValues(new Uint8Array(e))}async function Lt(e,t){if(!(e instanceof Uint8Array)||e.byteLength!==32)throw Error(`Invalid diagram key.`);return crypto.subtle.importKey(`raw`,e,{name:`AES-GCM`},!1,t)}async function Rt(e,{iterations:t,salt:n}){if(typeof e!=`string`)throw Error(`Password is required.`);let r=await crypto.subtle.importKey(`raw`,Ot.encode(e),`PBKDF2`,!1,[`deriveKey`]);return crypto.subtle.deriveKey({name:`PBKDF2`,hash:`SHA-256`,iterations:t,salt:n},r,{name:`AES-GCM`,length:256},!1,[`encrypt`,`decrypt`])}async function zt(e,t,n){let r=It(12),i=await crypto.subtle.encrypt({name:`AES-GCM`,iv:r,additionalData:n,tagLength:128},t,e);return{v:1,alg:`A256GCM`,iv:Pt(r),ciphertext:Pt(new Uint8Array(i))}}async function Bt(e,t,n){if(!e||e.v!==1||e.alg!==`A256GCM`)throw Error(`Invalid encrypted diagram.`);let r=Ft(e.iv);if(r.byteLength!==12)throw Error(`Invalid encrypted diagram.`);let i=Ft(e.ciphertext);if(i.byteLength<16)throw Error(`Invalid encrypted diagram.`);return new Uint8Array(await crypto.subtle.decrypt({name:`AES-GCM`,iv:r,additionalData:n,tagLength:128},t,i))}async function Vt(e,t,n){return zt(Ot.encode(JSON.stringify(e)),t,n)}async function Ht(e,t,n){return JSON.parse(kt.decode(await Bt(e,t,n)))}function Ut(e,t){if(!e||typeof e!=`object`||!r(e.type)||typeof e.source!=`string`||!e.options||typeof e.options!=`object`||Array.isArray(e.options))throw Error(`Invalid encrypted diagram.`);return{type:e.type,source:e.source,options:e.options,presentation:H(e.presentation),meta:V(t)}}async function Wt(e,t){if(typeof t!=`string`||t.length<8)throw Error(`Password must be at least 8 characters.`);let n=It(16),r={name:`PBKDF2`,hash:`SHA-256`,iterations:Dt,salt:Pt(n)};return{v:1,kdf:r,wrap:await zt(e,await Rt(t,{iterations:r.iterations,salt:n}),Mt)}}async function Gt(e,t){if(!e||e.v!==1||e.kdf?.name!==`PBKDF2`||e.kdf.hash!==`SHA-256`||!Number.isInteger(e.kdf.iterations)||e.kdf.iterations<1e5||e.kdf.iterations>5e6)throw Error(`Invalid encrypted diagram.`);let n=Ft(e.kdf.salt);if(n.byteLength!==16)throw Error(`Invalid encrypted diagram.`);let r=await Rt(t,{iterations:e.kdf.iterations,salt:n}),i=await Bt(e.wrap,r,Mt);if(i.byteLength!==32)throw Error(`Invalid encrypted diagram.`);return i}async function Kt(e,t,n){let r=Ut({type:e.type,source:e.source,options:e.options??{},presentation:e.presentation},e.meta),i=await Lt(t,[`encrypt`]);return{mode:`locked`,encryptedContent:await Vt({type:r.type,source:r.source,options:r.options,presentation:r.presentation},i,At),encryptedMetadata:await Vt(r.meta,i,jt),keyEnvelope:n}}async function qt(e,t){let n=It(32);return{bundleKey:n,payload:await Kt(e,n,await Wt(n,t))}}async function Jt(e,t){if(!e||e.mode!==`locked`)throw Error(`Invalid encrypted diagram.`);try{let n=await Gt(e.keyEnvelope,t),r=await Lt(n,[`decrypt`]),[i,a]=await Promise.all([Ht(e.encryptedContent,r,At),Ht(e.encryptedMetadata,r,jt)]);return{bundleKey:n,state:Ut(i,a)}}catch{throw Error(`Wrong password or damaged diagram.`)}}async function Yt(e,t,n){if(!(e instanceof Blob))throw Error(`Invalid rendered image.`);let r=await Lt(t,[`encrypt`]);return zt(new Uint8Array(await e.arrayBuffer()),r,Nt(n))}var Xt=`diagram.zip:renderer:v1`,Zt=6e4,Qt=Object.freeze({mermaid:Object.freeze({frameUrl:`https://mermaid.render.diagram.zip/index.html?v=1`}),bpmn:Object.freeze({frameUrl:`https://bpmn.render.diagram.zip/index.html?v=1`}),excalidraw:Object.freeze({frameUrl:`https://excalidraw.render.diagram.zip/index.html?v=3`}),diagramsnet:Object.freeze({frameUrl:`https://diagramsnet.render.diagram.zip/index.html?v=1`}),tikz:Object.freeze({frameUrl:`https://tikz.render.diagram.zip/index.html?v=1`})});Object.freeze(Object.keys(Qt));function $t(e){return e?.name===`AbortError`?e:new DOMException(`Render superseded.`,`AbortError`)}var en=class{constructor({documentObject:e=document,windowObject:t=window,frameUrl:n}={}){this.document=e,this.window=t,this.frameUrl=n,this.frame=null,this.ready=null,this.resolveReady=null,this.rejectReady=null,this.sequence=0,this.pending=new Map,this.handleMessage=e=>this.receive(e),this.window.addEventListener(`message`,this.handleMessage)}ensureFrame(){if(this.frame)return this.ready;let e=this.document.createElement(`iframe`);return e.title=`Diagram renderer`,e.setAttribute(`sandbox`,`allow-scripts`),e.setAttribute(`aria-hidden`,`true`),e.tabIndex=-1,Object.assign(e.style,{position:`fixed`,left:`-200vw`,top:`0`,width:`1280px`,height:`800px`,border:`0`,pointerEvents:`none`,visibility:`hidden`}),this.ready=new Promise((e,t)=>{this.resolveReady=e,this.rejectReady=t}),e.addEventListener(`error`,()=>this.rejectReady?.(Error(`The client renderer could not be loaded.`)),{once:!0}),e.src=this.frameUrl,this.frame=e,this.document.body.append(e),this.ready}receive(e){if(!this.frame||e.source!==this.frame.contentWindow||e.data?.channel!==Xt)return;if(e.data.type===`ready`){this.resolveReady?.(),this.resolveReady=null,this.rejectReady=null;return}if(e.data.type!==`result`)return;let t=this.pending.get(e.data.requestId);t&&(this.pending.delete(e.data.requestId),t.finish(),e.data.ok&&typeof e.data.svg==`string`?t.resolve({body:e.data.svg,version:e.data.version,build:e.data.build,pipeline:e.data.pipeline,runtime:`client`}):t.reject(Error(e.data.error||`Client rendering failed.`)))}async render(e,t,n){let r;try{await Promise.race([this.ensureFrame(),new Promise((e,t)=>{r=setTimeout(()=>t(Error(`The client renderer timed out while loading.`)),Zt)})])}finally{clearTimeout(r)}if(n.aborted)throw $t(n.reason);let i=`${Date.now().toString(36)}-${++this.sequence}`;return new Promise((r,a)=>{let o=setTimeout(()=>{this.pending.delete(i),n.removeEventListener(`abort`,s),a(Error(`The client renderer timed out.`))},Zt),s=()=>{this.pending.delete(i),clearTimeout(o),a($t(n.reason))};n.addEventListener(`abort`,s,{once:!0}),this.pending.set(i,{resolve:r,reject:a,finish:()=>{clearTimeout(o),n.removeEventListener(`abort`,s)}}),this.frame.contentWindow.postMessage({channel:Xt,type:`render`,requestId:i,engine:e,source:t},`*`)})}},tn=new Map;function nn(e){let t=Qt[e];if(!t)return null;let n=tn.get(t.frameUrl);return n||(n=new en({frameUrl:t.frameUrl}),tn.set(t.frameUrl,n)),{id:e,runtime:`client`,render:({source:t},r)=>n.render(e,t,r)}}var rn=e((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.CHAR=` 16311631 \r -퟿-�𐀀-􏿿`,e.S=` \r16321632 `,e.NAME_START_CHAR=`:A-Z_a-zÀ-ÖØ-öø-˿Ͱ-ͽͿ-῿‌‍⁰-↏Ⰰ-⿯、-퟿豈-﷏ﷰ-�𐀀-󯿿`,e.NAME_CHAR=`-`+e.NAME_START_CHAR+`.0-9·̀-ͯ‿-⁀`,e.CHAR_RE=RegExp(`^[`+e.CHAR+`]$`,`u`),e.S_RE=RegExp(`^[`+e.S+`]+$`,`u`),e.NAME_START_CHAR_RE=RegExp(`^[`+e.NAME_START_CHAR+`]$`,`u`),e.NAME_CHAR_RE=RegExp(`^[`+e.NAME_CHAR+`]$`,`u`),e.NAME_RE=RegExp(`^[`+e.NAME_START_CHAR+`][`+e.NAME_CHAR+`]*$`,`u`),e.NMTOKEN_RE=RegExp(`^[`+e.NAME_CHAR+`]+$`,`u`);var t=9,n=10,r=13,i=32;e.S_LIST=[i,n,r,t];function a(e){return e>=i&&e<=55295||e===n||e===r||e===t||e>=57344&&e<=65533||e>=65536&&e<=1114111}e.isChar=a;function o(e){return e===i||e===n||e===r||e===t}e.isS=o;function s(e){return e>=65&&e<=90||e>=97&&e<=122||e===58||e===95||e===8204||e===8205||e>=192&&e<=214||e>=216&&e<=246||e>=248&&e<=767||e>=880&&e<=893||e>=895&&e<=8191||e>=8304&&e<=8591||e>=11264&&e<=12271||e>=12289&&e<=55295||e>=63744&&e<=64975||e>=65008&&e<=65533||e>=65536&&e<=983039}e.isNameStartChar=s;function c(e){return s(e)||e>=48&&e<=57||e===45||e===46||e===183||e>=768&&e<=879||e>=8255&&e<=8256}e.isNameChar=c})),an=e((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.CHAR=`-퟿-�𐀀-􏿿`,e.RESTRICTED_CHAR=`-\b\v\f--„†-Ÿ`,e.S=` \r16331633 `,e.NAME_START_CHAR=`:A-Z_a-zÀ-ÖØ-öø-˿Ͱ-ͽͿ-῿‌‍⁰-↏Ⰰ-⿯、-퟿豈-﷏ﷰ-�𐀀-󯿿`,e.NAME_CHAR=`-`+e.NAME_START_CHAR+`.0-9·̀-ͯ‿-⁀`,e.CHAR_RE=RegExp(`^[`+e.CHAR+`]$`,`u`),e.RESTRICTED_CHAR_RE=RegExp(`^[`+e.RESTRICTED_CHAR+`]$`,`u`),e.S_RE=RegExp(`^[`+e.S+`]+$`,`u`),e.NAME_START_CHAR_RE=RegExp(`^[`+e.NAME_START_CHAR+`]$`,`u`),e.NAME_CHAR_RE=RegExp(`^[`+e.NAME_CHAR+`]$`,`u`),e.NAME_RE=RegExp(`^[`+e.NAME_START_CHAR+`][`+e.NAME_CHAR+`]*$`,`u`),e.NMTOKEN_RE=RegExp(`^[`+e.NAME_CHAR+`]+$`,`u`);var t=9,n=10,r=13,i=32;e.S_LIST=[i,n,r,t];function a(e){return e>=1&&e<=55295||e>=57344&&e<=65533||e>=65536&&e<=1114111}e.isChar=a;function o(e){return e>=1&&e<=8||e===11||e===12||e>=14&&e<=31||e>=127&&e<=132||e>=134&&e<=159}e.isRestrictedChar=o;function s(e){return e===9||e===10||e===13||e>31&&e<127||e===133||e>159&&e<=55295||e>=57344&&e<=65533||e>=65536&&e<=1114111}e.isCharAndNotRestricted=s;function c(e){return e===i||e===n||e===r||e===t}e.isS=c;function l(e){return e>=65&&e<=90||e>=97&&e<=122||e===58||e===95||e===8204||e===8205||e>=192&&e<=214||e>=216&&e<=246||e>=248&&e<=767||e>=880&&e<=893||e>=895&&e<=8191||e>=8304&&e<=8591||e>=11264&&e<=12271||e>=12289&&e<=55295||e>=63744&&e<=64975||e>=65008&&e<=65533||e>=65536&&e<=983039}e.isNameStartChar=l;function u(e){return l(e)||e>=48&&e<=57||e===45||e===46||e===183||e>=768&&e<=879||e>=8255&&e<=8256}e.isNameChar=u})),on=e((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.NC_NAME_START_CHAR=`A-Z_a-zÀ-ÖØ-öø-˿Ͱ-ͽͿ-῿‌-‍⁰-↏Ⰰ-⿯、-퟿豈-﷏ﷰ-�𐀀-󯿿`,e.NC_NAME_CHAR=`-`+e.NC_NAME_START_CHAR+`.0-9·̀-ͯ‿-⁀`,e.NC_NAME_START_CHAR_RE=RegExp(`^[`+e.NC_NAME_START_CHAR+`]$`,`u`),e.NC_NAME_CHAR_RE=RegExp(`^[`+e.NC_NAME_CHAR+`]$`,`u`),e.NC_NAME_RE=RegExp(`^[`+e.NC_NAME_START_CHAR+`][`+e.NC_NAME_CHAR+`]*$`,`u`);function t(e){return e>=65&&e<=90||e===95||e>=97&&e<=122||e>=192&&e<=214||e>=216&&e<=246||e>=248&&e<=767||e>=880&&e<=893||e>=895&&e<=8191||e>=8204&&e<=8205||e>=8304&&e<=8591||e>=11264&&e<=12271||e>=12289&&e<=55295||e>=63744&&e<=64975||e>=65008&&e<=65533||e>=65536&&e<=983039}e.isNCNameStartChar=t;function n(e){return t(e)||e===45||e===46||e>=48&&e<=57||e===183||e>=768&&e<=879||e>=8255&&e<=8256}e.isNCNameChar=n})),sn=e((e=>{Object.defineProperty(e,"__esModule",{value:!0}),e.SaxesParser=e.EVENTS=void 0;var t=rn(),n=an(),r=on(),i=t.isS,a=t.isChar,o=t.isNameStartChar,s=t.isNameChar,c=t.S_LIST,l=t.NAME_RE,u=n.isChar,d=r.isNCNameStartChar,f=r.isNCNameChar,p=r.NC_NAME_RE,m=`http://www.w3.org/XML/1998/namespace`,h=`http://www.w3.org/2000/xmlns/`,ee={__proto__:null,xml:m,xmlns:h},te={__proto__:null,amp:`&`,gt:`>`,lt:`<`,quot:`"`,apos:`'`},g=-1,_=-2,ne=0,re=1,ie=2,ae=3,v=4,oe=5,se=6,ce=7,le=8,ue=9,de=10,fe=11,pe=12,y=13,me=14,he=15,ge=16,_e=17,ve=18,ye=19,be=20,xe=21,Se=22,Ce=23,we=24,Te=25,Ee=26,De=27,Oe=28,ke=29,Ae=30,je=31,Me=32,b=33,Ne=34,Pe=35,x=36,S=37,C=38,w=39,Fe=40,Ie=41,Le=42,Re=43,ze=44,Be=9,T=10,Ve=13,He=32,Ue=33,We=34,Ge=38,Ke=39,qe=45,E=47,Je=59,D=60,O=61,k=62,A=63,j=91,M=93,N=133,P=8232,F=e=>e===We||e===Ke,Ye=[We,Ke],Xe=[...Ye,j,k],Ze=[...Ye,D,M],Qe=[O,A,...c],I=[...c,k,Ge,D];function $e(e,t,n){switch(t){case`xml`:n!==m&&e.fail(`xml prefix must be bound to ${m}.`);break;case`xmlns`:n!==h&&e.fail(`xmlns prefix must be bound to ${h}.`)}switch(n){case h:e.fail(t===``?`the default namespace may not be set to ${n}.`:`may not assign a prefix (even "xmlns") to the URI \