likec4 1.59.3 → 1.59.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/__app__/src/chunks/AIChat.mjs +108 -108
  2. package/__app__/src/chunks/LikeC4Styles.mjs +752 -604
  3. package/__app__/src/chunks/ProjectsOverview.mjs +72 -72
  4. package/__app__/src/chunks/es.mjs +1 -1
  5. package/__app__/src/chunks/hooks.mjs +94 -91
  6. package/__app__/src/chunks/libs/@floating-ui.mjs +3 -3
  7. package/__app__/src/chunks/libs/@mantine.mjs +1609 -892
  8. package/__app__/src/chunks/libs/@tanstack-ai.mjs +2 -2
  9. package/__app__/src/chunks/libs/@tanstack.mjs +4 -10
  10. package/__app__/src/chunks/libs/@xyflow/react.mjs +4 -4
  11. package/__app__/src/chunks/libs/d3.mjs +4 -9
  12. package/__app__/src/chunks/libs/fast-equals.mjs +61 -49
  13. package/__app__/src/chunks/libs/framer.mjs +6 -6
  14. package/__app__/src/chunks/styled-system.mjs +2578 -124
  15. package/__app__/src/main.mjs +21537 -20155
  16. package/__app__/src/style.css +1 -1
  17. package/config/schema.json +14 -0
  18. package/dist/app/render-view-client.css +1 -1
  19. package/dist/app/render-view-client.js +99 -105
  20. package/dist/chunks/filenames.mjs +6 -6
  21. package/dist/chunks/index.d.mts +7 -1
  22. package/dist/chunks/index2.d.mts +38 -21
  23. package/dist/chunks/libs/@chevrotain/gast.mjs +1 -1
  24. package/dist/chunks/libs/@chevrotain/types.d.mts +108 -0
  25. package/dist/chunks/libs/@logtape/logtape.mjs +4 -4
  26. package/dist/chunks/libs/langium.d.mts +1777 -16
  27. package/dist/chunks/libs/langium.mjs +4 -4
  28. package/dist/chunks/libs/p-queue.mjs +1 -1
  29. package/dist/chunks/libs/package-manager-detector.mjs +1 -1
  30. package/dist/chunks/libs/pako.mjs +2 -2
  31. package/dist/chunks/libs/picomatch.mjs +1 -1
  32. package/dist/chunks/libs/pretty-ms.mjs +1 -1
  33. package/dist/chunks/libs/remeda.mjs +1 -1
  34. package/dist/chunks/libs/ufo.mjs +1 -1
  35. package/dist/chunks/libs/unstorage.mjs +1 -1
  36. package/dist/chunks/libs/zod.d.mts +1717 -17
  37. package/dist/chunks/node.mjs +58 -59
  38. package/dist/chunks/vite-plugin.mjs +15 -12
  39. package/dist/cli/index.d.mts +1 -1
  40. package/dist/cli/index.mjs +104 -88
  41. package/dist/index.d.mts +3 -3
  42. package/dist/model/index.d.mts +4 -4
  43. package/dist/vite-plugin/index.d.mts +2 -2
  44. package/dist/vite-plugin/internal/index.d.mts +15 -15
  45. package/dist/vite-plugin/internal/index.mjs +72 -27
  46. package/package.json +28 -28
  47. package/react/index.d.mts +22720 -1460
  48. package/react/index.mjs +30391 -25072
  49. package/vite-plugin-modules.d.ts +4 -2
@@ -1,49 +1,47 @@
1
- import{c as e,i as t,r,t as o}from"./rolldown-runtime.mjs";import{a as s,i as c,n as u,r as d,t as p}from"./libs/@logtape/logtape.mjs";import{n as m,t as h}from"./libs/merge-error-cause.mjs";import{n as g,t as _}from"./sequence-view.mjs";import{$ as v,A as y,B as b,C as ee,D as te,E as ne,F as re,G as ie,H as x,I as ae,J as S,K as oe,L as se,M as ce,N as le,O as ue,P as de,Q as fe,R as pe,S as me,T as he,U as ge,V as C,W as _e,X as ve,Y as ye,Z as be,_t as xe,a as Se,at as Ce,bt as we,c as Te,ct as Ee,d as De,dt as Oe,et as ke,f as Ae,ft as je,g as Me,gt as Ne,h as Pe,ht as Fe,i as Ie,it as Le,j as Re,k as ze,l as Be,lt as Ve,m as He,mt as Ue,n as We,nt as Ge,o as Ke,ot as qe,p as Je,pt as Ye,q as Xe,r as Ze,rt as Qe,st as $e,t as et,tt,u as nt,ut as rt,v as it,vt as at,w as ot,x as st,y as ct,yt as lt,z as ut}from"./libs/langium.mjs";import{a as dt,d as ft,f as pt,i as mt,l as ht,n as gt,o as _t,r as vt,t as yt,u as bt}from"./libs/ufo.mjs";import{t as xt}from"./libs/json5.mjs";import{A as St,C as Ct,D as w,E as wt,T,b as E,g as D,h as Tt,l as k,p as Et,t as Dt,u as Ot,v as kt,w as At,y as jt,z as Mt}from"./libs/zod.mjs";import{a as Nt,c as Pt,d as Ft,n as It,r as Lt,s as Rt,t as zt}from"./filenames.mjs";import{n as Bt,t as Vt}from"./libs/pathe.mjs";import{$ as A,A as Ht,B as Ut,C as Wt,D as Gt,E as Kt,F as qt,G as Jt,H as Yt,I as Xt,J as Zt,K as Qt,L as $t,M as en,N as tn,O as nn,P as j,Q as rn,R as an,S as on,T as sn,U as cn,W as ln,X as un,Y as dn,Z as M,_ as fn,a as pn,at as mn,b as N,c as hn,d as gn,et as _n,f as vn,g as yn,h as bn,i as xn,it as Sn,j as P,k as F,l as Cn,m as wn,n as Tn,nt as En,o as Dn,ot as On,p as kn,r as An,rt as jn,s as Mn,t as Nn,tt as I,u as Pn,v as Fn,w as L,x as In,y as Ln,z as Rn}from"./libs/remeda.mjs";import{t as zn}from"./libs/@ts-graphviz/core.mjs";import{n as Bn,r as Vn,t as Hn}from"./libs/@ts-graphviz/ast.mjs";import{n as Un,r as Wn,t as Gn}from"./libs/khroma.mjs";import{t as Kn}from"./libs/p-queue.mjs";import{t as qn}from"./libs/which.mjs";import{t as Jn}from"./libs/pretty-ms.mjs";import{t as Yn}from"./libs/picomatch.mjs";import{n as Xn,t as Zn}from"./libs/unstorage.mjs";import*as Qn from"node:fs/promises";import{unlink as $n,writeFile as er}from"node:fs/promises";import{basename as tr,dirname as nr,join as rr,relative as ir,resolve as ar}from"node:path";import{BorderStyles as or,ElementShapes as sr,IconPositions as cr,LikeC4Styles as lr,RelationshipArrowTypes as ur,RelationshipLineTypes as dr,Sizes as fr,ThemeColors as pr,assignTagColors as mr,computeColorValues as hr}from"@likec4/core/styles";import{Fqn as gr,FqnExpr as _r,FqnRef as vr,_stage as yr,_type as br,exact as xr,isAnyOf as Sr,isExtendsElementView as Cr}from"@likec4/core/types";import{Builder as wr,assertSpecificationCompatible as Tr}from"@likec4/core/builder";import*as R from"@likec4/core";import{DefaultMap as Er,Fqn as Dr,FqnExpr as Or,FqnRef as z,GlobalFqn as kr,LikeC4Styles as Ar,LinkedList as jr,RelationExpr as Mr,RichText as Nr,_layout as Pr,_stage as Fr,_type as Ir,ancestorsFqn as Lr,applyCachedLayout as Rr,applyManualLayout as zr,calcDriftsFromSnapshot as Br,exact as Vr,hasProp as Hr,invariant as V,isAncestor as Ur,isAndOperator as Wr,isAnyOf as Gr,isDeploymentNode as Kr,isDeploymentView as qr,isDynamicView as Jr,isElementView as Yr,isGlobalFqn as Xr,isNonEmptyArray as Zr,isOrOperator as Qr,isSameHierarchy as $r,nameFromFqn as ei,nonNullable as ti,nonexhaustive as H,preferSummary as ni,splitGlobalFqn as ri}from"@likec4/core";import{DefaultMap as ii,DefaultWeakMap as ai,MultiMap as oi,ancestorsFqn as si,compareFqnHierarchically as ci,compareNatural as li,compareNaturalHierarchically as ui,delay as di,hierarchyDistance as fi,ifilter as pi,invariant as U,isNonEmptyArray as mi,isString as hi,memoizeProp as gi,nameFromFqn as _i,nonNullable as vi,nonexhaustive as yi,onNextTick as bi,parentFqn as xi,promiseNextTick as Si,sortNaturalByFqn as Ci,sortParentsFirst as wi,stringHash as Ti,toArray as Ei}from"@likec4/core/utils";import{produce as Di}from"immer";import{Graph as Oi}from"@likec4/core/utils/graphology";import{Graphviz as ki}from"@hpcc-js/wasm-graphviz";import{LikeC4Model as Ai}from"@likec4/core/model";import ji,{SubprocessError as Mi}from"nano-spawn";import Ni from"node:os";import{mkdirSync as Pi,statSync as Fi}from"node:fs";import{isColorSupported as Ii,isDevelopment as Li}from"std-env";import{bundleRequire as Ri}from"bundle-require";import{formatMessagesSync as zi}from"esbuild";import{cwd as Bi}from"node:process";import{fdir as Vi}from"fdir";import Hi from"chokidar";import{computeAdhocView as Ui,computeProjectsView as Wi,computeView as Gi,resolveRulesExtendedViews as Ki}from"@likec4/core/compute-view";function serializeValue(e,t,r,o){if(typeof e?.toJSON==`function`&&(e=e.toJSON()),!(typeof e==`object`&&e))return e;if(t.has(e)){if(!r)return`[Circular]`;let o=t.get(e);return`[Circular ${o===``?`*`:`*${o}`}]`}t.set(e,o);let s=Array.isArray(e)?[]:{};for(let[c,u]of Object.entries(e))s[c]=serializeValue(u,t,r,o===``?c:`${o}.${c}`);return t.delete(e),s}function safeStringify(e,{indentation:t,trace:r}={}){let o=serializeValue(e,new WeakMap,r,``);return JSON.stringify(o,void 0,t)}const parseStack=e=>e.split(`
2
- `).map(e=>e.trim().replace(`file://`,``));function indent$1(e,t=2){e=Array.isArray(e)?e:e.split(`
3
- `);let r=` `.repeat(t);return e.map(e=>`${r}${e}`).join(`
4
- `)}t(indent$1,`indent`);function loggable(e){if(typeof e==`string`)return e;if(e instanceof Error){let t=h(e);if(t.stack){let e=parseStack(t.stack);return t.message+`
5
- `+indent$1(e.slice(1))}return t.message}return safeStringify(e,{indentation:` `})}function wrapError(e,t){return m(e,t)}function getErrorFromLogRecord(e){let t=Object.entries(e.properties).flatMap(([e,t])=>{if(t instanceof Error){let e=h(t);return e.stack&&=parseStack(e.stack).join(`
6
- `),[e]}return e===`error`||e===`err`?[Error(loggable(t))]:[]});return t.length===0?null:t.length===1?t[0]:AggregateError(t)}function errorFromLogRecord(e){let t=getErrorFromLogRecord(e);return t&&typeof e.rawMessage==`string`?m(t,e.rawMessage+`
7
- `):t}function appendErrorToMessage(e,t=!1){let r=getErrorFromLogRecord(e.record);if(r){let o=r.message;return r.stack&&(o=o+`
8
- `+indent$1(r.stack.split(`
9
- `).slice(1))),t&&(o=`${Yi.red}${o}${Ji}`),{...e,message:e.message+`
10
- `+indent$1(o)}}return e}const qi={trace:`TRACE`,debug:`DEBUG`,info:`INFO `,warning:`WARN `,error:`ERROR`,fatal:`FATAL`};function getMessageOnlyFormatter(){return getTextFormatter({format:({message:e})=>e})}const level=e=>qi[e];function getTextFormatter(e){let t=e?.format??(({timestamp:e,level:t,category:r,message:o})=>`${e} ${t} ${r} ${o}`);return c({timestamp:`time`,level,category:`.`,...e,format:e=>t(appendErrorToMessage(e))})}const Ji=`\x1B[0m`,Yi={red:`\x1B[31m`};function getAnsiColorFormatter(e){let t=e?.format??(({timestamp:e,level:t,category:r,message:o})=>`${e} ${t} ${r} ${o}`);return d({timestamp:`time`,level,categoryStyle:`bold`,categoryColor:`cyan`,category:`.`,levelColors:{trace:`black`,debug:`blue`,info:`green`,warning:`yellow`,error:`red`,fatal:`magenta`},...e,format:e=>t(appendErrorToMessage(e,!0))})}function getConsoleFormatter(e){let t=e?.messageFormatter;return t?e=>{let{properties:r}=e;return r&&Object.keys(r).length>0?[t(e),r]:[t(e)]}:e=>{let{message:t,properties:r}=e;return r&&Object.keys(r).length>0?[...t,r]:t}}function getConsoleSink(e){return u({formatter:getConsoleFormatter(),...e})}function getConsoleStderrSink(e){let t=e?.formatter??getConsoleFormatter();return e=>{let r=t(e);if(typeof r==`string`){let e=r.replace(/\r?\n$/,``);console.error(e)}else console.error(...r)}}const W=s(`likec4`);function createLogger(e){return W.getChild(e)}function configureLogger$1(e){try{let{sinks:t={},loggers:r,...o}=e??{},s={console:getConsoleSink(),...t};p({reset:!0,...o,sinks:s,loggers:[{category:[`logtape`,`meta`],sinks:[`console`],lowestLevel:`warning`},...e?.loggers??[{category:`likec4`,sinks:[`console`],lowestLevel:`debug`}]]})}catch(e){console.error(e)}}t(configureLogger$1,`configureLogger`),Qe();var Xi={reset:[0,0],bold:[1,22,`\x1B[22m\x1B[1m`],dim:[2,22,`\x1B[22m\x1B[2m`],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29],black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],gray:[90,39],bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]};function i(e){return String(e)}i.open=``,i.close=``;function B(){let e=typeof process<`u`?process:void 0,t=e?.env||{},r=t.FORCE_TTY!==`false`,o=e?.argv||[];return!(`NO_COLOR`in t||o.includes(`--no-color`))&&(`FORCE_COLOR`in t||o.includes(`--color`)||e?.platform===`win32`||r&&t.TERM!==`dumb`||`CI`in t)||typeof window<`u`&&!!window.chrome}function C$1({force:e}={}){let t=e||B(),a=(e,t,r,o)=>{let s=``,c=0;do s+=e.substring(c,o)+r,c=o+t.length,o=e.indexOf(t,c);while(~o);return s+e.substring(c)},l=(e,t,r=e)=>{let n=o=>{let s=String(o),c=s.indexOf(t,e.length);return~c?e+a(s,t,r,c)+t:e+s+t};return n.open=e,n.close=t,n},r={isColorSupported:t},f=e=>`\x1B[${e}m`;for(let e in Xi){let o=Xi[e];r[e]=t?l(f(o[0]),f(o[1]),o[2]):i}return r}t(C$1,`C`);var Zi=C$1();function stripIndent(e){let t=e.match(/^[ \t]*(?=\S)/gm);if(!t)return e;let r=1/0;for(let e of t)r=Math.min(r,e.length);return r===0||r===1/0?e:e.replace(RegExp(`^[ \\t]{${r}}`,`gm`),``)}function dedent(e){return stripIndent(e.replace(/^(?:[ \t]*\r?\n)+|(?:\r?\n[ \t]*)+$/g,``))}const Qi=new it(`
11
- `);function toStringLF(e,t){return ct(e,t).replaceAll(`\r
1
+ import{c as e,i as t,r,t as o}from"./rolldown-runtime.mjs";import{a as s,i as c,n as u,o as d,r as p,t as m}from"./libs/@logtape/logtape.mjs";import{n as h,t as g}from"./libs/merge-error-cause.mjs";import{n as _,t as v}from"./sequence-view.mjs";import{$ as y,A as b,B as x,C as ee,D as te,E as S,F as ne,G as re,H as C,I as ie,J as w,K as ae,L as oe,M as se,N as ce,O as le,P as ue,Q as de,R as fe,S as pe,T as me,U as he,V as T,W as ge,X as _e,Y as ve,Z as ye,_t as be,a as xe,at as Se,bt as Ce,c as we,ct as Te,d as Ee,dt as De,et as Oe,f as ke,ft as Ae,g as je,gt as Me,h as Ne,ht as Pe,i as Fe,it as Ie,j as Le,k as Re,l as ze,lt as Be,m as Ve,mt as He,n as Ue,nt as We,o as Ge,ot as Ke,p as qe,pt as Je,q as Ye,r as Xe,rt as Ze,st as Qe,t as $e,tt as et,u as tt,ut as nt,v as rt,vt as it,w as at,x as ot,y as st,yt as ct,z as lt}from"./libs/langium.mjs";import{a as ut,d as dt,f as ft,i as pt,l as mt,n as ht,o as gt,r as _t,t as vt,u as yt}from"./libs/ufo.mjs";import{t as bt}from"./libs/json5.mjs";import{A as xt,C as St,D as E,E as Ct,T as D,b as k,g as A,h as wt,l as j,p as Tt,t as Et,u as Dt,v as Ot,w as kt,y as At,z as jt}from"./libs/zod.mjs";import{a as Mt,c as Nt,d as Pt,n as Ft,r as It,s as Lt,t as Rt}from"./filenames.mjs";import{n as zt,t as Bt}from"./libs/pathe.mjs";import{$ as M,A as Vt,B as Ht,C as Ut,D as Wt,E as Gt,F as Kt,G as qt,H as Jt,I as Yt,J as Xt,K as Zt,L as Qt,M as $t,N as en,O as tn,P as N,Q as nn,R as rn,S as an,T as on,U as sn,W as cn,X as ln,Y as un,Z as P,_ as dn,a as fn,at as pn,b as F,c as mn,d as hn,et as gn,f as _n,g as vn,h as yn,i as bn,it as xn,j as I,k as L,l as Sn,m as Cn,n as wn,nt as Tn,o as En,ot as Dn,p as On,r as kn,rt as An,s as jn,t as Mn,tt as R,u as Nn,v as Pn,w as z,x as Fn,y as In,z as Ln}from"./libs/remeda.mjs";import{t as Rn}from"./libs/@ts-graphviz/core.mjs";import{n as zn,r as Bn,t as Vn}from"./libs/@ts-graphviz/ast.mjs";import{n as Hn,r as Un,t as Wn}from"./libs/khroma.mjs";import{t as Gn}from"./libs/p-queue.mjs";import{t as Kn}from"./libs/which.mjs";import{t as qn}from"./libs/pretty-ms.mjs";import{t as Jn}from"./libs/picomatch.mjs";import{n as Yn,t as Xn}from"./libs/unstorage.mjs";import*as Zn from"node:fs/promises";import{unlink as Qn,writeFile as $n}from"node:fs/promises";import{basename as er,dirname as tr,join as nr,relative as rr,resolve as ir}from"node:path";import{BorderStyles as ar,ElementShapes as or,IconPositions as sr,LikeC4Styles as cr,RelationshipArrowTypes as lr,RelationshipLineTypes as ur,Sizes as dr,ThemeColors as fr,assignTagColors as pr,computeColorValues as mr}from"@likec4/core/styles";import{Fqn as hr,FqnExpr as gr,FqnRef as _r,_stage as vr,_type as yr,exact as br,isAnyOf as xr,isExtendsElementView as Sr}from"@likec4/core/types";import{Builder as Cr,assertSpecificationCompatible as wr}from"@likec4/core/builder";import*as V from"@likec4/core";import{DefaultMap as Tr,Fqn as Er,FqnExpr as Dr,FqnRef as H,GlobalFqn as Or,LikeC4Styles as kr,LinkedList as Ar,RelationExpr as jr,RichText as Mr,_layout as Nr,_stage as Pr,_type as Fr,ancestorsFqn as Ir,applyCachedLayout as Lr,applyManualLayout as Rr,calcDriftsFromSnapshot as zr,exact as Br,hasProp as Vr,invariant as U,isAncestor as Hr,isAndOperator as Ur,isAnyOf as Wr,isDeploymentNode as Gr,isDeploymentView as Kr,isDynamicView as qr,isElementView as Jr,isGlobalFqn as Yr,isNonEmptyArray as Xr,isOrOperator as Zr,isSameHierarchy as Qr,memoizeProp as $r,nameFromFqn as ei,nonNullable as ti,nonexhaustive as W,preferSummary as ni,splitGlobalFqn as ri}from"@likec4/core";import{DefaultMap as ii,DefaultWeakMap as ai,MultiMap as oi,ancestorsFqn as si,compareFqnHierarchically as ci,compareNatural as li,compareNaturalHierarchically as ui,delay as di,hierarchyDistance as fi,ifilter as pi,invariant as G,isNonEmptyArray as mi,isString as hi,memoizeProp as gi,nameFromFqn as _i,nonNullable as vi,nonexhaustive as yi,onNextTick as bi,parentFqn as xi,promiseNextTick as Si,sortNaturalByFqn as Ci,sortParentsFirst as wi,stringHash as Ti,toArray as Ei}from"@likec4/core/utils";import{produce as Di}from"immer";import{Graph as Oi}from"@likec4/core/utils/graphology";import{Graphviz as ki}from"@hpcc-js/wasm-graphviz";import{LikeC4Model as Ai,VIEW_FOLDERS_SEPARATOR as ji,splitViewFolderPath as Mi}from"@likec4/core/model";import Ni,{SubprocessError as Pi}from"nano-spawn";import Fi from"node:os";import{mkdirSync as Ii,statSync as Li}from"node:fs";import{isColorSupported as Ri,isDevelopment as zi}from"std-env";import{bundleRequire as Bi}from"bundle-require";import{formatMessagesSync as Vi}from"esbuild";import{cwd as Hi}from"node:process";import{fdir as Ui}from"fdir";import Wi from"chokidar";import{computeAdhocView as Gi,computeProjectsView as Ki,computeView as qi,resolveRulesExtendedViews as Ji}from"@likec4/core/compute-view";function serializeValue(e,t,r,o){if(typeof e?.toJSON==`function`&&(e=e.toJSON()),!(typeof e==`object`&&e))return e;if(t.has(e)){if(!r)return`[Circular]`;let o=t.get(e);return`[Circular ${o===``?`*`:`*${o}`}]`}t.set(e,o);let s=Array.isArray(e)?[]:{};for(let[c,u]of Object.entries(e))s[c]=serializeValue(u,t,r,o===``?c:`${o}.${c}`);return t.delete(e),s}function safeStringify(e,{indentation:t,trace:r}={}){let o=serializeValue(e,new WeakMap,r,``);return JSON.stringify(o,void 0,t)}const parseStack=e=>e.split(`
2
+ `).map(e=>e.trimEnd().replace(`file://`,``).replace(/[A-Za-z]:\\Users\\[^\\]+\\/i,`@vscode\\`).replace(/\/Users\/[^/]+\//,`@vscode/`));function indent$1(e,t=2){e=Array.isArray(e)?e:e.split(`
3
+ `);let r=typeof t==`string`?t:` `.repeat(t);return e.map(e=>`${r}${e}`).join(`
4
+ `)}t(indent$1,`indent`);function loggable(e){if(typeof e==`string`)return e;if(isError$1(e)){let t=g(e);if(t.stack){let e=parseStack(t.stack);return t.message+`
5
+ `+indent$1(e.slice(1),` `)}return t.message}return safeStringify(e,{indentation:` `})}function wrapError(e,t){return h(e,t)}function isError$1(e){return e instanceof Error}t(isError$1,`isError`);function getErrorFromLogRecord(e){let t=Object.entries(e.properties).flatMap(([e,t])=>{if(t instanceof Error){let e=g(t);return e.stack&&=parseStack(e.stack).join(`
6
+ `),[e]}return e===`error`||e===`err`?[Error(loggable(t))]:[]});return t.length===0?null:t.length===1?t[0]:AggregateError(t)}function errorFromLogRecord(e){let t=getErrorFromLogRecord(e);return t&&typeof e.rawMessage==`string`?h(t,e.rawMessage+`
7
+ `):t}function appendErrorToMessage(e,t=!1){let r=getErrorFromLogRecord(e.record);if(r){let o=`
8
+ `+indent$1(r.stack||r.message,` `);return t&&(o=`${Xi}${Zi.red}${o}${Xi}`),{...e,message:e.message+o}}return e}const Yi={trace:`TRACE`,debug:`DEBUG`,info:`INFO `,warning:`WARN `,error:`ERROR`,fatal:`FATAL`};function getMessageOnlyFormatter(){return getTextFormatter({format:({message:e})=>e})}const level=e=>Yi[e];function getTextFormatter(e){let t=e?.format??(({timestamp:e,level:t,category:r,message:o})=>`${e} ${t} ${r} ${o}`);return s({timestamp:`time`,level,category:`.`,...e,format:e=>t(appendErrorToMessage(e))})}const Xi=`\x1B[0m`,Zi={red:`\x1B[31m`};function getAnsiColorFormatter(e){let t=e?.format??(({timestamp:e,level:t,category:r,message:o})=>`${e} ${t} ${r} ${o}`);return c({timestamp:`time`,level,categoryStyle:`bold`,categoryColor:`cyan`,category:`.`,levelColors:{trace:`black`,debug:`blue`,info:`green`,warning:`yellow`,error:`red`,fatal:`magenta`},...e,format:e=>t(appendErrorToMessage(e,!0))})}function getConsoleFormatter(e){let t=e?.messageFormatter;return t?e=>{let{properties:r}=e;return r&&Object.keys(r).length>0?[t(e),r]:[t(e)]}:p}function getConsoleSink(e){return u({formatter:getConsoleFormatter(),...e})}function getConsoleStderrSink(e){let t=e?.formatter??getConsoleFormatter();return e=>{let r=t(e);if(typeof r==`string`){let e=r.replace(/\r?\n$/,``);console.error(e)}else console.error(...r)}}const K=d(`likec4`);function createLogger(e){return K.getChild(e)}function configureLogger$1(e){try{let{sinks:t={},loggers:r,...o}=e??{},s={console:getConsoleSink(),...t};m({reset:!0,...o,sinks:s,loggers:[{category:[`logtape`,`meta`],sinks:[`console`],lowestLevel:`warning`},...e?.loggers??[{category:`likec4`,sinks:[`console`],lowestLevel:`debug`}]]})}catch(e){console.error(e)}}t(configureLogger$1,`configureLogger`),Ze();var Qi={reset:[0,0],bold:[1,22,`\x1B[22m\x1B[1m`],dim:[2,22,`\x1B[22m\x1B[2m`],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29],black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],gray:[90,39],bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]};function i(e){return String(e)}i.open=``,i.close=``;function B(){let e=typeof process<`u`?process:void 0,t=e?.env||{},r=t.FORCE_TTY!==`false`,o=e?.argv||[];return!(`NO_COLOR`in t||o.includes(`--no-color`))&&(`FORCE_COLOR`in t||o.includes(`--color`)||e?.platform===`win32`||r&&t.TERM!==`dumb`||`CI`in t)||typeof window<`u`&&!!window.chrome}function C$1({force:e}={}){let t=e||B(),a=(e,t,r,o)=>{let s=``,c=0;do s+=e.substring(c,o)+r,c=o+t.length,o=e.indexOf(t,c);while(~o);return s+e.substring(c)},l=(e,t,r=e)=>{let n=o=>{let s=String(o),c=s.indexOf(t,e.length);return~c?e+a(s,t,r,c)+t:e+s+t};return n.open=e,n.close=t,n},r={isColorSupported:t},f=e=>`\x1B[${e}m`;for(let e in Qi){let o=Qi[e];r[e]=t?l(f(o[0]),f(o[1]),o[2]):i}return r}t(C$1,`C`);var $i=C$1();function stripIndent(e){let t=e.match(/^[ \t]*(?=\S)/gm);if(!t)return e;let r=1/0;for(let e of t)r=Math.min(r,e.length);return r===0||r===1/0?e:e.replace(RegExp(`^[ \\t]{${r}}`,`gm`),``)}function dedent(e){return stripIndent(e.replace(/^(?:[ \t]*\r?\n)+|(?:\r?\n[ \t]*)+$/g,``))}const ea=new rt(`
9
+ `);function toStringLF(e,t){return st(e,t).replaceAll(`\r
12
10
  `,`
13
- `)}function hasContent(e){return typeof e==`string`?e.trimStart().length!==0:e instanceof Me&&e.contents.some(e=>hasContent(e))}function hasContentOrNewLine(e){return typeof e==`string`?e.trimStart().length!==0:e instanceof it?!e.ifNotEmpty:e instanceof Me&&e.contents.some(e=>hasContentOrNewLine(e))}function fresh(e){return{ctx:e??void 0,out:new Me}}function materialize(e,t=2){return toStringLF(en(e)?executeOnFresh(void 0,[e]).out:e.out,t)}function executeOnCtx(e,t,...r){$t(t)?(V(r.length===0,`When first argument is an array, no additional operations are allowed`),r=t):r=[t,...r];for(let t of r)e=t(e);return e}function executeOnFresh(e,t,...r){return $t(t)?executeOnCtx(fresh(e),t):executeOnCtx(fresh(e),[t,...r])}function eachOnFresh(e,t){return t.map(t=>t(fresh(e)))}function operation(e,t){let r=typeof e==`function`?e:t,wrapped=e=>{let t=r(e);return t instanceof Me?{...e,out:t}:e};return typeof e==`string`&&r.name==``&&Object.defineProperties(wrapped,{name:{value:`wrapped(${e})`}}),wrapped}function isPrintable(e){return typeof e==`string`||typeof e==`number`||typeof e==`boolean`}function print(e){return operation(function printOp({ctx:t,out:r}){let o=typeof e==`function`?e(t):e??t;F(o)||o===``||(V(isPrintable(o),`Value must be a string, number or boolean - got `+typeof o),r.append(String(o)))})}const space=()=>print(` `);function noop(){return Rn()}function lazy(e){return t=>(e()(t),t)}function newline(e){return operation(({out:t})=>{e===`ifNotEmpty`?t.appendNewLineIfNotEmpty():t.appendNewLine()})}function merge(...e){return operation(function merge({ctx:t,out:r}){let o=executeOnFresh(t,e);r.appendIf(hasContent(o.out),o.out)})}function indent(...e){if(e.length===1&&typeof e[0]==`string`){let t=dedent(e[0]);return t.trimStart().length===0?noop():operation(function indent1({out:e}){e.appendNewLineIfNotEmpty().indent({indentEmptyLines:!0,indentedChildren:[Pe(t.split(/\r?\n/),{separator:Qi})]}).appendNewLineIfNotEmpty()})}let t=e;return operation(function indent2({ctx:e,out:r}){let o=executeOnFresh(e,t);hasContent(o.out)&&r.appendNewLineIfNotEmpty().indent({indentEmptyLines:!0,indentedChildren:o.out.contents}).appendNewLineIfNotEmpty()})}function body(...e){let t=wn(e);if(sn(t))return body(t+` {`,`}`);if(e.length===2&&sn(e[0])&&sn(e[1])){let[t,r]=e;return(...e)=>operation(function body({ctx:o,out:s}){let c=indent(lines(...e))(fresh(o)).out;s.appendIf(hasContent(c),Pe([t,c,r]))})}let r=e;return body(`{`,`}`)(...r)}function inlineText(e){return operation(({ctx:t,out:r})=>{let o=e??t;if(F(o))return;V(sn(o),`Value must be a string - got `+typeof o);let s=o.replace(/(\r?\n|\t)+/g,` `).replaceAll(`'`,`\\'`).trim();r.append(`'${s}'`)})}function multilineText(e,t=`'`){return merge(print(t),indent(e.replaceAll(`'`,`\\'`)),print(t))}function text(e){return operation(function text({ctx:t,out:r}){let o=typeof e==`function`?e(t):e??t;if(!F(o))return V(sn(o),`Value must be a string - got `+typeof o),o.includes(`
14
- `)?multilineText(o)({ctx:o,out:r}):inlineText()({ctx:o,out:r})})}const $i=`'`.repeat(3);function markdown(e){return operation(function markdown(t){let r=e??t.ctx;if(!F(r))return V(sn(r),`Value must be a string - got `+typeof r),multilineText(r,$i)(t)})}function markdownOrString$1(e){return operation(function markdownOrString(t){let r=e??t.ctx;if(!F(r)){if(typeof r==`string`)return text(r)(t);if(`md`in r)return markdown(r.md)(t);if(`txt`in r)return multilineText(r.txt)(t);throw Error(`Invalid MarkdownOrString value: `+r)}})}t(markdownOrString$1,`markdownOrString`);function join$1(e){return operation(function joinOp({ctx:t,out:r}){let{operations:o,...s}=e,c=Array.isArray(o)?o:[o];V(A(c,1),`At least one operation is required`);let u;return u=c.length===1?c[0](fresh(t)).out.contents:I(eachOnFresh(t,c),N(e=>e.out)),u=M(u,hasContentOrNewLine),r.appendIf(u.length>0,Pe(u,s))})}t(join$1,`join`);function spaceBetween(...e){return join$1({operations:e,suffix:(e,t,r)=>!r&&hasContent(e)?` `:void 0})}function lines(...e){let t=wn(e);if(nn(t)){let e=fresh(void 0);for(let r=0;r<t;r++)e.out.appendNewLine();return(...t)=>join$1({operations:t,suffix:(t,r,o)=>o?void 0:e.out})}return join$1({operations:e,appendNewLineIfNotEmpty:!0,skipNewLineAfterLastItem:!0})}function withctx(...e){let t=e[0];if(e.length===1)return(...e)=>operation(function withctx1({out:r}){executeOnCtx({ctx:t,out:r},e)});let r=e.slice(1);return operation(function withctx2({out:e}){executeOnCtx({ctx:t,out:e},r)})}function property(e,t){return operation(function propertyOp({ctx:r,out:o}){let s=Gt(r)&&Hr(r,e)?r[e]:void 0;if(s!=null){if(!t){V(isPrintable(s),`Property ${e} is not printable "${s}"`),o.append(e,` `,String(s));return}t({ctx:s,out:o})}})}function printProperty(e){return property(e,print())}function foreach(...e){let[t,r]=e;if(e.length===2&&!en(r)){let e=t,o=r;return operation(function foreachSingleOp({ctx:t,out:r}){let s=[];for(let r of t){let t=e(fresh(r)).out;hasContent(t)&&s.push(t)}r.appendIf(s.length>0,Pe(s,o))})}let o=e;return operation(({ctx:e,out:t})=>{for(let r of e)executeOnCtx({ctx:r,out:t},o)})}function separateWith(e){return{separator:e}}function separateNewLine(e=1){if(e>1){let t=fresh(void 0);for(let r=0;r<e;r++)t.out.appendNewLine();return separateWith(t.out)}return separateWith(Qi)}function separateComma(e){return e?{separator:`,`,appendNewLineIfNotEmpty:!0,skipNewLineAfterLastItem:!0}:{separator:`, `}}function foreachNewLine(...e){return operation(function foreachNewLineOp({ctx:t,out:r}){let o=[];for(let r of t){let t=executeOnFresh(r,e).out;hasContent(t)&&o.push(t)}r.appendIf(o.length>0,Pe(o,separateNewLine()))})}function guard(e,...t){return operation(`guard`,({ctx:r,out:o})=>{if(`safeParse`in e){let s=e.safeParse(r);if(s.success)executeOnCtx({ctx:s.data,out:o},t);else throw Error(`Guard failed: ${Mt(s.error)}`);return}if(V(typeof e==`function`),e(r)){executeOnCtx({ctx:r,out:o},t);return}})}function when(e,...t){return operation(function whenOp({ctx:r,out:o}){e(r)&&executeOnCtx({ctx:r,out:o},t)})}function select(e,...t){return operation(function selectOp({ctx:r,out:o}){let s=e(r);P(s)&&executeOnCtx({ctx:s,out:o},t)})}function execToOut(e){return(t,...r)=>executeOnCtx({ctx:t,out:e},r)}function zodOp(e){return t=>()=>({ctx:r,out:o})=>{let s=St(e,r);if(s.success){let e=t({ctx:s.data,out:o,exec:execToOut(o)});return e instanceof Me?{ctx:r,out:e}:typeof e==`function`?{ctx:r,out:o,...e({ctx:r,out:o})}:{ctx:r,out:o}}throw s.error}}var ea=r({arrow:()=>da,border:()=>ca,color:()=>ba,customColor:()=>ga,fqn:()=>ra,icon:()=>sa,iconPosition:()=>ua,id:()=>ta,kind:()=>ia,line:()=>fa,link:()=>pa,links:()=>ma,markdownOrString:()=>ya,metadata:()=>Ca,metadataValue:()=>Sa,opacity:()=>aa,props:()=>wa,shape:()=>oa,size:()=>la,style:()=>xa,tag:()=>_a,tags:()=>va,themeColor:()=>ha,viewId:()=>na});const ta=T().regex(/^[a-zA-Z0-9_.-]+$/,`id must consist of alphanumeric characters, underscores or hyphens`),na=ta.transform(e=>e),ra=T().regex(/^[a-zA-Z0-9_.-]+$/,`FQN must consist of alphanumeric characters, dots, underscores or hyphens`).transform(e=>e),ia=T().regex(/^[a-zA-Z0-9_-]+$/,`Kind must consist of alphanumeric characters, underscores or hyphens`).transform(e=>e),aa=Et().min(0,`Opacity must be between 0 and 100`).max(100,`Opacity must be between 0 and 100`),oa=D(sr),sa=T().nonempty(`Icon cannot be empty`).transform(e=>e),ca=D(or),la=D(fr),ua=D(cr),da=D(ur),fa=D(dr),pa=w([T(),E({title:T().optional(),url:T()})]).transform(e=>xr(typeof e==`string`?{url:e}:e)),ma=k(pa).readonly(),ha=D(pr),ga=T().nonempty(`Custom color name cannot be empty`).transform(e=>e),_a=T().nonempty(`Tag cannot be empty`).transform(e=>e.startsWith(`#`)?e.slice(1):e),va=k(_a).readonly(),ya=w([T().transform(e=>({txt:e})),At({md:T()}),At({txt:T()})]),ba=ha.or(ga),xa=E({shape:oa,icon:sa,iconColor:ba,iconSize:la,iconPosition:ua,color:ba,border:ca,opacity:aa,size:la,padding:la,textSize:la,multiple:Ot()}).partial().transform(vn(P)),Sa=w([T(),Ot(),jt()]),Ca=Ct(T(),Sa.or(k(Sa))),wa=E({tags:va.nullish(),title:T().nullish(),summary:ya.nullish(),description:ya.nullish(),notation:T().nullish(),technology:T().nullish(),links:ma.nullish(),metadata:Ca.nullish()});var Ta=r({directRelationExpr:()=>Za,elementKindExpr:()=>Va,elementTagExpr:()=>Ha,expression:()=>oo,fqnExpr:()=>Ua,fqnExprAny:()=>Xa,fqnExprCustom:()=>Ya,fqnExprOrWhere:()=>Ga,fqnRef:()=>Oa,incomingRelationExpr:()=>Qa,inoutRelationExpr:()=>eo,outgoingRelationExpr:()=>$a,refDeployment:()=>Da,refExpr:()=>Ba,refModel:()=>Ea,relationExpr:()=>to,relationExprAny:()=>io,relationExprCustom:()=>ro,relationExprOrWhere:()=>no,selector:()=>ka,whereAnd:()=>Fa,whereExpr:()=>ao,whereKind:()=>ja,whereMetadata:()=>Ma,whereNot:()=>Ia,whereOperator:()=>Ra,whereOr:()=>La,whereParticipant:()=>Pa,whereTag:()=>Aa,wildcardExpr:()=>za});const Ea=At({model:ra,project:T().optional()}),Da=At({deployment:ra,element:ra.nullish()}),Oa=w([Ea,Da]),ka=D([`children`,`expanded`,`descendants`]);function equalOp(e){return w([e.transform(e=>({eq:e})),E({eq:e}),E({neq:e})])}const Aa=E({tag:equalOp(_a)}),ja=E({kind:equalOp(ia)}),Ma=E({metadata:E({key:T(),value:equalOp(T()).optional()})}),Na=w([Aa,ja,Ma]),Pa=E({participant:D([`source`,`target`]),operator:Na}),Fa=E({get and(){return k(Ra)}}),Ia=E({get not(){return Ra}}),La=E({get or(){return k(Ra)}}),Ra=w([Aa,ja,Ma,Pa,Fa,La,Ia]),za=E({wildcard:D(!0)}),Ba=E({ref:Oa,selector:ka.optional()}),Va=E({elementKind:ia,isEqual:Ot()}),Ha=E({elementTag:_a,isEqual:Ot()}),Ua=w([za,Ba,Va,Ha]),Wa=At({where:At({expr:Ua,condition:Ra})}),Ga=w([Ua,Wa]),Ka=E({title:T(),description:ya,technology:T(),notation:T(),notes:ya,navigateTo:na,color:ba}),qa=E({...Ka.shape,shape:oa,icon:sa,iconColor:ba,iconSize:la,iconPosition:ua,border:ca,opacity:aa,multiple:Ot(),size:la,padding:la,textSize:la}).partial(),Ja=E({...Ka.shape,line:fa,head:da,tail:da}).partial(),Ya=At({custom:qa.extend({expr:Ga})}),Xa=w([Ga,Ya]),Za=E({source:Ua,target:Ua,isBidirectional:Ot().optional()}),Qa=E({incoming:Ua}),$a=E({outgoing:Ua}),eo=E({inout:Ua}),to=w([Za,Qa,$a,eo]),no=w([to,At({where:At({expr:to,condition:Ra})})]),ro=At({customRelation:Ja.extend({expr:no})}),io=w([no,ro]),ao=E({where:E({expr:w([Ua,to]),condition:Ra})}),oo=w([Ua,Ya,to,ro,ao]);var so=r({element:()=>mo,instance:()=>lo,node:()=>co,relationship:()=>po,schema:()=>vo});const co=wa.extend({id:ra,kind:ia,style:xa.optional(),shape:oa.optional(),color:ba.optional(),icon:sa.optional()}).readonly().transform(e=>{let{shape:t,color:r,icon:o,...s}=e;return vn(Di(s,e=>{e.style=s.style||{},t&&(e.style.shape=t),r&&(e.style.color=r),o&&(e.style.icon=o)}),P)}),lo=wa.extend({id:ra,element:ra,style:xa.optional(),shape:oa.optional(),color:ba.optional(),icon:sa.optional()}).readonly().transform(e=>{let{shape:t,color:r,icon:o,...s}=e;return vn(Di(s,e=>{e.style=s.style||{},t&&(e.style.shape=t),r&&(e.style.color=r),o&&(e.style.icon=o)}),P)}),uo=Da,fo=ta.transform(e=>e),po=wa.extend({id:fo.optional(),title:T().nullish(),source:uo,target:uo,navigateTo:na.nullish(),color:ba.nullish(),kind:ia.nullish(),line:fa.nullish(),head:da.nullish(),tail:da.nullish()}).readonly().transform(vn(P)),mo=w([co,lo]),ho=Ct(ra,mo),go=Ct(fo,po),_o=t(e=>e.id??Cn(8),`genRelationshipId`),vo=E({elements:w([ho,k(mo)]).transform(e=>$t(e)?an(e,Pn(`id`)):e).optional(),relations:w([go,k(po)]).transform(e=>$t(e)?an(e,_o):e).optional()});var yo=r({element:()=>bo,relationship:()=>Co,schema:()=>Eo});const bo=E({...wa.shape,id:ra,kind:ia,style:xa.optional(),shape:oa.optional(),color:ba.optional(),icon:sa.optional()}).transform(e=>{let{shape:t,color:r,icon:o,...s}=e;return(t||r||o)&&(s=Di(s,e=>{e.style=s.style||{},t&&(e.style.shape=t),r&&(e.style.color=r),o&&(e.style.icon=o)})),vn(s,P)}).readonly(),xo=w([ra,At({model:ra})]).transform(e=>typeof e==`string`?{model:e}:e),So=ta.transform(e=>e),Co=E({...wa.shape,id:So.optional(),title:T().nullish(),source:xo,target:xo,navigateTo:na.nullish(),color:ba.nullish(),kind:ia.nullish(),line:fa.nullish(),head:da.nullish(),tail:da.nullish()}).transform(vn(P)).readonly(),wo=Ct(ra,bo),To=Ct(So,Co),genRelationshipId=e=>e.id??Cn(8),Eo=E({elements:w([wo,k(bo)]).transform(e=>$t(e)?an(e,Pn(`id`)):e).optional(),relations:w([To,k(Co)]).transform(e=>$t(e)?an(e,genRelationshipId):e).optional()});var Do=r({element:()=>Oo,relationship:()=>ko,schema:()=>jo,tagSpec:()=>Ao});const Oo=E({tags:va.nullable(),title:T().nullable(),summary:ya.nullable(),description:ya.nullable(),technology:T().nullable(),notation:T().nullable(),links:ma.nullable(),style:xa.nullable()}).partial().transform(vn(P)),ko=E({technology:T().nullable(),notation:T().nullable(),color:ba.nullable(),line:fa.nullable(),head:da.nullable(),tail:da.nullable()}).partial().transform(vn(P)),Ao=E({color:ba.nullable()}).partial().transform(vn(P)),jo=E({elements:Ct(ia,Oo),deployments:Ct(ia,Oo),relationships:Ct(ia,ko),tags:w([Ct(_a,Ao),k(_a).transform(e=>Ln(e,e=>[e,{}]))])}).partial();var Mo=r({anyView:()=>cs,autoLayoutDirection:()=>No,deploymentView:()=>Yo,deploymentViewRule:()=>Jo,deploymentViewRuleIncludeAncestors:()=>Fo,dynamicStep:()=>Xo,dynamicStepAlt:()=>ns,dynamicStepAltBranch:()=>ts,dynamicStepBlock:()=>$o,dynamicStepSeries:()=>Qo,dynamicStepTry:()=>es,dynamicView:()=>ss,dynamicViewIncludeRule:()=>is,dynamicViewRule:()=>as,dynamicViewStep:()=>rs,dynamicViewVariant:()=>os,elementView:()=>qo,elementViewRule:()=>Go,viewRuleAutoLayout:()=>Po,viewRuleExclude:()=>Lo,viewRuleGlobalPredicate:()=>Vo,viewRuleGlobalStyle:()=>Bo,viewRuleGroup:()=>Wo,viewRuleInclude:()=>Io,viewRulePredicate:()=>Ro,viewRuleRank:()=>Uo,viewRuleStyle:()=>zo,views:()=>ls});const No=D([`TB`,`BT`,`LR`,`RL`]),Po=E({direction:No,nodeSep:jt().optional(),rankSep:jt().optional()}),Fo=At({includeAncestors:Ot()}),Io=At({include:k(oo)}),Lo=At({exclude:k(oo)}),Ro=w([Io,Lo]).transform(e=>e),zo=E({targets:k(Ua),notation:T().optional(),style:xa}).transform(e=>e),Bo=E({styleId:T()}).transform(e=>e),Vo=E({predicateId:T()}).transform(e=>e),Ho=D([`max`,`min`,`same`,`sink`,`source`]),Uo=E({targets:k(Ua),rank:Ho}).transform(e=>e),Wo=Tt(()=>E({groupRules:k(w([Ro,Vo,Wo])),title:T().nullable(),color:ba.optional(),border:ca.optional(),opacity:aa.optional(),multiple:Ot().optional(),size:la.optional(),padding:la.optional(),textSize:la.optional()})),Go=w([Ro,Po,zo,Bo,Vo,Uo,Wo]),Ko=E({id:na,title:T().nullish(),description:ya.nullish(),order:jt().int().nonnegative().optional(),tags:va.nullish(),links:ma.nullish()}),qo=Ko.extend({_type:D(`element`),viewOf:ra.nullish(),extends:na.nullish(),rules:k(Go).optional().default([])}),Jo=w([Ro,Po,zo,Bo,Vo,Fo]),Yo=Ko.extend({_type:D(`deployment`),rules:k(Jo).optional().default([])}),Xo=E({_type:kt().exactOptional(),source:ra,target:ra,title:T().nullish().default(null),kind:T().nullish(),description:ya.nullish(),technology:T().nullish(),notation:T().nullish(),notes:ya.nullish(),color:ba.optional(),line:fa.optional(),head:da.optional(),tail:da.optional(),isBackward:Ot().optional(),navigateTo:na.nullish()}),Zo=E({title:T().optional(),source:kt().exactOptional(),target:kt().exactOptional(),get steps(){return k(rs).nonempty(`must have at least one step`)}}),Qo=E({_type:D(`series`),steps:k(Xo).nonempty(`must have at least one step`)}).readonly(),$o=Zo.extend({_type:D([`par`,`loop`,`opt`,`break`])}).readonly(),es=E({_type:D(`try`),try:Zo,catch:Zo.optional(),finally:Zo.optional()}).readonly(),ts=Zo.extend({_type:D([`when`,`if`,`else`])}).readonly(),ns=E({_type:D(`alt`),title:T().optional(),branches:k(ts).nonempty(`alt block must have at least one branch`)}).readonly(),rs=w([Xo,ns,Qo,$o,es]),is=At({include:k(oo)}),as=w([is,Vo,zo,Bo,Po]),os=D([`diagram`,`sequence`]),ss=Ko.extend({_type:D(`dynamic`),variant:os.optional(),steps:k(rs).optional(),rules:k(as).optional()}),cs=w([qo,Yo,ss]),ls=Ct(na,cs),us=E({...Eo.shape,views:ls,project:E({id:T(),styles:Ft.nullish()}),deployment:vo,deployments:vo,specification:jo}).partial().readonly().transform(normalizeStyles);function normalizeStyles(e){let t=e.specification?.elements;return!tn(t)&&!tn(e.elements)&&(e={...e,elements:Fn(e.elements,e=>normalizeElementStyles(e,t))}),e}function normalizeElementStyles(e,t){let r=t[e.kind];if(!r)return e;let o=r.style??{};return Di(e,t=>{for(let o of[`description`,`technology`,`tags`,`summary`]){let s=r[o],c=e[o];Ut(s,c)&&delete t[o]}if(e.style)for(let[r,s]of rn(o))Ut(e.style?.[r],s)&&delete t.style[r]})}const G={common:ea,expr:Ta,specification:Do,model:yo,deployment:so,views:Mo,likec4data:us};function markdownProperty(e,t){return select(t=>t[e],spaceBetween(print(t??e),markdownOrString$1()))}const titleProperty=()=>property(`title`,spaceBetween(print(`title`),text())),summaryProperty=()=>property(`summary`,spaceBetween(print(`summary`),markdownOrString$1())),descriptionProperty=()=>property(`description`,spaceBetween(print(`description`),markdownOrString$1())),notesProperty=()=>property(`notes`,spaceBetween(print(`notes`),markdownOrString$1())),technologyProperty=()=>property(`technology`,spaceBetween(print(`technology`),text())),notationProperty=()=>property(`notation`,spaceBetween(print(`notation`),text()));function printMetadataValue(){return operation(({ctx:e,out:t})=>sn(e)?text()({ctx:e,out:t}):print()({ctx:e,out:t}))}function metadataValue(){return gn(guard(Ht($t),printMetadataValue()),guard($t,body(`[`,`]`)(foreach(printMetadataValue(),{appendNewLineIfNotEmpty:!0,suffix(e,t,r){return r?void 0:`,`}}))))}const metadataProperty=()=>select(e=>e.metadata?rn(e.metadata):void 0,body(`metadata`)(foreach(spaceBetween(print(e=>e[0]),property(`1`,metadataValue())),separateNewLine()))),tagsProperty=()=>property(`tags`,print(e=>e.map(e=>`#${e}`).join(`, `)));function linkProperty(){return spaceBetween(select(e=>typeof e==`string`?{url:e}:xr({url:e.url,title:e.title}),print(`link`),print(e=>e.url),property(`title`,inlineText())))}const linksProperty=()=>property(`links`,foreachNewLine(linkProperty()));function colorProperty(){return property(`color`,spaceBetween(print(`color`),print()))}function opacityProperty(){return property(`opacity`,spaceBetween(print(`opacity`),print(e=>`${e}%`)))}function iconProperty(){return property(`icon`,spaceBetween(print(`icon`),print()))}const ds=zodOp(xa)(lines(property(`shape`),colorProperty(),iconProperty(),property(`iconColor`),property(`iconSize`),property(`iconPosition`),property(`border`),opacityProperty(),property(`size`),property(`padding`),property(`textSize`),property(`multiple`)));function appendSelector(e,t){if(t)switch(t){case`children`:e.append(`.*`);break;case`descendants`:e.append(`.**`);break;case`expanded`:e.append(`._`);break;default:H(t)}return e}const fs=zodOp(Aa)(function whereTagEqualOp({ctx:{tag:e},out:t}){if(`eq`in e)return t.appendTemplate`tag is #${e.eq}`;if(`neq`in e)return t.appendTemplate`tag is not #${e.neq}`;H(e)}),ps=zodOp(ja)(function whereKindEqualOp({ctx:{kind:e},out:t}){if(`eq`in e)return t.appendTemplate`kind is ${e.eq}`;if(`neq`in e)return t.appendTemplate`kind is not ${e.neq}`;H(e)});function quoteMetadataValue(e){return e===`true`||e===`false`?e:`"${e}"`}const ms=zodOp(Ma)(function whereMetadataEqualOp({ctx:{metadata:e},out:t}){let{key:r,value:o}=e;if(o===void 0)return t.appendTemplate`metadata.${r}`;if(`eq`in o)return t.append(`metadata.${r} is ${quoteMetadataValue(o.eq)}`);if(`neq`in o)return t.append(`metadata.${r} is not ${quoteMetadataValue(o.neq)}`);H(o)}),hs=zodOp(Ia)(property(`not`,spaceBetween(print(`not (`),lazy(()=>ys()),print(`)`)))),gs=zodOp(Pa)(function whereParticipantOp({ctx:{participant:e,operator:t},out:r}){if(r.append(e,`.`),`tag`in t){fs()({ctx:t,out:r});return}if(`kind`in t){ps()({ctx:t,out:r});return}if(`metadata`in t){ms()({ctx:t,out:r});return}H(t)}),_s=zodOp(Fa)(function whereAndOp({ctx:{and:e},out:t}){let r=N(e,e=>{let{out:t}=executeOnFresh(e,ys());return`or`in e&&(t=fresh().out.append(`(`,...t.contents,`)`)),t});return t.append(Pe(r,{appendNewLineIfNotEmpty:!0,skipNewLineAfterLastItem:!0,prefix(e,t){return t>0?`and `:void 0}}))}),vs=zodOp(La)(({ctx:{or:e},out:t})=>{let r=N(e,e=>{let{out:t}=executeOnFresh(e,ys());return`and`in e&&(t=fresh().out.append(`(`,...t.contents,`)`)),t});return t.append(Pe(r,{appendNewLineIfNotEmpty:!0,skipNewLineAfterLastItem:!0,prefix(e,t){return t>0?`or `:void 0}}))}),ys=zodOp(Ra)(({ctx:e,exec:t})=>{if(`and`in e)return t(e,_s());if(`or`in e)return t(e,vs());if(`not`in e)return t(e,hs());if(`tag`in e)return t(e,fs());if(`kind`in e)return t(e,ps());if(`metadata`in e)return t(e,ms());if(`participant`in e)return t(e,gs());H(e)}),bs=zodOp(Oa)(({ctx:e,out:t})=>(`model`in e?t.append(e.model):(t.append(e.deployment),e.element&&t.append(`.`,e.element)),t)),xs=zodOp(Ua)(({ctx:e,out:t,exec:r})=>{if(`wildcard`in e)return t.append(`*`);if(`elementKind`in e)return t.append(`element.kind`).append(e.isEqual?` = `:` != `).append(e.elementKind);if(`elementTag`in e)return t.append(`element.tag`).append(e.isEqual?` = `:` != `).append(`#${e.elementTag}`);if(`ref`in e)return r(e.ref,bs()),appendSelector(t,e.selector),t;H(e)}),Ss=zodOp(Ya)(({ctx:{custom:e},exec:t})=>{t(e.expr,Cs());let r=withctx(e)(body(`with`)(titleProperty(),descriptionProperty(),notationProperty(),notesProperty(),property(`navigateTo`),ds()));return`where`in e.expr?t({},indent(r)):t({},space(),r)}),Cs=zodOp(Ga)(({ctx:e,exec:t})=>{if(`where`in e){t(e.where.expr,xs()),t(e.where.condition,indent(print(`where`),indent(ys())));return}t(e,xs())});zodOp(Xa)(({ctx:e,out:t})=>`custom`in e?Ss()({ctx:e,out:t}):Cs()({ctx:e,out:t}));const ws=zodOp(Za)(merge(property(`source`,xs()),print(e=>e.isBidirectional?` <-> `:` -> `),property(`target`,xs()))),Ts=zodOp(Qa)(merge(print(`-> `),property(`incoming`,xs()))),Es=zodOp($a)(merge(property(`outgoing`,xs()),print(` ->`))),Ds=zodOp(eo)(merge(print(`-> `),property(`inout`,xs()),print(` ->`))),Os=zodOp(to)(({ctx:e,exec:t})=>{if(`source`in e)return t(e,ws());if(`incoming`in e)return t(e,Ts());if(`outgoing`in e)return t(e,Es());if(`inout`in e)return t(e,Ds());H(e)}),ks=zodOp(no)(({ctx:e,out:t})=>`where`in e?merge(withctx(e.where.expr)(Os()),indent(print(`where`),indent(withctx(e.where.condition)(ys()))))({ctx:e,out:t}):Os()({ctx:e,out:t})),As=zodOp(ro)(({ctx:{customRelation:e},exec:t})=>{t(e.expr,ks());let r=withctx(e)(body(`with`)(titleProperty(),descriptionProperty(),notationProperty(),markdownProperty(`notes`),property(`navigateTo`),ds(),property(`head`),property(`tail`),property(`line`)));`where`in e.expr?t({},indent(r)):t({},space(),r)});zodOp(io)(({ctx:e,exec:t})=>`customRelation`in e?t(e,As()):t(e,ks()));const js=zodOp(oo)(({ctx:e,exec:t})=>{if(`custom`in e)return t(e,Ss());if(`customRelation`in e)return t(e,As());if(`wildcard`in e||`ref`in e||`elementKind`in e||`elementTag`in e)return t(e,xs());if(`source`in e||`incoming`in e||`outgoing`in e||`inout`in e)return t(e,Os());if(`where`in e){let{expr:r,condition:o}=e.where;return`source`in r||`incoming`in r||`outgoing`in r||`inout`in r?t({where:{expr:r,condition:o}},ks()):t({where:{expr:r,condition:o}},Cs())}H(e)});function buildTree$1(e){let t=new Map,r=[],o=I(e,wi);for(let e of o){let o;o=`element`in e?e:{...e,children:[]},t.set(e.id,o);let s=xi(e.id),c=s?t.get(s):void 0;c&&`children`in c?c.children.push(o):r.push(o)}return{roots:r,nodes:t,exists:e=>t.has(e)}}t(buildTree$1,`buildTree`);function hasStyleProps$1(e){return!tn(e.style)}t(hasStyleProps$1,`hasStyleProps`);function hasElementProps$1(e){return!!(e.description||e.summary||e.technology||e.notation||e.tags&&e.tags.length>0||e.links&&e.links.length>0||!tn(e.metadata)||hasStyleProps$1(e))}t(hasElementProps$1,`hasElementProps`);const Ms=zodOp(G.deployment.element)(lines(tagsProperty(),technologyProperty(),summaryProperty(),descriptionProperty(),linksProperty(),metadataProperty(),select(e=>hasStyleProps$1(e)?e.style:void 0,body(`style`)(ds())))),Ns=zodOp(G.deployment.instance)(spaceBetween(when(e=>_i(e.id)!==_i(e.element),print(e=>_i(e.id)),print(` =`)),print(`instanceOf`),printProperty(`element`),when(e=>!!e.title&&e.title!==_i(e.id),property(`title`,inlineText())),when(e=>hasElementProps$1(e),body(Ms()))));function node(){return function nodeOp({ctx:e,out:t}){let r=e;if(`element`in r)return Ns()({ctx:r,out:t}),{ctx:e,out:t};U(`children`in r,`Node must have children property`);let o=r.children.length>0||hasElementProps$1(r),s=_i(r.id),c=[print(s),print(`=`),print(r.kind)];return r.title&&r.title!==s&&c.push(inlineText(r.title)),o&&c.push(body(lines(2)(withctx(r,Ms()),...r.children.map(e=>withctx(e,nodeOp))))),spaceBetween(...c)({ctx:e,out:t})}}function hasRelationStyle$1(e){return!!(e.color||e.line||e.head||e.tail)}t(hasRelationStyle$1,`hasRelationStyle`);function hasRelationProps$1(e){return!!(e.description||e.summary||e.technology||e.tags&&e.tags.length>0||e.links&&e.links.length>0||!tn(e.metadata)||hasRelationStyle$1(e)||e.navigateTo)}t(hasRelationProps$1,`hasRelationProps`);const Ps=zodOp(G.deployment.relationship)(spaceBetween(property(`source`,bs()),print(e=>e.kind?`-[${e.kind}]->`:`->`),property(`target`,bs()),property(`title`,inlineText()),when(hasRelationProps$1,body(tagsProperty(),technologyProperty(),summaryProperty(),descriptionProperty(),property(`navigateTo`),linksProperty(),metadataProperty(),when(hasRelationStyle$1,body(`style`)(colorProperty(),property(`line`),property(`head`),property(`tail`))))))),Fs=zodOp(G.deployment.schema)(body(`deployment`)(lines(2)(select(e=>buildTree$1(e.elements?Nn(e.elements):[]).roots,lines(2)(foreach(node()))),select(e=>e.relations?Nn(e.relations):void 0,lines(2)(foreach(Ps()))))));function buildTree(e){let t=new Map,r=[],o=I(e,wi);for(let e of o){let o={...e,children:[]};t.set(e.id,o);let s=xi(e.id),c=s?t.get(s):void 0;c?c.children.push(o):r.push(o)}return{roots:r,nodes:t,exists:e=>t.has(e)}}function hasStyleProps(e){return!tn(e.style)}function hasElementProps(e){return!!(e.description||e.summary||e.technology||e.notation||e.tags&&e.tags.length>0||e.links&&e.links.length>0||!tn(e.metadata)||hasStyleProps(e))}const Is=zodOp(G.model.element)(lines(tagsProperty(),technologyProperty(),summaryProperty(),descriptionProperty(),linksProperty(),metadataProperty(),select(e=>hasStyleProps(e)?e.style:void 0,body(`style`)(ds()))));function elementTree(){return function elementTreeNodeOp({ctx:e,out:t}){let r=e,o=(e.children?.length??0)>0||hasElementProps(r),s=_i(r.id),c=[print(s),print(`=`),print(r.kind)];return r.title&&r.title!==s&&c.push(inlineText(r.title)),o&&c.push(body(lines(2)(withctx(r,Is()),...(e.children??[]).map(e=>withctx(e,elementTree()))))),spaceBetween(...c)({ctx:e,out:t})}}function hasRelationStyle(e){return!!(e.color||e.line||e.head||e.tail)}function hasRelationProps(e){return!!(e.description||e.summary||e.technology||e.tags&&e.tags.length>0||e.links&&e.links.length>0||!tn(e.metadata)||hasRelationStyle(e)||e.navigateTo)}const Ls=zodOp(G.model.relationship)(spaceBetween(property(`source`,bs()),print(e=>e.kind?`-[${e.kind}]->`:`->`),property(`target`,bs()),property(`title`,inlineText()),when(hasRelationProps,body(tagsProperty(),technologyProperty(),summaryProperty(),descriptionProperty(),property(`navigateTo`),linksProperty(),metadataProperty(),when(hasRelationStyle,body(`style`)(colorProperty(),property(`line`),property(`head`),property(`tail`)))))));zodOp(G.model.element)(elementTree());const Rs=zodOp(G.model.schema)(body(`model`)(lines(2)(select(e=>buildTree(e.elements?Nn(e.elements):[]).roots,lines(2)(foreach(elementTree()))),select(e=>e.relations?Nn(e.relations):void 0,lines(2)(foreach(Ls())))))),zs=zodOp(wt([T(),Ao]))(spaceBetween(print(`tag`),printProperty(`0`),property(`1`,property(`color`,body(spaceBetween(print(`color`),print())))))),elementKind=e=>zodOp(wt([T(),Oo]))(spaceBetween(print(e),printProperty(`0`),property(`1`,body(tagsProperty(),titleProperty(),summaryProperty(),descriptionProperty(),technologyProperty(),notationProperty(),linksProperty(),property(`style`,body(`style`)(ds())))))),Bs=zodOp(wt([T(),ko]))(spaceBetween(print(`relationship`),printProperty(`0`),property(`1`,body(technologyProperty(),notationProperty(),colorProperty(),property(`line`),property(`head`),property(`tail`))))),Vs=zodOp(jo)(body(`specification`)(lines(2)(select(e=>e.elements&&rn(e.elements),foreachNewLine(elementKind(`element`)())),select(e=>e.deployments&&rn(e.deployments),foreachNewLine(elementKind(`deploymentNode`)())),select(e=>e.relationships&&rn(e.relationships),foreachNewLine(Bs())),select(e=>e.tags&&rn(e.tags),foreachNewLine(zs()))))),viewTitleProperty=()=>property(`title`,spaceBetween(print(`title`),inlineText())),Hs=zodOp(G.views.viewRulePredicate)(({ctx:e,exec:t})=>{let r,o;if(`include`in e?(r=e.include,o=`include`):`exclude`in e&&(r=e.exclude,o=`exclude`),V(r&&o,`Invalid view rule predicate`),!A(r,1))return;let s=A(r,2),c=withctx(r)(foreach(js(),separateComma(s)));t(e,merge(print(o),...s?[indent(c)]:[space(),c]))}),Us=zodOp(G.views.viewRuleStyle)(spaceBetween(print(`style`),property(`targets`,foreach(js(),separateComma())),body(`{`,`}`)(notationProperty(),property(`style`,ds())))),Ws=zodOp(G.views.viewRuleGroup)(({ctx:e,exec:t})=>{throw Error(`not implemented`)}),Gs=zodOp(G.views.viewRuleGlobalStyle)(({ctx:e,exec:t})=>{throw Error(`not implemented`)}),Ks=zodOp(G.views.viewRuleGlobalPredicate)(({ctx:e,exec:t})=>{throw Error(`not implemented`)}),qs={TB:`TopBottom`,BT:`BottomTop`,LR:`LeftRight`,RL:`RightLeft`},Js=zodOp(G.views.viewRuleAutoLayout)(spaceBetween(print(`autoLayout`),property(`direction`,print(e=>qs[e])),guard(Hr(`rankSep`),spaceBetween(printProperty(`rankSep`),printProperty(`nodeSep`))))),Ys=zodOp(G.views.deploymentViewRuleIncludeAncestors)(spaceBetween(print(`includeAncestors`),printProperty(`includeAncestors`))),Xs=zodOp(G.views.viewRuleRank)(({ctx:e,exec:t})=>{throw Error(`not implemented`)}),Zs=zodOp(G.views.elementViewRule)(({ctx:e,exec:t})=>{if(`include`in e||`exclude`in e)return t(e,Hs());if(`groupRules`in e)return t(e,Ws());if(`rank`in e)return t(e,Xs());if(`direction`in e)return t(e,Js());if(`styleId`in e)return t(e,Gs());if(`predicateId`in e)return t(e,Ks());if(`targets`in e&&`style`in e)return t(e,Us());H(e)}),Qs=zodOp(G.views.elementView.partial({_type:!0}))(spaceBetween(print(`view`),print(e=>e.id),property(`viewOf`,spaceBetween(print(`of`),print())),body(lines(2)(lines(tagsProperty(),viewTitleProperty(),property(`order`),descriptionProperty(),linksProperty()),property(`rules`,foreachNewLine(Zs())))))),$s=zodOp(G.views.deploymentViewRule)(({ctx:e,exec:t})=>{if(`include`in e||`exclude`in e)return t(e,Hs());if(`includeAncestors`in e)return t(e,Ys());if(`direction`in e)return t(e,Js());if(`styleId`in e)return t(e,Gs());if(`predicateId`in e)return t(e,Ks());if(`targets`in e&&`style`in e)return t(e,Us());H(e)}),ec=zodOp(G.views.deploymentView.partial({_type:!0}))(spaceBetween(print(`deployment view`),print(e=>e.id),body(lines(2)(lines(tagsProperty(),viewTitleProperty(),property(`order`),descriptionProperty(),linksProperty()),property(`rules`,foreachNewLine($s())))))),tc=zodOp(G.views.dynamicStep.partial({source:!0}))(spaceBetween(print(e=>e.isBackward?`<-`:e.kind?`-[${e.kind}]->`:`->`),printProperty(`target`),property(`title`,text()),body(lines(technologyProperty(),descriptionProperty(),notesProperty(),property(`navigateTo`),notationProperty(),colorProperty(),property(`line`),property(`head`),property(`tail`))))),nc=zodOp(G.views.dynamicStep)(spaceBetween(printProperty(`source`),tc())),bodyWithSteps=()=>property(`steps`,body(foreachNewLine(lazy(()=>cc())))),rc=zodOp(G.views.dynamicStepBlock)(spaceBetween(printProperty(`_type`),property(`title`,text()),bodyWithSteps())),ic=zodOp(G.views.dynamicStepSeries)(merge(select(e=>e.steps[0],printProperty(`source`)),indent(property(`steps`,foreachNewLine(tc()))))),ac=zodOp(G.views.dynamicStepTry)(spaceBetween(select(e=>e.try,spaceBetween(print(`try`),property(`title`,text()),bodyWithSteps())),select(e=>e.catch,spaceBetween(print(`catch`),property(`title`,text()),bodyWithSteps())),select(e=>e.finally,spaceBetween(print(`finally`),property(`title`,text()),bodyWithSteps())))),oc=zodOp(G.views.dynamicStepAltBranch)(spaceBetween(printProperty(`_type`),property(`title`,text()),bodyWithSteps())),sc=zodOp(G.views.dynamicStepAlt)(spaceBetween(print(`alt`),property(`title`,text()),body(property(`branches`,foreachNewLine(oc()))))),cc=zodOp(G.views.dynamicViewStep)(({ctx:e,exec:t})=>{if(e.source&&e.target)return t(e,nc());switch(V(e._type,`Step must have a type`),e._type){case`loop`:case`opt`:case`break`:case`par`:return t(e,rc());case`alt`:return t(e,sc());case`series`:return t(e,ic());case`try`:return t(e,ac());default:H(e)}}),lc={single:nc,block:rc,alt:sc,series:ic,try:ac,any:cc},uc=zodOp(G.views.dynamicViewIncludeRule)(({ctx:e,exec:t})=>{if(!A(e.include,1))return;let r=A(e.include,2),o=withctx(e.include)(foreach(js(),separateComma(r)));t(e,merge(print(`include`),...r?[indent(o)]:[space(),o]))}),dc=zodOp(G.views.dynamicViewRule)(({ctx:e,exec:t})=>{if(`include`in e)return t(e,uc());if(`predicateId`in e)return t(e,Ks());if(`targets`in e&&`style`in e)return t(e,Us());if(`styleId`in e)return t(e,Gs());if(`direction`in e)return t(e,Js());H(e)}),fc=zodOp(G.views.dynamicView.partial({_type:!0}))(spaceBetween(print(`dynamic view`),print(e=>e.id),body(lines(2)(lines(tagsProperty(),viewTitleProperty(),property(`order`),descriptionProperty(),linksProperty(),property(`variant`)),property(`steps`,foreachNewLine(lc.any())),property(`rules`,foreachNewLine(dc())))))),pc=zodOp(G.views.anyView)(({ctx:e,exec:t})=>{if(`_type`in e){if(e._type==`element`)return t(e,Qs());if(e._type===`deployment`)return t(e,ec());if(e._type===`dynamic`)return t(e,fc())}H(e)}),mc=zodOp(G.views.views)(body(`views`)(select(e=>Nn(e),foreach(pc(),{separator:new Me().appendNewLine().appendNewLine(),prefix:(e,t,r)=>t===0&&!r?Qi:void 0})))),hc=zodOp(G.likec4data)(lines(2)(property(`specification`,Vs()),Rs(),property(`deployment`,Fs()),property(`deployments`,Fs()),property(`views`,mc())));function generateLikeC4(e,t){return t={indentation:2,...t},materialize(withctx(e,hc()),t.indentation)}function printOperation(e,t,r){return materialize(withctx(t??{},e),r?.indentation)}const gc=t(e=>e.severity===1,`isErrorDiagnostic`);var LikeC4=class{langium;logger;constructor(e,t=W){this.langium=e,this.logger=t}get workspace(){return this.langium.shared.workspace.WorkspaceManager.workspaceUri.fsPath}get workspaceURI(){return this.langium.shared.workspace.WorkspaceManager.workspaceUri}get workspaceURL(){return this.langium.shared.workspace.WorkspaceManager.workspaceURL}get languageServices(){return this.langium.likec4.likec4.LanguageServices}get projectsManager(){return this.langium.shared.workspace.ProjectsManager}get viewsService(){return this.langium.likec4.likec4.Views}get modelBuilder(){return this.langium.likec4.likec4.ModelBuilder}get LangiumDocuments(){return this.langium.shared.workspace.LangiumDocuments}ensureSingleProject(){let e=this.languageServices.projects();if(e.length>1)throw this.logger.error(`Multiple projects found:
11
+ `)}function hasContent(e){return typeof e==`string`?e.trimStart().length!==0:e instanceof je&&e.contents.some(e=>hasContent(e))}function hasContentOrNewLine(e){return typeof e==`string`?e.trimStart().length!==0:e instanceof rt?!e.ifNotEmpty:e instanceof je&&e.contents.some(e=>hasContentOrNewLine(e))}function fresh(e){return{ctx:e??void 0,out:new je}}function materialize(e,t=2){return toStringLF($t(e)?executeOnFresh(void 0,[e]).out:e.out,t)}function executeOnCtx(e,t,...r){Qt(t)?(U(r.length===0,`When first argument is an array, no additional operations are allowed`),r=t):r=[t,...r];for(let t of r)e=t(e);return e}function executeOnFresh(e,t,...r){return Qt(t)?executeOnCtx(fresh(e),t):executeOnCtx(fresh(e),[t,...r])}function eachOnFresh(e,t){return t.map(t=>t(fresh(e)))}function operation(e,t){let r=typeof e==`function`?e:t,wrapped=e=>{let t=r(e);return t instanceof je?{...e,out:t}:e};return typeof e==`string`&&r.name==``&&Object.defineProperties(wrapped,{name:{value:`wrapped(${e})`}}),wrapped}function isPrintable(e){return typeof e==`string`||typeof e==`number`||typeof e==`boolean`}function print(e){return operation(function printOp({ctx:t,out:r}){let o=typeof e==`function`?e(t):e??t;L(o)||o===``||(U(isPrintable(o),`Value must be a string, number or boolean - got `+typeof o),r.append(String(o)))})}const space=()=>print(` `);function noop(){return Ln()}function lazy(e){return t=>(e()(t),t)}function newline(e){return operation(({out:t})=>{e===`ifNotEmpty`?t.appendNewLineIfNotEmpty():t.appendNewLine()})}function merge(...e){return operation(function merge({ctx:t,out:r}){let o=executeOnFresh(t,e);r.appendIf(hasContent(o.out),o.out)})}function indent(...e){if(e.length===1&&typeof e[0]==`string`){let t=dedent(e[0]);return t.trimStart().length===0?noop():operation(function indent1({out:e}){e.appendNewLineIfNotEmpty().indent({indentEmptyLines:!0,indentedChildren:[Ne(t.split(/\r?\n/),{separator:ea})]}).appendNewLineIfNotEmpty()})}let t=e;return operation(function indent2({ctx:e,out:r}){let o=executeOnFresh(e,t);hasContent(o.out)&&r.appendNewLineIfNotEmpty().indent({indentEmptyLines:!0,indentedChildren:o.out.contents}).appendNewLineIfNotEmpty()})}function body(...e){let t=Cn(e);if(on(t))return body(t+` {`,`}`);if(e.length===2&&on(e[0])&&on(e[1])){let[t,r]=e;return(...e)=>operation(function body({ctx:o,out:s}){let c=indent(lines(...e))(fresh(o)).out;s.appendIf(hasContent(c),Ne([t,c,r]))})}let r=e;return body(`{`,`}`)(...r)}function inlineText(e){return operation(({ctx:t,out:r})=>{let o=e??t;if(L(o))return;U(on(o),`Value must be a string - got `+typeof o);let s=o.replace(/(\r?\n|\t)+/g,` `).replaceAll(`'`,`\\'`).trim();r.append(`'${s}'`)})}function multilineText(e,t=`'`){return merge(print(t),indent(e.replaceAll(`'`,`\\'`)),print(t))}function text(e){return operation(function text({ctx:t,out:r}){let o=typeof e==`function`?e(t):e??t;if(!L(o))return U(on(o),`Value must be a string - got `+typeof o),o.includes(`
12
+ `)?multilineText(o)({ctx:o,out:r}):inlineText()({ctx:o,out:r})})}const ta=`'`.repeat(3);function markdown(e){return operation(function markdown(t){let r=e??t.ctx;if(!L(r))return U(on(r),`Value must be a string - got `+typeof r),multilineText(r,ta)(t)})}function markdownOrString$1(e){return operation(function markdownOrString(t){let r=e??t.ctx;if(!L(r)){if(typeof r==`string`)return text(r)(t);if(`md`in r)return markdown(r.md)(t);if(`txt`in r)return multilineText(r.txt)(t);throw Error(`Invalid MarkdownOrString value: `+r)}})}t(markdownOrString$1,`markdownOrString`);function join$1(e){return operation(function joinOp({ctx:t,out:r}){let{operations:o,...s}=e,c=Array.isArray(o)?o:[o];U(M(c,1),`At least one operation is required`);let u;return u=c.length===1?c[0](fresh(t)).out.contents:R(eachOnFresh(t,c),F(e=>e.out)),u=P(u,hasContentOrNewLine),r.appendIf(u.length>0,Ne(u,s))})}t(join$1,`join`);function spaceBetween(...e){return join$1({operations:e,suffix:(e,t,r)=>!r&&hasContent(e)?` `:void 0})}function lines(...e){let t=Cn(e);if(tn(t)){let e=fresh(void 0);for(let r=0;r<t;r++)e.out.appendNewLine();return(...t)=>join$1({operations:t,suffix:(t,r,o)=>o?void 0:e.out})}return join$1({operations:e,appendNewLineIfNotEmpty:!0,skipNewLineAfterLastItem:!0})}function withctx(...e){let t=e[0];if(e.length===1)return(...e)=>operation(function withctx1({out:r}){executeOnCtx({ctx:t,out:r},e)});let r=e.slice(1);return operation(function withctx2({out:e}){executeOnCtx({ctx:t,out:e},r)})}function property(e,t){return operation(function propertyOp({ctx:r,out:o}){let s=Wt(r)&&Vr(r,e)?r[e]:void 0;if(s!=null){if(!t){U(isPrintable(s),`Property ${e} is not printable "${s}"`),o.append(e,` `,String(s));return}t({ctx:s,out:o})}})}function printProperty(e){return property(e,print())}function foreach(...e){let[t,r]=e;if(e.length===2&&!$t(r)){let e=t,o=r;return operation(function foreachSingleOp({ctx:t,out:r}){let s=[];for(let r of t){let t=e(fresh(r)).out;hasContent(t)&&s.push(t)}r.appendIf(s.length>0,Ne(s,o))})}let o=e;return operation(({ctx:e,out:t})=>{for(let r of e)executeOnCtx({ctx:r,out:t},o)})}function separateWith(e){return{separator:e}}function separateNewLine(e=1){if(e>1){let t=fresh(void 0);for(let r=0;r<e;r++)t.out.appendNewLine();return separateWith(t.out)}return separateWith(ea)}function separateComma(e){return e?{separator:`,`,appendNewLineIfNotEmpty:!0,skipNewLineAfterLastItem:!0}:{separator:`, `}}function foreachNewLine(...e){return operation(function foreachNewLineOp({ctx:t,out:r}){let o=[];for(let r of t){let t=executeOnFresh(r,e).out;hasContent(t)&&o.push(t)}r.appendIf(o.length>0,Ne(o,separateNewLine()))})}function guard(e,...t){return operation(`guard`,({ctx:r,out:o})=>{if(`safeParse`in e){let s=e.safeParse(r);if(s.success)executeOnCtx({ctx:s.data,out:o},t);else throw Error(`Guard failed: ${jt(s.error)}`);return}if(U(typeof e==`function`),e(r)){executeOnCtx({ctx:r,out:o},t);return}})}function when(e,...t){return operation(function whenOp({ctx:r,out:o}){e(r)&&executeOnCtx({ctx:r,out:o},t)})}function select(e,...t){return operation(function selectOp({ctx:r,out:o}){let s=e(r);I(s)&&executeOnCtx({ctx:s,out:o},t)})}function execToOut(e){return(t,...r)=>executeOnCtx({ctx:t,out:e},r)}function zodOp(e){return t=>()=>({ctx:r,out:o})=>{let s=xt(e,r);if(s.success){let e=t({ctx:s.data,out:o,exec:execToOut(o)});return e instanceof je?{ctx:r,out:e}:typeof e==`function`?{ctx:r,out:o,...e({ctx:r,out:o})}:{ctx:r,out:o}}throw s.error}}var na=r({arrow:()=>pa,border:()=>ua,color:()=>Sa,customColor:()=>va,fqn:()=>aa,icon:()=>la,iconPosition:()=>fa,id:()=>ra,kind:()=>oa,line:()=>ma,link:()=>ha,links:()=>ga,markdownOrString:()=>xa,metadata:()=>Ta,metadataValue:()=>wa,opacity:()=>sa,props:()=>Ea,shape:()=>ca,size:()=>da,style:()=>Ca,tag:()=>ya,tags:()=>ba,themeColor:()=>_a,viewId:()=>ia});const ra=D().regex(/^[a-zA-Z0-9_.-]+$/,`id must consist of alphanumeric characters, underscores or hyphens`),ia=ra.transform(e=>e),aa=D().regex(/^[a-zA-Z0-9_.-]+$/,`FQN must consist of alphanumeric characters, dots, underscores or hyphens`).transform(e=>e),oa=D().regex(/^[a-zA-Z0-9_-]+$/,`Kind must consist of alphanumeric characters, underscores or hyphens`).transform(e=>e),sa=Tt().min(0,`Opacity must be between 0 and 100`).max(100,`Opacity must be between 0 and 100`),ca=A(or),la=D().nonempty(`Icon cannot be empty`).transform(e=>e),ua=A(ar),da=A(dr),fa=A(sr),pa=A(lr),ma=A(ur),ha=E([D(),k({title:D().optional(),url:D()})]).transform(e=>br(typeof e==`string`?{url:e}:e)),ga=j(ha).readonly(),_a=A(fr),va=D().nonempty(`Custom color name cannot be empty`).transform(e=>e),ya=D().nonempty(`Tag cannot be empty`).transform(e=>e.startsWith(`#`)?e.slice(1):e),ba=j(ya).readonly(),xa=E([D().transform(e=>({txt:e})),kt({md:D()}),kt({txt:D()})]),Sa=_a.or(va),Ca=k({shape:ca,icon:la,iconColor:Sa,iconSize:da,iconPosition:fa,color:Sa,border:ua,opacity:sa,size:da,padding:da,textSize:da,multiple:Dt()}).partial().transform(_n(I)),wa=E([D(),Dt(),At()]),Ta=St(D(),wa.or(j(wa))),Ea=k({tags:ba.nullish(),title:D().nullish(),summary:xa.nullish(),description:xa.nullish(),notation:D().nullish(),technology:D().nullish(),links:ga.nullish(),metadata:Ta.nullish()});var Da=r({directRelationExpr:()=>$a,elementKindExpr:()=>Ua,elementTagExpr:()=>Wa,expression:()=>co,fqnExpr:()=>Ga,fqnExprAny:()=>Qa,fqnExprCustom:()=>Za,fqnExprOrWhere:()=>qa,fqnRef:()=>Aa,incomingRelationExpr:()=>eo,inoutRelationExpr:()=>no,outgoingRelationExpr:()=>to,refDeployment:()=>ka,refExpr:()=>Ha,refModel:()=>Oa,relationExpr:()=>ro,relationExprAny:()=>oo,relationExprCustom:()=>ao,relationExprOrWhere:()=>io,selector:()=>ja,whereAnd:()=>La,whereExpr:()=>so,whereKind:()=>Na,whereMetadata:()=>Pa,whereNot:()=>Ra,whereOperator:()=>Ba,whereOr:()=>za,whereParticipant:()=>Ia,whereTag:()=>Ma,wildcardExpr:()=>Va});const Oa=kt({model:aa,project:D().optional()}),ka=kt({deployment:aa,element:aa.nullish()}),Aa=E([Oa,ka]),ja=A([`children`,`expanded`,`descendants`]);function equalOp(e){return E([e.transform(e=>({eq:e})),k({eq:e}),k({neq:e})])}const Ma=k({tag:equalOp(ya)}),Na=k({kind:equalOp(oa)}),Pa=k({metadata:k({key:D(),value:equalOp(D()).optional()})}),Fa=E([Ma,Na,Pa]),Ia=k({participant:A([`source`,`target`]),operator:Fa}),La=k({get and(){return j(Ba)}}),Ra=k({get not(){return Ba}}),za=k({get or(){return j(Ba)}}),Ba=E([Ma,Na,Pa,Ia,La,za,Ra]),Va=k({wildcard:A(!0)}),Ha=k({ref:Aa,selector:ja.optional()}),Ua=k({elementKind:oa,isEqual:Dt()}),Wa=k({elementTag:ya,isEqual:Dt()}),Ga=E([Va,Ha,Ua,Wa]),Ka=kt({where:kt({expr:Ga,condition:Ba})}),qa=E([Ga,Ka]),Ja=k({title:D(),description:xa,technology:D(),notation:D(),notes:xa,navigateTo:ia,color:Sa}),Ya=k({...Ja.shape,shape:ca,icon:la,iconColor:Sa,iconSize:da,iconPosition:fa,border:ua,opacity:sa,multiple:Dt(),size:da,padding:da,textSize:da}).partial(),Xa=k({...Ja.shape,line:ma,head:pa,tail:pa}).partial(),Za=kt({custom:Ya.extend({expr:qa})}),Qa=E([qa,Za]),$a=k({source:Ga,target:Ga,isBidirectional:Dt().optional()}),eo=k({incoming:Ga}),to=k({outgoing:Ga}),no=k({inout:Ga}),ro=E([$a,eo,to,no]),io=E([ro,kt({where:kt({expr:ro,condition:Ba})})]),ao=kt({customRelation:Xa.extend({expr:io})}),oo=E([io,ao]),so=k({where:k({expr:E([Ga,ro]),condition:Ba})}),co=E([Ga,Za,ro,ao,so]);var lo=r({element:()=>go,instance:()=>fo,node:()=>uo,relationship:()=>ho,schema:()=>bo});const uo=Ea.extend({id:aa,kind:oa,style:Ca.optional(),shape:ca.optional(),color:Sa.optional(),icon:la.optional()}).readonly().transform(e=>{let{shape:t,color:r,icon:o,...s}=e;return _n(Di(s,e=>{e.style=s.style||{},t&&(e.style.shape=t),r&&(e.style.color=r),o&&(e.style.icon=o)}),I)}),fo=Ea.extend({id:aa,element:aa,style:Ca.optional(),shape:ca.optional(),color:Sa.optional(),icon:la.optional()}).readonly().transform(e=>{let{shape:t,color:r,icon:o,...s}=e;return _n(Di(s,e=>{e.style=s.style||{},t&&(e.style.shape=t),r&&(e.style.color=r),o&&(e.style.icon=o)}),I)}),po=ka,mo=ra.transform(e=>e),ho=Ea.extend({id:mo.optional(),title:D().nullish(),source:po,target:po,isBidirectional:Dt().nullish(),navigateTo:ia.nullish(),color:Sa.nullish(),kind:oa.nullish(),line:ma.nullish(),head:pa.nullish(),tail:pa.nullish()}).readonly().transform(_n(I)),go=E([uo,fo]),_o=St(aa,go),vo=St(mo,ho),yo=t(e=>e.id??Sn(8),`genRelationshipId`),bo=k({elements:E([_o,j(go)]).transform(e=>Qt(e)?rn(e,Nn(`id`)):e).optional(),relations:E([vo,j(ho)]).transform(e=>Qt(e)?rn(e,yo):e).optional()});var xo=r({element:()=>So,relationship:()=>To,schema:()=>Oo});const So=k({...Ea.shape,id:aa,kind:oa,style:Ca.optional(),shape:ca.optional(),color:Sa.optional(),icon:la.optional()}).transform(e=>{let{shape:t,color:r,icon:o,...s}=e;return(t||r||o)&&(s=Di(s,e=>{e.style=s.style||{},t&&(e.style.shape=t),r&&(e.style.color=r),o&&(e.style.icon=o)})),_n(s,I)}).readonly(),Co=E([aa,kt({model:aa})]).transform(e=>typeof e==`string`?{model:e}:e),wo=ra.transform(e=>e),To=k({...Ea.shape,id:wo.optional(),title:D().nullish(),source:Co,target:Co,isBidirectional:Dt().nullish(),navigateTo:ia.nullish(),color:Sa.nullish(),kind:oa.nullish(),line:ma.nullish(),head:pa.nullish(),tail:pa.nullish()}).transform(_n(I)).readonly(),Eo=St(aa,So),Do=St(wo,To),genRelationshipId=e=>e.id??Sn(8),Oo=k({elements:E([Eo,j(So)]).transform(e=>Qt(e)?rn(e,Nn(`id`)):e).optional(),relations:E([Do,j(To)]).transform(e=>Qt(e)?rn(e,genRelationshipId):e).optional()});var ko=r({element:()=>Ao,relationship:()=>jo,schema:()=>No,tagSpec:()=>Mo});const Ao=k({tags:ba.nullable(),title:D().nullable(),summary:xa.nullable(),description:xa.nullable(),technology:D().nullable(),notation:D().nullable(),links:ga.nullable(),style:Ca.nullable()}).partial().transform(_n(I)),jo=k({technology:D().nullable(),notation:D().nullable(),color:Sa.nullable(),line:ma.nullable(),head:pa.nullable(),tail:pa.nullable()}).partial().transform(_n(I)),Mo=k({color:Sa.nullable()}).partial().transform(_n(I)),No=k({elements:St(oa,Ao),deployments:St(oa,Ao),relationships:St(oa,jo),tags:E([St(ya,Mo),j(ya).transform(e=>In(e,e=>[e,{}]))])}).partial();var Po=r({anyView:()=>us,autoLayoutDirection:()=>Fo,deploymentView:()=>Zo,deploymentViewRule:()=>Xo,deploymentViewRuleIncludeAncestors:()=>Lo,dynamicStep:()=>Qo,dynamicStepAlt:()=>is,dynamicStepAltBranch:()=>rs,dynamicStepBlock:()=>ts,dynamicStepSeries:()=>es,dynamicStepTry:()=>ns,dynamicView:()=>ls,dynamicViewIncludeRule:()=>os,dynamicViewRule:()=>ss,dynamicViewStep:()=>as,dynamicViewVariant:()=>cs,elementView:()=>Yo,elementViewRule:()=>qo,viewRuleAutoLayout:()=>Io,viewRuleExclude:()=>zo,viewRuleGlobalPredicate:()=>Uo,viewRuleGlobalStyle:()=>Ho,viewRuleGroup:()=>Ko,viewRuleInclude:()=>Ro,viewRulePredicate:()=>Bo,viewRuleRank:()=>Go,viewRuleStyle:()=>Vo,views:()=>ds});const Fo=A([`TB`,`BT`,`LR`,`RL`]),Io=k({direction:Fo,nodeSep:At().optional(),rankSep:At().optional()}),Lo=kt({includeAncestors:Dt()}),Ro=kt({include:j(co)}),zo=kt({exclude:j(co)}),Bo=E([Ro,zo]).transform(e=>e),Vo=k({targets:j(Ga),notation:D().optional(),style:Ca}).transform(e=>e),Ho=k({styleId:D()}).transform(e=>e),Uo=k({predicateId:D()}).transform(e=>e),Wo=A([`max`,`min`,`same`,`sink`,`source`]),Go=k({targets:j(Ga),rank:Wo}).transform(e=>e),Ko=wt(()=>k({groupRules:j(E([Bo,Uo,Ko])),title:D().nullable(),color:Sa.optional(),border:ua.optional(),opacity:sa.optional(),multiple:Dt().optional(),size:da.optional(),padding:da.optional(),textSize:da.optional()})),qo=E([Bo,Io,Vo,Ho,Uo,Go,Ko]),Jo=k({id:ia,title:D().nullish(),description:xa.nullish(),order:At().int().nonnegative().optional(),tags:ba.nullish(),links:ga.nullish()}),Yo=Jo.extend({_type:A(`element`),viewOf:aa.nullish(),extends:ia.nullish(),rules:j(qo).optional().default([])}),Xo=E([Bo,Io,Vo,Ho,Uo,Lo]),Zo=Jo.extend({_type:A(`deployment`),rules:j(Xo).optional().default([])}),Qo=k({_type:Ot().exactOptional(),source:aa,target:aa,title:D().nullish().default(null),kind:D().nullish(),description:xa.nullish(),technology:D().nullish(),notation:D().nullish(),notes:xa.nullish(),color:Sa.optional(),line:ma.optional(),head:pa.optional(),tail:pa.optional(),isBackward:Dt().optional(),navigateTo:ia.nullish()}),$o=k({title:D().optional(),source:Ot().exactOptional(),target:Ot().exactOptional(),get steps(){return j(as).nonempty(`must have at least one step`)}}),es=k({_type:A(`series`),steps:j(Qo).nonempty(`must have at least one step`)}).readonly(),ts=$o.extend({_type:A([`par`,`loop`,`opt`,`break`])}).readonly(),ns=k({_type:A(`try`),try:$o,catch:$o.optional(),finally:$o.optional()}).readonly(),rs=$o.extend({_type:A([`when`,`if`,`else`])}).readonly(),is=k({_type:A(`alt`),title:D().optional(),branches:j(rs).nonempty(`alt block must have at least one branch`)}).readonly(),as=E([Qo,is,es,ts,ns]),os=kt({include:j(co)}),ss=E([os,Uo,Vo,Ho,Io]),cs=A([`diagram`,`sequence`]),ls=Jo.extend({_type:A(`dynamic`),variant:cs.optional(),steps:j(as).optional(),rules:j(ss).optional()}),us=E([Yo,Zo,ls]),ds=St(ia,us),fs=k({...Oo.shape,views:ds,project:k({id:D(),styles:Pt.nullish()}),deployment:bo,deployments:bo,specification:No}).partial().readonly().transform(normalizeStyles);function normalizeStyles(e){let t=e.specification?.elements;return!en(t)&&!en(e.elements)&&(e={...e,elements:Pn(e.elements,e=>normalizeElementStyles(e,t))}),e}function normalizeElementStyles(e,t){let r=t[e.kind];if(!r)return e;let o=r.style??{};return Di(e,t=>{for(let o of[`description`,`technology`,`tags`,`summary`]){let s=r[o],c=e[o];Ht(s,c)&&delete t[o]}if(e.style)for(let[r,s]of nn(o))Ht(e.style?.[r],s)&&delete t.style[r]})}const q={common:na,expr:Da,specification:ko,model:xo,deployment:lo,views:Po,likec4data:fs};function markdownProperty(e,t){return select(t=>t[e],spaceBetween(print(t??e),markdownOrString$1()))}const titleProperty=()=>property(`title`,spaceBetween(print(`title`),text())),summaryProperty=()=>property(`summary`,spaceBetween(print(`summary`),markdownOrString$1())),descriptionProperty=()=>property(`description`,spaceBetween(print(`description`),markdownOrString$1())),notesProperty=()=>property(`notes`,spaceBetween(print(`notes`),markdownOrString$1())),technologyProperty=()=>property(`technology`,spaceBetween(print(`technology`),text())),notationProperty=()=>property(`notation`,spaceBetween(print(`notation`),text()));function printMetadataValue(){return operation(({ctx:e,out:t})=>on(e)?text()({ctx:e,out:t}):print()({ctx:e,out:t}))}function metadataValue(){return hn(guard(Vt(Qt),printMetadataValue()),guard(Qt,body(`[`,`]`)(foreach(printMetadataValue(),{appendNewLineIfNotEmpty:!0,suffix(e,t,r){return r?void 0:`,`}}))))}const metadataProperty=()=>select(e=>e.metadata?nn(e.metadata):void 0,body(`metadata`)(foreach(spaceBetween(print(e=>e[0]),property(`1`,metadataValue())),separateNewLine()))),tagsProperty=()=>property(`tags`,print(e=>e.map(e=>`#${e}`).join(`, `)));function linkProperty(){return spaceBetween(select(e=>typeof e==`string`?{url:e}:br({url:e.url,title:e.title}),print(`link`),print(e=>e.url),property(`title`,inlineText())))}const linksProperty=()=>property(`links`,foreachNewLine(linkProperty()));function colorProperty(){return property(`color`,spaceBetween(print(`color`),print()))}function opacityProperty(){return property(`opacity`,spaceBetween(print(`opacity`),print(e=>`${e}%`)))}function iconProperty(){return property(`icon`,spaceBetween(print(`icon`),print()))}const ps=zodOp(Ca)(lines(property(`shape`),colorProperty(),iconProperty(),property(`iconColor`),property(`iconSize`),property(`iconPosition`),property(`border`),opacityProperty(),property(`size`),property(`padding`),property(`textSize`),property(`multiple`)));function relationConnector(e,t){let r=t?`<->`:`->`;return e?`-[${e}]${r}`:r}function appendSelector(e,t){if(t)switch(t){case`children`:e.append(`.*`);break;case`descendants`:e.append(`.**`);break;case`expanded`:e.append(`._`);break;default:W(t)}return e}const ms=zodOp(Ma)(function whereTagEqualOp({ctx:{tag:e},out:t}){if(`eq`in e)return t.appendTemplate`tag is #${e.eq}`;if(`neq`in e)return t.appendTemplate`tag is not #${e.neq}`;W(e)}),hs=zodOp(Na)(function whereKindEqualOp({ctx:{kind:e},out:t}){if(`eq`in e)return t.appendTemplate`kind is ${e.eq}`;if(`neq`in e)return t.appendTemplate`kind is not ${e.neq}`;W(e)});function quoteMetadataValue(e){return e===`true`||e===`false`?e:`"${e}"`}const gs=zodOp(Pa)(function whereMetadataEqualOp({ctx:{metadata:e},out:t}){let{key:r,value:o}=e;if(o===void 0)return t.appendTemplate`metadata.${r}`;if(`eq`in o)return t.append(`metadata.${r} is ${quoteMetadataValue(o.eq)}`);if(`neq`in o)return t.append(`metadata.${r} is not ${quoteMetadataValue(o.neq)}`);W(o)}),_s=zodOp(Ra)(property(`not`,spaceBetween(print(`not (`),lazy(()=>xs()),print(`)`)))),vs=zodOp(Ia)(function whereParticipantOp({ctx:{participant:e,operator:t},out:r}){if(r.append(e,`.`),`tag`in t){ms()({ctx:t,out:r});return}if(`kind`in t){hs()({ctx:t,out:r});return}if(`metadata`in t){gs()({ctx:t,out:r});return}W(t)}),ys=zodOp(La)(function whereAndOp({ctx:{and:e},out:t}){let r=F(e,e=>{let{out:t}=executeOnFresh(e,xs());return`or`in e&&(t=fresh().out.append(`(`,...t.contents,`)`)),t});return t.append(Ne(r,{appendNewLineIfNotEmpty:!0,skipNewLineAfterLastItem:!0,prefix(e,t){return t>0?`and `:void 0}}))}),bs=zodOp(za)(({ctx:{or:e},out:t})=>{let r=F(e,e=>{let{out:t}=executeOnFresh(e,xs());return`and`in e&&(t=fresh().out.append(`(`,...t.contents,`)`)),t});return t.append(Ne(r,{appendNewLineIfNotEmpty:!0,skipNewLineAfterLastItem:!0,prefix(e,t){return t>0?`or `:void 0}}))}),xs=zodOp(Ba)(({ctx:e,exec:t})=>{if(`and`in e)return t(e,ys());if(`or`in e)return t(e,bs());if(`not`in e)return t(e,_s());if(`tag`in e)return t(e,ms());if(`kind`in e)return t(e,hs());if(`metadata`in e)return t(e,gs());if(`participant`in e)return t(e,vs());W(e)}),Ss=zodOp(Aa)(({ctx:e,out:t})=>(`model`in e?t.append(e.model):(t.append(e.deployment),e.element&&t.append(`.`,e.element)),t)),Cs=zodOp(Ga)(({ctx:e,out:t,exec:r})=>{if(`wildcard`in e)return t.append(`*`);if(`elementKind`in e)return t.append(`element.kind`).append(e.isEqual?` = `:` != `).append(e.elementKind);if(`elementTag`in e)return t.append(`element.tag`).append(e.isEqual?` = `:` != `).append(`#${e.elementTag}`);if(`ref`in e)return r(e.ref,Ss()),appendSelector(t,e.selector),t;W(e)}),ws=zodOp(Za)(({ctx:{custom:e},exec:t})=>{t(e.expr,Ts());let r=withctx(e)(body(`with`)(titleProperty(),descriptionProperty(),notationProperty(),notesProperty(),property(`navigateTo`),ps()));return`where`in e.expr?t({},indent(r)):t({},space(),r)}),Ts=zodOp(qa)(({ctx:e,exec:t})=>{if(`where`in e){t(e.where.expr,Cs()),t(e.where.condition,indent(print(`where`),indent(xs())));return}t(e,Cs())});zodOp(Qa)(({ctx:e,out:t})=>`custom`in e?ws()({ctx:e,out:t}):Ts()({ctx:e,out:t}));const Es=zodOp($a)(merge(property(`source`,Cs()),print(e=>e.isBidirectional?` <-> `:` -> `),property(`target`,Cs()))),Ds=zodOp(eo)(merge(print(`-> `),property(`incoming`,Cs()))),Os=zodOp(to)(merge(property(`outgoing`,Cs()),print(` ->`))),ks=zodOp(no)(merge(print(`-> `),property(`inout`,Cs()),print(` ->`))),As=zodOp(ro)(({ctx:e,exec:t})=>{if(`source`in e)return t(e,Es());if(`incoming`in e)return t(e,Ds());if(`outgoing`in e)return t(e,Os());if(`inout`in e)return t(e,ks());W(e)}),js=zodOp(io)(({ctx:e,out:t})=>`where`in e?merge(withctx(e.where.expr)(As()),indent(print(`where`),indent(withctx(e.where.condition)(xs()))))({ctx:e,out:t}):As()({ctx:e,out:t})),Ms=zodOp(ao)(({ctx:{customRelation:e},exec:t})=>{t(e.expr,js());let r=withctx(e)(body(`with`)(titleProperty(),descriptionProperty(),notationProperty(),markdownProperty(`notes`),property(`navigateTo`),ps(),property(`head`),property(`tail`),property(`line`)));`where`in e.expr?t({},indent(r)):t({},space(),r)});zodOp(oo)(({ctx:e,exec:t})=>`customRelation`in e?t(e,Ms()):t(e,js()));const Ns=zodOp(co)(({ctx:e,exec:t})=>{if(`custom`in e)return t(e,ws());if(`customRelation`in e)return t(e,Ms());if(`wildcard`in e||`ref`in e||`elementKind`in e||`elementTag`in e)return t(e,Cs());if(`source`in e||`incoming`in e||`outgoing`in e||`inout`in e)return t(e,As());if(`where`in e){let{expr:r,condition:o}=e.where;return`source`in r||`incoming`in r||`outgoing`in r||`inout`in r?t({where:{expr:r,condition:o}},js()):t({where:{expr:r,condition:o}},Ts())}W(e)});function buildTree$1(e){let t=new Map,r=[],o=R(e,wi);for(let e of o){let o;o=`element`in e?e:{...e,children:[]},t.set(e.id,o);let s=xi(e.id),c=s?t.get(s):void 0;c&&`children`in c?c.children.push(o):r.push(o)}return{roots:r,nodes:t,exists:e=>t.has(e)}}t(buildTree$1,`buildTree`);function hasStyleProps$1(e){return!en(e.style)}t(hasStyleProps$1,`hasStyleProps`);function hasElementProps$1(e){return!!(e.description||e.summary||e.technology||e.notation||e.tags&&e.tags.length>0||e.links&&e.links.length>0||!en(e.metadata)||hasStyleProps$1(e))}t(hasElementProps$1,`hasElementProps`);const Ps=zodOp(q.deployment.element)(lines(tagsProperty(),technologyProperty(),summaryProperty(),descriptionProperty(),linksProperty(),metadataProperty(),select(e=>hasStyleProps$1(e)?e.style:void 0,body(`style`)(ps())))),Fs=zodOp(q.deployment.instance)(spaceBetween(when(e=>_i(e.id)!==_i(e.element),print(e=>_i(e.id)),print(` =`)),print(`instanceOf`),printProperty(`element`),when(e=>!!e.title&&e.title!==_i(e.id),property(`title`,inlineText())),when(e=>hasElementProps$1(e),body(Ps()))));function node(){return function nodeOp({ctx:e,out:t}){let r=e;if(`element`in r)return Fs()({ctx:r,out:t}),{ctx:e,out:t};G(`children`in r,`Node must have children property`);let o=r.children.length>0||hasElementProps$1(r),s=_i(r.id),c=[print(s),print(`=`),print(r.kind)];return r.title&&r.title!==s&&c.push(inlineText(r.title)),o&&c.push(body(lines(2)(withctx(r,Ps()),...r.children.map(e=>withctx(e,nodeOp))))),spaceBetween(...c)({ctx:e,out:t})}}function hasRelationStyle$1(e){return!!(e.color||e.line||e.head||e.tail)}t(hasRelationStyle$1,`hasRelationStyle`);function hasRelationProps$1(e){return!!(e.description||e.summary||e.technology||e.tags&&e.tags.length>0||e.links&&e.links.length>0||!en(e.metadata)||hasRelationStyle$1(e)||e.navigateTo)}t(hasRelationProps$1,`hasRelationProps`);const Is=zodOp(q.deployment.relationship)(spaceBetween(property(`source`,Ss()),print(e=>relationConnector(e.kind,e.isBidirectional)),property(`target`,Ss()),property(`title`,inlineText()),when(hasRelationProps$1,body(tagsProperty(),technologyProperty(),summaryProperty(),descriptionProperty(),property(`navigateTo`),linksProperty(),metadataProperty(),when(hasRelationStyle$1,body(`style`)(colorProperty(),property(`line`),property(`head`),property(`tail`))))))),Ls=zodOp(q.deployment.schema)(body(`deployment`)(lines(2)(select(e=>buildTree$1(e.elements?Mn(e.elements):[]).roots,lines(2)(foreach(node()))),select(e=>e.relations?Mn(e.relations):void 0,lines(2)(foreach(Is()))))));function buildTree(e){let t=new Map,r=[],o=R(e,wi);for(let e of o){let o={...e,children:[]};t.set(e.id,o);let s=xi(e.id),c=s?t.get(s):void 0;c?c.children.push(o):r.push(o)}return{roots:r,nodes:t,exists:e=>t.has(e)}}function hasStyleProps(e){return!en(e.style)}function hasElementProps(e){return!!(e.description||e.summary||e.technology||e.notation||e.tags&&e.tags.length>0||e.links&&e.links.length>0||!en(e.metadata)||hasStyleProps(e))}const Rs=zodOp(q.model.element)(lines(tagsProperty(),technologyProperty(),summaryProperty(),descriptionProperty(),linksProperty(),metadataProperty(),select(e=>hasStyleProps(e)?e.style:void 0,body(`style`)(ps()))));function elementTree(){return function elementTreeNodeOp({ctx:e,out:t}){let r=e,o=(e.children?.length??0)>0||hasElementProps(r),s=_i(r.id),c=[print(s),print(`=`),print(r.kind)];return r.title&&r.title!==s&&c.push(inlineText(r.title)),o&&c.push(body(lines(2)(withctx(r,Rs()),...(e.children??[]).map(e=>withctx(e,elementTree()))))),spaceBetween(...c)({ctx:e,out:t})}}function hasRelationStyle(e){return!!(e.color||e.line||e.head||e.tail)}function hasRelationProps(e){return!!(e.description||e.summary||e.technology||e.tags&&e.tags.length>0||e.links&&e.links.length>0||!en(e.metadata)||hasRelationStyle(e)||e.navigateTo)}const zs=zodOp(q.model.relationship)(spaceBetween(property(`source`,Ss()),print(e=>relationConnector(e.kind,e.isBidirectional)),property(`target`,Ss()),property(`title`,inlineText()),when(hasRelationProps,body(tagsProperty(),technologyProperty(),summaryProperty(),descriptionProperty(),property(`navigateTo`),linksProperty(),metadataProperty(),when(hasRelationStyle,body(`style`)(colorProperty(),property(`line`),property(`head`),property(`tail`)))))));zodOp(q.model.element)(elementTree());const Bs=zodOp(q.model.schema)(body(`model`)(lines(2)(select(e=>buildTree(e.elements?Mn(e.elements):[]).roots,lines(2)(foreach(elementTree()))),select(e=>e.relations?Mn(e.relations):void 0,lines(2)(foreach(zs())))))),Vs=zodOp(Ct([D(),Mo]))(spaceBetween(print(`tag`),printProperty(`0`),property(`1`,property(`color`,body(spaceBetween(print(`color`),print())))))),elementKind=e=>zodOp(Ct([D(),Ao]))(spaceBetween(print(e),printProperty(`0`),property(`1`,body(tagsProperty(),titleProperty(),summaryProperty(),descriptionProperty(),technologyProperty(),notationProperty(),linksProperty(),property(`style`,body(`style`)(ps())))))),Hs=zodOp(Ct([D(),jo]))(spaceBetween(print(`relationship`),printProperty(`0`),property(`1`,body(technologyProperty(),notationProperty(),colorProperty(),property(`line`),property(`head`),property(`tail`))))),Us=zodOp(No)(body(`specification`)(lines(2)(select(e=>e.elements&&nn(e.elements),foreachNewLine(elementKind(`element`)())),select(e=>e.deployments&&nn(e.deployments),foreachNewLine(elementKind(`deploymentNode`)())),select(e=>e.relationships&&nn(e.relationships),foreachNewLine(Hs())),select(e=>e.tags&&nn(e.tags),foreachNewLine(Vs()))))),viewTitleProperty=()=>property(`title`,spaceBetween(print(`title`),inlineText())),Ws=zodOp(q.views.viewRulePredicate)(({ctx:e,exec:t})=>{let r,o;if(`include`in e?(r=e.include,o=`include`):`exclude`in e&&(r=e.exclude,o=`exclude`),U(r&&o,`Invalid view rule predicate`),!M(r,1))return;let s=M(r,2),c=withctx(r)(foreach(Ns(),separateComma(s)));t(e,merge(print(o),...s?[indent(c)]:[space(),c]))}),Gs=zodOp(q.views.viewRuleStyle)(spaceBetween(print(`style`),property(`targets`,foreach(Ns(),separateComma())),body(`{`,`}`)(notationProperty(),property(`style`,ps())))),Ks=zodOp(q.views.viewRuleGroup)(({ctx:e,exec:t})=>{throw Error(`not implemented`)}),qs=zodOp(q.views.viewRuleGlobalStyle)(({ctx:e,exec:t})=>{throw Error(`not implemented`)}),Js=zodOp(q.views.viewRuleGlobalPredicate)(({ctx:e,exec:t})=>{throw Error(`not implemented`)}),Ys={TB:`TopBottom`,BT:`BottomTop`,LR:`LeftRight`,RL:`RightLeft`},Xs=zodOp(q.views.viewRuleAutoLayout)(spaceBetween(print(`autoLayout`),property(`direction`,print(e=>Ys[e])),guard(Vr(`rankSep`),spaceBetween(printProperty(`rankSep`),printProperty(`nodeSep`))))),Zs=zodOp(q.views.deploymentViewRuleIncludeAncestors)(spaceBetween(print(`includeAncestors`),printProperty(`includeAncestors`))),Qs=zodOp(q.views.viewRuleRank)(({ctx:e,exec:t})=>{throw Error(`not implemented`)}),$s=zodOp(q.views.elementViewRule)(({ctx:e,exec:t})=>{if(`include`in e||`exclude`in e)return t(e,Ws());if(`groupRules`in e)return t(e,Ks());if(`rank`in e)return t(e,Qs());if(`direction`in e)return t(e,Xs());if(`styleId`in e)return t(e,qs());if(`predicateId`in e)return t(e,Js());if(`targets`in e&&`style`in e)return t(e,Gs());W(e)}),ec=zodOp(q.views.elementView.partial({_type:!0}))(spaceBetween(print(`view`),print(e=>e.id),property(`viewOf`,spaceBetween(print(`of`),print())),body(lines(2)(lines(tagsProperty(),viewTitleProperty(),property(`order`),descriptionProperty(),linksProperty()),property(`rules`,foreachNewLine($s())))))),tc=zodOp(q.views.deploymentViewRule)(({ctx:e,exec:t})=>{if(`include`in e||`exclude`in e)return t(e,Ws());if(`includeAncestors`in e)return t(e,Zs());if(`direction`in e)return t(e,Xs());if(`styleId`in e)return t(e,qs());if(`predicateId`in e)return t(e,Js());if(`targets`in e&&`style`in e)return t(e,Gs());W(e)}),nc=zodOp(q.views.deploymentView.partial({_type:!0}))(spaceBetween(print(`deployment view`),print(e=>e.id),body(lines(2)(lines(tagsProperty(),viewTitleProperty(),property(`order`),descriptionProperty(),linksProperty()),property(`rules`,foreachNewLine(tc())))))),rc=zodOp(q.views.dynamicStep.partial({source:!0}))(spaceBetween(print(e=>e.isBackward?`<-`:e.kind?`-[${e.kind}]->`:`->`),printProperty(`target`),property(`title`,text()),body(lines(technologyProperty(),descriptionProperty(),notesProperty(),property(`navigateTo`),notationProperty(),colorProperty(),property(`line`),property(`head`),property(`tail`))))),ic=zodOp(q.views.dynamicStep)(spaceBetween(printProperty(`source`),rc())),bodyWithSteps=()=>property(`steps`,body(foreachNewLine(lazy(()=>uc())))),ac=zodOp(q.views.dynamicStepBlock)(spaceBetween(printProperty(`_type`),property(`title`,text()),bodyWithSteps())),oc=zodOp(q.views.dynamicStepSeries)(merge(select(e=>e.steps[0],printProperty(`source`)),indent(property(`steps`,foreachNewLine(rc()))))),sc=zodOp(q.views.dynamicStepTry)(spaceBetween(select(e=>e.try,spaceBetween(print(`try`),property(`title`,text()),bodyWithSteps())),select(e=>e.catch,spaceBetween(print(`catch`),property(`title`,text()),bodyWithSteps())),select(e=>e.finally,spaceBetween(print(`finally`),property(`title`,text()),bodyWithSteps())))),cc=zodOp(q.views.dynamicStepAltBranch)(spaceBetween(printProperty(`_type`),property(`title`,text()),bodyWithSteps())),lc=zodOp(q.views.dynamicStepAlt)(spaceBetween(print(`alt`),property(`title`,text()),body(property(`branches`,foreachNewLine(cc()))))),uc=zodOp(q.views.dynamicViewStep)(({ctx:e,exec:t})=>{if(e.source&&e.target)return t(e,ic());switch(U(e._type,`Step must have a type`),e._type){case`loop`:case`opt`:case`break`:case`par`:return t(e,ac());case`alt`:return t(e,lc());case`series`:return t(e,oc());case`try`:return t(e,sc());default:W(e)}}),dc={single:ic,block:ac,alt:lc,series:oc,try:sc,any:uc},fc=zodOp(q.views.dynamicViewIncludeRule)(({ctx:e,exec:t})=>{if(!M(e.include,1))return;let r=M(e.include,2),o=withctx(e.include)(foreach(Ns(),separateComma(r)));t(e,merge(print(`include`),...r?[indent(o)]:[space(),o]))}),pc=zodOp(q.views.dynamicViewRule)(({ctx:e,exec:t})=>{if(`include`in e)return t(e,fc());if(`predicateId`in e)return t(e,Js());if(`targets`in e&&`style`in e)return t(e,Gs());if(`styleId`in e)return t(e,qs());if(`direction`in e)return t(e,Xs());W(e)}),mc=zodOp(q.views.dynamicView.partial({_type:!0}))(spaceBetween(print(`dynamic view`),print(e=>e.id),body(lines(2)(lines(tagsProperty(),viewTitleProperty(),property(`order`),descriptionProperty(),linksProperty(),property(`variant`)),property(`steps`,foreachNewLine(dc.any())),property(`rules`,foreachNewLine(pc())))))),hc=zodOp(q.views.anyView)(({ctx:e,exec:t})=>{if(`_type`in e){if(e._type==`element`)return t(e,ec());if(e._type===`deployment`)return t(e,nc());if(e._type===`dynamic`)return t(e,mc())}W(e)}),gc=zodOp(q.views.views)(body(`views`)(select(e=>Mn(e),foreach(hc(),{separator:new je().appendNewLine().appendNewLine(),prefix:(e,t,r)=>t===0&&!r?ea:void 0})))),_c=zodOp(q.likec4data)(lines(2)(property(`specification`,Us()),Bs(),property(`deployment`,Ls()),property(`deployments`,Ls()),property(`views`,gc())));function generateLikeC4(e,t){return t={indentation:2,...t},materialize(withctx(e,_c()),t.indentation)}function printOperation(e,t,r){return materialize(withctx(t??{},e),r?.indentation)}const vc=t(e=>e.severity===1,`isErrorDiagnostic`);var LikeC4=class{langium;logger;constructor(e,t=K){this.langium=e,this.logger=t}get workspace(){return this.langium.shared.workspace.WorkspaceManager.workspaceUri.fsPath}get workspaceURI(){return this.langium.shared.workspace.WorkspaceManager.workspaceUri}get workspaceURL(){return this.langium.shared.workspace.WorkspaceManager.workspaceURL}get languageServices(){return this.langium.likec4.likec4.LanguageServices}get projectsManager(){return this.langium.shared.workspace.ProjectsManager}get viewsService(){return this.langium.likec4.likec4.Views}get modelBuilder(){return this.langium.likec4.likec4.ModelBuilder}get LangiumDocuments(){return this.langium.shared.workspace.LangiumDocuments}ensureSingleProject(){let e=this.languageServices.projects();if(e.length>1)throw this.logger.error(`Multiple projects found:
15
13
  ${e.map(e=>` - ${e.folder.fsPath}`).join(`
16
14
  `)}
17
15
 
18
- Please specify a project folder`),Error(`Multiple projects found`)}async diagrams(e){let t=this.projectsManager.ensureProjectId(e);return await this.viewsService.diagrams(t)}syncComputedModel(e){let t=this.projectsManager.ensureProjectId(e);return this.modelBuilder.unsafeSyncComputeModel(t)}async computedModel(e){let t=this.projectsManager.ensureProjectId(e);return await this.modelBuilder.computeModel(t)}async parsedModel(e){let t=this.projectsManager.ensureProjectId(e),r=await this.modelBuilder.parseModel(t);if(!r)throw Error(`Failed to parse model for project "${t}"`);return r}async toBuilder(e=`editable`,t){let r=await this.parsedModel(t);return wr.fromParsed(r.$data,e)}async toTypedBuilder(e){let{specification:t,mode:r=`editable`,project:o}=e,s=await this.parsedModel(o);return Tr(t,s.$data.specification),wr.fromParsed(s.$data,r)}async toDSL(e){return generateLikeC4((await this.parsedModel(e)).$data)}projects(){return N(this.languageServices.projects(),Pn(`id`))}async layoutedModel(e){let t=this.projectsManager.ensureProjectId(e);return await this.languageServices.layoutedModel(t)}getErrors(){return[...this.LangiumDocuments.userDocuments].flatMap(e=>(e.diagnostics?.filter(gc)??[]).map(({message:t,range:r})=>({message:t,line:r.start.line,range:r,sourceFsPath:e.uri.fsPath})))}hasErrors(){return this.LangiumDocuments.userDocuments.some(e=>e.diagnostics&&e.diagnostics.some(gc))}printErrors(){let e=!1;for(let t of this.LangiumDocuments.userDocuments){let r=t.diagnostics?.filter(gc)??[];if(!A(r,1))continue;e=!0;let o=I(r,Qt(e=>{let t=e.range.start.line,r=e.message.split(`
19
- `);return r.length>5&&(r.length=5,r.push(`...`)),r.map((e,r)=>r===0?` `+Zi.dim(`Line ${t}: `)+Zi.red(e):` `.repeat(10)+Zi.red(e))}),Wt(`
20
- `));this.logger.error(`Invalid ${t.uri.fsPath}\n${o}`)}return e}documentCount(){return[...this.LangiumDocuments.userDocuments].length}documentPaths(){return[...this.LangiumDocuments.userDocuments].map(e=>e.uri.fsPath)}onModelUpdate(e){let t=this.modelBuilder.onModelParsed(t=>e(t));return()=>{t.dispose()}}async format(e){let{projects:t,...r}=e??{},o={...r,...t&&{projectIds:t.map(e=>this.projectsManager.ensureProjectId(e))}};return await this.languageServices.format(o)}async dispose(){await this.languageServices.dispose()}async[Symbol.asyncDispose](){await this.dispose()}};const _c={printErrors:!0,throwIfInvalid:!1,graphviz:`wasm`,configureLogger:!1,logLevel:void 0},validationErrorsToError=e=>Error(`Invalid model:\n${e.getErrors().map(e=>` ${e.sourceFsPath}:${e.line} ${e.message.slice(0,200)}`).join(`
21
- `)}`);async function handleInitOptions(e,t=W,r){let o=new LikeC4(e,t),s=r?.throwIfInvalid??_c.throwIfInvalid,c=r?.printErrors??_c.printErrors;if((s||c)&&o.hasErrors()){if(s)return await o.dispose(),Promise.reject(validationErrorsToError(o));o.printErrors()}return o}async function createFromSources(e,t,r,o){let s=x.from({scheme:`virtual`,path:`/workspace`}),c={name:`virtual`,uri:s.toString()},u=e.shared.workspace.WorkspaceManager;u.initialize({capabilities:{},processId:null,rootUri:c.uri,workspaceFolders:[c]}),await u.initializeWorkspace([c]);let d=e.shared.ServiceRegistry.all.flatMap(e=>e.LanguageMetaData.fileExtensions),[p,m]=kn(rn(r),([e])=>It(e));for(let[r,o]of p){let c=C.joinPath(s,r);try{await e.shared.workspace.ProjectsManager.registerProject({configUri:c,config:Nt.parse(o)})}catch(e){t.error(loggable(e))}}let h=I(m,N(([t,r])=>{d.includes(Vt(t))||(t+=`.c4`);let o=C.joinPath(s,t);return e.shared.workspace.LangiumDocuments.createDocument(o,r)}));return await e.shared.workspace.DocumentBuilder.build(h,{validation:!0}),handleInitOptions(e,t,o)}const K=new Proxy(Object.freeze({}),{get:(e,t)=>t});function f(e,t){return(...r)=>{let o=e?this.Digraph:this.Graph,s=r.find(e=>typeof e==`string`),c=r.find(e=>typeof e==`object`),u=r.find(e=>typeof e==`function`),d=new o(s,t,c);return d.with(this),typeof u==`function`&&u(d),d}}function n(e,t=Vn){return Object.freeze({digraph:f.call(t,!0,e),graph:f.call(t,!1,e)})}const vc=n(!1),yc=vc.digraph;vc.graph,n(!0);function O(e,t){let r=Hn(e,t?.convert);return Bn(r,t?.print)}zn()
16
+ Please specify a project folder`),Error(`Multiple projects found`)}async diagrams(e){let t=this.projectsManager.ensureProjectId(e);return await this.viewsService.diagrams(t)}syncComputedModel(e){let t=this.projectsManager.ensureProjectId(e);return this.modelBuilder.unsafeSyncComputeModel(t)}async computedModel(e){let t=this.projectsManager.ensureProjectId(e);return await this.modelBuilder.computeModel(t)}async parsedModel(e){let t=this.projectsManager.ensureProjectId(e),r=await this.modelBuilder.parseModel(t);if(!r)throw Error(`Failed to parse model for project "${t}"`);return r}async toBuilder(e=`editable`,t){let r=await this.parsedModel(t);return Cr.fromParsed(r.$data,e)}async toTypedBuilder(e){let{specification:t,mode:r=`editable`,project:o}=e,s=await this.parsedModel(o);return wr(t,s.$data.specification),Cr.fromParsed(s.$data,r)}async toDSL(e){return generateLikeC4((await this.parsedModel(e)).$data)}projects(){return F(this.languageServices.projects(),Nn(`id`))}async layoutedModel(e){let t=this.projectsManager.ensureProjectId(e);return await this.languageServices.layoutedModel(t)}getErrors(){return[...this.LangiumDocuments.userDocuments].flatMap(e=>(e.diagnostics?.filter(vc)??[]).map(({message:t,range:r})=>({message:t,line:r.start.line,range:r,sourceFsPath:e.uri.fsPath})))}hasErrors(){return this.LangiumDocuments.userDocuments.some(e=>e.diagnostics&&e.diagnostics.some(vc))}printErrors(){let e=!1;for(let t of this.LangiumDocuments.userDocuments){let r=t.diagnostics?.filter(vc)??[];if(!M(r,1))continue;e=!0;let o=R(r,Zt(e=>{let t=e.range.start.line,r=e.message.split(`
17
+ `);return r.length>5&&(r.length=5,r.push(`...`)),r.map((e,r)=>r===0?` `+$i.dim(`Line ${t}: `)+$i.red(e):` `.repeat(10)+$i.red(e))}),Ut(`
18
+ `));this.logger.error(`Invalid ${t.uri.fsPath}\n${o}`)}return e}documentCount(){return[...this.LangiumDocuments.userDocuments].length}documentPaths(){return[...this.LangiumDocuments.userDocuments].map(e=>e.uri.fsPath)}onModelUpdate(e){let t=this.modelBuilder.onModelParsed(t=>e(t));return()=>{t.dispose()}}async format(e){let{projects:t,...r}=e??{},o={...r,...t&&{projectIds:t.map(e=>this.projectsManager.ensureProjectId(e))}};return await this.languageServices.format(o)}async dispose(){await this.languageServices.dispose()}async[Symbol.asyncDispose](){await this.dispose()}};const yc={printErrors:!0,throwIfInvalid:!1,graphviz:`wasm`,configureLogger:!1,logLevel:void 0},validationErrorsToError=e=>Error(`Invalid model:\n${e.getErrors().map(e=>` ${e.sourceFsPath}:${e.line} ${e.message.slice(0,200)}`).join(`
19
+ `)}`);async function handleInitOptions(e,t=K,r){let o=new LikeC4(e,t),s=r?.throwIfInvalid??yc.throwIfInvalid,c=r?.printErrors??yc.printErrors;if((s||c)&&o.hasErrors()){if(s)return await o.dispose(),Promise.reject(validationErrorsToError(o));o.printErrors()}return o}async function createFromSources(e,t,r,o){let s=C.from({scheme:`virtual`,path:`/workspace`}),c={name:`virtual`,uri:s.toString()},u=e.shared.workspace.WorkspaceManager;u.initialize({capabilities:{},processId:null,rootUri:c.uri,workspaceFolders:[c]}),await u.initializeWorkspace([c]);let d=e.shared.ServiceRegistry.all.flatMap(e=>e.LanguageMetaData.fileExtensions),[p,m]=On(nn(r),([e])=>Ft(e));for(let[r,o]of p){let c=T.joinPath(s,r);try{await e.shared.workspace.ProjectsManager.registerProject({configUri:c,config:Mt.parse(o)})}catch(e){t.error(loggable(e))}}let h=R(m,F(([t,r])=>{d.includes(Bt(t))||(t+=`.c4`);let o=T.joinPath(s,t);return e.shared.workspace.LangiumDocuments.createDocument(o,r)}));return await e.shared.workspace.DocumentBuilder.build(h,{validation:!0}),handleInitOptions(e,t,o)}const J=new Proxy(Object.freeze({}),{get:(e,t)=>t});function f(e,t){return(...r)=>{let o=e?this.Digraph:this.Graph,s=r.find(e=>typeof e==`string`),c=r.find(e=>typeof e==`object`),u=r.find(e=>typeof e==`function`),d=new o(s,t,c);return d.with(this),typeof u==`function`&&u(d),d}}function n(e,t=Bn){return Object.freeze({digraph:f.call(t,!0,e),graph:f.call(t,!1,e)})}const bc=n(!1),xc=bc.digraph;bc.graph,n(!0);function O(e,t){let r=Vn(e,t?.convert);return zn(r,t?.print)}Rn()
22
20
  /*!
23
21
  * word-wrap <https://github.com/jonschlinkert/word-wrap>
24
22
  *
25
23
  * Copyright (c) 2014-2023, Jon Schlinkert.
26
24
  * Released under the MIT License.
27
25
  */
28
- ;var bc=e(o(((e,t)=>{function trimEnd(e){let t=e.length-1,r=e[t];for(;r===` `||r===` `;)r=e[--t];return e.substring(0,t+1)}function trimTabAndSpaces(e){return e.split(`
26
+ ;var Sc=e(o(((e,t)=>{function trimEnd(e){let t=e.length-1,r=e[t];for(;r===` `||r===` `;)r=e[--t];return e.substring(0,t+1)}function trimTabAndSpaces(e){return e.split(`
29
27
  `).map(e=>trimEnd(e)).join(`
30
28
  `)}t.exports=function(e,t){if(t||={},e==null)return e;var r=t.width||50,o=typeof t.indent==`string`?t.indent:` `,s=t.newline||`
31
29
  `+o,c=typeof t.escape==`function`?t.escape:identity,u=`.{1,`+r+`}`;t.cut!==!0&&(u+=`([\\s​]+|$)|[^\\s​]+?([\\s​]+|$)`);var d=new RegExp(u,`g`),p=o+(e.match(d)||[]).map(function(e){return e.slice(-1)===`
32
- `&&(e=e.slice(0,e.length-1)),c(e)}).join(s);return t.trim===!0&&(p=trimTabAndSpaces(p)),p};function identity(e){return e}}))(),1);function isCompound(e){return e.children.length>0}function toArrowType(e){switch(e){case`open`:return`vee`;default:return e}}function pointToPx(e){return Array.isArray(e)?[pointToPx(e[0]),pointToPx(e[1])]:(U(isFinite(e),`Invalid not finite point value ${e}`),Math.round(e))}const inchToPx=e=>(U(isFinite(e),`Invalid not finite inch value ${e}`),Math.floor(e*72)),pxToInch=e=>Math.ceil(e/72*1e3)/1e3,pxToPoints=e=>Math.ceil(e);pxToPoints(40).toString();function compoundColor(e,t){return Wn(Gn(e,{l:-35-5*t,s:-15-5*t}))}function compoundLabelColor(e){return Wn(Un(e,.3))}function sanitize(e){return e.trim().replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`)}function wrap(e,{maxchars:t,maxLines:r,sanitize:o=Rn()}){let s=(0,bc.default)(e,{width:t,indent:``,escape:o}).split(`
33
- `);return qt(r)&&r>0&&s.length>r&&(s=s.slice(0,r)),s}function wrapWithFont({text:e,maxchars:t,fontsize:r,maxLines:o,bold:s,color:c}){let u=wrap(e,{maxchars:t,maxLines:o,sanitize}).join(`<BR/>`);s&&(u=`<B>${u}</B>`);let d=c?` COLOR="${c}"`:``;return`<FONT POINT-SIZE="${pxToPoints(r)}"${d}>${u}</FONT>`}function maxchars(e){switch(e){case`xs`:case`sm`:return 30;case`md`:return 40;case`lg`:case`xl`:return 55;default:yi(e)}}function nodeLabel(e,t){let{sizes:{size:r},values:o}=t.nodeSizes(e.style),s=t.colors(e.color).elements,c=[`sm`,`xs`].includes(r),u=L(e.icon),d=e.style.iconPosition??`left`,p=u&&(d===`left`||d===`right`),m=[wrapWithFont({text:e.title,fontsize:o.textSize,maxchars:maxchars(r),maxLines:c?1:3})];if(r!==`xs`){L(e.technology?.trim())&&m.push(wrapWithFont({text:e.technology,fontsize:Math.ceil(o.textSize*.65),maxchars:p?35:45,maxLines:1,color:s.loContrast}));let t=Nr.from(e.description).text;t&&m.push(wrapWithFont({text:t,fontsize:Math.ceil(o.textSize*.75),maxchars:p?35:45,maxLines:c?3:5,color:s.loContrast}))}if(m.length===1&&u===!1)return`<${m[0]}>`;let h=p?(t,r,s)=>{let c=`<TD ALIGN="TEXT" BALIGN="LEFT">${t}</TD>`;if(r===0){let t=s.length>1?` ROWSPAN="${s.length}"`:``,r=Math.ceil(o.iconSize+16);(e.shape===`queue`||e.shape===`mobile`)&&(r+=20),d===`right`?(c=`<TD${t} WIDTH="16"> </TD>${c}`,c=`${c}<TD${t} WIDTH="${r}"> </TD>`):(c=`<TD${t} WIDTH="${r}"> </TD>${c}`,c=`${c}<TD${t} WIDTH="16"> </TD>`)}return`<TR>${c}</TR>`}:e=>`<TR><TD>${e}</TD></TR>`,g=m.map(h).join(``);if(u&&(d===`top`||d===`bottom`)){let e=`<TR><TD HEIGHT="${Math.ceil(o.iconSize+8)}"> </TD></TR>`;g=d===`top`?`${e}${g}`:`${g}${e}`}return`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="4">${g}</TABLE>>`}function compoundLabel(e,t){let r=wrapWithFont({text:e.title.toUpperCase(),maxchars:50,fontsize:11,maxLines:1,bold:!0,color:t});return r.includes(`<BR/>`)?`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR><TD ALIGN="TEXT" BALIGN="LEFT">${r}</TD></TR></TABLE>>`:`<${r}>`}const xc=`BGCOLOR="${Ar.DEFAULT.relationshipColors.labelBg}A0"`;function edgelabel({label:e,technology:t}){let r=[];if(L(e?.trim())&&r.push(wrapWithFont({text:e,maxchars:40,fontsize:14,maxLines:5,bold:e===`[...]`})),L(t?.trim())&&r.push(wrapWithFont({text:`[ ${t} ]`,fontsize:12,maxLines:1,maxchars:40})),r.length===0)return null;let o=r.map(e=>`<TR><TD ALIGN="TEXT" BALIGN="LEFT">${e}</TD></TR>`).join(``);return`<<TABLE BORDER="0" CELLPADDING="3" CELLSPACING="0" ${xc}>${o}</TABLE>>`}function stepEdgeLabel(e,t){let r=`<TABLE BORDER="0" CELLPADDING="6" ${xc}><TR><TD WIDTH="20" HEIGHT="20"><FONT POINT-SIZE="${pxToPoints(14)}"><B>${e}</B></FONT></TD></TR></TABLE>`;return L(t?.trim())?`<${[`<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">`,`<TR>`,`<TD>${r}</TD>`,`<TD ${xc} CELLPADDING="3">`,wrapWithFont({text:t,maxchars:40,fontsize:14,maxLines:5}),`</TD>`,`</TR>`,`</TABLE>`].join(``)}>`:`<${r}>`}const Sc=`Arial`,Cc=createLogger(`dot`);var DotPrinter=class{view;styles;ids=new Set;subgraphs=new Map;nodes=new Map;edges=new Map;compoundIds;edgesWithCompounds;viewNodes=new ii(e=>vi(this.view.nodes.find(t=>t.id===e),`Node ${e} not found`));logger=Cc;graphology=new Oi({allowSelfLoops:!0,multi:!0,type:`directed`});G;constructor(e,t){this.view=e,this.styles=t,this.compoundIds=new Set(e.nodes.filter(isCompound).map(e=>e.id)),this.edgesWithCompounds=new Set(this.compoundIds.size>0?e.edges.filter(e=>this.compoundIds.has(e.source)||this.compoundIds.has(e.target)).map(e=>e.id):[]);for(let t of e.nodes)this.graphology.addNode(t.id,{origin:t,level:t.level,depth:t.depth??0,modelRef:t.modelRef??null,deploymentRef:t.deploymentRef??null,maxConnectedHierarchyDistance:0});for(let t of e.edges){let e=this.graphology.getNodeAttribute(t.source,`deploymentRef`),r=this.graphology.getNodeAttribute(t.target,`deploymentRef`);(e===null||r===null)&&(e=this.graphology.getNodeAttribute(t.source,`modelRef`),r=this.graphology.getNodeAttribute(t.target,`modelRef`));let o=-1;e!==null&&r!==null&&(o=fi(e,r)),this.graphology.addEdgeWithKey(t.id,t.source,t.target,{origin:t,hierarchyDistance:o,weight:1}),o>this.graphology.getNodeAttribute(t.source,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.source,{maxConnectedHierarchyDistance:o}),o>this.graphology.getNodeAttribute(t.target,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.target,{maxConnectedHierarchyDistance:o})}this.graphology.forEachEdge((e,{hierarchyDistance:t},r,o,s,c)=>{let u=Math.max(s.maxConnectedHierarchyDistance,c.maxConnectedHierarchyDistance);if(u>t)this.graphology.mergeEdgeAttributes(e,{weight:u-t+1});else{let s=this.graphology.directedDegree(r),c=this.graphology.directedDegree(o);s===1&&c===1&&t>1&&this.graphology.mergeEdgeAttributes(e,{weight:t})}});let r=this.G=this.createGraph();this.applyNodeAttributes(r.attributes.node),this.applyEdgeAttributes(r.attributes.edge)}get $defaults(){return this.styles.defaults}get hasEdgesWithCompounds(){return this.edgesWithCompounds.size>0}get defaultRelationshipColors(){let e=this.styles.relationshipColors;return{line:e.line,label:e.label,labelBg:e.labelBg}}postBuild(e){}selectViewNodes(){return this.view.nodes}selectViewEdges(){return this.view.edges}build(){let e=this.G,t=[];for(let r of this.selectViewNodes())if(isCompound(r))F(r.parent)&&t.push(r);else{let t=this.generateGraphvizId(r),o=this.elementToNode(r,e.node(t));this.nodes.set(r.id,o)}let traverseClusters=(e,t)=>{let r=this.generateGraphvizId(e),o=this.elementToSubgraph(e,t.subgraph(r));this.subgraphs.set(e.id,o);for(let t of e.children){let e=this.computedNode(t);if(isCompound(e))traverseClusters(e,o);else{let t=this.getGraphNode(e.id);t&&o.node(t.id)}}};for(let r of t)traverseClusters(r,e);for(let t of this.selectViewEdges()){let r=this.addEdge(t,e);r&&this.edges.set(t.id,r)}return this}print(){return this.build(),this.postBuild(this.G),O(this.G,{print:{indentStyle:`space`,indentSize:2}})}enableNewRankIfNeeded(){return this.G.subgraphs.some(e=>!!e.get(K.rank))&&this.G.set(K.newrank,!0),this}createGraph(){let e=this.view.autoLayout,t=e.direction,r=yc({[K.likec4_viewId]:this.view.id,[K.bgcolor]:`transparent`,[K.layout]:`dot`,[K.compound]:!0,[K.rankdir]:t,[K.TBbalance]:`min`,[K.splines]:`spline`,[K.outputorder]:`nodesfirst`,[K.nodesep]:pxToInch(e.nodeSep??110),[K.ranksep]:pxToInch(e.rankSep??120),[K.pad]:pxToInch(15),[K.fontname]:Sc});return r.attributes.graph.apply({[K.fontsize]:pxToPoints(this.styles.fontSize()),[K.labeljust]:t===`RL`?`r`:`l`,[K.labelloc]:t===`BT`?`b`:`t`,[K.margin]:50.1}),r}applyNodeAttributes(e){let t=this.styles.elementColors;e.apply({[K.fontname]:Sc,[K.shape]:`rect`,[K.fillcolor]:t.fill,[K.fontcolor]:t.hiContrast,[K.color]:t.stroke,[K.style]:`filled`,[K.penwidth]:0})}applyEdgeAttributes(e){let t=this.defaultRelationshipColors;e.apply({[K.arrowsize]:.75,[K.fontname]:Sc,[K.fontsize]:pxToPoints(14),[K.penwidth]:pxToPoints(2),[K.color]:t.line,[K.fontcolor]:t.label,[K.style]:this.$defaults.relationship.line})}reserveNodeId(e,t=!1){return t?e=`cluster_`+e:e.toLowerCase().startsWith(`cluster`)&&(e=`nd_`+e),!this.ids.has(e)&&(this.ids.add(e),e)}generateGraphvizId(e){let t=isCompound(e),r=_i(e.id).toLowerCase(),o=this.reserveNodeId(r,t),s=1;for(;o===!1;)o=this.reserveNodeId(r+`_`+s++,t);return o}elementToSubgraph(e,t){U(isCompound(e),`node should be compound`),U(nn(e.depth),`node.depth should be defined`);let r=this.styles.colors(e.color).elements,o=compoundLabelColor(r.loContrast);return t.apply({[K.likec4_id]:e.id,[K.likec4_level]:e.level,[K.likec4_depth]:e.depth,[K.fillcolor]:compoundColor(r.fill,e.depth),[K.color]:compoundColor(r.stroke,e.depth),[K.style]:`filled`,[K.margin]:pxToPoints(e.children.length>1?40:32)}),j(e.title.trim())||t.set(K.label,compoundLabel(e,o)),t}elementToNode(e,t){U(!isCompound(e),`node should not be compound`);let r=L(e.icon),{values:{padding:o,sizes:{width:s,height:c}}}=this.styles.nodeSizes(e.style),u=r?8:o;if(t.attributes.apply({[K.likec4_id]:e.id,[K.likec4_level]:e.level,[K.label]:nodeLabel(e,this.styles),[K.margin]:`${pxToInch(u)},${pxToInch(o)}`}),t.attributes.set(K.width,pxToInch(s)),t.attributes.set(K.height,pxToInch(c)),!this.styles.isDefaultColor(e.color)){let r=this.styles.colors(e.color).elements;t.attributes.apply({[K.fillcolor]:r.fill,[K.fontcolor]:r.hiContrast,[K.color]:r.stroke})}switch(e.shape){case`cylinder`:case`storage`:t.attributes.apply({[K.margin]:`${pxToInch(u)},${pxToInch(0)}`,[K.penwidth]:pxToPoints(2),[K.shape]:`cylinder`});break;case`browser`:t.attributes.apply({[K.margin]:`${pxToInch(r?u:u+4)},${pxToInch(o+6)}`});break;case`mobile`:t.attributes.apply({[K.margin]:`${pxToInch(r?u:u+4)},${pxToInch(o)}`});break;case`queue`:t.attributes.apply({[K.width]:pxToInch(s),[K.height]:pxToInch(c-8),[K.margin]:`${pxToInch(r?u:u+4)},${pxToInch(o)}`});break;case`component`:t.attributes.apply({[K.width]:pxToInch(s+10),[K.margin]:`${pxToInch(u+20)},${pxToInch(o)}`})}return t}leafElements(e){return e===null?M([...this.selectViewNodes()],e=>!isCompound(e)):this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return isCompound(t)?this.leafElements(t.id):[t]})}descendants(e){return e===null?[...this.selectViewNodes()]:this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return[t,...this.descendants(t.id)]})}computedNode(e){return this.viewNodes.get(e)}getGraphNode(e){return this.nodes.get(e)??null}getSubgraph(e){return this.subgraphs.get(e)??null}edgeEndpoint(e,t){let r=this.computedNode(e),o=this.getGraphNode(e),s;return o?[r,o,void 0]:(U(isCompound(r),`endpoint node should be compound`),s=this.getSubgraph(e)?.id,U(s,`subgraph ${e} not found`),r=vi(t(this.leafElements(e)),`leaf element in ${e} not found`),o=vi(this.getGraphNode(r.id),`source graphviz node ${r.id} not found`),[r,o,s])}findInternalEdges(e){if(e===null)return this.view.edges.slice();let t=this.computedNode(e);return I(this.descendants(e),Qt(e=>En(e.inEdges,e.outEdges)),An(),_n(En(t.inEdges,t.outEdges)),N(e=>this.view.edges.find(t=>t.id===e)),M(L))}assignGroups(){let e=I(this.view.nodes,M(isCompound),N(e=>e.id),Dn(ci),Mn(),N(e=>({id:e,edges:this.findInternalEdges(e).filter(e=>e.source!==e.target&&!this.compoundIds.has(e.source)&&!this.compoundIds.has(e.target))})),M(({edges:e})=>e.length>1&&e.length<8),pn(4)),t=new Set;for(let r of e){let e=r.edges.filter(e=>!t.has(e.source)&&!t.has(e.target));for(let o of e)try{let e=vi(this.getGraphNode(o.source),`Graphviz Node not found for ${o.source}`),s=vi(this.getGraphNode(o.target),`Graphviz Node not found for ${o.target}`);t.add(o.source),t.add(o.target),e.attributes.set(K.group,r.id),s.attributes.set(K.group,r.id)}catch(e){Cc.error(`Failed to assign group to edge ${o.id}`,{error:e})}}return this}},AiLayoutViewPrinter=class extends DotPrinter{aiHints;constructor(e,t,r){super(e,t),this.aiHints=r}createGraph(){let e=super.createGraph();return e.delete(K.TBbalance),e}selectViewNodes(){if(!this.aiHints.nodeOrder)return this.view.nodes;let e=[...this.view.nodes],t=[];for(let r of this.aiHints.nodeOrder){let o=e.findIndex(e=>e.id===r);o!==-1&&t.push(...e.splice(o,1))}return t.push(...e),t}selectViewEdges(){if(!this.aiHints.edgeOrder)return this.view.edges;let e=[...this.view.edges],t=[];for(let r of this.aiHints.edgeOrder){let o=e.findIndex(e=>e.id===r);o!==-1&&t.push(...e.splice(o,1))}return t.push(...e),t}postBuild(e){this.applyNodeRanks().addInvisibleEdges().enableNewRankIfNeeded()}applyNodeRanks(){let e=this.G;for(let t of this.aiHints.ranks){let r=[...new Set(t.nodes)].map(e=>this.getGraphNode(e)).filter(P);if(r.length===0||t.rank===`same`&&r.length===1)continue;let o=e.createSubgraph({[K.rank]:t.rank});for(let e of r)o.node(e.id)}return this}addEdge(e,t){let r=this.aiHints.reverseRank?.includes(e.id)??!1,[o,s]=r?[e.target,e.source]:[e.source,e.target],[,c,u]=this.edgeEndpoint(o,e=>In(e)),[,d,p]=this.edgeEndpoint(s,Zt),m=t.edge([c,d],{[K.likec4_id]:e.id});e.line&&e.line!==`dashed`&&m.attributes.set(K.style,e.line),p&&m.attributes.set(K.lhead,p),u&&m.attributes.set(K.ltail,u);let h=P(p)||P(u),g=edgelabel(e);if(g&&m.attributes.set(h?K.xlabel:K.label,g),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;m.attributes.apply({[K.color]:t.line,[K.fontcolor]:t.label})}let _=this.aiHints.edgeWeight[e.id];_!==void 0&&_!==1&&m.attributes.set(K.weight,_);let v=this.aiHints.edgeMinlen[e.id];return v!==void 0&&v!==1&&m.attributes.set(K.minlen,v),this.aiHints.excludeFromRanking?.includes(e.id)&&m.attributes.set(K.constraint,!1),r&&m.attributes.set(K.dir,`back`),m}addInvisibleEdges(){if(!this.aiHints.invisibleEdges)return this;let e=this.G;for(let{source:t,target:r,...o}of this.aiHints.invisibleEdges){let s=this.getGraphNode(t),c=this.getGraphNode(r);if(!s||!c)continue;let u=`invisible_${t}->${r}`;if(this.edges.has(u)){this.logger.trace`invisible edge ${t} -> ${r} already exists with id ${u}, skipping creation`;continue}this.graphology.addEdgeWithKey(u,t,r,{hierarchyDistance:0,origin:`invisible`,weight:o.weight??1});let d=e.edge([s,c],{[K.style]:`invis`});this.edges.set(u,d),o.minlen!==void 0&&o.minlen!==1&&d.attributes.set(K.minlen,o.minlen),o.weight!==void 0&&o.weight!==1&&d.attributes.set(K.weight,o.weight)}return this}reduceDefaultRankSeparation(){let e=this.view.autoLayout,t=this.G;return nn(e.rankSep)||!(rn(this.aiHints.edgeMinlen).some(([e,t])=>t>1)||(this.aiHints.invisibleEdges?.some(e=>e.minlen&&e.minlen>1)??!1))||t.set(K.ranksep,pxToInch(80)),this}},DeploymentViewPrinter=class extends DotPrinter{createGraph(){let e=super.createGraph(),t=this.view.autoLayout;return e.delete(K.TBbalance),e.apply({[K.nodesep]:pxToInch(t.nodeSep??130),[K.ranksep]:pxToInch(t.rankSep??130)}),e}postBuild(){let e=this.G;return I(this.view.nodes,N(e=>({node:e,graphvizNode:this.getGraphNode(e.id)})),Yt(({node:e,graphvizNode:t})=>{if(t!=null)return e.modelRef}),Nn(),N(e=>e),Jt(t=>{t.length<2||e.subgraph({[K.rank]:`same`},e=>{for(let{graphvizNode:r}of t)e.node(vi(r).id)})}),xn(()=>{e.set(K.newrank,!0),e.set(K.clusterrank,`global`),e.delete(K.pack),e.delete(K.packmode)})),this}elementToSubgraph(e,t){let r=super.elementToSubgraph(e,t);return e.children.length>1&&r.set(K.margin,pxToPoints(50)),r}addEdge(e,t){let[r,o]=[e.source,e.target],[s,c,u]=this.edgeEndpoint(r,e=>In(e)),[d,p,m]=this.edgeEndpoint(o,Zt),h=P(m)||P(u),g=t.edge([c,p],{[K.likec4_id]:e.id,[K.style]:e.line??`dashed`});m&&g.attributes.set(K.lhead,m),u&&g.attributes.set(K.ltail,u);let _=this.graphology.getEdgeAttribute(e.id,`weight`);_>1&&!this.graphology.hasDirectedEdge(e.target,e.source)&&g.attributes.set(K.weight,_);let v=edgelabel(e);if(v&&g.attributes.set(h?K.xlabel:K.label,v),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;g.attributes.apply({[K.color]:t.line,[K.fontcolor]:t.label})}let[y,b]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return y===`none`&&b===`none`?(g.attributes.apply({[K.arrowtail]:`none`,[K.arrowhead]:`none`,[K.dir]:`none`}),g):e.dir===`both`?(g.attributes.apply({[K.arrowhead]:toArrowType(y),[K.arrowtail]:toArrowType(e.tail??y),[K.dir]:`both`}),!h&&s.modelRef!==d.modelRef&&g.attributes.set(K.constraint,!1),g):(y&&g.attributes.set(K.arrowhead,toArrowType(y)),b!==`none`&&g.attributes.set(K.arrowtail,toArrowType(b)),g)}},DynamicViewPrinter=class extends DotPrinter{postBuild(e){e.delete(K.TBbalance),e.set(K.ordering,`in`)}addEdge(e,t){let{nodes:r}=this.view,[o,s]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[c,u,d]=this.edgeEndpoint(o,e=>In(e)),[p,m,h]=this.edgeEndpoint(s,Zt),g=t.edge([u,m],{[K.likec4_id]:e.id});if(e.line&&e.line!==this.$defaults.relationship.line&&g.attributes.set(K.style,e.line),h&&g.attributes.set(K.lhead,h),d&&g.attributes.set(K.ltail,d),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;g.attributes.apply({[K.color]:t.line,[K.fontcolor]:t.label})}let _=[e.label?.trim(),e.technology?.trim()].filter(L).join(`
34
- `),v=stepEdgeLabel(this.view.edges.indexOf(e),_);g.attributes.set(K.label,v);let y=r.findIndex(e=>e.id===o);r.findIndex(e=>e.id===s)<y&&e.dir!==`back`&&g.attributes.apply({[K.minlen]:0});let[b,ee]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return e.dir===`back`?(g.attributes.apply({[K.arrowtail]:toArrowType(b),[K.dir]:`back`}),ee!==`none`&&g.attributes.apply({[K.arrowhead]:toArrowType(ee),[K.minlen]:0}),g):b===`none`&&ee===`none`||b!==`none`&&ee!==`none`?(g.attributes.apply({[K.arrowhead]:toArrowType(b),[K.arrowtail]:toArrowType(ee),[K.dir]:`both`}),g):b===`none`?(g.attributes.delete(K.arrowhead),g.attributes.apply({[K.arrowtail]:toArrowType(ee),[K.minlen]:0,[K.dir]:`back`}),g):(g.attributes.set(K.arrowhead,toArrowType(b)),g)}};const wc=createLogger(`dot.rank`);var ElementViewPrinter=class extends DotPrinter{postBuild(){this.assignGroups().tileNodesWithoutEdges().applyExplicitRankBlocks().enableNewRankIfNeeded()}tileNodesWithoutEdges(){let e=new Set,t=this.view.nodes.reduce((t,r)=>(isCompound(r)&&(e.add(r.id),t.push(r)),t),[]);for(let e of t){let t=I(e.children,M(e=>!this.compoundIds.has(e)&&this.graphology.degree(e)===0),N(e=>this.computedNode(e)));if(t.length<=2)continue;let r=2;switch(!0){case t.length>11:r=4;break;case t.length>4:r=3}let o=vi(this.getSubgraph(e.id),`Subgraph not found for ${e.id}`),s=null;Sn(t,r).forEach(e=>{let t=e.length>1?o.createSubgraph({[K.rank]:`same`}):null;e.forEach((e,r)=>{let c=this.getGraphNode(e.id);c&&(t?.node(c.id),r===0&&(s&&o.edge([s,c],{[K.style]:`invis`}),s=c))})})}return this}applyExplicitRankBlocks(){let e=this.view.ranks??[];if(e.length===0)return this;let t=0;for(let r of e){let e=[...new Set(r.nodes)].map(e=>this.getGraphNode(e)).filter(e=>!!e);if(e.length===0)continue;let o=this.G.createSubgraph({[K.rank]:r.type});e.forEach(e=>o.node(e.id)),t+=1,wc.trace`rank ${r.type} => ${e.map(e=>e.id).join(`, `)}`}return t>0&&this.G.set(`likec4_rankBlocks`,t),this}addEdge(e,t){let[r,o]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[s,c,u]=this.edgeEndpoint(r,e=>In(e)),[d,p,m]=this.edgeEndpoint(o,Zt),h=e.parent,g=this.graphology.getEdgeAttributes(e.id),_=t.edge([c,p],{[K.likec4_id]:e.id});e.line&&e.line!==this.$defaults.relationship.line&&_.attributes.set(K.style,e.line),m&&_.attributes.set(K.lhead,m),u&&_.attributes.set(K.ltail,u);let v=P(m)||P(u),y=edgelabel(e);if(y&&_.attributes.set(v?K.xlabel:K.label,y),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;_.attributes.apply({[K.color]:t.line,[K.fontcolor]:t.label})}!this.graphology.hasDirectedEdge(e.target,e.source)&&g.weight>1&&_.attributes.set(K.weight,g.weight);let[b,ee]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];if(e.dir===`back`)return _.attributes.apply({[K.arrowtail]:toArrowType(b),[K.dir]:`back`}),ee!==`none`&&_.attributes.apply({[K.arrowhead]:toArrowType(ee),[K.dir]:`both`,[K.minlen]:0}),_;if(b===`none`&&ee===`none`)return _.attributes.apply({[K.arrowtail]:`none`,[K.arrowhead]:`none`,[K.dir]:`none`,[K.minlen]:0,[K.constraint]:!1}),_;if(b!==`none`&&ee!==`none`)return _.attributes.apply({[K.arrowhead]:toArrowType(b),[K.arrowtail]:toArrowType(ee),[K.dir]:`both`}),_;if(_.attributes.set(K.arrowhead,toArrowType(b)),ee!==`none`&&_.attributes.set(K.arrowtail,toArrowType(ee)),this.view.edges.length===1)return _;let te;return te=h===null&&s.parent==null&&d.parent==null?this.view.edges.filter(t=>{if(t.id===e.id||t.parent!==null||t.source===e.source&&t.target===e.target||t.source===e.target&&t.target===e.source)return!1;let r=this.computedNode(t.source),o=this.computedNode(t.target);return isCompound(r)||isCompound(o)?!1:r.parent==null&&o.parent==null}):this.findInternalEdges(h).filter(t=>!(t.id===e.id||t.source===e.source&&t.target===e.target||t.source===e.target&&t.target===e.source)),te.length===0&&(h===null||this.leafElements(h).length<=3)&&_.attributes.set(K.minlen,0),_}};function parseBB(e){let[t,r,o,s]=e?e.split(`,`).map(e=>pointToPx(+e)):[0,0,0,0],c=Math.round(o-t),u=Math.round(r-s);return{x:Math.round(t),y:Math.round(s),width:c,height:u}}function parsePos(e){try{let[t,r]=e.split(`,`);return{x:pointToPx(parseFloat(t)),y:pointToPx(parseFloat(r))}}catch(t){throw Error(`Failed on parsing pos: ${e}`,{cause:t})}}function parseNode(e){let{x:t,y:r}=parsePos(e.pos),o=inchToPx(parseFloat(e.width)),s=inchToPx(parseFloat(e.height));return{x:t-Math.round(o/2),y:r-Math.round(s/2),width:o,height:s}}function parseLabelBbox(e,[t,r]=[0,0]){if(!e||e.length===0)return null;let o=1/0,s=1/0,c=-1/0,u=-1/0,d=13;try{for(let p of e){if(p.op===`F`){d=pointToPx(p.size);continue}if(p.op===`T`){let e=pointToPx(p.pt[0])-t,m=pointToPx(p.width);switch(p.align){case`r`:e-=m;break;case`c`:e-=Math.round(m/2)}o=Math.min(o,e),c=Math.max(c,e+m);let h=pointToPx(p.pt[1])-r;s=Math.min(s,Math.round(h-d)),u=Math.max(u,h)}}}catch(t){return W.warn(`Failed on parsing label draw ops:
35
- {labelDrawOps}`,{e:t,labelDrawOps:e}),null}return o===1/0?null:{x:o-2,y:s-2,width:c-o+4,height:u-s+4}}function parseEdgePoints({_draw_:e,likec4_id:t=`???`},r=`<unknown view>`){try{let o=e.filter(e=>e.op.toLowerCase()===`b`);U(A(o,1),`view ${r} edge ${t} should have at least one bezier draw op`),o.length>1&&W.warn(`view ${r} edge ${t} has more than one bezier draw op, using the first one only`);let s=o[0].points.map(e=>pointToPx(e));return U(A(s,2),`view ${r} edge ${t} should have at least two points`),s}catch(o){throw Error(`failed on parsing view ${r} edge ${t} _draw_:\n${JSON.stringify(e,null,2)}`,{cause:o})}}function parseGraphvizEdge(e,{id:t,source:r,target:o,dir:s,label:c,description:u,...d},p){let m=parseLabelBbox(e._ldraw_??e._tldraw_??e._hldraw_),h=e.dir===`back`||s===`back`;return c=c&&m?wrap(c,{maxchars:40,maxLines:5}).join(`
36
- `):null,{id:t,source:r,target:o,label:c,...L(u)&&{description:u},points:parseEdgePoints(e,p),labelBBox:m,...h?{dir:`back`}:{},...d}}function parseGraphvizJson(e,t){let r=parseBB(e.bb),{nodes:o,edges:s,hasManualLayout:c,...u}=t,d=[],p=[],m;if(m=u._type===`dynamic`?{...u,sequenceLayout:{actors:[],compounds:[],parallelAreas:[],subflows:[],steps:[],bounds:r},[Fr]:`layouted`,bounds:r,nodes:d,edges:p}:{...u,[Fr]:`layouted`,bounds:r,nodes:d,edges:p},c){let e=m;e[Pr]=`auto`}let h=e.objects??[];for(let e of o){let t=h.find(t=>t.likec4_id===e.id);U(t,`View ${u.id} node ${e.id} not found in graphviz output`);try{let{x:r,y:o,width:s,height:c}=`bb`in t?parseBB(t.bb):parseNode(t),u=[r,o];d.push({...e,x:r,y:o,width:s,height:c,labelBBox:parseLabelBbox(t._ldraw_,u)??{x:r,y:o,width:s,height:c}})}catch(r){throw Error(`Failed on parsing node ${e.id}:\n${JSON.stringify(t,null,2)}`,{cause:r})}}let g=e.edges??[];for(let e of s){let t=g.find(t=>t.likec4_id===e.id);if(!t){W.warn`View ${u.id} edge ${e.id} not found in graphviz output, skipping`;continue}p.push(parseGraphvizEdge(t,e,u.id))}return m}function parseGraphvizJsonOfProjectsView(e,t){return parseGraphvizJson(e,t)}var Tc=class ProjectsViewPrinter extends DotPrinter{static toDot(e){return new ProjectsViewPrinter(e).print()}constructor(e){super(e,lr.DEFAULT)}createGraph(){let e=super.createGraph();return e.apply({[K.nodesep]:pxToInch(100),[K.ranksep]:pxToInch(100)}),e.delete(K.TBbalance),e}elementToNode(e,t){return t.attributes.apply({[K.likec4_id]:e.id,[K.likec4_project]:e.projectId}),super.elementToNode(e,t)}addEdge(e,t){let r=vi(this.getGraphNode(e.source),`Node not found for ${e.source}`),o=vi(this.getGraphNode(e.target),`Node not found for ${e.target}`),s=this.graphology.getEdgeAttributes(e.id),c=t.edge([r,o],{[K.likec4_id]:e.id,[K.likec4_project]:e.projectId});e.line&&e.line!==this.$defaults.relationship.line&&c.attributes.set(K.style,e.line),!this.graphology.hasDirectedEdge(e.target,e.source)&&s.weight>1&&c.attributes.set(K.weight,s.weight);let u=edgelabel(e);if(u&&c.attributes.set(K.label,u),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;c.attributes.apply({[K.color]:t.line,[K.fontcolor]:t.label})}return c}},Node=class{value;next;constructor(e){this.value=e}},Queue=class{#e;#t;#n;constructor(){this.clear()}enqueue(e){let t=new Node(e);this.#e?(this.#t.next=t,this.#t=t):(this.#e=t,this.#t=t),this.#n++}dequeue(){let e=this.#e;if(e)return this.#e=this.#e.next,this.#n--,this.#e||(this.#t=void 0),e.value}peek(){if(this.#e)return this.#e.value}clear(){this.#e=void 0,this.#t=void 0,this.#n=0}get size(){return this.#n}*[Symbol.iterator](){let e=this.#e;for(;e;)yield e.value,e=e.next}*drain(){for(;this.#e;)yield this.dequeue()}};function pLimit(e){let t=!1;if(typeof e==`object`&&({concurrency:e,rejectOnClear:t=!1}=e),validateConcurrency(e),typeof t!=`boolean`)throw TypeError("Expected `rejectOnClear` to be a boolean");let r=new Queue,o=0,resumeNext=()=>{o<e&&r.size>0&&(o++,r.dequeue().run())},next=()=>{o--,resumeNext()},run=async(e,t,r)=>{let o=(async()=>e(...r))();t(o);try{await o}catch{}next()},enqueue=(t,s,c,u)=>{let d={reject:c};new Promise(e=>{d.run=e,r.enqueue(d)}).then(run.bind(void 0,t,s,u)),o<e&&resumeNext()},generator=(e,...t)=>new Promise((r,o)=>{enqueue(e,r,o,t)});return Object.defineProperties(generator,{activeCount:{get:()=>o},pendingCount:{get:()=>r.size},clearQueue:{value(){if(!t){r.clear();return}let e=AbortSignal.abort().reason;for(;r.size>0;)r.dequeue().reject(e)}},concurrency:{get:()=>e,set(t){validateConcurrency(t),e=t,queueMicrotask(()=>{for(;o<e&&r.size>0;)resumeNext()})}},map:{async value(e,t){let r=Array.from(e,(e,r)=>generator(t,e,r));return Promise.all(r)}}}),generator}function validateConcurrency(e){if(!((Number.isInteger(e)||e===1/0)&&e>0))throw TypeError("Expected `concurrency` to be a number from 1 and up")}const Ec=pLimit(1);var Dc=class GraphvizWasmAdapter{static opsCount=0;get name(){return`wasm`}get concurrency(){return 1}dispose(){ki.unload()}[Symbol.dispose](){this.dispose()}async attempt(e,t,r){return await Ec(async()=>{let o=W.getChild([`layouter`,`wasm`,e,`_`,Cn(4).toLowerCase()]);try{o.trace`execute`;let e=await r();return++GraphvizWasmAdapter.opsCount>=20&&(GraphvizWasmAdapter.opsCount=0,o.trace`reached 20 operations, unloading wasm`,ki.unload()),e}catch(e){o.trace(`FAILED DOT
37
- `+t);let r=loggable(e);if(r.includes(`syntax error`))throw e;o.warn(r),GraphvizWasmAdapter.opsCount=0,ki.unload()}return o.warn(`Retrying...`),await di(30,300),await r()})}async unflatten(e){return await this.attempt(`unflatten`,e,async()=>(await ki.load()).unflatten(e,1,!1,3).replaceAll(/\t\[/g,` [`).replaceAll(/\t/g,` `))}async acyclic(e){return await this.attempt(`acyclic`,e,async()=>{let t=(await ki.load()).acyclic(e,!0);return t.acyclic&&t.outFile||e})}async layoutJson(e){return await this.attempt(`layout`,e,async()=>(await ki.load()).layout(e,`json`,void 0,{yInvert:!0}))}async svg(e){return await this.attempt(`svg`,e,async()=>(await ki.load()).layout(e,`svg`))}};const getPrinter=({view:e,styles:t})=>{switch(!0){case Jr(e):return new DynamicViewPrinter(e,t);case qr(e):return new DeploymentViewPrinter(e,t);case Yr(e):return new ElementViewPrinter(e,t);default:yi(e)}},Oc=W.getChild(`layouter`);function normalizeDot(e){return e.split(`
30
+ `&&(e=e.slice(0,e.length-1)),c(e)}).join(s);return t.trim===!0&&(p=trimTabAndSpaces(p)),p};function identity(e){return e}}))(),1);function isCompound(e){return e.children.length>0}function toArrowType(e){switch(e){case`open`:return`vee`;default:return e}}function pointToPx(e){return Array.isArray(e)?[pointToPx(e[0]),pointToPx(e[1])]:(G(isFinite(e),`Invalid not finite point value ${e}`),Math.round(e))}const inchToPx=e=>(G(isFinite(e),`Invalid not finite inch value ${e}`),Math.floor(e*72)),pxToInch=e=>Math.ceil(e/72*1e3)/1e3,pxToPoints=e=>Math.ceil(e);pxToPoints(40).toString();function compoundColor(e,t){return Un(Wn(e,{l:-35-5*t,s:-15-5*t}))}function compoundLabelColor(e){return Un(Hn(e,.3))}function sanitize(e){return e.trim().replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`)}function wrap(e,{maxchars:t,maxLines:r,sanitize:o=Ln()}){let s=(0,Sc.default)(e,{width:t,indent:``,escape:o}).split(`
31
+ `);return Kt(r)&&r>0&&s.length>r&&(s=s.slice(0,r)),s}function wrapWithFont({text:e,maxchars:t,fontsize:r,maxLines:o,bold:s,color:c}){let u=wrap(e,{maxchars:t,maxLines:o,sanitize}).join(`<BR/>`);s&&(u=`<B>${u}</B>`);let d=c?` COLOR="${c}"`:``;return`<FONT POINT-SIZE="${pxToPoints(r)}"${d}>${u}</FONT>`}function maxchars(e){switch(e){case`xs`:case`sm`:return 30;case`md`:return 40;case`lg`:case`xl`:return 55;default:yi(e)}}function nodeLabel(e,t){let{sizes:{size:r},values:o}=t.nodeSizes(e.style),s=t.colors(e.color).elements,c=[`sm`,`xs`].includes(r),u=z(e.icon),d=e.style.iconPosition??`left`,p=u&&(d===`left`||d===`right`),m=[wrapWithFont({text:e.title,fontsize:o.textSize,maxchars:maxchars(r),maxLines:c?1:3})];if(r!==`xs`){z(e.technology?.trim())&&m.push(wrapWithFont({text:e.technology,fontsize:Math.ceil(o.textSize*.65),maxchars:p?35:45,maxLines:1,color:s.loContrast}));let t=Mr.from(e.description).text;t&&m.push(wrapWithFont({text:t,fontsize:Math.ceil(o.textSize*.75),maxchars:p?35:45,maxLines:c?3:5,color:s.loContrast}))}if(m.length===1&&u===!1)return`<${m[0]}>`;let h=p?(t,r,s)=>{let c=`<TD ALIGN="TEXT" BALIGN="LEFT">${t}</TD>`;if(r===0){let t=s.length>1?` ROWSPAN="${s.length}"`:``,r=Math.ceil(o.iconSize+16);(e.shape===`queue`||e.shape===`mobile`)&&(r+=20),d===`right`?(c=`<TD${t} WIDTH="16"> </TD>${c}`,c=`${c}<TD${t} WIDTH="${r}"> </TD>`):(c=`<TD${t} WIDTH="${r}"> </TD>${c}`,c=`${c}<TD${t} WIDTH="16"> </TD>`)}return`<TR>${c}</TR>`}:e=>`<TR><TD>${e}</TD></TR>`,g=m.map(h).join(``);if(u&&(d===`top`||d===`bottom`)){let e=`<TR><TD HEIGHT="${Math.ceil(o.iconSize+8)}"> </TD></TR>`;g=d===`top`?`${e}${g}`:`${g}${e}`}return`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="4">${g}</TABLE>>`}function compoundLabel(e,t){let r=wrapWithFont({text:e.title.toUpperCase(),maxchars:50,fontsize:11,maxLines:1,bold:!0,color:t});return r.includes(`<BR/>`)?`<<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0"><TR><TD ALIGN="TEXT" BALIGN="LEFT">${r}</TD></TR></TABLE>>`:`<${r}>`}const Cc=`BGCOLOR="${kr.DEFAULT.relationshipColors.labelBg}A0"`;function edgelabel({label:e,technology:t}){let r=[];if(z(e?.trim())&&r.push(wrapWithFont({text:e,maxchars:40,fontsize:14,maxLines:5,bold:e===`[...]`})),z(t?.trim())&&r.push(wrapWithFont({text:`[ ${t} ]`,fontsize:12,maxLines:1,maxchars:40})),r.length===0)return null;let o=r.map(e=>`<TR><TD ALIGN="TEXT" BALIGN="LEFT">${e}</TD></TR>`).join(``);return`<<TABLE BORDER="0" CELLPADDING="3" CELLSPACING="0" ${Cc}>${o}</TABLE>>`}function stepEdgeLabel(e,t){let r=`<TABLE BORDER="0" CELLPADDING="6" ${Cc}><TR><TD WIDTH="20" HEIGHT="20"><FONT POINT-SIZE="${pxToPoints(14)}"><B>${e}</B></FONT></TD></TR></TABLE>`;return z(t?.trim())?`<${[`<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3">`,`<TR>`,`<TD>${r}</TD>`,`<TD ${Cc} CELLPADDING="3">`,wrapWithFont({text:t,maxchars:40,fontsize:14,maxLines:5}),`</TD>`,`</TR>`,`</TABLE>`].join(``)}>`:`<${r}>`}const wc=`Arial`,Tc=createLogger(`dot`);var DotPrinter=class{view;styles;ids=new Set;subgraphs=new Map;nodes=new Map;edges=new Map;compoundIds;edgesWithCompounds;viewNodes=new ii(e=>vi(this.view.nodes.find(t=>t.id===e),`Node ${e} not found`));logger=Tc;graphology=new Oi({allowSelfLoops:!0,multi:!0,type:`directed`});G;constructor(e,t){this.view=e,this.styles=t,this.compoundIds=new Set(e.nodes.filter(isCompound).map(e=>e.id)),this.edgesWithCompounds=new Set(this.compoundIds.size>0?e.edges.filter(e=>this.compoundIds.has(e.source)||this.compoundIds.has(e.target)).map(e=>e.id):[]);for(let t of e.nodes)this.graphology.addNode(t.id,{origin:t,level:t.level,depth:t.depth??0,modelRef:t.modelRef??null,deploymentRef:t.deploymentRef??null,maxConnectedHierarchyDistance:0});for(let t of e.edges){let e=this.graphology.getNodeAttribute(t.source,`deploymentRef`),r=this.graphology.getNodeAttribute(t.target,`deploymentRef`);(e===null||r===null)&&(e=this.graphology.getNodeAttribute(t.source,`modelRef`),r=this.graphology.getNodeAttribute(t.target,`modelRef`));let o=-1;e!==null&&r!==null&&(o=fi(e,r)),this.graphology.addEdgeWithKey(t.id,t.source,t.target,{origin:t,hierarchyDistance:o,weight:1}),o>this.graphology.getNodeAttribute(t.source,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.source,{maxConnectedHierarchyDistance:o}),o>this.graphology.getNodeAttribute(t.target,`maxConnectedHierarchyDistance`)&&this.graphology.mergeNodeAttributes(t.target,{maxConnectedHierarchyDistance:o})}this.graphology.forEachEdge((e,{hierarchyDistance:t},r,o,s,c)=>{let u=Math.max(s.maxConnectedHierarchyDistance,c.maxConnectedHierarchyDistance);if(u>t)this.graphology.mergeEdgeAttributes(e,{weight:u-t+1});else{let s=this.graphology.directedDegree(r),c=this.graphology.directedDegree(o);s===1&&c===1&&t>1&&this.graphology.mergeEdgeAttributes(e,{weight:t})}});let r=this.G=this.createGraph();this.applyNodeAttributes(r.attributes.node),this.applyEdgeAttributes(r.attributes.edge)}get $defaults(){return this.styles.defaults}get hasEdgesWithCompounds(){return this.edgesWithCompounds.size>0}get defaultRelationshipColors(){let e=this.styles.relationshipColors;return{line:e.line,label:e.label,labelBg:e.labelBg}}postBuild(e){}selectViewNodes(){return this.view.nodes}selectViewEdges(){return this.view.edges}build(){let e=this.G,t=[];for(let r of this.selectViewNodes())if(isCompound(r))L(r.parent)&&t.push(r);else{let t=this.generateGraphvizId(r),o=this.elementToNode(r,e.node(t));this.nodes.set(r.id,o)}let traverseClusters=(e,t)=>{let r=this.generateGraphvizId(e),o=this.elementToSubgraph(e,t.subgraph(r));this.subgraphs.set(e.id,o);for(let t of e.children){let e=this.computedNode(t);if(isCompound(e))traverseClusters(e,o);else{let t=this.getGraphNode(e.id);t&&o.node(t.id)}}};for(let r of t)traverseClusters(r,e);for(let t of this.selectViewEdges()){let r=this.addEdge(t,e);r&&this.edges.set(t.id,r)}return this}print(){return this.build(),this.postBuild(this.G),O(this.G,{print:{indentStyle:`space`,indentSize:2}})}enableNewRankIfNeeded(){return this.G.subgraphs.some(e=>!!e.get(J.rank))&&this.G.set(J.newrank,!0),this}createGraph(){let e=this.view.autoLayout,t=e.direction,r=xc({[J.likec4_viewId]:this.view.id,[J.bgcolor]:`transparent`,[J.layout]:`dot`,[J.compound]:!0,[J.rankdir]:t,[J.TBbalance]:`min`,[J.splines]:`spline`,[J.outputorder]:`nodesfirst`,[J.nodesep]:pxToInch(e.nodeSep??110),[J.ranksep]:pxToInch(e.rankSep??120),[J.pad]:pxToInch(15),[J.fontname]:wc});return r.attributes.graph.apply({[J.fontsize]:pxToPoints(this.styles.fontSize()),[J.labeljust]:t===`RL`?`r`:`l`,[J.labelloc]:t===`BT`?`b`:`t`,[J.margin]:50.1}),r}applyNodeAttributes(e){let t=this.styles.elementColors;e.apply({[J.fontname]:wc,[J.shape]:`rect`,[J.fillcolor]:t.fill,[J.fontcolor]:t.hiContrast,[J.color]:t.stroke,[J.style]:`filled`,[J.penwidth]:0})}applyEdgeAttributes(e){let t=this.defaultRelationshipColors;e.apply({[J.arrowsize]:.75,[J.fontname]:wc,[J.fontsize]:pxToPoints(14),[J.penwidth]:pxToPoints(2),[J.color]:t.line,[J.fontcolor]:t.label,[J.style]:this.$defaults.relationship.line})}reserveNodeId(e,t=!1){return t?e=`cluster_`+e:e.toLowerCase().startsWith(`cluster`)&&(e=`nd_`+e),!this.ids.has(e)&&(this.ids.add(e),e)}generateGraphvizId(e){let t=isCompound(e),r=_i(e.id).toLowerCase(),o=this.reserveNodeId(r,t),s=1;for(;o===!1;)o=this.reserveNodeId(r+`_`+s++,t);return o}elementToSubgraph(e,t){G(isCompound(e),`node should be compound`),G(tn(e.depth),`node.depth should be defined`);let r=this.styles.colors(e.color).elements,o=compoundLabelColor(r.loContrast);return t.apply({[J.likec4_id]:e.id,[J.likec4_level]:e.level,[J.likec4_depth]:e.depth,[J.fillcolor]:compoundColor(r.fill,e.depth),[J.color]:compoundColor(r.stroke,e.depth),[J.style]:`filled`,[J.margin]:pxToPoints(e.children.length>1?40:32)}),N(e.title.trim())||t.set(J.label,compoundLabel(e,o)),t}elementToNode(e,t){G(!isCompound(e),`node should not be compound`);let r=z(e.icon),{values:{padding:o,sizes:{width:s,height:c}}}=this.styles.nodeSizes(e.style),u=r?8:o;if(t.attributes.apply({[J.likec4_id]:e.id,[J.likec4_level]:e.level,[J.label]:nodeLabel(e,this.styles),[J.margin]:`${pxToInch(u)},${pxToInch(o)}`}),t.attributes.set(J.width,pxToInch(s)),t.attributes.set(J.height,pxToInch(c)),!this.styles.isDefaultColor(e.color)){let r=this.styles.colors(e.color).elements;t.attributes.apply({[J.fillcolor]:r.fill,[J.fontcolor]:r.hiContrast,[J.color]:r.stroke})}switch(e.shape){case`cylinder`:case`storage`:t.attributes.apply({[J.margin]:`${pxToInch(u)},${pxToInch(0)}`,[J.penwidth]:pxToPoints(2),[J.shape]:`cylinder`});break;case`browser`:t.attributes.apply({[J.margin]:`${pxToInch(r?u:u+4)},${pxToInch(o+6)}`});break;case`mobile`:t.attributes.apply({[J.margin]:`${pxToInch(r?u:u+4)},${pxToInch(o)}`});break;case`queue`:t.attributes.apply({[J.width]:pxToInch(s),[J.height]:pxToInch(c-8),[J.margin]:`${pxToInch(r?u:u+4)},${pxToInch(o)}`});break;case`component`:t.attributes.apply({[J.width]:pxToInch(s+10),[J.margin]:`${pxToInch(u+20)},${pxToInch(o)}`})}return t}leafElements(e){return e===null?P([...this.selectViewNodes()],e=>!isCompound(e)):this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return isCompound(t)?this.leafElements(t.id):[t]})}descendants(e){return e===null?[...this.selectViewNodes()]:this.computedNode(e).children.flatMap(e=>{let t=this.computedNode(e);return[t,...this.descendants(t.id)]})}computedNode(e){return this.viewNodes.get(e)}getGraphNode(e){return this.nodes.get(e)??null}getSubgraph(e){return this.subgraphs.get(e)??null}edgeEndpoint(e,t){let r=this.computedNode(e),o=this.getGraphNode(e),s;return o?[r,o,void 0]:(G(isCompound(r),`endpoint node should be compound`),s=this.getSubgraph(e)?.id,G(s,`subgraph ${e} not found`),r=vi(t(this.leafElements(e)),`leaf element in ${e} not found`),o=vi(this.getGraphNode(r.id),`source graphviz node ${r.id} not found`),[r,o,s])}findInternalEdges(e){if(e===null)return this.view.edges.slice();let t=this.computedNode(e);return R(this.descendants(e),Zt(e=>Tn(e.inEdges,e.outEdges)),kn(),gn(Tn(t.inEdges,t.outEdges)),F(e=>this.view.edges.find(t=>t.id===e)),P(z))}assignGroups(){let e=R(this.view.nodes,P(isCompound),F(e=>e.id),En(ci),jn(),F(e=>({id:e,edges:this.findInternalEdges(e).filter(e=>e.source!==e.target&&!this.compoundIds.has(e.source)&&!this.compoundIds.has(e.target))})),P(({edges:e})=>e.length>1&&e.length<8),fn(4)),t=new Set;for(let r of e){let e=r.edges.filter(e=>!t.has(e.source)&&!t.has(e.target));for(let o of e)try{let e=vi(this.getGraphNode(o.source),`Graphviz Node not found for ${o.source}`),s=vi(this.getGraphNode(o.target),`Graphviz Node not found for ${o.target}`);t.add(o.source),t.add(o.target),e.attributes.set(J.group,r.id),s.attributes.set(J.group,r.id)}catch(e){Tc.error(`Failed to assign group to edge ${o.id}`,{error:e})}}return this}},AiLayoutViewPrinter=class extends DotPrinter{aiHints;constructor(e,t,r){super(e,t),this.aiHints=r}createGraph(){let e=super.createGraph();return e.delete(J.TBbalance),e}selectViewNodes(){if(!this.aiHints.nodeOrder)return this.view.nodes;let e=[...this.view.nodes],t=[];for(let r of this.aiHints.nodeOrder){let o=e.findIndex(e=>e.id===r);o!==-1&&t.push(...e.splice(o,1))}return t.push(...e),t}selectViewEdges(){if(!this.aiHints.edgeOrder)return this.view.edges;let e=[...this.view.edges],t=[];for(let r of this.aiHints.edgeOrder){let o=e.findIndex(e=>e.id===r);o!==-1&&t.push(...e.splice(o,1))}return t.push(...e),t}postBuild(e){this.applyNodeRanks().addInvisibleEdges().enableNewRankIfNeeded()}applyNodeRanks(){let e=this.G;for(let t of this.aiHints.ranks){let r=[...new Set(t.nodes)].map(e=>this.getGraphNode(e)).filter(I);if(r.length===0||t.rank===`same`&&r.length===1)continue;let o=e.createSubgraph({[J.rank]:t.rank});for(let e of r)o.node(e.id)}return this}addEdge(e,t){let r=this.aiHints.reverseRank?.includes(e.id)??!1,[o,s]=r?[e.target,e.source]:[e.source,e.target],[,c,u]=this.edgeEndpoint(o,e=>Fn(e)),[,d,p]=this.edgeEndpoint(s,Xt),m=t.edge([c,d],{[J.likec4_id]:e.id});e.line&&e.line!==`dashed`&&m.attributes.set(J.style,e.line),p&&m.attributes.set(J.lhead,p),u&&m.attributes.set(J.ltail,u);let h=I(p)||I(u),g=edgelabel(e);if(g&&m.attributes.set(h?J.xlabel:J.label,g),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;m.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}let _=this.aiHints.edgeWeight[e.id];_!==void 0&&_!==1&&m.attributes.set(J.weight,_);let v=this.aiHints.edgeMinlen[e.id];return v!==void 0&&v!==1&&m.attributes.set(J.minlen,v),this.aiHints.excludeFromRanking?.includes(e.id)&&m.attributes.set(J.constraint,!1),r&&m.attributes.set(J.dir,`back`),m}addInvisibleEdges(){if(!this.aiHints.invisibleEdges)return this;let e=this.G;for(let{source:t,target:r,...o}of this.aiHints.invisibleEdges){let s=this.getGraphNode(t),c=this.getGraphNode(r);if(!s||!c)continue;let u=`invisible_${t}->${r}`;if(this.edges.has(u)){this.logger.trace`invisible edge ${t} -> ${r} already exists with id ${u}, skipping creation`;continue}this.graphology.addEdgeWithKey(u,t,r,{hierarchyDistance:0,origin:`invisible`,weight:o.weight??1});let d=e.edge([s,c],{[J.style]:`invis`});this.edges.set(u,d),o.minlen!==void 0&&o.minlen!==1&&d.attributes.set(J.minlen,o.minlen),o.weight!==void 0&&o.weight!==1&&d.attributes.set(J.weight,o.weight)}return this}reduceDefaultRankSeparation(){let e=this.view.autoLayout,t=this.G;return tn(e.rankSep)||!(nn(this.aiHints.edgeMinlen).some(([e,t])=>t>1)||(this.aiHints.invisibleEdges?.some(e=>e.minlen&&e.minlen>1)??!1))||t.set(J.ranksep,pxToInch(80)),this}},DeploymentViewPrinter=class extends DotPrinter{createGraph(){let e=super.createGraph(),t=this.view.autoLayout;return e.delete(J.TBbalance),e.apply({[J.nodesep]:pxToInch(t.nodeSep??130),[J.ranksep]:pxToInch(t.rankSep??130)}),e}postBuild(){let e=this.G;return R(this.view.nodes,F(e=>({node:e,graphvizNode:this.getGraphNode(e.id)})),Jt(({node:e,graphvizNode:t})=>{if(t!=null)return e.modelRef}),Mn(),F(e=>e),qt(t=>{t.length<2||e.subgraph({[J.rank]:`same`},e=>{for(let{graphvizNode:r}of t)e.node(vi(r).id)})}),bn(()=>{e.set(J.newrank,!0),e.set(J.clusterrank,`global`),e.delete(J.pack),e.delete(J.packmode)})),this}elementToSubgraph(e,t){let r=super.elementToSubgraph(e,t);return e.children.length>1&&r.set(J.margin,pxToPoints(50)),r}addEdge(e,t){let[r,o]=[e.source,e.target],[s,c,u]=this.edgeEndpoint(r,e=>Fn(e)),[d,p,m]=this.edgeEndpoint(o,Xt),h=I(m)||I(u),g=t.edge([c,p],{[J.likec4_id]:e.id,[J.style]:e.line??`dashed`});m&&g.attributes.set(J.lhead,m),u&&g.attributes.set(J.ltail,u);let _=this.graphology.getEdgeAttribute(e.id,`weight`);_>1&&!this.graphology.hasDirectedEdge(e.target,e.source)&&g.attributes.set(J.weight,_);let v=edgelabel(e);if(v&&g.attributes.set(h?J.xlabel:J.label,v),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;g.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}let[y,b]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return y===`none`&&b===`none`?(g.attributes.apply({[J.arrowtail]:`none`,[J.arrowhead]:`none`,[J.dir]:`none`}),g):e.dir===`both`?(g.attributes.apply({[J.arrowhead]:toArrowType(y),[J.arrowtail]:toArrowType(e.tail??y),[J.dir]:`both`}),!h&&s.modelRef!==d.modelRef&&g.attributes.set(J.constraint,!1),g):(y&&g.attributes.set(J.arrowhead,toArrowType(y)),b!==`none`&&g.attributes.set(J.arrowtail,toArrowType(b)),g)}},DynamicViewPrinter=class extends DotPrinter{postBuild(e){e.delete(J.TBbalance),e.set(J.ordering,`in`)}addEdge(e,t){let{nodes:r}=this.view,[o,s]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[c,u,d]=this.edgeEndpoint(o,e=>Fn(e)),[p,m,h]=this.edgeEndpoint(s,Xt),g=t.edge([u,m],{[J.likec4_id]:e.id});if(e.line&&e.line!==this.$defaults.relationship.line&&g.attributes.set(J.style,e.line),h&&g.attributes.set(J.lhead,h),d&&g.attributes.set(J.ltail,d),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;g.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}let _=[e.label?.trim(),e.technology?.trim()].filter(z).join(`
32
+ `),v=stepEdgeLabel(this.view.edges.indexOf(e),_);g.attributes.set(J.label,v);let y=r.findIndex(e=>e.id===o);r.findIndex(e=>e.id===s)<y&&e.dir!==`back`&&g.attributes.apply({[J.minlen]:0});let[b,x]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];return e.dir===`back`?(g.attributes.apply({[J.arrowtail]:toArrowType(b),[J.dir]:`back`}),x!==`none`&&g.attributes.apply({[J.arrowhead]:toArrowType(x),[J.minlen]:0}),g):b===`none`&&x===`none`||b!==`none`&&x!==`none`?(g.attributes.apply({[J.arrowhead]:toArrowType(b),[J.arrowtail]:toArrowType(x),[J.dir]:`both`}),g):b===`none`?(g.attributes.delete(J.arrowhead),g.attributes.apply({[J.arrowtail]:toArrowType(x),[J.minlen]:0,[J.dir]:`back`}),g):(g.attributes.set(J.arrowhead,toArrowType(b)),g)}};const Ec=createLogger(`dot.rank`);var ElementViewPrinter=class extends DotPrinter{postBuild(){this.assignGroups().tileNodesWithoutEdges().applyExplicitRankBlocks().enableNewRankIfNeeded()}tileNodesWithoutEdges(){let e=new Set,t=this.view.nodes.reduce((t,r)=>(isCompound(r)&&(e.add(r.id),t.push(r)),t),[]);for(let e of t){let t=R(e.children,P(e=>!this.compoundIds.has(e)&&this.graphology.degree(e)===0),F(e=>this.computedNode(e)));if(t.length<=2)continue;let r=2;switch(!0){case t.length>11:r=4;break;case t.length>4:r=3}let o=vi(this.getSubgraph(e.id),`Subgraph not found for ${e.id}`),s=null;xn(t,r).forEach(e=>{let t=e.length>1?o.createSubgraph({[J.rank]:`same`}):null;e.forEach((e,r)=>{let c=this.getGraphNode(e.id);c&&(t?.node(c.id),r===0&&(s&&o.edge([s,c],{[J.style]:`invis`}),s=c))})})}return this}applyExplicitRankBlocks(){let e=this.view.ranks??[];if(e.length===0)return this;let t=0;for(let r of e){let e=[...new Set(r.nodes)].map(e=>this.getGraphNode(e)).filter(e=>!!e);if(e.length===0)continue;let o=this.G.createSubgraph({[J.rank]:r.type});e.forEach(e=>o.node(e.id)),t+=1,Ec.trace`rank ${r.type} => ${e.map(e=>e.id).join(`, `)}`}return t>0&&this.G.set(`likec4_rankBlocks`,t),this}addEdge(e,t){let[r,o]=e.dir===`back`?[e.target,e.source]:[e.source,e.target],[s,c,u]=this.edgeEndpoint(r,e=>Fn(e)),[d,p,m]=this.edgeEndpoint(o,Xt),h=e.parent,g=this.graphology.getEdgeAttributes(e.id),_=t.edge([c,p],{[J.likec4_id]:e.id});e.line&&e.line!==this.$defaults.relationship.line&&_.attributes.set(J.style,e.line),m&&_.attributes.set(J.lhead,m),u&&_.attributes.set(J.ltail,u);let v=I(m)||I(u),y=edgelabel(e);if(y&&_.attributes.set(v?J.xlabel:J.label,y),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;_.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}!this.graphology.hasDirectedEdge(e.target,e.source)&&g.weight>1&&_.attributes.set(J.weight,g.weight);let[b,x]=[e.head??this.$defaults.relationship.arrow,e.tail??`none`];if(e.dir===`back`)return _.attributes.apply({[J.arrowtail]:toArrowType(b),[J.dir]:`back`}),x!==`none`&&_.attributes.apply({[J.arrowhead]:toArrowType(x),[J.dir]:`both`,[J.minlen]:0}),_;if(b===`none`&&x===`none`)return _.attributes.apply({[J.arrowtail]:`none`,[J.arrowhead]:`none`,[J.dir]:`none`,[J.minlen]:0,[J.constraint]:!1}),_;if(b!==`none`&&x!==`none`)return _.attributes.apply({[J.arrowhead]:toArrowType(b),[J.arrowtail]:toArrowType(x),[J.dir]:`both`}),_;if(_.attributes.set(J.arrowhead,toArrowType(b)),x!==`none`&&_.attributes.set(J.arrowtail,toArrowType(x)),this.view.edges.length===1)return _;let ee;return ee=h===null&&s.parent==null&&d.parent==null?this.view.edges.filter(t=>{if(t.id===e.id||t.parent!==null||t.source===e.source&&t.target===e.target||t.source===e.target&&t.target===e.source)return!1;let r=this.computedNode(t.source),o=this.computedNode(t.target);return isCompound(r)||isCompound(o)?!1:r.parent==null&&o.parent==null}):this.findInternalEdges(h).filter(t=>!(t.id===e.id||t.source===e.source&&t.target===e.target||t.source===e.target&&t.target===e.source)),ee.length===0&&(h===null||this.leafElements(h).length<=3)&&_.attributes.set(J.minlen,0),_}};function parseBB(e){let[t,r,o,s]=e?e.split(`,`).map(e=>pointToPx(+e)):[0,0,0,0],c=Math.round(o-t),u=Math.round(r-s);return{x:Math.round(t),y:Math.round(s),width:c,height:u}}function parsePos(e){try{let[t,r]=e.split(`,`);return{x:pointToPx(parseFloat(t)),y:pointToPx(parseFloat(r))}}catch(t){throw Error(`Failed on parsing pos: ${e}`,{cause:t})}}function parseNode(e){let{x:t,y:r}=parsePos(e.pos),o=inchToPx(parseFloat(e.width)),s=inchToPx(parseFloat(e.height));return{x:t-Math.round(o/2),y:r-Math.round(s/2),width:o,height:s}}function parseLabelBbox(e,[t,r]=[0,0]){if(!e||e.length===0)return null;let o=1/0,s=1/0,c=-1/0,u=-1/0,d=13;try{for(let p of e){if(p.op===`F`){d=pointToPx(p.size);continue}if(p.op===`T`){let e=pointToPx(p.pt[0])-t,m=pointToPx(p.width);switch(p.align){case`r`:e-=m;break;case`c`:e-=Math.round(m/2)}o=Math.min(o,e),c=Math.max(c,e+m);let h=pointToPx(p.pt[1])-r;s=Math.min(s,Math.round(h-d)),u=Math.max(u,h)}}}catch(t){return K.warn(`Failed on parsing label draw ops:
33
+ {labelDrawOps}`,{e:t,labelDrawOps:e}),null}return o===1/0?null:{x:o-2,y:s-2,width:c-o+4,height:u-s+4}}function parseEdgePoints({_draw_:e,likec4_id:t=`???`},r=`<unknown view>`){try{let o=e.filter(e=>e.op.toLowerCase()===`b`);G(M(o,1),`view ${r} edge ${t} should have at least one bezier draw op`),o.length>1&&K.warn(`view ${r} edge ${t} has more than one bezier draw op, using the first one only`);let s=o[0].points.map(e=>pointToPx(e));return G(M(s,2),`view ${r} edge ${t} should have at least two points`),s}catch(o){throw Error(`failed on parsing view ${r} edge ${t} _draw_:\n${JSON.stringify(e,null,2)}`,{cause:o})}}function parseGraphvizEdge(e,{id:t,source:r,target:o,dir:s,label:c,description:u,...d},p){let m=parseLabelBbox(e._ldraw_??e._tldraw_??e._hldraw_),h=e.dir===`back`||s===`back`;return c=c&&m?wrap(c,{maxchars:40,maxLines:5}).join(`
34
+ `):null,{id:t,source:r,target:o,label:c,...z(u)&&{description:u},points:parseEdgePoints(e,p),labelBBox:m,...h?{dir:`back`}:{},...d}}function parseGraphvizJson(e,t){let r=parseBB(e.bb),{nodes:o,edges:s,hasManualLayout:c,...u}=t,d=[],p=[],m;if(m=u._type===`dynamic`?{...u,sequenceLayout:{actors:[],compounds:[],parallelAreas:[],subflows:[],steps:[],bounds:r},[Pr]:`layouted`,bounds:r,nodes:d,edges:p}:{...u,[Pr]:`layouted`,bounds:r,nodes:d,edges:p},c){let e=m;e[Nr]=`auto`}let h=e.objects??[];for(let e of o){let t=h.find(t=>t.likec4_id===e.id);G(t,`View ${u.id} node ${e.id} not found in graphviz output`);try{let{x:r,y:o,width:s,height:c}=`bb`in t?parseBB(t.bb):parseNode(t),u=[r,o];d.push({...e,x:r,y:o,width:s,height:c,labelBBox:parseLabelBbox(t._ldraw_,u)??{x:r,y:o,width:s,height:c}})}catch(r){throw Error(`Failed on parsing node ${e.id}:\n${JSON.stringify(t,null,2)}`,{cause:r})}}let g=e.edges??[];for(let e of s){let t=g.find(t=>t.likec4_id===e.id);if(!t){K.warn`View ${u.id} edge ${e.id} not found in graphviz output, skipping`;continue}p.push(parseGraphvizEdge(t,e,u.id))}return m}function parseGraphvizJsonOfProjectsView(e,t){return parseGraphvizJson(e,t)}var Dc=class ProjectsViewPrinter extends DotPrinter{static toDot(e){return new ProjectsViewPrinter(e).print()}constructor(e){super(e,cr.DEFAULT)}createGraph(){let e=super.createGraph();return e.apply({[J.nodesep]:pxToInch(100),[J.ranksep]:pxToInch(100)}),e.delete(J.TBbalance),e}elementToNode(e,t){return t.attributes.apply({[J.likec4_id]:e.id,[J.likec4_project]:e.projectId}),super.elementToNode(e,t)}addEdge(e,t){let r=vi(this.getGraphNode(e.source),`Node not found for ${e.source}`),o=vi(this.getGraphNode(e.target),`Node not found for ${e.target}`),s=this.graphology.getEdgeAttributes(e.id),c=t.edge([r,o],{[J.likec4_id]:e.id,[J.likec4_project]:e.projectId});e.line&&e.line!==this.$defaults.relationship.line&&c.attributes.set(J.style,e.line),!this.graphology.hasDirectedEdge(e.target,e.source)&&s.weight>1&&c.attributes.set(J.weight,s.weight);let u=edgelabel(e);if(u&&c.attributes.set(J.label,u),e.color&&e.color!==this.$defaults.relationship.color){let t=this.styles.colors(e.color).relationships;c.attributes.apply({[J.color]:t.line,[J.fontcolor]:t.label})}return c}},Node=class{value;next;constructor(e){this.value=e}},Queue=class{#e;#t;#n;constructor(){this.clear()}enqueue(e){let t=new Node(e);this.#e?(this.#t.next=t,this.#t=t):(this.#e=t,this.#t=t),this.#n++}dequeue(){let e=this.#e;if(e)return this.#e=this.#e.next,this.#n--,this.#e||(this.#t=void 0),e.value}peek(){if(this.#e)return this.#e.value}clear(){this.#e=void 0,this.#t=void 0,this.#n=0}get size(){return this.#n}*[Symbol.iterator](){let e=this.#e;for(;e;)yield e.value,e=e.next}*drain(){for(;this.#e;)yield this.dequeue()}};function pLimit(e){let t=!1;if(typeof e==`object`&&({concurrency:e,rejectOnClear:t=!1}=e),validateConcurrency(e),typeof t!=`boolean`)throw TypeError("Expected `rejectOnClear` to be a boolean");let r=new Queue,o=0,resumeNext=()=>{o<e&&r.size>0&&(o++,r.dequeue().run())},next=()=>{o--,resumeNext()},run=async(e,t,r)=>{let o=(async()=>e(...r))();t(o);try{await o}catch{}next()},enqueue=(t,s,c,u)=>{let d={reject:c};new Promise(e=>{d.run=e,r.enqueue(d)}).then(run.bind(void 0,t,s,u)),o<e&&resumeNext()},generator=(e,...t)=>new Promise((r,o)=>{enqueue(e,r,o,t)});return Object.defineProperties(generator,{activeCount:{get:()=>o},pendingCount:{get:()=>r.size},clearQueue:{value(){if(!t){r.clear();return}let e=AbortSignal.abort().reason;for(;r.size>0;)r.dequeue().reject(e)}},concurrency:{get:()=>e,set(t){validateConcurrency(t),e=t,queueMicrotask(()=>{for(;o<e&&r.size>0;)resumeNext()})}},map:{async value(e,t){let r=Array.from(e,(e,r)=>generator(t,e,r));return Promise.all(r)}}}),generator}function validateConcurrency(e){if(!((Number.isInteger(e)||e===1/0)&&e>0))throw TypeError("Expected `concurrency` to be a number from 1 and up")}const Oc=pLimit(1);var kc=class GraphvizWasmAdapter{static opsCount=0;get name(){return`wasm`}get concurrency(){return 1}dispose(){ki.unload()}[Symbol.dispose](){this.dispose()}async attempt(e,t,r){return await Oc(async()=>{let o=K.getChild([`layouter`,`wasm`,e,`_`,Sn(4).toLowerCase()]);try{o.trace`execute`;let e=await r();return++GraphvizWasmAdapter.opsCount>=20&&(GraphvizWasmAdapter.opsCount=0,o.trace`reached 20 operations, unloading wasm`,ki.unload()),e}catch(e){o.trace(`FAILED DOT
35
+ `+t);let r=loggable(e);if(r.includes(`syntax error`))throw e;o.warn(r),GraphvizWasmAdapter.opsCount=0,ki.unload()}return o.warn(`Retrying...`),await di(30,300),await r()})}async unflatten(e){return await this.attempt(`unflatten`,e,async()=>(await ki.load()).unflatten(e,1,!1,3).replaceAll(/\t\[/g,` [`).replaceAll(/\t/g,` `))}async acyclic(e){return await this.attempt(`acyclic`,e,async()=>{let t=(await ki.load()).acyclic(e,!0);return t.acyclic&&t.outFile||e})}async layoutJson(e){return await this.attempt(`layout`,e,async()=>(await ki.load()).layout(e,`json`,void 0,{yInvert:!0}))}async svg(e){return await this.attempt(`svg`,e,async()=>(await ki.load()).layout(e,`svg`))}};const getPrinter=({view:e,styles:t})=>{switch(!0){case qr(e):return new DynamicViewPrinter(e,t);case Kr(e):return new DeploymentViewPrinter(e,t);case Jr(e):return new ElementViewPrinter(e,t);default:yi(e)}},Ac=K.getChild(`layouter`);function normalizeDot(e){return e.split(`
38
36
  `).filter(e=>!(e.includes(`margin`)&&e.includes(`50.1`))).join(`
39
- `)}var GraphvizLayouter=class{graphviz;constructor(e){this.graphviz=e??new Dc,Oc.trace`created with port ${this.graphviz.name}`}dispose(){this.graphviz.dispose()}[Symbol.dispose](){this.dispose()}get graphvizPort(){return this.graphviz}changePort(e){this.graphviz.dispose(),this.graphviz=e,Oc.trace`change port to ${this.graphviz.name}`}printToDot(e,t){return normalizeDot((t?new AiLayoutViewPrinter(e.view,e.styles,t):getPrinter(e)).print())}newScopedLogger(e){return Oc.getChild([e,`_`,Cn(4).toLowerCase()])}async dotToJson(e){let t=this.newScopedLogger(`dotToJson`),r;try{r=await this.graphviz.layoutJson(e)}catch(r){throw t.error(loggable(r)),t.error(`Failed to convert DOT to JSON:
40
- `+e),r}try{return JSON.parse(r)}catch(o){throw t.error(loggable(o)),t.error`Failed to parse JSON:\n${r}\n. Generated from DOT:\n${e}`,o}}async layout(e){let t=this.newScopedLogger(`layout`);try{t.trace`layouting view ${e.view.id}...`;let r=await this.dot(e),{view:o}=e,s=parseGraphvizJson(await this.dotToJson(r),o);return Jr(s)&&Object.assign(s,{sequenceLayout:_(s)}),r=normalizeDot(r),t.trace`layouting view ${e.view.id} done`,{dot:r,diagram:s}}catch(r){throw t.warn(loggable(r)),wrapError(r,`Error during layout: ${e.view.id}`)}}async aiLayout({view:e,styles:t},r){let o=this.newScopedLogger(`ai-layout`);try{o.trace`layouting view ${e.id} using AI hints...`;let s=new AiLayoutViewPrinter(e,t,r).print(),c=parseGraphvizJson(await this.dotToJson(s),e);return Jr(c)&&Object.assign(c,{sequenceLayout:_(c)}),s=normalizeDot(s),o.trace`layouting view ${e.id} done`,{dot:s,diagram:c}}catch(t){throw o.warn(loggable(t)),wrapError(t,`Error during AI layout: ${e.id}`)}}async svg(e){let t=await this.dot(e);return t=normalizeDot(t),{svg:await this.graphviz.svg(t),dot:t}}async dot(e){let t=this.newScopedLogger(`dot`);t.trace`generating dot for view ${e.view.id}`;let r=getPrinter(e).print();if(!Yr(e.view))return normalizeDot(r);try{t.trace`unflattening dot`,r=await this.graphviz.unflatten(r)}catch(r){t.warn(`Error during unflatten: ${e.view.id}`,{error:r})}return normalizeDot(r)}async layoutProjectsView(e){let t=this.newScopedLogger(`layoutProjectsView`);t.debug`layouting projects overview...`;let r=new Tc(e).print();try{r=await this.graphviz.unflatten(r)}catch(e){t.warn(`Error during unflatten of projects view`,{error:e})}let o=await this.dotToJson(r);return t.debug`layouting ${`projects overview`}`,parseGraphvizJsonOfProjectsView(o,e)}};const kc=W.getChild([`layouter-queue`]);var QueueGraphvizLayoter=class extends GraphvizLayouter{queue;isProcessingBatch=!1;constructor(e){super(e?.graphviz),this.queue=new Kn({concurrency:e?.concurrency??this.graphvizPort.concurrency,timeout:e?.timeout??2e4,throwOnTimeout:e?.throwOnTimeout??!0})}async runInQueue(e){let t=kc.getChild([`run`,Cn(3)]);return this.isProcessingBatch?(t.debug`waiting for batch to finish`,await this.queue.onIdle(),await Si(),t.trace`try runInQueue again`,await this.runInQueue(e)):(await this.waitForQueueToShrink(this.queue.concurrency,t),kc.trace`add task to queue`,await this.queue.add(e))}changePort(e){super.changePort(e),this.queue.concurrency!==e.concurrency&&(this.queue.concurrency=this.graphvizPort.concurrency,kc.debug`set queue concurrency to ${this.graphvizPort.concurrency}`)}async layout(e){let t=await this.runInQueue(async()=>await super.layout(e));if(!t)throw Error(`QueueGraphvizLayoter: layout failed`);return t}async layoutProjectsView(e){let t=await this.runInQueue(async()=>await super.layoutProjectsView(e));if(!t)throw Error(`QueueGraphvizLayoter: layoutProjectsView failed`);return t}async batchLayout(e){let t=kc.getChild([`batch`,Cn(3)]);if(this.isProcessingBatch)return t.trace`wait for previous layouts to finish`,await this.queue.onIdle(),await Si(),e.cancelToken?.isCancellationRequested?(t.trace`cancellation requested`,[]):(t.trace`retry`,await this.batchLayout(e));let r=this.queue.concurrency;t.debug`starting, batch size: ${e.batch.length}, concurrency: ${r}`,this.isProcessingBatch=!0;let o=[];try{for(let s of e.batch)if(t.trace`add task for view ${s.view.id}`,this.queue.add(async()=>(r<=2&&await Si(),await super.layout(s))).then(t=>{if(!t){e.onError?.(s,Error(`Layout queue returned null for view ${s.view.id}`));return}o.push(t),e.onSuccess?.(s,t)}).catch(r=>{t.error(`Fail layout view ${s.view.id}`,{err:r}),e.onError?.(s,r)}),await this.waitForQueueToShrink(r,t),e.cancelToken?.isCancellationRequested){t.debug`cancellation requested`;break}let s=this.queue.pending+this.queue.size;s>0&&(t.trace`waiting ${s} tasks to finish`,await this.queue.onIdle())}finally{t.debug`batch layout done`,this.isProcessingBatch=!1}return o}async waitForQueueToShrink(e=this.queue.concurrency,t=kc){this.queue.size>e+2&&(t.trace`limit reached. queue size: ${this.queue.size}, running: ${this.queue.pending}, waiting shrink to ${e}`,await this.queue.onSizeLessThan(e+1))}dispose(){this.queue.clear(),super.dispose()}},Ac=e(qn(),1);const jc=W.getChild([`graphviz`,`binary`]);var GraphvizBinaryAdapter=class{_dotpath;_unflattenpath;constructor(e,t){this._dotpath=e,this._unflattenpath=t}get name(){return`binary`}dispose(){}[Symbol.dispose](){}get concurrency(){return Math.max(1,Ni.availableParallelism()-2)}get dotpath(){return this._dotpath??gi(this,`_dotpath`,()=>{let e=Ac.default.sync(`dot`);return jc.debug`Found ${e}`,e})}get unflattenpath(){return this._unflattenpath??gi(this,`_unflattenpath`,()=>{let e=Ac.default.sync(`unflatten`);return jc.debug`Found ${e}`,e})}async unflatten(e){let t,r=jc.getChild([`unflatten`,Cn(4)]);try{let o=await ji(this.unflattenpath,[`-l`,`1`,`-c`,`3`],{timeout:1e4,stdin:{string:e}});t=o.stdout,j(o.stderr)?r.trace(`{command} succeeded in {durationMs}ms`,{command:o.command,durationMs:Math.round(o.durationMs)}):r.warn(`{command} has stderr:
41
- `+o.stderr,{command:o.command})}catch(o){r.debug(`FAILED DOT`,{dot:e}),r.error(loggable(o)),o instanceof Mi&&!j(o.stdout)&&(r.warn(`{command} returned result but failed with exitcode {exitCode}:
42
- {stderr}`,{command:o.command,exitCode:o.exitCode,stderr:o.stderr}),t=o.stdout)}return t&&(e=t.replaceAll(/\t\[/g,` [`).replaceAll(/\t/g,` `)),e}async layoutJson(e){let t=jc.getChild([`layoutJson`,Cn(4)]),r;try{let o=await ji(this.dotpath,[`-Tjson`,`-y`],{timeout:1e4,stdin:{string:e}});r=o.stdout,j(o.stderr)?t.trace(`{command} succeeded in {durationMs}ms`,{command:o.command,durationMs:Math.round(o.durationMs)}):t.warn(`{command} has stderr:
43
- `+o.stderr,{command:o.command})}catch(o){if(t.debug(`FAILED DOT`,{dot:e}),t.error(loggable(o)),o instanceof Mi&&!j(o.stdout))t.warn(`{command} returned result but failed with exitcode {exitCode}:
44
- {stderr}`,{command:o.command,exitCode:o.exitCode,stderr:o.stderr}),r=o.stdout;else throw o}return r}async acyclic(e){return Promise.reject(Error(`Method not implemented.`))}async svg(e){let t=jc.getChild([`svg`,Cn(4)]),r;try{let o=await ji(this.dotpath,[`-Tsvg`,`-y`],{timeout:1e4,stdin:{string:e}});r=o.stdout,j(o.stderr)?t.trace(`{command} succeeded in {durationMs}ms`,{command:o.command,durationMs:Math.round(o.durationMs)}):t.warn(`{command} has stderr:
45
- `+o.stderr,{command:o.command})}catch(o){if(t.debug(`FAILED DOT`,{dot:e}),t.error(loggable(o)),o instanceof Mi&&!j(o.stdout))t.warn(`{command} returned result but failed with exitcode {exitCode}:
46
- {stderr}`,{command:o.command,exitCode:o.exitCode,stderr:o.stderr}),r=o.stdout;else throw o}return r}};const q=W.getChild(`server`);function logWarnError(e){q.warn(loggable(e))}function getTelemetrySink(e){let t=getMessageOnlyFormatter();return r=>{try{switch(r.level){case`error`:case`fatal`:{let o=r.category.join(`.`);if(o===`likec4.config`)break;let s=errorFromLogRecord(r);s?e.telemetry.logEvent({eventName:`error`,message:`${s.name}: ${s.message}`,category:o,...s.stack&&{stack:s.stack}}):e.telemetry.logEvent({eventName:`error`,message:t(r),category:o});break}}}catch(e){console.error(`Error while logging to LSP connection:`,e)}}}function configureLanguageServerLogger({lspConnection:e,enableTelemetry:t=!!e,useStdErr:r=!1,logLevel:o=Li?`debug`:`warning`,nonBlocking:s=!1,colors:c=!1}={}){let u=!!e&&t&&!Li;configureLogger$1({reset:!0,sinks:{console:r?getConsoleStderrSink({formatter:getTextFormatter()}):getConsoleSink({formatter:c?getAnsiColorFormatter():getTextFormatter(),nonBlocking:s}),...u&&{telemetry:getTelemetrySink(e)}},loggers:[{category:[`likec4`],sinks:[`console`,...u?[`telemetry`]:[]],lowestLevel:o}]}),q.trace(`logger configured`)}const Mc=Rt.pick({extends:!0,styles:!0}).loose(),normalizeExtends=e=>e?Array.isArray(e)?e:[e]:[],parseJsonConfig=async e=>{let t=await Qn.readFile(e,`utf-8`),r;try{r=xt.parse(t.trim()||`{}`)}catch(t){throw wrapError(t,`${e}:`)}if(!r||typeof r!=`object`||Array.isArray(r))throw Error(`${e}: Config must be a JSON object`);let o=Mc.safeParse(r);if(!o.success)throw Error(`${e}: Invalid config\n`+Dt.prettifyError(o.error));return o.data},loadJsonConfigs=async(e,t)=>{if(t.includes(e)){let r=t.indexOf(e),o=[...t.slice(r),e].join(` -> `);throw Error(`Config extends cycle detected: ${o}`)}let r=await parseJsonConfig(e),o=normalizeExtends(r.extends),s=[...t,e],c=[];for(let t of o){let r=ar(nr(e),t);c.push(...await loadJsonConfigs(r,s))}return[...c,r]};async function loadConfig(e){e=typeof e==`string`?e:e.fsPath,W.getChild(`config`).trace`Loading config: ${ir(Bi(),e)}`;let t=nr(e),r=tr(e),o={name:tr(t)};if(It(r)){let t=await loadJsonConfigs(ar(e),[]);V(A(t,1),`Expect at least one config`);let r=fn(In(t),[`extends`,`styles`]),s=t.map(e=>e.styles).filter(P),c=s.length>0?g({},...s.reverse()):void 0;return Pt({...o,...r,...c?{styles:c}:{}})}V(Lt(r),`Invalid name for config file: ${e}`);let{mod:s}=await Ri({filepath:e,cwd:t,esbuildOptions:{resolveExtensions:[`.ts`,`.mts`,`.cts`,`.mjs`,`.js`,`.cjs`],plugins:[{name:`likec4-config`,setup(e){e.onResolve({filter:/^@?likec4\/config$/},e=>({path:e.path,namespace:`likec4-config`})),e.onEnd(e=>{let t=zi(e.errors,{kind:`error`});for(let e of t)W.error(e)}),e.onLoad({filter:/.*/,namespace:`likec4-config`},e=>({contents:`
37
+ `)}var GraphvizLayouter=class{graphviz;constructor(e){this.graphviz=e??new kc,Ac.trace`created with port ${this.graphviz.name}`}dispose(){this.graphviz.dispose()}[Symbol.dispose](){this.dispose()}get graphvizPort(){return this.graphviz}changePort(e){this.graphviz.dispose(),this.graphviz=e,Ac.trace`change port to ${this.graphviz.name}`}printToDot(e,t){return normalizeDot((t?new AiLayoutViewPrinter(e.view,e.styles,t):getPrinter(e)).print())}newScopedLogger(e){return Ac.getChild([e,`_`,Sn(4).toLowerCase()])}async dotToJson(e){let t=this.newScopedLogger(`dotToJson`),r;try{r=await this.graphviz.layoutJson(e)}catch(r){throw t.error(loggable(r)),t.error(`Failed to convert DOT to JSON:
38
+ `+e),r}try{return JSON.parse(r)}catch(o){throw t.error(loggable(o)),t.error`Failed to parse JSON:\n${r}\n. Generated from DOT:\n${e}`,o}}async layout(e){let t=this.newScopedLogger(`layout`);try{t.trace`layouting view ${e.view.id}...`;let r=await this.dot(e),{view:o}=e,s=parseGraphvizJson(await this.dotToJson(r),o);return qr(s)&&Object.assign(s,{sequenceLayout:v(s)}),r=normalizeDot(r),t.trace`layouting view ${e.view.id} done`,{dot:r,diagram:s}}catch(r){throw t.warn(loggable(r)),wrapError(r,`Error during layout: ${e.view.id}`)}}async aiLayout({view:e,styles:t},r){let o=this.newScopedLogger(`ai-layout`);try{o.trace`layouting view ${e.id} using AI hints...`;let s=new AiLayoutViewPrinter(e,t,r).print(),c=parseGraphvizJson(await this.dotToJson(s),e);return qr(c)&&Object.assign(c,{sequenceLayout:v(c)}),s=normalizeDot(s),o.trace`layouting view ${e.id} done`,{dot:s,diagram:c}}catch(t){throw o.warn(loggable(t)),wrapError(t,`Error during AI layout: ${e.id}`)}}async svg(e){let t=await this.dot(e);return t=normalizeDot(t),{svg:await this.graphviz.svg(t),dot:t}}async dot(e){let t=this.newScopedLogger(`dot`);t.trace`generating dot for view ${e.view.id}`;let r=getPrinter(e).print();if(!Jr(e.view))return normalizeDot(r);try{t.trace`unflattening dot`,r=await this.graphviz.unflatten(r)}catch(r){t.warn(`Error during unflatten: ${e.view.id}`,{error:r})}return normalizeDot(r)}async layoutProjectsView(e){let t=this.newScopedLogger(`layoutProjectsView`);t.debug`layouting projects overview...`;let r=new Dc(e).print();try{r=await this.graphviz.unflatten(r)}catch(e){t.warn(`Error during unflatten of projects view`,{error:e})}let o=await this.dotToJson(r);return t.debug`layouting ${`projects overview`}`,parseGraphvizJsonOfProjectsView(o,e)}};const jc=K.getChild([`layouter-queue`]);var QueueGraphvizLayoter=class extends GraphvizLayouter{queue;isProcessingBatch=!1;constructor(e){super(e?.graphviz),this.queue=new Gn({concurrency:e?.concurrency??this.graphvizPort.concurrency,timeout:e?.timeout??2e4,throwOnTimeout:e?.throwOnTimeout??!0})}async runInQueue(e){let t=jc.getChild([`run`,Sn(3)]);return this.isProcessingBatch?(t.debug`waiting for batch to finish`,await this.queue.onIdle(),await Si(),t.trace`try runInQueue again`,await this.runInQueue(e)):(await this.waitForQueueToShrink(this.queue.concurrency,t),jc.trace`add task to queue`,await this.queue.add(e))}changePort(e){super.changePort(e),this.queue.concurrency!==e.concurrency&&(this.queue.concurrency=this.graphvizPort.concurrency,jc.debug`set queue concurrency to ${this.graphvizPort.concurrency}`)}async layout(e){let t=await this.runInQueue(async()=>await super.layout(e));if(!t)throw Error(`QueueGraphvizLayoter: layout failed`);return t}async layoutProjectsView(e){let t=await this.runInQueue(async()=>await super.layoutProjectsView(e));if(!t)throw Error(`QueueGraphvizLayoter: layoutProjectsView failed`);return t}async batchLayout(e){let t=jc.getChild([`batch`,Sn(3)]);if(this.isProcessingBatch)return t.trace`wait for previous layouts to finish`,await this.queue.onIdle(),await Si(),e.cancelToken?.isCancellationRequested?(t.trace`cancellation requested`,[]):(t.trace`retry`,await this.batchLayout(e));let r=this.queue.concurrency;t.debug`starting, batch size: ${e.batch.length}, concurrency: ${r}`,this.isProcessingBatch=!0;let o=[];try{for(let s of e.batch)if(t.trace`add task for view ${s.view.id}`,this.queue.add(async()=>(r<=2&&await Si(),await super.layout(s))).then(t=>{if(!t){e.onError?.(s,Error(`Layout queue returned null for view ${s.view.id}`));return}o.push(t),e.onSuccess?.(s,t)}).catch(r=>{t.error(`Fail layout view ${s.view.id}`,{err:r}),e.onError?.(s,r)}),await this.waitForQueueToShrink(r,t),e.cancelToken?.isCancellationRequested){t.debug`cancellation requested`;break}let s=this.queue.pending+this.queue.size;s>0&&(t.trace`waiting ${s} tasks to finish`,await this.queue.onIdle())}finally{t.debug`batch layout done`,this.isProcessingBatch=!1}return o}async waitForQueueToShrink(e=this.queue.concurrency,t=jc){this.queue.size>e+2&&(t.trace`limit reached. queue size: ${this.queue.size}, running: ${this.queue.pending}, waiting shrink to ${e}`,await this.queue.onSizeLessThan(e+1))}dispose(){this.queue.clear(),super.dispose()}},Mc=e(Kn(),1);const Nc=K.getChild([`graphviz`,`binary`]);var GraphvizBinaryAdapter=class{_dotpath;_unflattenpath;constructor(e,t){this._dotpath=e,this._unflattenpath=t}get name(){return`binary`}dispose(){}[Symbol.dispose](){}get concurrency(){return Math.max(1,Fi.availableParallelism()-2)}get dotpath(){return this._dotpath??gi(this,`_dotpath`,()=>{let e=Mc.default.sync(`dot`);return Nc.debug`Found ${e}`,e})}get unflattenpath(){return this._unflattenpath??gi(this,`_unflattenpath`,()=>{let e=Mc.default.sync(`unflatten`);return Nc.debug`Found ${e}`,e})}async unflatten(e){let t,r=Nc.getChild([`unflatten`,Sn(4)]);try{let o=await Ni(this.unflattenpath,[`-l`,`1`,`-c`,`3`],{timeout:1e4,stdin:{string:e}});t=o.stdout,N(o.stderr)?r.trace(`{command} succeeded in {durationMs}ms`,{command:o.command,durationMs:Math.round(o.durationMs)}):r.warn(`{command} has stderr:
39
+ `+o.stderr,{command:o.command})}catch(o){r.debug(`FAILED DOT`,{dot:e}),r.error(loggable(o)),o instanceof Pi&&!N(o.stdout)&&(r.warn(`{command} returned result but failed with exitcode {exitCode}:
40
+ {stderr}`,{command:o.command,exitCode:o.exitCode,stderr:o.stderr}),t=o.stdout)}return t&&(e=t.replaceAll(/\t\[/g,` [`).replaceAll(/\t/g,` `)),e}async layoutJson(e){let t=Nc.getChild([`layoutJson`,Sn(4)]),r;try{let o=await Ni(this.dotpath,[`-Tjson`,`-y`],{timeout:1e4,stdin:{string:e}});r=o.stdout,N(o.stderr)?t.trace(`{command} succeeded in {durationMs}ms`,{command:o.command,durationMs:Math.round(o.durationMs)}):t.warn(`{command} has stderr:
41
+ `+o.stderr,{command:o.command})}catch(o){if(t.debug(`FAILED DOT`,{dot:e}),t.error(loggable(o)),o instanceof Pi&&!N(o.stdout))t.warn(`{command} returned result but failed with exitcode {exitCode}:
42
+ {stderr}`,{command:o.command,exitCode:o.exitCode,stderr:o.stderr}),r=o.stdout;else throw o}return r}async acyclic(e){return Promise.reject(Error(`Method not implemented.`))}async svg(e){let t=Nc.getChild([`svg`,Sn(4)]),r;try{let o=await Ni(this.dotpath,[`-Tsvg`,`-y`],{timeout:1e4,stdin:{string:e}});r=o.stdout,N(o.stderr)?t.trace(`{command} succeeded in {durationMs}ms`,{command:o.command,durationMs:Math.round(o.durationMs)}):t.warn(`{command} has stderr:
43
+ `+o.stderr,{command:o.command})}catch(o){if(t.debug(`FAILED DOT`,{dot:e}),t.error(loggable(o)),o instanceof Pi&&!N(o.stdout))t.warn(`{command} returned result but failed with exitcode {exitCode}:
44
+ {stderr}`,{command:o.command,exitCode:o.exitCode,stderr:o.stderr}),r=o.stdout;else throw o}return r}};const Y=K.getChild(`server`);function logWarnError(e){Y.warn(loggable(e))}function getTelemetrySink(e){let t=getMessageOnlyFormatter();return r=>{try{switch(r.level){case`error`:case`fatal`:{let o=r.category.join(`.`);if(o===`likec4.config`)break;let s=errorFromLogRecord(r);s?e.telemetry.logEvent({eventName:`error`,message:`${s.name}: ${s.message}`,category:o,...s.stack&&{stack:s.stack}}):e.telemetry.logEvent({eventName:`error`,message:t(r),category:o});break}}}catch(e){console.error(`Error while logging to LSP connection:`,e)}}}function configureLanguageServerLogger({lspConnection:e,enableTelemetry:t=!!e,useStdErr:r=!1,logLevel:o=zi?`debug`:`warning`,nonBlocking:s=!1,colors:c=Ri}={}){let u=!!e&&t&&!zi;configureLogger$1({reset:!0,sinks:{console:r?getConsoleStderrSink():getConsoleSink({formatter:c?getAnsiColorFormatter():getTextFormatter(),nonBlocking:s}),...u&&{telemetry:getTelemetrySink(e)}},loggers:[{category:[`likec4`],sinks:[`console`,...u?[`telemetry`]:[]],lowestLevel:o}]}),Y.trace(`logger configured`)}const Pc=Lt.pick({extends:!0,styles:!0}).loose(),normalizeExtends=e=>e?Array.isArray(e)?e:[e]:[],parseJsonConfig=async e=>{let t=await Zn.readFile(e,`utf-8`),r;try{r=bt.parse(t.trim()||`{}`)}catch(t){throw wrapError(t,`${e}:`)}if(!r||typeof r!=`object`||Array.isArray(r))throw Error(`${e}: Config must be a JSON object`);let o=Pc.safeParse(r);if(!o.success)throw Error(`${e}: Invalid config\n`+Et.prettifyError(o.error));return o.data},loadJsonConfigs=async(e,t)=>{if(t.includes(e)){let r=t.indexOf(e),o=[...t.slice(r),e].join(` -> `);throw Error(`Config extends cycle detected: ${o}`)}let r=await parseJsonConfig(e),o=normalizeExtends(r.extends),s=[...t,e],c=[];for(let t of o){let r=ir(tr(e),t);c.push(...await loadJsonConfigs(r,s))}return[...c,r]};async function loadConfig(e){e=typeof e==`string`?e:e.fsPath,K.getChild(`config`).trace`Loading config: ${rr(Hi(),e)}`;let t=tr(e),r=er(e),o={name:er(t)};if(Ft(r)){let t=await loadJsonConfigs(ir(e),[]);U(M(t,1),`Expect at least one config`);let r=dn(Fn(t),[`extends`,`styles`]),s=t.map(e=>e.styles).filter(I),c=s.length>0?_({},...s.reverse()):void 0;return Nt({...o,...r,...c?{styles:c}:{}})}U(It(r),`Invalid name for config file: ${e}`);let{mod:s}=await Bi({filepath:e,cwd:t,esbuildOptions:{resolveExtensions:[`.ts`,`.mts`,`.cts`,`.mjs`,`.js`,`.cjs`],plugins:[{name:`likec4-config`,setup(e){e.onResolve({filter:/^@?likec4\/config$/},e=>({path:e.path,namespace:`likec4-config`})),e.onEnd(e=>{let t=Vi(e.errors,{kind:`error`});for(let e of t)K.error(e)}),e.onLoad({filter:/.*/,namespace:`likec4-config`},e=>({contents:`
47
45
  // Mock implementation to allow loading config files without bundling @likec4/config
48
46
  function mock(x) { return x }
49
47
  export {
@@ -52,56 +50,57 @@ export {
52
50
  mock as defineStyle,
53
51
  mock as defineTheme,
54
52
  mock as defineThemeColor,
55
- }`,loader:`js`}))}}]}});return Pt(Object.assign(o,s?.default??s))}const Nc={aws:`activate.alexa-for-business.amplify.apache-mxnet-on-aws.api-gateway.app-config.app-flow.app-mesh.app-runner.app-stream.app-sync.application-auto-scaling.application-composer.application-cost-profiler.application-discovery-service.application-migration-service.artifact.athena.audit-manager.augmented-ai-a2i.aurora.auto-scaling.backint-agent.backup.batch.billing-conductor.bottlerocket.braket.budgets.certificate-manager.chatbot.chime-sdk.chime-voice-connector.chime.clean-rooms.client-vpn.cloud-control-api.cloud-development-kit.cloud-directory.cloud-formation.cloud-front.cloud-hsm.cloud-map.cloud-search.cloud-shell.cloud-trail.cloud-wan.cloud-watch.cloud9.code-artifact.code-build.code-catalyst.code-commit.code-deploy.code-guru.code-pipeline.code-star.code-whisperer.cognito.command-line-interface.comprehend-medical.comprehend.compute-optimizer.config.connect.console-mobile-application.control-tower.corretto.cost-and-usage-report.cost-explorer.data-exchange.data-pipeline.data-sync.data-zone.database-migration-service.deep-composer.deep-learning-amis.deep-learning-containers.deep-lens.deep-racer.detective.dev-ops-guru.device-farm.direct-connect.directory-service.distro-for-open-telemetry.document-db.dynamo-db.ec2-auto-scaling.ec2-image-builder.ec2.ecs-anywhere.efs.eks-anywhere.eks-cloud.eks-distro.elasti-cache.elastic-beanstalk.elastic-block-store.elastic-container-registry.elastic-container-service.elastic-disaster-recovery.elastic-fabric-adapter.elastic-inference.elastic-kubernetes-service.elastic-load-balancing.elastic-transcoder.elemental-appliances-software.elemental-conductor.elemental-delta.elemental-link.elemental-live.elemental-media-connect.elemental-media-convert.elemental-media-live.elemental-media-package.elemental-media-store.elemental-media-tailor.elemental-server.emr.event-bridge.express-workflows.fargate.fault-injection-simulator.file-cache.fin-space.firewall-manager.forecast.fraud-detector.free-rtos.fsx-for-lustre.fsx-for-net-app-ontap.fsx-for-open-zfs.fsx-for-wfs.fsx.game-kit.game-lift.game-sparks.genomics-cli.global-accelerator.glue-data-brew.glue-elastic-views.glue.ground-station.guard-duty.health-lake.honeycode.iam-identity-center.identity-and-access-management.inspector.interactive-video-service.io-t-1-click.io-t-analytics.io-t-button.io-t-core.io-t-device-defender.io-t-device-management.io-t-edu-kit.io-t-events.io-t-express-link.io-t-fleet-wise.io-t-greengrass.io-t-robo-runner.io-t-site-wise.io-t-things-graph.io-t-twin-maker.iq.kendra.key-management-service.keyspaces.kinesis-data-analytics.kinesis-data-streams.kinesis-firehose.kinesis-video-streams.kinesis.lake-formation.lambda.launch-wizard.lex.license-manager.lightsail.local-zones.location-service.lookout-for-equipment.lookout-for-metrics.lookout-for-vision.lumberyard.macie.mainframe-modernization.managed-blockchain.managed-grafana.managed-service-for-prometheus.managed-services.managed-streaming-for-apache-kafka.managed-workflows-for-apache-airflow.management-console.marketplace-dark.marketplace-light.memory-db-for-redis.migration-evaluator.migration-hub.monitron.mq.neptune.network-firewall.neuron.nice-dcv.nice-engin-frame.nimble-studio.nitro-enclaves.omics.open-3d-engine.open-search-service.ops-works.organizations.outposts-family.outposts-rack.outposts-servers.panorama.parallel-cluster.personal-health-dashboard.personalize.pinpoint-apis.pinpoint.polly.private-5g.private-certificate-authority.private-link.professional-services.proton.quantum-ledger-database.quick-sight.rds-on-vmware.rds.re-post.red-hat-open-shift-service-on-aws.redshift.rekognition.reserved-instance-reporting.resilience-hub.resource-access-manager.resource-explorer.robo-maker.route-53.s3-on-outposts.sage-maker-ground-truth.sage-maker-studio-lab.sage-maker.savings-plans.secrets-manager.security-hub.security-lake.server-migration-service.serverless-application-repository.service-catalog.service-management-connector.shield.signer.sim-space-weaver.simple-email-service.simple-notification-service.simple-queue-service.simple-storage-service-glacier.simple-storage-service.site-to-site-vpn.snowball-edge.snowball.snowcone.snowmobile.step-functions.storage-gateway.sumerian.supply-chain.support.systems-manager.tensor-flow-on-aws.textract.thinkbox-deadline.thinkbox-frost.thinkbox-krakatoa.thinkbox-sequoia.thinkbox-stoke.thinkbox-xmesh.timestream.tools-and-sdks.torch-serve.training-certification.transcribe.transfer-family.transit-gateway.translate.trusted-advisor.verified-access.verified-permissions.virtual-private-cloud.vmware-cloud-on-aws.vpc-lattice.waf.wavelength.well-architected-tool.wickr.work-docs-sdk.work-docs.work-link.work-mail.work-spaces-family.x-ray`.split(`.`),azure:`abs-member.active-directory-connect-health.activity-log.administrative-units.advisor.ai-at-edge.ai-studio.aks-automatic.aks-istio.alerts.all-resources.analysis-services.anomaly-detector.api-center.api-connections.api-management-services.api-proxy.app-compliance-automation.app-configuration.app-registrations.app-service-certificates.app-service-domains.app-service-environments.app-service-plans.app-services.app-space-component.app-space.applens.application-gateway-containers.application-gateways.application-group.application-insights.application-security-groups.aquila.arc-data-services.arc-kubernetes.arc-machines.arc-postgre-sql.arc-sql-managed-instance.arc-sql-server.atm-multistack.auto-scale.automanaged-vm.automation-accounts.availability-sets.avs-vm.azure-a.azure-ad-b2c.azure-api-for-fhir.azure-applied-ai-services.azure-arc.azure-attestation.azure-backup-center.azure-blockchain-service.azure-center-for-sap.azure-chaos-studio.azure-cloud-shell.azure-communication-services.azure-communications-gateway.azure-compute-galleries.azure-consumption-commitment.azure-cosmos-db.azure-data-catalog.azure-data-explorer-clusters.azure-database-maria-db-server.azure-database-migration-services.azure-database-my-sql-server.azure-database-postgre-sql-server-group.azure-database-postgre-sql-server.azure-databox-gateway.azure-databricks.azure-deployment-environments.azure-dev-ops.azure-dev-tunnels.azure-edge-hardware-center.azure-experimentation-studio.azure-fileshares.azure-firewall-manager.azure-firewall-policy.azure-hcp-cache.azure-hpc-workbenches.azure-hybrid-center.azure-information-protection.azure-io-t-operations.azure-lighthouse.azure-load-testing.azure-managed-grafana.azure-managed-redis.azure-maps-accounts.azure-media-service.azure-migrate.azure-monitor-dashboard.azure-monitor-pipeline.azure-monitors-for-sap-solutions.azure-net-app-files.azure-network-function-manager-functions.azure-network-function-manager.azure-object-understanding.azure-open-ai.azure-operator-5g-core.azure-operator-insights.azure-operator-nexus.azure-operator-service-manager.azure-orbital.azure-programmable-connectivity.azure-purview-accounts.azure-quotas.azure-red-hat-open-shift.azure-sentinel.azure-service-bus.azure-sphere.azure-spring-apps.azure-sql-edge.azure-sql-server-stretch-databases.azure-sql-vm.azure-sql.azure-stack-edge.azure-stack-hci-sizer.azure-stack.azure-storage-mover.azure-support-center-blue.azure-sustainability.azure-synapse-analytics.azure-token-service.azure-video-indexer.azure-virtual-desktop.azure-vmware-solution.azure-workbooks.azurite.backlog.backup-vault.bare-metal-infrastructure.bastions.batch-accounts.batch-ai.biz-talk.blob-block.blob-page.blockchain-applications.blueprints.bonsai.bot-services.branch.breeze.browser.bug.builds.business-process-tracking.cache-redis.cache.capacity-reservation-groups.capacity.cdn-profiles.central-service-instance-for-sap.ceres.change-analysis.client-apps.cloud-services-classic.cloud-services-extended-support.cloud-test.code-optimization.code.cognitive-search.cognitive-services-decisions.cognitive-services.collaborative-service.commit.community-images.compliance-center.compliance.compute-fleet.computer-vision.conditional-access.confidential-ledgers.connected-cache.connected-vehicle-platform.connections.consortium.container-apps-environments.container-instances.container-registries.container-services-deprecated.content-moderators.content-safety.controls-horizontal.controls.cost-alerts.cost-analysis.cost-budgets.cost-export.cost-management-and-billing.cost-management.counter.cubes.custom-ip-prefix.custom-vision.customer-lockbox-for-microsoft-azure.dashboard-hub.dashboard.data-box.data-collection-rules.data-factories.data-lake-analytics.data-lake-storage-gen1.data-lake-store-gen1.data-share-invitations.data-shares.data-virtualization.database-instance-for-sap.ddo-s-protection-plans.dedicated-hsm.defender-cm-local-manager.defender-dcs-controller.defender-distributer-control-system.defender-engineering-station.defender-external-management.defender-freezer-monitor.defender-historian.defender-hmi.defender-industrial-packaging-system.defender-industrial-printer.defender-industrial-robot.defender-industrial-scale-system.defender-marquee.defender-meter.defender-plc.defender-pneumatic-device.defender-programable-board.defender-relay.defender-robot-controller.defender-rtu.defender-sensor.defender-slot.defender-web-guiding-system.detonation.dev-console.dev-ops-starter.dev-test-labs.device-compliance.device-configuration.device-enrollment.device-provisioning-services.device-security-apple.device-security-google.device-security-windows.device-update-io-t-hub.devices.diagnostics-settings.digital-twins.disk-encryption-sets.disk-pool.disks-classic.disks-snapshots.disks.dns-multistack.dns-private-resolver.dns-security-policy.dns-zones.download.e-books.edge-actions.edge-management.edge-storage-accelerator.education.elastic-job-agents.elastic-san.endpoint-analytics.engage-center-connect.enterprise-applications.entra-connect-health.entra-connect-sync.entra-connect.entra-domain-services.entra-global-secure-access.entra-id-protection.entra-identity-custom-roles.entra-identity-licenses.entra-identity-risky-signins.entra-identity-risky-users.entra-identity-roles-and-administrators.entra-internet-access.entra-managed-identities.entra-private-access.entra-privleged-identity-management.entra-verified-id.error.event-grid-domains.event-grid-subscriptions.event-grid-topics.event-hub-clusters.event-hubs.exchange-access.exchange-on-premises-access.express-route-circuits.express-route-direct.express-route-traffic-collector.extended-security-updates.extensions.external-id-modified.external-id.external-identities.face-apis.feature-previews.fhir-service.fiji.file.files.firewalls.folder-blank.folder-website.form-recognizers.frd-qa.free-services.front-door-and-cdn-profiles.ftp.function-apps.gear.genomics-accounts.genomics.globe-error.globe-success.globe-warning.groups.guide.hd-insight-clusters.hdi-aks-cluster.heart.help-and-support.host-groups.host-pools.hosts.hybrid-connectivity-hub.ic-m-troubleshooting.identity-governance.identity-multi-factor-authentication.identity-secure-score.image-definitions.image-templates.image-versions.image.images.immersive-readers.import-export-jobs.industrial-io-t.information.infrastructure-backup.input-output.instance-pools.integration-accounts.integration-environments.integration-service-environments.internet-analyzer-profiles.intune-app-protection.intune-for-education.intune-trends.intune.io-t-central-applications.io-t-edge.io-t-hub.ip-address-manager.ip-groups.journey-hub.key-vaults.keys.kubernetes-fleet-manager.kubernetes-services.lab-accounts.lab-services.landing-zone.language-understanding.language.launch-portal.learn.load-balancer-hub.load-balancers.load-test.load-testing.local-network-gateways.location.log-analytics-query-pack.log-analytics-workspaces.log-streaming.logic-apps-custom-connector.logic-apps-template.logic-apps.machine-learning-studio-classic-web-services.machine-learning-studio-web-service-plans.machine-learning-studio-workspaces.machine-learning.machines-azure-arc.maintenance-configuration.managed-applications-center.managed-database.managed-desktop.managed-dev-ops-pools.managed-file-shares.managed-identities.managed-instance-apache-cassandra.managed-service-fabric.management-groups.management-portal.marketplace-management.marketplace.med-tech-service.media-file.media.mesh-applications.metrics-advisor.metrics.microsoft-defender-easm.microsoft-defender-for-cloud.microsoft-defender-for-io-t.microsoft-dev-box.mindaro.mission-landing-zone.mobile-engagement.mobile-networks.mobile.modular-data-center.module.monitor-health-models.monitor.multi-tenancy.multifactor-authentication.my-customers.nat.network-foundation-hub.network-interfaces.network-managers.network-security-groups.network-security-hub.network-security-perimeters.network-watcher.notification-hub-namespaces.notification-hubs.offers.on-premises-data-gateways.open-supply-chain-platform.operation-log-classic.oracle-database.os-images-classic.osconfig.outbound-connection.partner-namespace.partner-registration.partner-topic.peering-service.peerings.personalizers.planetary-computer-pro.plans.policy.power-bi-embedded.power-platform.power-up.power.powershell.preview-features.private-endpoints.private-link-service.private-link-services.private-link.process-explorer.production-ready-database.promethus.proximity-placement-groups.public-ip-addresses-classic.public-ip-addresses.public-ip-prefixes.qn-a-makers.quickstart-center.recent.recovery-services-vaults.region-management.relays.remote-rendering.reservations.reserved-capacity.reserved-ip-addresses-classic.resource-explorer.resource-graph-explorer.resource-group-list.resource-groups.resource-guard.resource-linked.resource-management-private-link.resource-mover.resources-provider.restore-points-collections.restore-points.route-filters.route-tables.rtos.savings-plans.scheduler-job-collections.scheduler.scvmm-management-servers.search-grid.search.security-baselines.security.send-grid-accounts.server-farm.serverless-search.service-catalog-mad.service-endpoint-policies.service-fabric-clusters.service-group-relationships.service-groups.service-health.service-providers.shared-image-galleries.signal-r.software-as-a-service.software-updates.solutions.sonic-dash.spatial-anchor-accounts.speech-services.spot-vm.spot-vmss.sql-data-warehouses.sql-database-fleet-manager.sql-database.sql-elastic-pools.sql-managed-instance.sql-server-registries.sql-server.ssd.ssh-keys.ssis-lift-and-shift-ir.stack-hci-premium.static-apps.stor-simple-data-managers.stor-simple-device-managers.storage-accounts-classic.storage-accounts.storage-actions.storage-azure-files.storage-container.storage-explorer.storage-functions.storage-hubs.storage-queue.storage-sync-services.stream-analytics-jobs.subnet.subscriptions.system-topic.table.tag.tags.targets-management.template-specs.templates.tenant-properties.tenant-status.test-base.tfs-vc-repository.time-series-data-sets.time-series-insights-access-policies.time-series-insights-environments.time-series-insights-event-sources.toolbox.toolchain-orchestrator.traffic-manager-profiles.translator-text.troubleshoot.universal-print.update-management-center.updates.user-privacy.user-settings.user-subscriptions.users.verifiable-credentials.verification-as-a-service.versions.video-analyzers.virtual-clusters.virtual-enclaves.virtual-instance-for-sap.virtual-machine.virtual-machines-classic.virtual-network-gateways.virtual-networks-classic.virtual-networks.virtual-router.virtual-visits-builder.virtual-wan-hub.virtual-wans.vm-app-definitions.vm-app-versions.vm-image-version.vm-images-classic.vm-scale-sets.vpnclient-windows.wac-installer.wac.web-app-database.web-application-firewall-policies-waf.web-jobs.web-slots.web-test.website-power.website-staging.windows-notification-services.windows10-core-services.workbooks.worker-container-app.workflow.workload-orchestration.workspace-gateway.workspaces`.split(`.`),gcp:`access-context-manager.administration.advanced-agent-modeling.advanced-solutions-lab.agent-assist.ai-hub.ai-platform-unified.ai-platform.analytics-hub.anthos-config-management.anthos-service-mesh.anthos.api-analytics.api-monetization.api.apigee-api-platform.apigee-sense.app-engine.artifact-registry.asset-inventory.assured-workloads.auto-ml-natural-language.auto-ml-tables.auto-ml-translation.auto-ml-video-intelligence.auto-ml-vision.auto-ml.bare-metal-solutions.batch.beyondcorp.big-query.bigtable.billing.binary-authorization.catalog.certificate-authority-service.certificate-manager.cloud-api-gateway.cloud-apis.cloud-armor.cloud-asset-inventory.cloud-audit-logs.cloud-build.cloud-cdn.cloud-code.cloud-composer.cloud-data-fusion.cloud-deploy.cloud-deployment-manager.cloud-dns.cloud-domains.cloud-ekm.cloud-endpoints.cloud-external-ip-addresses.cloud-firewall-rules.cloud-for-marketing.cloud-functions.cloud-generic.cloud-gpu.cloud-healthcare-api.cloud-healthcare-marketplace.cloud-hsm.cloud-ids.cloud-inference-api.cloud-interconnect.cloud-jobs-api.cloud-load-balancing.cloud-logging.cloud-media-edge.cloud-monitoring.cloud-nat.cloud-natural-language-api.cloud-network.cloud-ops.cloud-optimization-ai-fleet-routing-api.cloud-optimization-ai.cloud-router.cloud-routes.cloud-run-for-anthos.cloud-run.cloud-scheduler.cloud-security-scanner.cloud-shell.cloud-spanner.cloud-sql.cloud-storage.cloud-tasks.cloud-test-lab.cloud-tpu.cloud-translation-api.cloud-vision-api.cloud-vpn.compute-engine.configuration-management.connectivity-test.connectors.contact-center-ai.container-optimized-os.container-registry.data-catalog.data-labeling.data-layers.data-loss-prevention-api.data-qn-a.data-studio.data-transfer.database-migration-service.dataflow.datalab.dataplex.datapol.dataprep.dataproc-metastore.dataproc.datashare.datastore.datastream.debugger.developer-portal.dialogflow-cx.dialogflow-insights.dialogflow.document-ai.early-access-center.error-reporting.eventarc.filestore.financial-services-marketplace.firestore.fleet-engine.free-trial.game-servers.gce-systems-management.genomics.gke-on-prem.google-cloud-marketplace.google-kubernetes-engine.google-maps-platform.healthcare-nlp-api.home.identity-and-access-management.identity-aware-proxy.identity-platform.iot-core.iot-edge.key-access-justifications.key-management-service.kuberun.launcher.local-ssd.looker.managed-service-for-microsoft-active-directory.media-translation-api.memorystore.migrate-for-anthos.migrate-for-compute-engine.my-cloud.network-connectivity-center.network-intelligence-center.network-security.network-tiers.network-topology.onboarding.os-configuration-management.os-inventory-management.os-patch-management.partner-interconnect.partner-portal.performance-dashboard.permissions.persistent-disk.phishing-protection.policy-analyzer.premium-network-tier.private-connectivity.private-service-connect.producer-portal.profiler.project.pub-sub.quantum-engine.quotas.real-world-insights.recommendations-ai.release-notes.retail-api.risk-manager.runtime-config.secret-manager.security-command-center.security-health-advisor.security-key-enforcement.security.service-discovery.speech-to-text.stackdriver.standard-network-tier.stream-suite.support.tensorflow-enterprise.text-to-speech.tools-for-powershell.trace.traffic-director.transfer-appliance.transfer.user-preferences.vertex-ai.video-intelligence-api.virtual-private-cloud.visual-inspection.vmware-engine.web-risk.web-security-scanner.workflows.workload-identity-pool`.split(`.`),tech:`100tb.500px.aarch64.active-campaign-icon.active-campaign.adobe-after-effects.adobe-animate.adobe-dreamweaver.adobe-icon.adobe-illustrator.adobe-incopy.adobe-indesign.adobe-lightroom.adobe-photoshop.adobe-premiere-pro.adobe-premiere.adobe-xd.adobe.adonis-js.adonisjs-icon.adroll.adyen.aerogear.aerospike-icon.aerospike.after-effects.aha.airbnb-icon.airbnb.airbrake.airflow-icon.airflow.airtable.aix.akamai.akka.alfresco.algolia.alpinejs-icon.alpinejs.altair.amazon-chime.amazon-connect.amazon-web-services.amd.amex-digital.amex.amp-icon.amp.ampersand.amplication-icon.amplication.amplitude-icon.amplitude.anaconda.analog.android-icon.android-studio.android-vertical.android.angellist.angular-icon.angular-js.angular.ansible.ant-design.anthropic-icon.anthropic.apache-camel.apache-cloudstack.apache-flink-icon.apache-flink.apache-spark.apache-superset-icon.apache-superset.apache.apiary.apidog-icon.apidog.apl.apollostack.apostrophe.appbaseio-icon.appbaseio.appcelerator.appcenter-icon.appcenter.appcircle-icon.appcircle.appcode.appdynamics-icon.appdynamics.appium.apple-app-store.apple-pay.apple-safari.apple.applitools-icon.applitools.appsignal-icon.appsignal.apptentive.appveyor.appwrite-icon.appwrite.arangodb-icon.arangodb.arc.architect-icon.architect.archlinux.arduino.argo-icon.argo.argocd.arm.armory-icon.armory.asana-icon.asana.asciidoctor.assembla-icon.assembla.astro-icon.astro.astronomer.async-api-icon.async-api.atlassian.atom-icon.atom.atomic-icon.atomic.atomicojs-icon.atomicojs.aurelia.aurora.auth0-icon.auth0.authy.autodesk-maya.autodesk-shot-grid.autoit.autoprefixer.ava.awesome.awk.aws-amplify.aws-api-gateway.aws-app-mesh.aws-appflow.aws-appsync.aws-athena.aws-aurora.aws-backup.aws-batch.aws-certificate-manager.aws-cloudformation.aws-cloudfront.aws-cloudsearch.aws-cloudtrail.aws-cloudwatch.aws-codebuild.aws-codecommit.aws-codedeploy.aws-codepipeline.aws-codestar.aws-cognito.aws-config.aws-documentdb.aws-dynamodb.aws-ec2.aws-ecs.aws-eks.aws-elastic-beanstalk.aws-elasticache.aws-elb.aws-eventbridge.aws-fargate.aws-glacier.aws-glue.aws-iam.aws-keyspaces.aws-kinesis.aws-kms.aws-lake-formation.aws-lambda.aws-lightsail.aws-mq.aws-msk.aws-neptune.aws-open-search.aws-opsworks.aws-quicksight.aws-rds.aws-redshift.aws-route53.aws-s3.aws-secrets-manager.aws-ses.aws-shield.aws-sns.aws-sqs.aws-step-functions.aws-systems-manager.aws-timestream.aws-vpc.aws-waf.aws-xray.aws.axios.azios.azure-devops.azure-sql-database.azure.babel.backbone-icon.backbone-js.backbone.backerkit.baker-street.balena.ballerina.bamboo.basecamp-icon.basecamp.basekit.baseline.bash-icon.bash.batch.beats.behance.bem-2.bem.bigpanda.bing.biomejs-icon.biomejs.bitbar.bitbucket.bitcoin.bitnami.bitrise-icon.bitrise.blender.blitzjs-icon.blitzjs.blocs.blogger.blossom.blueprint.bluesky.bluetooth.booqable-icon.booqable.bootstrap.bosun.botanalytics.bourbon.bower.box.brackets.brainjs.branch-icon.branch.brandfolder-icon.brandfolder.brave.braze-icon.braze.broadcom-icon.broadcom.broccoli.brotli.browserify-icon.browserify.browserling.browserslist.browserstack.browsersync.brunch.bubble-icon.bubble.buck.buddy.buffer.bugherd-icon.bugherd.bugsee.bugsnag.builder-io-icon.builder-io.buildkite-icon.buildkite.bulma.bun.bunny-net-icon.bunny-net.c.cachet.cairo-graphics.cake-php.cakephp-icon.calibre-icon.calibre.campaignmonitor-icon.campaignmonitor.canjs.canva.capacitor.capacitorjs-icon.capacitorjs.capistrano.carbide.cardano-icon.cardano.cassandra.cent-os.centos-icon.certbot.ceylon.chai.chalk.chargebee-icon.chargebee.chartjs.chef.chevereto.chroma.chromatic-icon.chromatic.chrome-web-store.chrome.cinder.circle-ci.cirrus-ci.cirrus.clarity.claude-icon.claude.clio-lang.clion.cljs.clojure-script.clojure.close.cloud9.cloudacademy-icon.cloudacademy.cloudcraft.cloudflare-icon.cloudflare-workers-icon.cloudflare-workers.cloudflare.cloudinary-icon.cloudinary.cloudlinux.cmake.cobalt.cockpit.cocoapods.coda-icon.coda.codacy.code-igniter.code-pen.codeac.codebase.codebeat.codecademy.codeception.codeclimate-icon.codeclimate.codecov-icon.codecov.codefactor-icon.codefactor.codeigniter-icon.codepen-icon.codersrank-icon.codersrank.coderwall.codesandbox-icon.codesandbox.codesee-icon.codesee.codio.codium-icon.codium.coffee-script.commitizen.compass.componentkit.compose-multiplatform.compose.composer.conan-io.concourse.concretecms-icon.concretecms.conda.confluence.consul.contao.contentful.convox-icon.convox.copyleft-pirate.copyleft.corda.cordova.cosmosdb.couchbase.couchdb-icon.couchdb.coursera.coveralls.cpanel.cplusplus.craftcms.crashlytics.crateio.create-react-app.createjs.crossplane-icon.crossplane.crucible.crystal.csharp.css3-official.css3.cssnext.cube-icon.cube.cucumber.curl.customerio-icon.customerio.cyclejs.cypress-icon.cypress.d3.d3js.dailydev-icon.dailydev.daisy-ui-icon.daisy-ui.danfo.dart.dashlane-icon.dashlane.data-grip.data-spell.data-station.database-labs.datadog-icon.datadog.datasette-icon.datasette.datocms-icon.datocms.dbeaver.dbt-icon.dbt.dcos-icon.dcos.debian.delighted-icon.delighted.deno.dependabot.deployhq-icon.deployhq.derby.descript-icon.descript.designernews.deviantart-icon.deviantart.devicon.dgraph-icon.dgraph.dialogflow.digital-ocean-icon.digital-ocean.dimer.dinersclub.discord-icon.discord-js.discord.discourse-icon.discourse.discover.disqus.django-icon.django-rest.django.dockbit.docker-icon.docker.doctrine.docusaurus.dojo-icon.dojo-toolkit.dojo.dolt.dotnet.dovetail-icon.dovetail.dreamhost.dribbble-icon.dribbble.drift.drip.drizzle-icon.drizzle.drone-icon.drone.drools-icon.drools.dropbox.dropmark.dropwizard.dropzone.drupal-icon.drupal.duckduckgo.dynatrace-icon.dynatrace.dyndns.ebanx.eclipse-ceylon.eclipse-icon.eclipse-ide.eclipse-vert-x.eclipse.ecma.edgedb.edgio-icon.edgio.editorconfig.effect-icon.effect.effector.egghead.elasticbeats.elasticpath-icon.elasticpath.elasticsearch.electron.element.elemental-ui.elementary.eleventy-11ty.eleventy.elixir.ello.elm-classic.elm.elo.emacs-classic.emacs.embedded-c.embedly.ember-js.ember-tomster.ember.emmet.enact.engine-yard-icon.engine-yard.envato.envoy-icon.envoy.envoyer.eraser-icon.eraser.erlang.esbuild.esdoc.eslint-old.eslint.eta-icon.eta.etcd.ethereum-color.ethereum.ethers.ethnio.eventbrite-icon.eventbrite.eventsentry.evergreen-icon.evergreen.expo-icon.expo.express.fabric.facebook.faker.falcor.fast-api.fastapi-icon.fastify-icon.fastify.fastlane.fastly.fauna-icon.fauna.feathers.feathersjs.fedora.fetch.ffmpeg-icon.ffmpeg.figma.file-zilla.firebase-icon.firebase.firefox.flannel.flarum.flask.flat-ui.flattr-icon.flattr.fleep.flickr-icon.flickr.flight.floodio.flow.flowxo.floydhub.flutter.flux.fluxxor.fly-icon.fly.fogbugz-icon.fogbugz.fomo-icon.fomo.font-awesome.forestadmin-icon.forestadmin.forever.formkeep.fortran.foundation.foundationdb-icon.foundationdb.framer.framework7-icon.framework7.freebsd.freedcamp-icon.freedcamp.freedomdefined.fresh.frontapp.fsharp.fuchsia.galliumos.game-analytics-icon.game-analytics.ganache-icon.ganache.gatling.gatsby.gazebo.gcc.geekbot.geetest-icon.geetest.gentoo.getyourguide.ghost.giantswarm.gimp.gin.git-icon.git.gitboard.gitbook.github-actions.github-codespaces.github-copilot.github-icon.github-octocat.github.gitkraken.gitlab-icon.gitlab.gitpod.gitter.gitup.glamorous-icon.glamorous.gleam.glimmerjs.glint.glitch-icon.glitch.gnome-icon.gnome.gnu-emacs.gnu-net.gnu.gnupg-icon.gnupg.go-land.go.gocd.godot-engine.godot-icon.godot.gohorse.google-360suite.google-admob.google-ads.google-adsense.google-analytics.google-bard-icon.google-bard.google-calendar.google-cloud-functions.google-cloud-run.google-cloud.google-data-studio.google-developers.google-domains-icon.google-domains.google-drive.google-fit.google-gemini.google-gmail.google-home.google-icon.google-keep.google-maps.google-marketing-platform.google-meet.google-one.google-optimize.google-palm.google-pay.google-photos.google-play-console-icon.google-play-console.google-play-icon.google-play.google-search-console.google-tag-manager.google-workspace.google.gopher.gradio-icon.gradio.gradle.grafana.grails.grammarly-icon.grammarly.graphene.graphql.grav.gravatar-icon.gravatar.graylog-icon.graylog.greensock-icon.greensock.gridsome-icon.gridsome.grommet.groovehq.groovy.grove.growth-book-icon.growth-book.grpc.grunt.gruntjs.gulp.gulpjs.gunicorn.gunjs.gusto.gwt.hack.hacker-one.hadoop.haiku-icon.haiku.haml.hanami.handlebars.hapi.hardhat-icon.hardhat.harness-icon.harness.harvester.hashicorp-icon.hashicorp-vault.hashicorp.hashnode-icon.hashnode.haskell-icon.haskell.hasura-icon.hasura.haxe.haxl.hbase.hcaptcha-icon.hcaptcha.headlessui-icon.headlessui.heap-icon.heap.helm.helpscout-icon.helpscout.hermes.heroku-icon.heroku-redis.heroku.hexo.hhvm.hibernate.highcharts.hipercard.homebrew.hono.hookstate.hootsuite-icon.hootsuite.hosted-graphite.hostgator-icon.hostgator.hotjar-icon.hotjar.houndci.html5-boilerplate.html5.htmx-icon.htmx.httpie-icon.httpie.hubspot.hugging-face-icon.hugging-face.huggy.hugo.humongous.hyper.hyperapp.ibm-spss-statistics.ibm.ie10.ieee.ietf.ifttt.imagemin.imba-icon.imba.immer-icon.immer.immutable.impala.importio-icon.importio.incident-icon.incident.infer.inferno.influxdb-icon.influxdb.ink.inkscape.insomnia.instagram-icon.instagram.intel.intellij-idea.intercom-icon.intercom.internet-computer-icon.internet-computer.internetexplorer.invision-icon.invision.ionic-icon.ionic.ios.iron-icon.iron.itsalive-icon.itsalive.jade.jaeger.jamstack-icon.jamstack.jasmine.java.javascript.jcb.jeet.jekyll.jenkins.jest.jetbrains-icon.jetbrains-space-icon.jetbrains-space.jetbrains.jfrog.jhipster-icon.jhipster.jira-align.jira.joomla.jotai.jquery-mobile.jquery.jruby.jsbin.jsdelivr.jsdom.jsfiddle.json-ld.json-schema-icon.json-schema.json.jspm.jss.juju.jule.julia.junit.jupyter.jwt-icon.jwt.k3os.k3s.kafka-icon.kafka.kaggle.kaios.kallithea.karate.karma.katalon-icon.katalon.kde.keen.kemal.keras.keycdn-icon.keycdn.keydb-icon.keydb.keystonejs.khan-academy-icon.khan-academy.kibana.kickstarter-icon.kickstarter.kinto-icon.kinto.kirby-icon.kirby.knex-js.knex.knockout.koa.kong-icon.kong.kops.koreio.kotlin-icon.kotlin.kraken.krakenjs.ktor-icon.ktor.kubernetes.kustomer.labview.languagetool.laravel.lastfm.lateral-icon.lateral.latex.launchdarkly-icon.launchdarkly.launchrock.leaflet.leankit-icon.leankit.lerna.less-js.less.lets-cloud.letsencrypt.leveldb.lexical-icon.lexical.liftweb.lighthouse.lightstep-icon.lightstep.lighttpd.linear-icon.linear.linkedin-icon.linkedin.linkerd.linode.linux-mint.linux-tux.linux.liquibase.lit-icon.lit.litmus.livewire.llvm.loader.lodash.logentries.logstash.lookback.looker-icon.looker.loom-icon.loom.loopback-icon.loopback.losant.lua.lucene-net.lucene.lumen.mac-os.madge.maestro.mageia.magento.mailchimp-freddie.mailchimp.maildeveloper.mailgun-icon.mailgun.mailjet-icon.mailjet.malinajs.manjaro.mantine-icon.mantine.mapbox-icon.mapbox.maps-me.mapzen-icon.mapzen.mariadb-icon.mariadb.marionette.markdown.marko.marvel.mastercard.mastodon-icon.mastodon.material-ui.materialize.materializecss.matlab.matomo-icon.matomo.matplotlib-icon.matplotlib.matter-icon.matter.mattermost-icon.mattermost.mautic-icon.mautic.maven.mdn.mdx.medium-icon.medium.medusa-icon.medusa.meilisearch.memcached.memgraph.mention.mercurial.mesos.messenger.meta-icon.meta.metabase.metamask-icon.metamask.meteor-icon.meteor-js.meteor.micro-icon.micro-python.micro.microcosm.micron-icon.micron.microsoft-azure.microsoft-edge.microsoft-icon.microsoft-onedrive.microsoft-power-bi.microsoft-sql-server.microsoft-teams.microsoft-windows-icon.microsoft-windows.microsoft.mida-icon.mida.middleman.midjourney.milligram.million-icon.million.milvus-icon.milvus.mindsdb-icon.mindsdb.minitab.mint-lang.mio.miro-icon.miro.mist.mistral-ai-icon.mistral-ai.mithril.mixmax.mixpanel.mlab.mob-x.mocha.mockflow-icon.mockflow.modernizr.modx-icon.modx.moleculer.momentjs.monday-icon.monday.monero.mongodb-icon.mongodb.mongoose-js.mono.moodle.moon.mootools.morpheus-icon.morpheus.mozilla.mparticle-icon.mparticle.mps-icon.mps.ms-dos.msw-icon.msw.multipass.mysql-icon.mysql.naiveui.namecheap.nano.nanonets.nasm.nativescript.nats-icon.nats.neat.neo4j.neon-icon.neon.neovim.nerog.nestjs.net-core.net.netbeans.netflix-icon.netflix.netlify-icon.netlify.network-x.neverinstall-icon.neverinstall.new-relic-icon.new-relic.new4j.nextjs-icon.nextjs.nginx.ngrok.nhibernate.nhost-icon.nhost.nightwatch.nim-lang.nim.nimble.nix.nocodb.nodal.node-sass.nodebots.nodejs-icon-alt.nodejs-icon.nodejs.nodemon.nodeos.nodewebkit.nomad-icon.nomad.notion-icon.notion.noysi.npm-icon.npm.nuclide.nuget.num-py.nuxt-icon.nuxt-js.nuxt.nvidia.nvm.nx.oauth.objective-c.observablehq.obsidian-icon.obsidian.ocaml.octodns.octopus-deploy.oh-my-zsh.okta-icon.okta.olark.onesignal.open-al.open-api.open-cl.open-cv.open-gl.open-graph.open-stack.open-suse.open-telemetry.open-zeppelin-icon.open-zeppelin.openai-icon.openai.openapi-icon.opencart.opencollective.openframeworks.openjs-foundation-icon.openjs-foundation.openlayers.opensearch-icon.opensearch.openshift.opensource.openstack-icon.opentelemetry-icon.opera.opsgenie.optimizely-icon.optimizely.oracle.oreilly.origami.origin.oshw.osquery.overloop-icon.overloop.p5js.packer.pagekit.pagekite.pagerduty-icon.pagerduty.panda.pandacss-icon.pandacss.pandas-icon.pandas.parcel-icon.parcel.parse.parsehub.partytown-icon.partytown.passbolt-icon.passbolt.passport.patreon.payload.paypal.peer5.pepperoni.percona.percy-icon.percy.perf-rocks.perl.perplexity-icon.perplexity.pf-sense.phalcon.phoenix-framework.phoenix.photon-engine.php-alt.php-storm.php.pinecone-icon.pinecone.pinia.pinterest.pipedream.pipedrive.pipefy.pivotal-tracker.pixijs.pkg.planetscale.planless-icon.planless.plasmic.plastic-scm.platformio.play.playwright.playwrite.ploty.pluralsight-icon.pluralsight.pm2-icon.pm2.pnpm.pocket-base.podman.poeditor.polygon.polymer.portainer.postcss.postgraphile.postgresql.posthog-icon.posthog.postman-icon.postman.pouchdb.powershell.preact.precursor.prerender-icon.prerender.prestashop-icon.prestashop.presto-icon.presto.prettier.prisma.prismic-icon.prismic.processing.processwire-icon.processwire.productboard-icon.productboard.producthunt.progress.prometheus.promises.proofy.protoio.protonet.protractor.prott.pug.pulumi-icon.pulumi.pumpkindb.puppet-icon.puppet.puppeteer.purescript-icon.purescript.pushbullet.pusher-icon.pusher.putty.pwa.pycharm.pypi.pyscript.pytest.python-poetry.python.pytorch-icon.pytorch.pyup.q.qdrant-icon.qdrant.qlik.qodana.qt.qualcomm.quarkus-icon.quarkus.quasar.quay.quobyte.quora.qwik-icon.qwik.r-lang.r.rabbitmq-icon.rabbitmq.rackspace-icon.rackspace.rails.ramda.raml.rancher-icon.rancher.raphael.raspberry-pi.rax.reach.react-bootstrap.react-query-icon.react-query.react-router.react-spring.react-styleguidist.react.reactivex.realm.reapp.reasonml-icon.reasonml.recaptcha.recoil-icon.recoil.red-cube-s-epic-compiler-thingy-programming-re-ct.reddit-icon.reddit.redhat-icon.redhat.redis.redsmin.redux-observable.redux-saga.redux.redwoodjs.reindex.relay.release.remix-icon.remix.ren-py.renovatebot.replay-icon.replay.replit-icon.replit.require.rescript-icon.rescript.rest-li.rethinkdb.retool-icon.retool.riak.rider.riot.risingwave-icon.risingwave.robot-operating-system-ros.rocket-chat-icon.rocket-chat.rocksdb.rocky-linux-icon.rocky-linux.rollbar-icon.rollbar.rollupjs.rome-icon.rome.ros.rsa.rsmq.rspec.rstudio.rubocop.ruby-mine.ruby-on-rails.ruby.rubygems.rum.runscope.rush-icon.rush.rust.rxdb.safari.sagui.sails.salesforce.sameroom.samsung.sanity.sap.sass-doc.sass.saucelabs.scala.scaledrone.scalingo.scribd-icon.scribd.sdl.seaborn-icon.seaborn.section-icon.section.segment-icon.segment.selenium.sema-software.semantic-release.semantic-ui.semaphoreci.sencha.sendgrid-icon.sendgrid.seneca.sensu-icon.sensu.sentry-icon.sentry.sequelize.serverless.sherlock-icon.sherlock.shields.shipit.shogun.shopify.shopware.shortcut-icon.shortcut.sidekiq-icon.sidekiq.signal.sigstore-icon.sigstore.sinatra.singlestore-icon.singlestore.sitepoint.sk-hynix.skaffolder.sketch.skylight.skype.slack-icon.slack.slides.slidev.slim.smartling.smashingmagazine.snap-svg.snaplet-icon.snaplet.snowflake-icon.snowflake.snowpack.snyk.socket-io.solarwinds.solid.solidity.solidjs-icon.solidjs.solr.sonarcloud-icon.sonarcloud.sonarlint-icon.sonarlint.sonarqube.soundcloud.sourcegraph.sourcetree.spark.sparkpost.speakerdeck.speedcurve.spidermonkey-icon.spidermonkey.spinnaker.splunk.spotify-icon.spotify.spree.spring-icon.spring.sql-developer.sqlalchemy.sqlite.square.squarespace.ssh.sst-icon.sst.stability-ai-icon.stability-ai.stackbit-icon.stackbit.stackblitz-icon.stackblitz.stackoverflow-icon.stackoverflow.stackshare.stata.stately-icon.stately.statuspage.stdlib-icon.stdlib.steam.stenciljs-icon.stenciljs.stetho.stickermule.stigg-icon.stigg.stimulus-icon.stimulus.stitch.stoplight.storyblocks-icon.storyblocks.storyblok-icon.storyblok.storybook-icon.storybook.strapi-icon.strapi.streamlit.strider.stripe.struts.styleci.stylefmt.stylelint.stylis.stylus.stytch.sublimetext-icon.sublimetext.subversion.sugarss.supabase-icon.supabase.supertokens-icon.supertokens.surge.surrealdb-icon.surrealdb.survicate-icon.survicate.suse.susy.svelte-icon.svelte-kit.svelte.svg.svgator.swagger.swc.swift.swiftype.swimm.swr.symfony.sysdig-icon.sysdig.t3.tableau-icon.tableau.taiga.tailwindcss-icon.tailwindcss.tapcart-icon.tapcart.taskade-icon.taskade.tastejs.tauri.tealium.teamcity.teamgrid.teamwork-icon.teamwork.telegram.tensorflow.terminal.terraform-icon.terraform.terser-icon.terser.testcafe.testing-library.testlodge.tex.the-algorithms.threejs.thymeleaf-icon.thymeleaf.tidal-icon.tidal.tiktok-icon.tiktok.titanium-sdk.tnw.todoist-icon.todoist.todomvc.tomcat.toml.tor-browser.tor.tortoise-git.tower.traackr.trac.traefik-mesh.traefik-proxy.travis-ci-monochrome.travis-ci.treasuredata-icon.treasuredata.treehouse-icon.treehouse.trello.trpc.truffle-icon.truffle.tsmc.tsnode.tsuru.tumblr-icon.tumblr.tunein.tuple.turbopack-icon.turbopack.turborepo-icon.turborepo.turret.twilio-icon.twilio.twitch.twitter.typeform-icon.typeform.typeorm.typescript-icon-round.typescript-icon.typescript.typesense-icon.typesense.typo3-icon.typo3.ubuntu.udacity-icon.udacity.udemy-icon.udemy.uikit.uml.umu.unbounce-icon.unbounce.undertow.unionpay.unitjs.unito-icon.unito.unity.unix.unjs.unocss.unrealengine-icon.unrealengine.upcase.upstash-icon.upstash.upwork.user-testing-icon.user-testing.uservoice-icon.uservoice.uwsgi.v8-ignition.v8-turbofan.v8.vaadin.vaddy.vagrant-icon.vagrant.vala.vault-icon.vault.vector.vercel-icon.vercel.verdaccio-icon.verdaccio.vernemq.veutify.vim.vimeo-icon.vimeo.visa.visaelectron.visual-studio-code.visual-studio.vite.vitejs.vitess.vitest.vivaldi-icon.vivaldi.vlang.vmware.void.volar.vorejs.vscode.vsphere.vue-storefront.vue.vuetifyjs.vueuse.vulkan.vultr-icon.vultr.vwo.vyper.w3c.waffle-icon.waffle.wagtail.wakatime.walkme.watchman.waypoint-icon.waypoint.wayscript-icon.wayscript.wearos.weave.web-dev-icon.web-dev.web3js.webassembly.webcomponents.webdriverio.webflow.webgpu.webhint-icon.webhint.webhooks.webix-icon.webix.webkit.weblate.webmin.webpack.webplatform.webrtc.websocket.webstorm.webtorrent.weebly.whalar-icon.whalar.whatsapp-icon.whatsapp-monochrome-icon.whatsapp.whatwg.wicket-icon.wicket.wifi.wildfly.windi-css.windows11.windows8.winglang-icon.winglang.wire.wix.wmr.woo-commerce.woocommerce-icon.woopra.wordpress-icon-alt.wordpress-icon.wordpress.workboard.workos-icon.workos.workplace-icon.workplace.wpengine.wufoo.x.xamarin.xampp.xata-icon.xata.xcart.xcode.xero.xml.xray-for-jira.xstate.xtend.xwiki-icon.xwiki.yahoo.yaml.yammer.yandex-ru.yarn.ycombinator.yeoman.yii-framework.yii.youtrack.youtube-icon.youtube.yugabyte-icon.yugabyte.yuno-host.zabbix.zapier.zend-framework.zendesk-icon.zendesk.zenhub-icon.zenhub.zeplin.zeroheight-icon.zeroheight.zig.zod.zoho.zoom-icon.zoom.zorin-os.zsh.zube.zulip-icon.zulip.zwave`.split(`.`),bootstrap:`0-circle-fill.0-circle.0-square-fill.0-square.1-circle-fill.1-circle.1-square-fill.1-square.123.2-circle-fill.2-circle.2-square-fill.2-square.3-circle-fill.3-circle.3-square-fill.3-square.4-circle-fill.4-circle.4-square-fill.4-square.5-circle-fill.5-circle.5-square-fill.5-square.6-circle-fill.6-circle.6-square-fill.6-square.7-circle-fill.7-circle.7-square-fill.7-square.8-circle-fill.8-circle.8-square-fill.8-square.9-circle-fill.9-circle.9-square-fill.9-square.activity.airplane-engines-fill.airplane-engines.airplane-fill.airplane.alarm-fill.alarm.alexa.align-bottom.align-center.align-end.align-middle.align-start.align-top.alipay.alphabet-uppercase.alphabet.alt.amazon.amd.android.android2.app-indicator.app.apple.archive-fill.archive.arrow-90deg-down.arrow-90deg-left.arrow-90deg-right.arrow-90deg-up.arrow-bar-down.arrow-bar-left.arrow-bar-right.arrow-bar-up.arrow-clockwise.arrow-counterclockwise.arrow-down-circle-fill.arrow-down-circle.arrow-down-left-circle-fill.arrow-down-left-circle.arrow-down-left-square-fill.arrow-down-left-square.arrow-down-left.arrow-down-right-circle-fill.arrow-down-right-circle.arrow-down-right-square-fill.arrow-down-right-square.arrow-down-right.arrow-down-short.arrow-down-square-fill.arrow-down-square.arrow-down-up.arrow-down.arrow-left-circle-fill.arrow-left-circle.arrow-left-right.arrow-left-short.arrow-left-square-fill.arrow-left-square.arrow-left.arrow-repeat.arrow-return-left.arrow-return-right.arrow-right-circle-fill.arrow-right-circle.arrow-right-short.arrow-right-square-fill.arrow-right-square.arrow-right.arrow-through-heart-fill.arrow-through-heart.arrow-up-circle-fill.arrow-up-circle.arrow-up-left-circle-fill.arrow-up-left-circle.arrow-up-left-square-fill.arrow-up-left-square.arrow-up-left.arrow-up-right-circle-fill.arrow-up-right-circle.arrow-up-right-square-fill.arrow-up-right-square.arrow-up-right.arrow-up-short.arrow-up-square-fill.arrow-up-square.arrow-up.arrows-angle-contract.arrows-angle-expand.arrows-collapse-vertical.arrows-collapse.arrows-expand-vertical.arrows-expand.arrows-fullscreen.arrows-move.arrows-vertical.arrows.aspect-ratio-fill.aspect-ratio.asterisk.at.award-fill.award.back.backpack-fill.backpack.backpack2-fill.backpack2.backpack3-fill.backpack3.backpack4-fill.backpack4.backspace-fill.backspace-reverse-fill.backspace-reverse.backspace.badge-3d-fill.badge-3d.badge-4k-fill.badge-4k.badge-8k-fill.badge-8k.badge-ad-fill.badge-ad.badge-ar-fill.badge-ar.badge-cc-fill.badge-cc.badge-hd-fill.badge-hd.badge-sd-fill.badge-sd.badge-tm-fill.badge-tm.badge-vo-fill.badge-vo.badge-vr-fill.badge-vr.badge-wc-fill.badge-wc.bag-check-fill.bag-check.bag-dash-fill.bag-dash.bag-fill.bag-heart-fill.bag-heart.bag-plus-fill.bag-plus.bag-x-fill.bag-x.bag.balloon-fill.balloon-heart-fill.balloon-heart.balloon.ban-fill.ban.bandaid-fill.bandaid.bank.bank2.bar-chart-fill.bar-chart-line-fill.bar-chart-line.bar-chart-steps.bar-chart.basket-fill.basket.basket2-fill.basket2.basket3-fill.basket3.battery-charging.battery-full.battery-half.battery.behance.bell-fill.bell-slash-fill.bell-slash.bell.bezier.bezier2.bicycle.bing.binoculars-fill.binoculars.blockquote-left.blockquote-right.bluetooth.body-text.book-fill.book-half.book.bookmark-check-fill.bookmark-check.bookmark-dash-fill.bookmark-dash.bookmark-fill.bookmark-heart-fill.bookmark-heart.bookmark-plus-fill.bookmark-plus.bookmark-star-fill.bookmark-star.bookmark-x-fill.bookmark-x.bookmark.bookmarks-fill.bookmarks.bookshelf.boombox-fill.boombox.bootstrap-fill.bootstrap-icons.bootstrap-reboot.bootstrap.border-all.border-bottom.border-center.border-inner.border-left.border-middle.border-outer.border-right.border-style.border-top.border-width.border.bounding-box-circles.bounding-box.box-arrow-down-left.box-arrow-down-right.box-arrow-down.box-arrow-in-down-left.box-arrow-in-down-right.box-arrow-in-down.box-arrow-in-left.box-arrow-in-right.box-arrow-in-up-left.box-arrow-in-up-right.box-arrow-in-up.box-arrow-left.box-arrow-right.box-arrow-up-left.box-arrow-up-right.box-arrow-up.box-fill.box-seam-fill.box-seam.box.box2-fill.box2-heart-fill.box2-heart.box2.boxes.braces-asterisk.braces.bricks.briefcase-fill.briefcase.brightness-alt-high-fill.brightness-alt-high.brightness-alt-low-fill.brightness-alt-low.brightness-high-fill.brightness-high.brightness-low-fill.brightness-low.brilliance.broadcast-pin.broadcast.browser-chrome.browser-edge.browser-firefox.browser-safari.brush-fill.brush.bucket-fill.bucket.bug-fill.bug.building-add.building-check.building-dash.building-down.building-exclamation.building-fill-add.building-fill-check.building-fill-dash.building-fill-down.building-fill-exclamation.building-fill-gear.building-fill-lock.building-fill-slash.building-fill-up.building-fill-x.building-fill.building-gear.building-lock.building-slash.building-up.building-x.building.buildings-fill.buildings.bullseye.bus-front-fill.bus-front.c-circle-fill.c-circle.c-square-fill.c-square.cake-fill.cake.cake2-fill.cake2.calculator-fill.calculator.calendar-check-fill.calendar-check.calendar-date-fill.calendar-date.calendar-day-fill.calendar-day.calendar-event-fill.calendar-event.calendar-fill.calendar-heart-fill.calendar-heart.calendar-minus-fill.calendar-minus.calendar-month-fill.calendar-month.calendar-plus-fill.calendar-plus.calendar-range-fill.calendar-range.calendar-week-fill.calendar-week.calendar-x-fill.calendar-x.calendar.calendar2-check-fill.calendar2-check.calendar2-date-fill.calendar2-date.calendar2-day-fill.calendar2-day.calendar2-event-fill.calendar2-event.calendar2-fill.calendar2-heart-fill.calendar2-heart.calendar2-minus-fill.calendar2-minus.calendar2-month-fill.calendar2-month.calendar2-plus-fill.calendar2-plus.calendar2-range-fill.calendar2-range.calendar2-week-fill.calendar2-week.calendar2-x-fill.calendar2-x.calendar2.calendar3-event-fill.calendar3-event.calendar3-fill.calendar3-range-fill.calendar3-range.calendar3-week-fill.calendar3-week.calendar3.calendar4-event.calendar4-range.calendar4-week.calendar4.camera-fill.camera-reels-fill.camera-reels.camera-video-fill.camera-video-off-fill.camera-video-off.camera-video.camera.camera2.capslock-fill.capslock.capsule-pill.capsule.car-front-fill.car-front.card-checklist.card-heading.card-image.card-list.card-text.caret-down-fill.caret-down-square-fill.caret-down-square.caret-down.caret-left-fill.caret-left-square-fill.caret-left-square.caret-left.caret-right-fill.caret-right-square-fill.caret-right-square.caret-right.caret-up-fill.caret-up-square-fill.caret-up-square.caret-up.cart-check-fill.cart-check.cart-dash-fill.cart-dash.cart-fill.cart-plus-fill.cart-plus.cart-x-fill.cart-x.cart.cart2.cart3.cart4.cash-coin.cash-stack.cash.cassette-fill.cassette.cast.cc-circle-fill.cc-circle.cc-square-fill.cc-square.chat-dots-fill.chat-dots.chat-fill.chat-heart-fill.chat-heart.chat-left-dots-fill.chat-left-dots.chat-left-fill.chat-left-heart-fill.chat-left-heart.chat-left-quote-fill.chat-left-quote.chat-left-text-fill.chat-left-text.chat-left.chat-quote-fill.chat-quote.chat-right-dots-fill.chat-right-dots.chat-right-fill.chat-right-heart-fill.chat-right-heart.chat-right-quote-fill.chat-right-quote.chat-right-text-fill.chat-right-text.chat-right.chat-square-dots-fill.chat-square-dots.chat-square-fill.chat-square-heart-fill.chat-square-heart.chat-square-quote-fill.chat-square-quote.chat-square-text-fill.chat-square-text.chat-square.chat-text-fill.chat-text.chat.check-all.check-circle-fill.check-circle.check-lg.check-square-fill.check-square.check.check2-all.check2-circle.check2-square.check2.chevron-bar-contract.chevron-bar-down.chevron-bar-expand.chevron-bar-left.chevron-bar-right.chevron-bar-up.chevron-compact-down.chevron-compact-left.chevron-compact-right.chevron-compact-up.chevron-contract.chevron-double-down.chevron-double-left.chevron-double-right.chevron-double-up.chevron-down.chevron-expand.chevron-left.chevron-right.chevron-up.circle-fill.circle-half.circle-square.circle.clipboard-check-fill.clipboard-check.clipboard-data-fill.clipboard-data.clipboard-fill.clipboard-heart-fill.clipboard-heart.clipboard-minus-fill.clipboard-minus.clipboard-plus-fill.clipboard-plus.clipboard-pulse.clipboard-x-fill.clipboard-x.clipboard.clipboard2-check-fill.clipboard2-check.clipboard2-data-fill.clipboard2-data.clipboard2-fill.clipboard2-heart-fill.clipboard2-heart.clipboard2-minus-fill.clipboard2-minus.clipboard2-plus-fill.clipboard2-plus.clipboard2-pulse-fill.clipboard2-pulse.clipboard2-x-fill.clipboard2-x.clipboard2.clock-fill.clock-history.clock.cloud-arrow-down-fill.cloud-arrow-down.cloud-arrow-up-fill.cloud-arrow-up.cloud-check-fill.cloud-check.cloud-download-fill.cloud-download.cloud-drizzle-fill.cloud-drizzle.cloud-fill.cloud-fog-fill.cloud-fog.cloud-fog2-fill.cloud-fog2.cloud-hail-fill.cloud-hail.cloud-haze-fill.cloud-haze.cloud-haze2-fill.cloud-haze2.cloud-lightning-fill.cloud-lightning-rain-fill.cloud-lightning-rain.cloud-lightning.cloud-minus-fill.cloud-minus.cloud-moon-fill.cloud-moon.cloud-plus-fill.cloud-plus.cloud-rain-fill.cloud-rain-heavy-fill.cloud-rain-heavy.cloud-rain.cloud-slash-fill.cloud-slash.cloud-sleet-fill.cloud-sleet.cloud-snow-fill.cloud-snow.cloud-sun-fill.cloud-sun.cloud-upload-fill.cloud-upload.cloud.clouds-fill.clouds.cloudy-fill.cloudy.code-slash.code-square.code.coin.collection-fill.collection-play-fill.collection-play.collection.columns-gap.columns.command.compass-fill.compass.cone-striped.cone.controller.cookie.copy.cpu-fill.cpu.credit-card-2-back-fill.credit-card-2-back.credit-card-2-front-fill.credit-card-2-front.credit-card-fill.credit-card.crop.crosshair.crosshair2.cup-fill.cup-hot-fill.cup-hot.cup-straw.cup.currency-bitcoin.currency-dollar.currency-euro.currency-exchange.currency-pound.currency-rupee.currency-yen.cursor-fill.cursor-text.cursor.dash-circle-dotted.dash-circle-fill.dash-circle.dash-lg.dash-square-dotted.dash-square-fill.dash-square.dash.database-add.database-check.database-dash.database-down.database-exclamation.database-fill-add.database-fill-check.database-fill-dash.database-fill-down.database-fill-exclamation.database-fill-gear.database-fill-lock.database-fill-slash.database-fill-up.database-fill-x.database-fill.database-gear.database-lock.database-slash.database-up.database-x.database.device-hdd-fill.device-hdd.device-ssd-fill.device-ssd.diagram-2-fill.diagram-2.diagram-3-fill.diagram-3.diamond-fill.diamond-half.diamond.dice-1-fill.dice-1.dice-2-fill.dice-2.dice-3-fill.dice-3.dice-4-fill.dice-4.dice-5-fill.dice-5.dice-6-fill.dice-6.disc-fill.disc.discord.display-fill.display.displayport-fill.displayport.distribute-horizontal.distribute-vertical.door-closed-fill.door-closed.door-open-fill.door-open.dot.download.dpad-fill.dpad.dribbble.dropbox.droplet-fill.droplet-half.droplet.duffle-fill.duffle.ear-fill.ear.earbuds.easel-fill.easel.easel2-fill.easel2.easel3-fill.easel3.egg-fill.egg-fried.egg.eject-fill.eject.emoji-angry-fill.emoji-angry.emoji-astonished-fill.emoji-astonished.emoji-dizzy-fill.emoji-dizzy.emoji-expressionless-fill.emoji-expressionless.emoji-frown-fill.emoji-frown.emoji-grimace-fill.emoji-grimace.emoji-grin-fill.emoji-grin.emoji-heart-eyes-fill.emoji-heart-eyes.emoji-kiss-fill.emoji-kiss.emoji-laughing-fill.emoji-laughing.emoji-neutral-fill.emoji-neutral.emoji-smile-fill.emoji-smile-upside-down-fill.emoji-smile-upside-down.emoji-smile.emoji-sunglasses-fill.emoji-sunglasses.emoji-surprise-fill.emoji-surprise.emoji-tear-fill.emoji-tear.emoji-wink-fill.emoji-wink.envelope-arrow-down-fill.envelope-arrow-down.envelope-arrow-up-fill.envelope-arrow-up.envelope-at-fill.envelope-at.envelope-check-fill.envelope-check.envelope-dash-fill.envelope-dash.envelope-exclamation-fill.envelope-exclamation.envelope-fill.envelope-heart-fill.envelope-heart.envelope-open-fill.envelope-open-heart-fill.envelope-open-heart.envelope-open.envelope-paper-fill.envelope-paper-heart-fill.envelope-paper-heart.envelope-paper.envelope-plus-fill.envelope-plus.envelope-slash-fill.envelope-slash.envelope-x-fill.envelope-x.envelope.eraser-fill.eraser.escape.ethernet.ev-front-fill.ev-front.ev-station-fill.ev-station.exclamation-circle-fill.exclamation-circle.exclamation-diamond-fill.exclamation-diamond.exclamation-lg.exclamation-octagon-fill.exclamation-octagon.exclamation-square-fill.exclamation-square.exclamation-triangle-fill.exclamation-triangle.exclamation.exclude.explicit-fill.explicit.exposure.eye-fill.eye-slash-fill.eye-slash.eye.eyedropper.eyeglasses.facebook.fan.fast-forward-btn-fill.fast-forward-btn.fast-forward-circle-fill.fast-forward-circle.fast-forward-fill.fast-forward.feather.feather2.file-arrow-down-fill.file-arrow-down.file-arrow-up-fill.file-arrow-up.file-bar-graph-fill.file-bar-graph.file-binary-fill.file-binary.file-break-fill.file-break.file-check-fill.file-check.file-code-fill.file-code.file-diff-fill.file-diff.file-earmark-arrow-down-fill.file-earmark-arrow-down.file-earmark-arrow-up-fill.file-earmark-arrow-up.file-earmark-bar-graph-fill.file-earmark-bar-graph.file-earmark-binary-fill.file-earmark-binary.file-earmark-break-fill.file-earmark-break.file-earmark-check-fill.file-earmark-check.file-earmark-code-fill.file-earmark-code.file-earmark-diff-fill.file-earmark-diff.file-earmark-easel-fill.file-earmark-easel.file-earmark-excel-fill.file-earmark-excel.file-earmark-fill.file-earmark-font-fill.file-earmark-font.file-earmark-image-fill.file-earmark-image.file-earmark-lock-fill.file-earmark-lock.file-earmark-lock2-fill.file-earmark-lock2.file-earmark-medical-fill.file-earmark-medical.file-earmark-minus-fill.file-earmark-minus.file-earmark-music-fill.file-earmark-music.file-earmark-pdf-fill.file-earmark-pdf.file-earmark-person-fill.file-earmark-person.file-earmark-play-fill.file-earmark-play.file-earmark-plus-fill.file-earmark-plus.file-earmark-post-fill.file-earmark-post.file-earmark-ppt-fill.file-earmark-ppt.file-earmark-richtext-fill.file-earmark-richtext.file-earmark-ruled-fill.file-earmark-ruled.file-earmark-slides-fill.file-earmark-slides.file-earmark-spreadsheet-fill.file-earmark-spreadsheet.file-earmark-text-fill.file-earmark-text.file-earmark-word-fill.file-earmark-word.file-earmark-x-fill.file-earmark-x.file-earmark-zip-fill.file-earmark-zip.file-earmark.file-easel-fill.file-easel.file-excel-fill.file-excel.file-fill.file-font-fill.file-font.file-image-fill.file-image.file-lock-fill.file-lock.file-lock2-fill.file-lock2.file-medical-fill.file-medical.file-minus-fill.file-minus.file-music-fill.file-music.file-pdf-fill.file-pdf.file-person-fill.file-person.file-play-fill.file-play.file-plus-fill.file-plus.file-post-fill.file-post.file-ppt-fill.file-ppt.file-richtext-fill.file-richtext.file-ruled-fill.file-ruled.file-slides-fill.file-slides.file-spreadsheet-fill.file-spreadsheet.file-text-fill.file-text.file-word-fill.file-word.file-x-fill.file-x.file-zip-fill.file-zip.file.files-alt.files.filetype-aac.filetype-ai.filetype-bmp.filetype-cs.filetype-css.filetype-csv.filetype-doc.filetype-docx.filetype-exe.filetype-gif.filetype-heic.filetype-html.filetype-java.filetype-jpg.filetype-js.filetype-json.filetype-jsx.filetype-key.filetype-m4p.filetype-md.filetype-mdx.filetype-mov.filetype-mp3.filetype-mp4.filetype-otf.filetype-pdf.filetype-php.filetype-png.filetype-ppt.filetype-pptx.filetype-psd.filetype-py.filetype-raw.filetype-rb.filetype-sass.filetype-scss.filetype-sh.filetype-sql.filetype-svg.filetype-tiff.filetype-tsx.filetype-ttf.filetype-txt.filetype-wav.filetype-woff.filetype-xls.filetype-xlsx.filetype-xml.filetype-yml.film.filter-circle-fill.filter-circle.filter-left.filter-right.filter-square-fill.filter-square.filter.fingerprint.fire.flag-fill.flag.floppy-fill.floppy.floppy2-fill.floppy2.flower1.flower2.flower3.folder-check.folder-fill.folder-minus.folder-plus.folder-symlink-fill.folder-symlink.folder-x.folder.folder2-open.folder2.fonts.forward-fill.forward.front.fuel-pump-diesel-fill.fuel-pump-diesel.fuel-pump-fill.fuel-pump.fullscreen-exit.fullscreen.funnel-fill.funnel.gear-fill.gear-wide-connected.gear-wide.gear.gem.gender-ambiguous.gender-female.gender-male.gender-neuter.gender-trans.geo-alt-fill.geo-alt.geo-fill.geo.gift-fill.gift.git.github.gitlab.globe-americas.globe-asia-australia.globe-central-south-asia.globe-europe-africa.globe.globe2.google-play.google.gpu-card.graph-down-arrow.graph-down.graph-up-arrow.graph-up.grid-1x2-fill.grid-1x2.grid-3x2-gap-fill.grid-3x2-gap.grid-3x2.grid-3x3-gap-fill.grid-3x3-gap.grid-3x3.grid-fill.grid.grip-horizontal.grip-vertical.h-circle-fill.h-circle.h-square-fill.h-square.hammer.hand-index-fill.hand-index-thumb-fill.hand-index-thumb.hand-index.hand-thumbs-down-fill.hand-thumbs-down.hand-thumbs-up-fill.hand-thumbs-up.handbag-fill.handbag.hash.hdd-fill.hdd-network-fill.hdd-network.hdd-rack-fill.hdd-rack.hdd-stack-fill.hdd-stack.hdd.hdmi-fill.hdmi.headphones.headset-vr.headset.heart-arrow.heart-fill.heart-half.heart-pulse-fill.heart-pulse.heart.heartbreak-fill.heartbreak.hearts.heptagon-fill.heptagon-half.heptagon.hexagon-fill.hexagon-half.hexagon.highlighter.highlights.hospital-fill.hospital.hourglass-bottom.hourglass-split.hourglass-top.hourglass.house-add-fill.house-add.house-check-fill.house-check.house-dash-fill.house-dash.house-door-fill.house-door.house-down-fill.house-down.house-exclamation-fill.house-exclamation.house-fill.house-gear-fill.house-gear.house-heart-fill.house-heart.house-lock-fill.house-lock.house-slash-fill.house-slash.house-up-fill.house-up.house-x-fill.house-x.house.houses-fill.houses.hr.hurricane.hypnotize.image-alt.image-fill.image.images.inbox-fill.inbox.inboxes-fill.inboxes.incognito.indent.infinity.info-circle-fill.info-circle.info-lg.info-square-fill.info-square.info.input-cursor-text.input-cursor.instagram.intersect.journal-album.journal-arrow-down.journal-arrow-up.journal-bookmark-fill.journal-bookmark.journal-check.journal-code.journal-medical.journal-minus.journal-plus.journal-richtext.journal-text.journal-x.journal.journals.joystick.justify-left.justify-right.justify.kanban-fill.kanban.key-fill.key.keyboard-fill.keyboard.ladder.lamp-fill.lamp.laptop-fill.laptop.layer-backward.layer-forward.layers-fill.layers-half.layers.layout-sidebar-inset-reverse.layout-sidebar-inset.layout-sidebar-reverse.layout-sidebar.layout-split.layout-text-sidebar-reverse.layout-text-sidebar.layout-text-window-reverse.layout-text-window.layout-three-columns.layout-wtf.life-preserver.lightbulb-fill.lightbulb-off-fill.lightbulb-off.lightbulb.lightning-charge-fill.lightning-charge.lightning-fill.lightning.line.link-45deg.link.linkedin.list-check.list-columns-reverse.list-columns.list-nested.list-ol.list-stars.list-task.list-ul.list.lock-fill.lock.luggage-fill.luggage.lungs-fill.lungs.magic.magnet-fill.magnet.mailbox-flag.mailbox.mailbox2-flag.mailbox2.map-fill.map.markdown-fill.markdown.marker-tip.mask.mastodon.medium.megaphone-fill.megaphone.memory.menu-app-fill.menu-app.menu-button-fill.menu-button-wide-fill.menu-button-wide.menu-button.menu-down.menu-up.messenger.meta.mic-fill.mic-mute-fill.mic-mute.mic.microsoft-teams.microsoft.minecart-loaded.minecart.modem-fill.modem.moisture.moon-fill.moon-stars-fill.moon-stars.moon.mortarboard-fill.mortarboard.motherboard-fill.motherboard.mouse-fill.mouse.mouse2-fill.mouse2.mouse3-fill.mouse3.music-note-beamed.music-note-list.music-note.music-player-fill.music-player.newspaper.nintendo-switch.node-minus-fill.node-minus.node-plus-fill.node-plus.noise-reduction.nut-fill.nut.nvidia.nvme-fill.nvme.octagon-fill.octagon-half.octagon.opencollective.optical-audio-fill.optical-audio.option.outlet.p-circle-fill.p-circle.p-square-fill.p-square.paint-bucket.palette-fill.palette.palette2.paperclip.paragraph.pass-fill.pass.passport-fill.passport.patch-check-fill.patch-check.patch-exclamation-fill.patch-exclamation.patch-minus-fill.patch-minus.patch-plus-fill.patch-plus.patch-question-fill.patch-question.pause-btn-fill.pause-btn.pause-circle-fill.pause-circle.pause-fill.pause.paypal.pc-display-horizontal.pc-display.pc-horizontal.pc.pci-card-network.pci-card-sound.pci-card.peace-fill.peace.pen-fill.pen.pencil-fill.pencil-square.pencil.pentagon-fill.pentagon-half.pentagon.people-fill.people.percent.person-add.person-arms-up.person-badge-fill.person-badge.person-bounding-box.person-check-fill.person-check.person-circle.person-dash-fill.person-dash.person-down.person-exclamation.person-fill-add.person-fill-check.person-fill-dash.person-fill-down.person-fill-exclamation.person-fill-gear.person-fill-lock.person-fill-slash.person-fill-up.person-fill-x.person-fill.person-gear.person-heart.person-hearts.person-lines-fill.person-lock.person-plus-fill.person-plus.person-raised-hand.person-rolodex.person-slash.person-square.person-standing-dress.person-standing.person-up.person-vcard-fill.person-vcard.person-video.person-video2.person-video3.person-walking.person-wheelchair.person-workspace.person-x-fill.person-x.person.phone-fill.phone-flip.phone-landscape-fill.phone-landscape.phone-vibrate-fill.phone-vibrate.phone.pie-chart-fill.pie-chart.piggy-bank-fill.piggy-bank.pin-angle-fill.pin-angle.pin-fill.pin-map-fill.pin-map.pin.pinterest.pip-fill.pip.play-btn-fill.play-btn.play-circle-fill.play-circle.play-fill.play.playstation.plug-fill.plug.plugin.plus-circle-dotted.plus-circle-fill.plus-circle.plus-lg.plus-slash-minus.plus-square-dotted.plus-square-fill.plus-square.plus.postage-fill.postage-heart-fill.postage-heart.postage.postcard-fill.postcard-heart-fill.postcard-heart.postcard.power.prescription.prescription2.printer-fill.printer.projector-fill.projector.puzzle-fill.puzzle.qr-code-scan.qr-code.question-circle-fill.question-circle.question-diamond-fill.question-diamond.question-lg.question-octagon-fill.question-octagon.question-square-fill.question-square.question.quora.quote.r-circle-fill.r-circle.r-square-fill.r-square.radar.radioactive.rainbow.receipt-cutoff.receipt.reception-0.reception-1.reception-2.reception-3.reception-4.record-btn-fill.record-btn.record-circle-fill.record-circle.record-fill.record.record2-fill.record2.recycle.reddit.regex.repeat-1.repeat.reply-all-fill.reply-all.reply-fill.reply.rewind-btn-fill.rewind-btn.rewind-circle-fill.rewind-circle.rewind-fill.rewind.robot.rocket-fill.rocket-takeoff-fill.rocket-takeoff.rocket.router-fill.router.rss-fill.rss.rulers.safe-fill.safe.safe2-fill.safe2.save-fill.save.save2-fill.save2.scissors.scooter.screwdriver.sd-card-fill.sd-card.search-heart-fill.search-heart.search.segmented-nav.send-arrow-down-fill.send-arrow-down.send-arrow-up-fill.send-arrow-up.send-check-fill.send-check.send-dash-fill.send-dash.send-exclamation-fill.send-exclamation.send-fill.send-plus-fill.send-plus.send-slash-fill.send-slash.send-x-fill.send-x.send.server.shadows.share-fill.share.shield-check.shield-exclamation.shield-fill-check.shield-fill-exclamation.shield-fill-minus.shield-fill-plus.shield-fill-x.shield-fill.shield-lock-fill.shield-lock.shield-minus.shield-plus.shield-shaded.shield-slash-fill.shield-slash.shield-x.shield.shift-fill.shift.shop-window.shop.shuffle.sign-dead-end-fill.sign-dead-end.sign-do-not-enter-fill.sign-do-not-enter.sign-intersection-fill.sign-intersection-side-fill.sign-intersection-side.sign-intersection-t-fill.sign-intersection-t.sign-intersection-y-fill.sign-intersection-y.sign-intersection.sign-merge-left-fill.sign-merge-left.sign-merge-right-fill.sign-merge-right.sign-no-left-turn-fill.sign-no-left-turn.sign-no-parking-fill.sign-no-parking.sign-no-right-turn-fill.sign-no-right-turn.sign-railroad-fill.sign-railroad.sign-stop-fill.sign-stop-lights-fill.sign-stop-lights.sign-stop.sign-turn-left-fill.sign-turn-left.sign-turn-right-fill.sign-turn-right.sign-turn-slight-left-fill.sign-turn-slight-left.sign-turn-slight-right-fill.sign-turn-slight-right.sign-yield-fill.sign-yield.signal.signpost-2-fill.signpost-2.signpost-fill.signpost-split-fill.signpost-split.signpost.sim-fill.sim-slash-fill.sim-slash.sim.sina-weibo.skip-backward-btn-fill.skip-backward-btn.skip-backward-circle-fill.skip-backward-circle.skip-backward-fill.skip-backward.skip-end-btn-fill.skip-end-btn.skip-end-circle-fill.skip-end-circle.skip-end-fill.skip-end.skip-forward-btn-fill.skip-forward-btn.skip-forward-circle-fill.skip-forward-circle.skip-forward-fill.skip-forward.skip-start-btn-fill.skip-start-btn.skip-start-circle-fill.skip-start-circle.skip-start-fill.skip-start.skype.slack.slash-circle-fill.slash-circle.slash-lg.slash-square-fill.slash-square.slash.sliders.sliders2-vertical.sliders2.smartwatch.snapchat.snow.snow2.snow3.sort-alpha-down-alt.sort-alpha-down.sort-alpha-up-alt.sort-alpha-up.sort-down-alt.sort-down.sort-numeric-down-alt.sort-numeric-down.sort-numeric-up-alt.sort-numeric-up.sort-up-alt.sort-up.soundwave.sourceforge.speaker-fill.speaker.speedometer.speedometer2.spellcheck.spotify.square-fill.square-half.square.stack-overflow.stack.star-fill.star-half.star.stars.steam.stickies-fill.stickies.sticky-fill.sticky.stop-btn-fill.stop-btn.stop-circle-fill.stop-circle.stop-fill.stop.stoplights-fill.stoplights.stopwatch-fill.stopwatch.strava.stripe.subscript.substack.subtract.suit-club-fill.suit-club.suit-diamond-fill.suit-diamond.suit-heart-fill.suit-heart.suit-spade-fill.suit-spade.suitcase-fill.suitcase-lg-fill.suitcase-lg.suitcase.suitcase2-fill.suitcase2.sun-fill.sun.sunglasses.sunrise-fill.sunrise.sunset-fill.sunset.superscript.symmetry-horizontal.symmetry-vertical.table.tablet-fill.tablet-landscape-fill.tablet-landscape.tablet.tag-fill.tag.tags-fill.tags.taxi-front-fill.taxi-front.telegram.telephone-fill.telephone-forward-fill.telephone-forward.telephone-inbound-fill.telephone-inbound.telephone-minus-fill.telephone-minus.telephone-outbound-fill.telephone-outbound.telephone-plus-fill.telephone-plus.telephone-x-fill.telephone-x.telephone.tencent-qq.terminal-dash.terminal-fill.terminal-plus.terminal-split.terminal-x.terminal.text-center.text-indent-left.text-indent-right.text-left.text-paragraph.text-right.text-wrap.textarea-resize.textarea-t.textarea.thermometer-half.thermometer-high.thermometer-low.thermometer-snow.thermometer-sun.thermometer.threads-fill.threads.three-dots-vertical.three-dots.thunderbolt-fill.thunderbolt.ticket-detailed-fill.ticket-detailed.ticket-fill.ticket-perforated-fill.ticket-perforated.ticket.tiktok.toggle-off.toggle-on.toggle2-off.toggle2-on.toggles.toggles2.tools.tornado.train-freight-front-fill.train-freight-front.train-front-fill.train-front.train-lightrail-front-fill.train-lightrail-front.translate.transparency.trash-fill.trash.trash2-fill.trash2.trash3-fill.trash3.tree-fill.tree.trello.triangle-fill.triangle-half.triangle.trophy-fill.trophy.tropical-storm.truck-flatbed.truck-front-fill.truck-front.truck.tsunami.tv-fill.tv.twitch.twitter-x.twitter.type-bold.type-h1.type-h2.type-h3.type-h4.type-h5.type-h6.type-italic.type-strikethrough.type-underline.type.ubuntu.ui-checks-grid.ui-checks.ui-radios-grid.ui-radios.umbrella-fill.umbrella.unindent.union.unity.universal-access-circle.universal-access.unlock-fill.unlock.upc-scan.upc.upload.usb-c-fill.usb-c.usb-drive-fill.usb-drive.usb-fill.usb-micro-fill.usb-micro.usb-mini-fill.usb-mini.usb-plug-fill.usb-plug.usb-symbol.usb.valentine.valentine2.vector-pen.view-list.view-stacked.vignette.vimeo.vinyl-fill.vinyl.virus.virus2.voicemail.volume-down-fill.volume-down.volume-mute-fill.volume-mute.volume-off-fill.volume-off.volume-up-fill.volume-up.vr.wallet-fill.wallet.wallet2.watch.water.webcam-fill.webcam.wechat.whatsapp.wifi-1.wifi-2.wifi-off.wifi.wikipedia.wind.window-dash.window-desktop.window-dock.window-fullscreen.window-plus.window-sidebar.window-split.window-stack.window-x.window.windows.wordpress.wrench-adjustable-circle-fill.wrench-adjustable-circle.wrench-adjustable.wrench.x-circle-fill.x-circle.x-diamond-fill.x-diamond.x-lg.x-octagon-fill.x-octagon.x-square-fill.x-square.x.xbox.yelp.yin-yang.youtube.zoom-in.zoom-out`.split(`.`)},Pc=Object.keys(Nc),Fc=Nc,Ic=[`likec4lib {`,` icons {`,...[...Object.entries(Nc)].flatMap(([e,t])=>t.map(t=>e+`:`+t)).map(e=>` `+e),` }`,`}`].join(`
56
- `),Lc=`likec4builtin`,Rc=`${Lc}:///likec4/lib/icons.c4`;function isLikeC4Builtin(e){return(`uri`in e?e.uri:e).scheme===Lc}function isNotLikeC4Builtin(e){return!isLikeC4Builtin(e)}const zc=ui(`/`),compareByUri=(e,t)=>zc(pt(e.uri.path),pt(t.uri.path)),Bc=ui(`/`,!0),compareByUriDeepFirst=(e,t)=>Bc(pt(e.uri.path),pt(t.uri.path));var ADisposable=class{toDispose=[];isDisposed=!1;onDispose(...e){this.toDispose.push(...e)}dispose(){this.throwIfDisposed(),this.isDisposed=!0;let e;for(;e=this.toDispose.pop();)try{e.dispose()}catch(e){logWarnError(e)}}throwIfDisposed(){this.isDisposed&&q.warn(`this has already been disposed`)}};const Vc=`AnyProperty`;function isAnyProperty(e){return J.isInstance(e,Vc)}const Hc=`ColorLiteral`;function isColorLiteral(e){return J.isInstance(e,Hc)}const Uc=`DeploymentElement`;function isDeploymentElement(e){return J.isInstance(e,Uc)}const Wc=`DeploymentNodeOrElementKind`,Gc=`DeploymentViewRule`;function isDeploymentViewRule(e){return J.isInstance(e,Gc)}const Kc=`DynamicViewProperty`,qc=`DynamicViewRule`;function isDynamicViewRule(e){return J.isInstance(e,qc)}const Jc=`ElementProperty`;function isElementProperty(e){return J.isInstance(e,Jc)}const Yc=`ExpressionV2`;function isExpressionV2(e){return J.isInstance(e,Yc)}const Xc=`ExtendElementOrRelation`;function isExtendElementOrRelation(e){return J.isInstance(e,Xc)}const Zc=`FqnExpr`;function isFqnExpr(e){return J.isInstance(e,Zc)}const Qc=`FqnExprOrWhere`;function isFqnExprOrWhere(e){return J.isInstance(e,Qc)}const $c=`FqnExprOrWith`;function isFqnExprOrWith(e){return J.isInstance(e,$c)}const el=`FqnReferenceable`,tl=`LikeC4View`;function isLikeC4View(e){return J.isInstance(e,tl)}const nl=`MetadataProperty`;function isMetadataProperty(e){return J.isInstance(e,nl)}const rl=`MetadataValue`,il=`ModelElement`,al=`Referenceable`,ol=`RelationExpr`;function isRelationExpr(e){return J.isInstance(e,ol)}const sl=`RelationExprOrWhere`;function isRelationExprOrWhere(e){return J.isInstance(e,sl)}const cl=`RelationExprOrWith`;function isRelationExprOrWith(e){return J.isInstance(e,cl)}const ll=`RelationProperty`,ul=`RelationshipStyleProperty`;function isRelationshipStyleProperty(e){return J.isInstance(e,ul)}const dl=`SizeProperty`;function isSizeProperty(e){return J.isInstance(e,dl)}const fl=`StepOrSeries`;function isStepOrSeries(e){return J.isInstance(e,fl)}const pl=`StepStatement`;function isStepStatement(e){return J.isInstance(e,pl)}const ml=`StringProperty`;function isStringProperty(e){return J.isInstance(e,ml)}const hl=`StyleProperty`;function isStyleProperty(e){return J.isInstance(e,hl)}const gl=`TryStep`;function isTryStep(e){return J.isInstance(e,gl)}const _l=`ViewProperty`;function isViewProperty(e){return J.isInstance(e,_l)}const vl=`ViewRule`;function isViewRule(e){return J.isInstance(e,vl)}const yl=`ViewRuleStyleOrGlobalRef`;function isViewRuleStyleOrGlobalRef(e){return J.isInstance(e,yl)}const bl=`WhereElement`;function isWhereElement(e){return J.isInstance(e,bl)}const xl=`WhereElementExpression`;function isWhereElementExpression(e){return J.isInstance(e,xl)}const Sl=`WhereExpression`,Cl=`WhereKindEqual`;function isWhereKindEqual(e){return J.isInstance(e,Cl)}const wl=`WhereMetadataEqual`;function isWhereMetadataEqual(e){return J.isInstance(e,wl)}const Tl=`WhereRelation`;function isWhereRelation(e){return J.isInstance(e,Tl)}const El=`WhereRelationExpression`;function isWhereRelationExpression(e){return J.isInstance(e,El)}const Dl=`WhereTagEqual`;function isWhereTagEqual(e){return J.isInstance(e,Dl)}const Ol=`AbstractStep`,kl=`AltSteps`;function isAltSteps(e){return J.isInstance(e,kl)}const Al=`ArrowProperty`;function isArrowProperty(e){return J.isInstance(e,Al)}const jl=`BorderProperty`;function isBorderProperty(e){return J.isInstance(e,jl)}const Ml=`CatchBlock`;function isCatchBlock(e){return J.isInstance(e,Ml)}const Nl=`ColorProperty`;function isColorProperty(e){return J.isInstance(e,Nl)}const Pl=`CustomColor`,Fl=`CustomElementProperties`;function isCustomElementProperties(e){return J.isInstance(e,Fl)}const Il=`CustomRelationProperties`;function isCustomRelationProperties(e){return J.isInstance(e,Il)}const Ll=`DeployedInstance`;function isDeployedInstance(e){return J.isInstance(e,Ll)}const Rl=`DeployedInstanceBody`;function isDeployedInstanceBody(e){return J.isInstance(e,Rl)}const zl=`DeploymentNode`;function isDeploymentNode$1(e){return J.isInstance(e,zl)}t(isDeploymentNode$1,`isDeploymentNode`);const Bl=`DeploymentNodeBody`;function isDeploymentNodeBody(e){return J.isInstance(e,Bl)}const Vl=`DeploymentNodeKind`;function isDeploymentNodeKind(e){return J.isInstance(e,Vl)}const Hl=`DeploymentRelation`;function isDeploymentRelation(e){return J.isInstance(e,Hl)}const Ul=`DeploymentRelationBody`;function isDeploymentRelationBody(e){return J.isInstance(e,Ul)}const Wl=`DeploymentView`;function isDeploymentView$1(e){return J.isInstance(e,Wl)}t(isDeploymentView$1,`isDeploymentView`);const Gl=`DeploymentViewBody`;function isDeploymentViewBody(e){return J.isInstance(e,Gl)}const Kl=`DeploymentViewRulePredicate`;function isDeploymentViewRulePredicate(e){return J.isInstance(e,Kl)}const ql=`DeploymentViewRuleStyle`;function isDeploymentViewRuleStyle(e){return J.isInstance(e,ql)}const Jl=`DirectedRelationExpr`;function isDirectedRelationExpr(e){return J.isInstance(e,Jl)}const Yl=`DynamicView`;function isDynamicView$1(e){return J.isInstance(e,Yl)}t(isDynamicView$1,`isDynamicView`);const Xl=`DynamicViewBody`;function isDynamicViewBody(e){return J.isInstance(e,Xl)}const Zl=`DynamicViewDisplayVariantProperty`;function isDynamicViewDisplayVariantProperty(e){return J.isInstance(e,Zl)}const Ql=`DynamicViewGlobalPredicateRef`;function isDynamicViewGlobalPredicateRef(e){return J.isInstance(e,Ql)}const $l=`DynamicViewIncludePredicate`;function isDynamicViewIncludePredicate(e){return J.isInstance(e,$l)}const eu=`DynamicViewRef`,tu=`Element`;function isElement(e){return J.isInstance(e,tu)}const nu=`ElementBody`;function isElementBody(e){return J.isInstance(e,nu)}const ru=`ElementKind`;function isElementKind(e){return J.isInstance(e,ru)}const iu=`ElementKindExpression`;function isElementKindExpression(e){return J.isInstance(e,iu)}const au=`ElementRef`;function isElementRef(e){return J.isInstance(e,au)}const ou=`ElementStringProperty`;function isElementStringProperty(e){return J.isInstance(e,ou)}const su=`ElementStyleProperty`;function isElementStyleProperty(e){return J.isInstance(e,su)}const cu=`ElementTagExpression`;function isElementTagExpression(e){return J.isInstance(e,cu)}const lu=`ElementView`;function isElementView$1(e){return J.isInstance(e,lu)}t(isElementView$1,`isElementView`);const uu=`ElementViewBody`;function isElementViewBody(e){return J.isInstance(e,uu)}const du=`ElementViewRef`,fu=`Expressions`;function isExpressions(e){return J.isInstance(e,fu)}const pu=`ExtendDeployment`;function isExtendDeployment(e){return J.isInstance(e,pu)}const mu=`ExtendDeploymentBody`;function isExtendDeploymentBody(e){return J.isInstance(e,mu)}const hu=`ExtendElement`;function isExtendElement(e){return J.isInstance(e,hu)}const gu=`ExtendElementBody`;function isExtendElementBody(e){return J.isInstance(e,gu)}const _u=`ExtendRelation`;function isExtendRelation(e){return J.isInstance(e,_u)}const vu=`ExtendRelationBody`;function isExtendRelationBody(e){return J.isInstance(e,vu)}const yu=`FinallyBlock`;function isFinallyBlock(e){return J.isInstance(e,yu)}const bu=`FqnExpressions`;function isFqnExpressions(e){return J.isInstance(e,bu)}const xu=`FqnExprWhere`;function isFqnExprWhere(e){return J.isInstance(e,xu)}const Su=`FqnExprWith`;function isFqnExprWith(e){return J.isInstance(e,Su)}const Cu=`FqnRef`;function isFqnRef(e){return J.isInstance(e,Cu)}const wu=`FqnRefExpr`;function isFqnRefExpr(e){return J.isInstance(e,wu)}const Tu=`GlobalDynamicPredicateGroup`;function isGlobalDynamicPredicateGroup(e){return J.isInstance(e,Tu)}const Eu=`GlobalPredicateGroup`;function isGlobalPredicateGroup(e){return J.isInstance(e,Eu)}const Du=`Globals`;function isGlobals(e){return J.isInstance(e,Du)}const Ou=`GlobalStyle`;function isGlobalStyle(e){return J.isInstance(e,Ou)}const ku=`GlobalStyleGroup`;function isGlobalStyleGroup(e){return J.isInstance(e,ku)}const Au=`GlobalStyleId`,ju=`HexColor`;function isHexColor(e){return J.isInstance(e,ju)}const Mu=`IconColorProperty`;function isIconColorProperty(e){return J.isInstance(e,Mu)}const Nu=`IconPositionProperty`;function isIconPositionProperty(e){return J.isInstance(e,Nu)}const Pu=`IconProperty`;function isIconProperty(e){return J.isInstance(e,Pu)}const Fu=`IconSizeProperty`;function isIconSizeProperty(e){return J.isInstance(e,Fu)}const Iu=`Imported`;function isImported(e){return J.isInstance(e,Iu)}const Lu=`ImportsFromPoject`;function isImportsFromPoject(e){return J.isInstance(e,Lu)}const Ru=`IncomingRelationExpr`;function isIncomingRelationExpr(e){return J.isInstance(e,Ru)}const zu=`InOutRelationExpr`;function isInOutRelationExpr(e){return J.isInstance(e,zu)}const Bu=`LibIcon`;function isLibIcon(e){return J.isInstance(e,Bu)}const Vu=`LikeC4Grammar`;function isLikeC4Grammar(e){return J.isInstance(e,Vu)}const Hu=`LikeC4Lib`;function isLikeC4Lib(e){return J.isInstance(e,Hu)}const Uu=`LineProperty`;function isLineProperty(e){return J.isInstance(e,Uu)}const Wu=`LinkProperty`;function isLinkProperty(e){return J.isInstance(e,Wu)}const Gu=`MarkdownOrString`;function isMarkdownOrString(e){return J.isInstance(e,Gu)}const Ku=`MetadataArray`;function isMetadataArray(e){return J.isInstance(e,Ku)}const qu=`MetadataAttribute`;function isMetadataAttribute(e){return J.isInstance(e,qu)}const Ju=`MetadataBody`;function isMetadataBody(e){return J.isInstance(e,Ju)}const Yu=`Model`;function isModel(e){return J.isInstance(e,Yu)}const Xu=`ModelDeployments`;function isModelDeployments(e){return J.isInstance(e,Xu)}const Zu=`ModelViews`;function isModelViews(e){return J.isInstance(e,Zu)}const Qu=`MultipleProperty`;function isMultipleProperty(e){return J.isInstance(e,Qu)}const $u=`NavigateToProperty`;function isNavigateToProperty(e){return J.isInstance(e,$u)}const ed=`NotationProperty`;function isNotationProperty(e){return J.isInstance(e,ed)}const td=`NotesProperty`;function isNotesProperty(e){return J.isInstance(e,td)}const nd=`OpacityProperty`;function isOpacityProperty(e){return J.isInstance(e,nd)}const rd=`OutgoingRelationExpr`;function isOutgoingRelationExpr(e){return J.isInstance(e,rd)}const id=`PaddingSizeProperty`;function isPaddingSizeProperty(e){return J.isInstance(e,id)}const ad=`Relation`;function isRelation(e){return J.isInstance(e,ad)}const od=`RelationBody`;function isRelationBody(e){return J.isInstance(e,od)}const sd=`RelationExprWhere`;function isRelationExprWhere(e){return J.isInstance(e,sd)}const cd=`RelationExprWith`;function isRelationExprWith(e){return J.isInstance(e,cd)}const ld=`RelationKindDotRef`;function isRelationKindDotRef(e){return J.isInstance(e,ld)}const ud=`RelationNavigateToProperty`;function isRelationNavigateToProperty(e){return J.isInstance(e,ud)}const dd=`RelationshipKind`;function isRelationshipKind(e){return J.isInstance(e,dd)}const fd=`RelationStringProperty`;function isRelationStringProperty(e){return J.isInstance(e,fd)}const pd=`RelationStyleProperty`;function isRelationStyleProperty(e){return J.isInstance(e,pd)}const md=`RGBAColor`;function isRGBAColor(e){return J.isInstance(e,md)}const hd=`ShapeProperty`;function isShapeProperty(e){return J.isInstance(e,hd)}const gd=`ShapeSizeProperty`;function isShapeSizeProperty(e){return J.isInstance(e,gd)}const _d=`SpecificationColor`;function isSpecificationColor(e){return J.isInstance(e,_d)}const vd=`SpecificationDeploymentNodeKind`;function isSpecificationDeploymentNodeKind(e){return J.isInstance(e,vd)}const yd=`SpecificationElementKind`;function isSpecificationElementKind(e){return J.isInstance(e,yd)}const bd=`SpecificationElementStringProperty`;function isSpecificationElementStringProperty(e){return J.isInstance(e,bd)}const xd=`SpecificationRelationshipKind`;function isSpecificationRelationshipKind(e){return J.isInstance(e,xd)}const Sd=`SpecificationRelationshipStringProperty`;function isSpecificationRelationshipStringProperty(e){return J.isInstance(e,Sd)}const Cd=`SpecificationRule`;function isSpecificationRule(e){return J.isInstance(e,Cd)}const wd=`SpecificationTag`;function isSpecificationTag(e){return J.isInstance(e,wd)}const Td=`StepsBlock`;function isStepsBlock(e){return J.isInstance(e,Td)}const Ed=`StrictFqnElementRef`;function isStrictFqnElementRef(e){return J.isInstance(e,Ed)}const Dd=`StrictFqnRef`;function isStrictFqnRef(e){return J.isInstance(e,Dd)}function isTag(e){return J.isInstance(e,`Tag`)}const Od=`TagRef`;function isTagRef(e){return J.isInstance(e,Od)}const kd=`Tags`;function isTags(e){return J.isInstance(e,kd)}const Ad=`TextSizeProperty`;function isTextSizeProperty(e){return J.isInstance(e,Ad)}const jd=`ViewOrderProperty`;function isViewOrderProperty(e){return J.isInstance(e,jd)}const Md=`ViewRef`,Nd=`ViewRuleAncestors`;function isViewRuleAncestors(e){return J.isInstance(e,Nd)}const Pd=`ViewRuleAutoLayout`;function isViewRuleAutoLayout(e){return J.isInstance(e,Pd)}const Fd=`ViewRuleGlobalPredicateRef`;function isViewRuleGlobalPredicateRef(e){return J.isInstance(e,Fd)}const Id=`ViewRuleGlobalStyle`;function isViewRuleGlobalStyle(e){return J.isInstance(e,Id)}const Ld=`ViewRuleGroup`;function isViewRuleGroup(e){return J.isInstance(e,Ld)}const Rd=`ViewRulePredicate`;function isViewRulePredicate(e){return J.isInstance(e,Rd)}const zd=`ViewRuleRank`;function isViewRuleRank(e){return J.isInstance(e,zd)}const Bd=`ViewRuleStyle`;function isViewRuleStyle(e){return J.isInstance(e,Bd)}const Vd=`ViewStringProperty`;function isViewStringProperty(e){return J.isInstance(e,Vd)}const Hd=`WhereBinaryExpression`;function isWhereBinaryExpression(e){return J.isInstance(e,Hd)}const Ud=`WhereElementKind`;function isWhereElementKind(e){return J.isInstance(e,Ud)}const Wd=`WhereElementMetadata`;function isWhereElementMetadata(e){return J.isInstance(e,Wd)}const Gd=`WhereElementNegation`;function isWhereElementNegation(e){return J.isInstance(e,Gd)}const Kd=`WhereElementTag`;function isWhereElementTag(e){return J.isInstance(e,Kd)}const qd=`WhereRelationKind`;function isWhereRelationKind(e){return J.isInstance(e,qd)}const Jd=`WhereRelationMetadata`;function isWhereRelationMetadata(e){return J.isInstance(e,Jd)}const Yd=`WhereRelationNegation`;function isWhereRelationNegation(e){return J.isInstance(e,Yd)}const Xd=`WhereRelationParticipantKind`;function isWhereRelationParticipantKind(e){return J.isInstance(e,Xd)}const Zd=`WhereRelationParticipantMetadata`;function isWhereRelationParticipantMetadata(e){return J.isInstance(e,Zd)}const Qd=`WhereRelationParticipantTag`;function isWhereRelationParticipantTag(e){return J.isInstance(e,Qd)}const $d=`WhereRelationTag`;function isWhereRelationTag(e){return J.isInstance(e,$d)}const ef=`WildcardExpression`;function isWildcardExpression(e){return J.isInstance(e,ef)}const tf=`Step`;function isStep(e){return J.isInstance(e,tf)}const nf=`StepSeries`;function isStepSeries(e){return J.isInstance(e,nf)}const rf=`SubflowStep`;function isSubflowStep(e){return J.isInstance(e,rf)}const af=`TryBlock`;function isTryBlock(e){return J.isInstance(e,af)}var LikeC4AstReflection=class extends lt{getAllTypes(){return[Ol,kl,Vc,Al,jl,Ml,Hc,Nl,Pl,Fl,Il,Ll,Rl,Uc,zl,Bl,Vl,Wc,Hl,Ul,Wl,Gl,Gc,Kl,ql,Jl,Yl,Xl,Zl,Ql,$l,Kc,eu,qc,tu,nu,ru,iu,Jc,au,ou,su,cu,lu,uu,du,Yc,fu,pu,mu,hu,gu,Xc,`ExtendElementProperty`,_u,vu,`ExtendRelationProperty`,yu,Zc,Qc,$c,xu,Su,bu,Cu,wu,el,Tu,Eu,Ou,ku,Au,Du,ju,Mu,Nu,Pu,Fu,Iu,Lu,zu,Ru,Bu,Vu,Hu,tl,Uu,Wu,Gu,Ku,qu,Ju,nl,rl,Yu,Xu,il,`ModelReferenceable`,Zu,Qu,$u,ed,td,nd,rd,id,md,al,ad,od,ol,sl,cl,sd,cd,ld,ud,ll,fd,pd,dd,ul,hd,gd,dl,_d,vd,yd,bd,xd,Sd,Cd,wd,tf,fl,nf,pl,Td,Ed,Dd,ml,hl,rf,`Tag`,Od,kd,Ad,af,gl,jd,_l,Md,vl,Nd,Pd,Fd,Id,Ld,Rd,zd,Bd,yl,Vd,Hd,bl,xl,Ud,Wd,Gd,Kd,Sl,Cl,wl,Tl,El,qd,Jd,Yd,Xd,Zd,Qd,$d,Dl,ef]}computeIsSubtype(e,t){switch(e){case kl:case fl:case gl:return this.isSubtype(pl,t);case Al:case Uu:return this.isSubtype(ul,t);case jl:case Mu:case Nu:case Qu:case nd:case hd:return this.isSubtype(hl,t);case Ml:case yu:return this.isSubtype(gl,t);case Nl:return this.isSubtype(`RelationshipStyleProperty`,t)||this.isSubtype(`StyleProperty`,t);case Ll:case zl:return this.isSubtype(`DeploymentElement`,t)||this.isSubtype(`Referenceable`,t);case Vl:case ru:return this.isSubtype(Wc,t);case Wl:case Yl:case lu:return this.isSubtype(tl,t);case Kl:case ql:case Nd:return this.isSubtype(Gc,t);case Jl:case Ru:case zu:case rd:return this.isSubtype(ol,t);case Zl:return this.isSubtype(Kc,t);case Ql:case $l:return this.isSubtype(qc,t);case Kc:case Jc:case $u:case ll:case ul:case ml:case hl:return this.isSubtype(Vc,t);case tu:return this.isSubtype(`FqnReferenceable`,t)||this.isSubtype(`ModelElement`,t)||this.isSubtype(`ModelReferenceable`,t)||this.isSubtype(`Referenceable`,t);case iu:case cu:case wu:case ef:return this.isSubtype(Zc,t);case ou:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`StringProperty`,t);case su:return this.isSubtype(Jc,t);case pu:case al:return this.isSubtype(el,t);case hu:return this.isSubtype(`ExtendElementOrRelation`,t)||this.isSubtype(`FqnReferenceable`,t);case Xc:case ad:return this.isSubtype(il,t);case _u:return this.isSubtype(Xc,t);case Zc:case xu:return this.isSubtype(Qc,t);case Qc:case Su:return this.isSubtype($c,t);case $c:case cl:return this.isSubtype(Yc,t);case ju:case md:return this.isSubtype(Hc,t);case Pu:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`StyleProperty`,t);case Fu:case id:case gd:case Ad:return this.isSubtype(`SizeProperty`,t)||this.isSubtype(`StyleProperty`,t);case Iu:return this.isSubtype(`ModelReferenceable`,t)||this.isSubtype(`Referenceable`,t);case Wu:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`ExtendElementProperty`,t)||this.isSubtype(`ExtendRelationProperty`,t)||this.isSubtype(`RelationProperty`,t)||this.isSubtype(`ViewProperty`,t);case Gu:case Ku:return this.isSubtype(rl,t);case qu:case ed:case td:case bd:case Sd:return this.isSubtype(ml,t);case Ju:return this.isSubtype(nl,t);case nl:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`ExtendElementProperty`,t)||this.isSubtype(`ExtendRelationProperty`,t)||this.isSubtype(`RelationProperty`,t);case ol:case sd:return this.isSubtype(sl,t);case sl:case cd:return this.isSubtype(cl,t);case ud:case pd:return this.isSubtype(ll,t);case fd:return this.isSubtype(`RelationProperty`,t)||this.isSubtype(`StringProperty`,t);case tf:case nf:return this.isSubtype(`AbstractStep`,t)||this.isSubtype(`StepOrSeries`,t);case rf:return this.isSubtype(`StepStatement`,t)||this.isSubtype(`StepsBlock`,t);case af:return this.isSubtype(`StepsBlock`,t)||this.isSubtype(`TryStep`,t);case jd:return this.isSubtype(_l,t);case _l:return this.isSubtype(`AnyProperty`,t)||this.isSubtype(`DynamicViewProperty`,t);case Pd:return this.isSubtype(`DeploymentViewRule`,t)||this.isSubtype(`DynamicViewRule`,t)||this.isSubtype(`ViewRule`,t);case Fd:case Ld:case Rd:case zd:return this.isSubtype(vl,t);case Id:case Bd:return this.isSubtype(yl,t);case yl:return this.isSubtype(`DynamicViewRule`,t)||this.isSubtype(`ViewRule`,t);case Vd:return this.isSubtype(`StringProperty`,t)||this.isSubtype(`ViewProperty`,t);case Hd:return this.isSubtype(`WhereElementExpression`,t)||this.isSubtype(`WhereRelationExpression`,t);case bl:case Gd:return this.isSubtype(xl,t);case xl:case El:return this.isSubtype(Sl,t);case Ud:return this.isSubtype(`WhereElement`,t)||this.isSubtype(`WhereKindEqual`,t);case Wd:return this.isSubtype(`WhereElement`,t)||this.isSubtype(`WhereMetadataEqual`,t);case Kd:return this.isSubtype(`WhereElement`,t)||this.isSubtype(`WhereTagEqual`,t);case Tl:case Yd:return this.isSubtype(El,t);case qd:case Xd:return this.isSubtype(`WhereKindEqual`,t)||this.isSubtype(`WhereRelation`,t);case Jd:case Zd:return this.isSubtype(`WhereMetadataEqual`,t)||this.isSubtype(`WhereRelation`,t);case Qd:case $d:return this.isSubtype(`WhereRelation`,t)||this.isSubtype(`WhereTagEqual`,t);default:return!1}}getReferenceType(e){let t=`${e.container.$type}:${e.property}`;switch(t){case`AbstractStep:kind`:case`DeploymentRelation:kind`:case`ExtendRelation:kind`:case`OutgoingRelationExpr:kind`:case`Relation:kind`:case`RelationKindDotRef:kind`:case`Step:kind`:case`StepSeries:kind`:case`WhereRelationKind:value`:return dd;case`ColorProperty:customColor`:case`IconColorProperty:customColor`:case`SpecificationTag:customColor`:return Pl;case`DeploymentNode:kind`:return Vl;case`DynamicViewGlobalPredicateRef:predicate`:return Tu;case`DynamicViewRef:view`:return Yl;case`Element:kind`:case`ElementKindExpression:kind`:return ru;case`ElementViewRef:view`:return lu;case`FqnRef:value`:case`StrictFqnRef:value`:return al;case`IconProperty:libicon`:return Bu;case`Imported:imported`:case`StrictFqnElementRef:el`:return tu;case`TagRef:tag`:return`Tag`;case`ViewRef:view`:return tl;case`ViewRuleGlobalPredicateRef:predicate`:return Eu;case`ViewRuleGlobalStyle:style`:return Au;case`WhereElementKind:value`:case`WhereRelationParticipantKind:value`:return Wc;default:throw Error(`${t} is not a valid reference id.`)}}getTypeMetaData(e){switch(e){case Ol:return{name:Ol,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`target`},{name:`title`}]};case kl:return{name:kl,properties:[{name:`branches`,defaultValue:[]},{name:`title`}]};case Al:return{name:Al,properties:[{name:`key`},{name:`value`}]};case jl:return{name:jl,properties:[{name:`key`},{name:`value`}]};case Ml:return{name:Ml,properties:[{name:`catch`},{name:`title`},{name:`try`}]};case Nl:return{name:Nl,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case Pl:return{name:Pl,properties:[{name:`name`}]};case Fl:return{name:Fl,properties:[{name:`props`,defaultValue:[]}]};case Il:return{name:Il,properties:[{name:`props`,defaultValue:[]}]};case Ll:return{name:Ll,properties:[{name:`body`},{name:`name`},{name:`summary`},{name:`target`},{name:`title`}]};case Rl:return{name:Rl,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case zl:return{name:zl,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`summary`},{name:`title`}]};case Bl:return{name:Bl,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Vl:return{name:Vl,properties:[{name:`name`}]};case Hl:return{name:Hl,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case Ul:return{name:Ul,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case Wl:return{name:Wl,properties:[{name:`body`},{name:`name`}]};case Gl:return{name:Gl,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case Kl:return{name:Kl,properties:[{name:`expr`},{name:`isInclude`,defaultValue:!1}]};case ql:return{name:ql,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case Jl:return{name:Jl,properties:[{name:`source`},{name:`target`}]};case Yl:return{name:Yl,properties:[{name:`body`},{name:`name`}]};case Xl:return{name:Xl,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`steps`,defaultValue:[]},{name:`tags`}]};case Zl:return{name:Zl,properties:[{name:`key`},{name:`value`}]};case Ql:return{name:Ql,properties:[{name:`predicate`}]};case $l:return{name:$l,properties:[{name:`exprs`}]};case eu:return{name:eu,properties:[{name:`view`}]};case tu:return{name:tu,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`props`,defaultValue:[]}]};case nu:return{name:nu,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case ru:return{name:ru,properties:[{name:`name`}]};case iu:return{name:iu,properties:[{name:`isEqual`,defaultValue:!1},{name:`kind`}]};case au:return{name:au,properties:[{name:`modelElement`}]};case ou:return{name:ou,properties:[{name:`key`},{name:`value`}]};case su:return{name:su,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case cu:return{name:cu,properties:[{name:`isEqual`,defaultValue:!1},{name:`tag`}]};case lu:return{name:lu,properties:[{name:`body`},{name:`extends`},{name:`name`},{name:`viewOf`}]};case uu:return{name:uu,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case du:return{name:du,properties:[{name:`view`}]};case fu:return{name:fu,properties:[{name:`prev`},{name:`value`}]};case pu:return{name:pu,properties:[{name:`body`},{name:`deploymentNode`}]};case mu:return{name:mu,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case hu:return{name:hu,properties:[{name:`body`},{name:`element`}]};case gu:return{name:gu,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case _u:return{name:_u,properties:[{name:`body`},{name:`dotKind`},{name:`isBidirectional`,defaultValue:!1},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case vu:return{name:vu,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case yu:return{name:yu,properties:[{name:`finally`},{name:`title`},{name:`tryCatch`}]};case bu:return{name:bu,properties:[{name:`prev`},{name:`value`}]};case xu:return{name:xu,properties:[{name:`subject`},{name:`where`}]};case Su:return{name:Su,properties:[{name:`custom`},{name:`subject`}]};case Cu:return{name:Cu,properties:[{name:`parent`},{name:`value`}]};case wu:return{name:wu,properties:[{name:`ref`},{name:`selector`}]};case Tu:return{name:Tu,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case Eu:return{name:Eu,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case Du:return{name:Du,properties:[{name:`name`},{name:`predicates`,defaultValue:[]},{name:`styles`,defaultValue:[]}]};case Ou:return{name:Ou,properties:[{name:`id`},{name:`props`,defaultValue:[]},{name:`targets`}]};case ku:return{name:ku,properties:[{name:`id`},{name:`styles`,defaultValue:[]}]};case Au:return{name:Au,properties:[{name:`name`}]};case ju:return{name:ju,properties:[{name:`hex`}]};case Mu:return{name:Mu,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case Nu:return{name:Nu,properties:[{name:`key`},{name:`value`}]};case Pu:return{name:Pu,properties:[{name:`key`},{name:`libicon`},{name:`value`}]};case Fu:return{name:Fu,properties:[{name:`key`},{name:`value`}]};case Iu:return{name:Iu,properties:[{name:`imported`},{name:`prev`}]};case Lu:return{name:Lu,properties:[{name:`imports`},{name:`project`}]};case Ru:return{name:Ru,properties:[{name:`to`}]};case zu:return{name:zu,properties:[{name:`inout`}]};case Bu:return{name:Bu,properties:[{name:`name`}]};case Vu:return{name:Vu,properties:[{name:`deployments`,defaultValue:[]},{name:`globals`,defaultValue:[]},{name:`imports`,defaultValue:[]},{name:`likec4lib`,defaultValue:[]},{name:`models`,defaultValue:[]},{name:`specifications`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case Hu:return{name:Hu,properties:[{name:`icons`,defaultValue:[]}]};case Uu:return{name:Uu,properties:[{name:`key`},{name:`value`}]};case Wu:return{name:Wu,properties:[{name:`key`},{name:`title`},{name:`value`}]};case Gu:return{name:Gu,properties:[{name:`markdown`},{name:`text`}]};case Ku:return{name:Ku,properties:[{name:`values`,defaultValue:[]}]};case qu:return{name:qu,properties:[{name:`boolValue`,defaultValue:!1},{name:`key`},{name:`value`}]};case Ju:return{name:Ju,properties:[{name:`props`,defaultValue:[]}]};case Yu:return{name:Yu,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case Xu:return{name:Xu,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case Zu:return{name:Zu,properties:[{name:`folder`},{name:`name`},{name:`styles`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case Qu:return{name:Qu,properties:[{name:`key`},{name:`value`,defaultValue:!1}]};case $u:return{name:$u,properties:[{name:`key`},{name:`value`}]};case ed:return{name:ed,properties:[{name:`key`},{name:`value`}]};case td:return{name:td,properties:[{name:`key`},{name:`value`}]};case nd:return{name:nd,properties:[{name:`key`},{name:`value`}]};case rd:return{name:rd,properties:[{name:`dotKind`},{name:`from`},{name:`isBidirectional`,defaultValue:!1},{name:`kind`}]};case id:return{name:id,properties:[{name:`key`},{name:`value`}]};case ad:return{name:ad,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`isBidirectional`,defaultValue:!1},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case od:return{name:od,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case sd:return{name:sd,properties:[{name:`subject`},{name:`where`}]};case cd:return{name:cd,properties:[{name:`custom`},{name:`subject`}]};case ld:return{name:ld,properties:[{name:`kind`}]};case ud:return{name:ud,properties:[{name:`key`},{name:`value`}]};case dd:return{name:dd,properties:[{name:`name`}]};case fd:return{name:fd,properties:[{name:`key`},{name:`value`}]};case pd:return{name:pd,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case md:return{name:md,properties:[{name:`alpha`},{name:`blue`},{name:`green`},{name:`red`}]};case hd:return{name:hd,properties:[{name:`key`},{name:`value`}]};case gd:return{name:gd,properties:[{name:`key`},{name:`value`}]};case _d:return{name:_d,properties:[{name:`color`},{name:`name`}]};case vd:return{name:vd,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case yd:return{name:yd,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case bd:return{name:bd,properties:[{name:`key`},{name:`value`}]};case xd:return{name:xd,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case Sd:return{name:Sd,properties:[{name:`key`},{name:`value`}]};case Cd:return{name:Cd,properties:[{name:`colors`,defaultValue:[]},{name:`deploymentNodes`,defaultValue:[]},{name:`elements`,defaultValue:[]},{name:`name`},{name:`relationships`,defaultValue:[]},{name:`tags`,defaultValue:[]}]};case wd:return{name:wd,properties:[{name:`color`},{name:`customColor`},{name:`tag`},{name:`themeColor`}]};case Td:return{name:Td,properties:[{name:`steps`,defaultValue:[]}]};case Ed:return{name:Ed,properties:[{name:`el`},{name:`parent`}]};case Dd:return{name:Dd,properties:[{name:`parent`},{name:`value`}]};case`Tag`:return{name:`Tag`,properties:[{name:`name`}]};case Od:return{name:Od,properties:[{name:`tag`}]};case kd:return{name:kd,properties:[{name:`prev`},{name:`values`,defaultValue:[]}]};case Ad:return{name:Ad,properties:[{name:`key`},{name:`value`}]};case jd:return{name:jd,properties:[{name:`key`},{name:`value`}]};case Md:return{name:Md,properties:[{name:`view`}]};case Nd:return{name:Nd,properties:[{name:`key`},{name:`value`,defaultValue:!1}]};case Pd:return{name:Pd,properties:[{name:`direction`},{name:`nodeSep`},{name:`rankSep`}]};case Fd:return{name:Fd,properties:[{name:`predicate`}]};case Id:return{name:Id,properties:[{name:`style`}]};case Ld:return{name:Ld,properties:[{name:`groupRules`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`title`}]};case Rd:return{name:Rd,properties:[{name:`exprs`},{name:`isInclude`,defaultValue:!1}]};case zd:return{name:zd,properties:[{name:`targets`},{name:`value`}]};case Bd:return{name:Bd,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case Vd:return{name:Vd,properties:[{name:`key`},{name:`value`}]};case Hd:return{name:Hd,properties:[{name:`left`},{name:`operator`},{name:`right`}]};case Ud:return{name:Ud,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Wd:return{name:Wd,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Gd:return{name:Gd,properties:[{name:`value`}]};case Kd:return{name:Kd,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case qd:return{name:qd,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Jd:return{name:Jd,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Yd:return{name:Yd,properties:[{name:`value`}]};case Xd:return{name:Xd,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case Zd:return{name:Zd,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case Qd:return{name:Qd,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case $d:return{name:$d,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case ef:return{name:ef,properties:[{name:`isWildcard`,defaultValue:!1}]};case tf:return{name:tf,properties:[{name:`custom`},{name:`dotKind`},{name:`isBackward`,defaultValue:!1},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case nf:return{name:nf,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case rf:return{name:rf,properties:[{name:`kind`},{name:`steps`,defaultValue:[]},{name:`title`}]};case af:return{name:af,properties:[{name:`steps`,defaultValue:[]},{name:`title`}]};default:return{name:e,properties:[]}}}};const J=new LikeC4AstReflection;let of;const LikeC4Grammar=()=>of??=st(`{"$type":"Grammar","isDeclared":true,"name":"LikeC4","rules":[{"$type":"ParserRule","entry":true,"name":"LikeC4Grammar","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"imports","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"Assignment","feature":"specifications","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}},{"$type":"Assignment","feature":"models","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"Assignment","feature":"views","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@45"},"arguments":[]}},{"$type":"Assignment","feature":"globals","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@134"},"arguments":[]}},{"$type":"Assignment","feature":"deployments","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@119"},"arguments":[]}},{"$type":"Assignment","feature":"likec4lib","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}}],"cardinality":"*"},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LikeC4Lib","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"likec4lib"},{"$type":"Keyword","value":"{"},{"$type":"Keyword","value":"icons"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"icons","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},"cardinality":"+"},{"$type":"Keyword","value":"}"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LibIcon","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Tag","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationshipKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomColor","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNodeKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRule","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"specification"}},{"$type":"Keyword","value":"{"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"relationships","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}},{"$type":"Assignment","feature":"colors","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}},{"$type":"Assignment","feature":"deploymentNodes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationElementKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"element"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@158"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationElementStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"notation"},{"$type":"Keyword","value":"summary"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationDeploymentNodeKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"deploymentNode"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@158"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationTag","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"tag"},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Group","elements":[{"$type":"Keyword","value":"color"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]},{"$type":"Assignment","feature":"color","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@171"},"arguments":[]}}]}],"cardinality":"?"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationColor","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"color"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"color","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@171"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRelationshipKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"relationship"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRelationshipStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"notation"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ImportsFromPoject","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"import"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"imports","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}},{"$type":"Keyword","value":"}"}]},{"$type":"Assignment","feature":"imports","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Keyword","value":"from"},{"$type":"Assignment","feature":"project","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Imported","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"imported","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@21"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Imported"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"imported","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@21"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Tags","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]},"cardinality":"+"},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Tags"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]},"cardinality":"*"}],"cardinality":"*"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Model","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"model"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ModelElement","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@25"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Element","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@158"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@40"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"summary"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElementOrRelation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ExtendRelation"}},{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@35"},"arguments":[]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ExtendElement"}},{"$type":"Assignment","feature":"element","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@31"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@26"},"arguments":[]}}]}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElementBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@27"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElementProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@40"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelationProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@40"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementRef","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Assignment","feature":"modelElement","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StrictFqnElementRef","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@21"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@1"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@21"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnRef","returnType":{"$ref":"#/interfaces@2"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@2"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StrictFqnRef","returnType":{"$ref":"#/interfaces@3"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@3"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Relation","parameters":[{"$type":"Parameter","name":"isExplicit"}],"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","guardCondition":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@34/parameters@0"}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}}]},{"$type":"Group","guardCondition":{"$type":"Negation","value":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@34/parameters@0"}}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]},"cardinality":"?"}]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@35"},"arguments":[]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@36"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"RelationConnector","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBidirectional","operator":"?=","terminal":{"$type":"Keyword","value":"]<->"}},{"$type":"Keyword","value":"]->"}]}]},{"$type":"Assignment","feature":"isBidirectional","operator":"?=","terminal":{"$type":"Keyword","value":"<->"}},{"$type":"Keyword","value":"->"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@38"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@78"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@40"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"description"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationStyleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"style"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataProperty","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@41"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@42"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataAttribute","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@43"},"arguments":[]}},{"$type":"Assignment","feature":"boolValue","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataValue","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@44"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataArray","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"["},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"]"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ModelViews","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"views"}},{"$type":"Assignment","feature":"folder","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"views","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@46"},"arguments":[]}},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@71"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LikeC4ViewRule","returnType":{"$ref":"#/types@2"},"definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@48"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@47"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"extends"},{"$type":"Assignment","feature":"extends","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@50"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"of"},{"$type":"Assignment","feature":"viewOf","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}}]}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@52"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"dynamic"},{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@53"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@2"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@47"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@48"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@56"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@60"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@54"},"arguments":[]},"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"steps","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@106"},"arguments":[]}},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@64"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@55"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@56"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewDisplayVariantProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"variant"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@57"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@58"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewOrderProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"order"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewLayoutDirection","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"TopBottom"},{"$type":"Keyword","value":"LeftRight"},{"$type":"Keyword","value":"BottomTop"},{"$type":"Keyword","value":"RightLeft"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@66"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@63"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@71"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@72"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@61"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleRank","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"rank"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@62"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@92"},"arguments":[]}},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RankValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"same"},{"$type":"Keyword","value":"min"},{"$type":"Keyword","value":"max"},{"$type":"Keyword","value":"source"},{"$type":"Keyword","value":"sink"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"group"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@142"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@143"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"groupRules","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@66"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@63"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@67"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@71"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@72"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRulePredicate","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isInclude","operator":"?=","terminal":{"$type":"Keyword","value":"include"}},{"$type":"Keyword","value":"exclude"}]},{"$type":"Assignment","feature":"exprs","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGlobalPredicateRef","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"predicate"},{"$type":"Assignment","feature":"predicate","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@135"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewIncludePredicate","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"include"},{"$type":"Assignment","feature":"exprs","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewGlobalPredicateRef","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"predicate"},{"$type":"Assignment","feature":"predicate","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@136"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@92"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGlobalStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"style","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@137"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleStyleOrGlobalRef","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@69"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@70"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleAutoLayout","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"autoLayout"},{"$type":"Assignment","feature":"direction","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@59"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"rankSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]}},{"$type":"Assignment","feature":"nodeSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NotationProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"notation"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NotesProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"notes"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomElementProperties","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@77"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomRelationProperties","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@78"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@38"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NavigateToProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"navigateTo"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@49"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationNavigateToProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"navigateTo"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@51"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Expressions","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@80"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Expressions"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@80"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExpressionV2","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@83"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@81"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExprOrWith","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExprWith"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"with"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExprOrWhere","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExprWhere"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"where"},{"$type":"Assignment","feature":"where","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@93"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExprOrWith","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@84"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"RelationExprWith"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"with"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExprOrWhere","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@87"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"RelationExprWhere"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"where"},{"$type":"Assignment","feature":"where","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@100"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExpr","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WildcardExpression"}},{"$type":"Assignment","feature":"isWildcard","operator":"?=","terminal":{"$type":"Keyword","value":"*"}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementTagExpression"}},{"$type":"Keyword","value":"element.tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementKindExpression"}},{"$type":"Keyword","value":"element.kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@86"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnRefExpr","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"ref","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Assignment","feature":"selector","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@191"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@192"},"arguments":[]}]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExpr","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@90"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"InOutRelationExpr","inferredType":{"$type":"InferredType","name":"RelationExpr"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@89"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"InOutRelationExpr"},"feature":"inout","operator":"="},{"$type":"Keyword","value":"->"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IncomingRelationExpr","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"->"},{"$type":"Assignment","feature":"to","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DirectedRelationExpr","inferredType":{"$type":"InferredType","name":"RelationExpr"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@91"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"DirectedRelationExpr"},"feature":"source","operator":"="},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"OutgoingRelationExpr","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"from","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBidirectional","operator":"?=","terminal":{"$type":"Keyword","value":"<->"}},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExpressions","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExpressions"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@94"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementOr","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"or"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementAnd","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"and"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementPrimary","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"("},{"$type":"RuleCall","rule":{"$ref":"#/rules@93"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@97"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@98"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementNegation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"not"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@93"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElement","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementMetadata"}},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@99"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@5"},"deprecatedSyntax":false}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataFilterValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@101"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationOr","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"or"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationAnd","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@103"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"and"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@103"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationPrimary","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"("},{"$type":"RuleCall","rule":{"$ref":"#/rules@100"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@104"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@105"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationNegation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"not"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@100"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelation","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantMetadata"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@170"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@99"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantKind"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@170"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantTag"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@170"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationMetadata"}},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@99"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StepStatement","returnType":{"$ref":"#/types@10"},"definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@111"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@117"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"StepsBlockFragment","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"steps","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@106"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SubflowKind","returnType":{"$ref":"#/types@11"},"definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"opt"},{"$type":"Keyword","value":"par"},{"$type":"Keyword","value":"parallel"},{"$type":"Keyword","value":"loop"},{"$type":"Keyword","value":"when"},{"$type":"Keyword","value":"if"},{"$type":"Keyword","value":"else"},{"$type":"Keyword","value":"break"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SubflowStep","returnType":{"$ref":"#/interfaces@5"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@108"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@107"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StepsBlock","returnType":{"$ref":"#/interfaces@4"},"definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@107"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false,"$comment":"/**\\n * Represents a block of step statements, i.e. { ... }\\n */"},{"$type":"ParserRule","name":"TryStep","returnType":{"$ref":"#/types@12"},"definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@112"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FinallyBlock","returnType":{"$ref":"#/interfaces@8"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@113"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@8"},"feature":"tryCatch","operator":"="},{"$type":"Keyword","value":"finally"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"finally","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@110"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CatchBlock","returnType":{"$ref":"#/interfaces@7"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@114"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@7"},"feature":"try","operator":"="},{"$type":"Keyword","value":"catch"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"catch","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@110"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TryBlock","returnType":{"$ref":"#/interfaces@6"},"definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"try"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@107"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"AltSteps","returnType":{"$ref":"#/interfaces@9"},"definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"alt"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"branches","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"StepTarget","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StepSeries","returnType":{"$ref":"#/interfaces@12"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@118"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@12"},"feature":"source","operator":"="},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Step","returnType":{"$ref":"#/interfaces@11"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBackward","operator":"?=","terminal":{"$type":"Keyword","value":"<-"}},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ModelDeployments","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"deployment"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@120"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@126"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@124"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNode","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@121"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNodeBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@122"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@126"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@120"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeployedInstance","definition":{"$type":"Group","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]}],"cardinality":"?"},{"$type":"Keyword","value":"instanceOf"},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@123"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeployedInstanceBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@126"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendDeployment","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"deploymentNode","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@33"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@125"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendDeploymentBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@27"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@122"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@126"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@120"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentRelation","parameters":[{"$type":"Parameter","name":"isExplicit"}],"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","guardCondition":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@126/parameters@0"}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}}]},{"$type":"Group","guardCondition":{"$type":"Negation","value":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@126/parameters@0"}}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]},"cardinality":"?"}]}]},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]},{"$type":"Keyword","value":"->"}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@127"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentRelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"deployment"},{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@56"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@133"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@132"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@72"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@131"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleAncestors","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"includeAncestors"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRuleStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@92"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRulePredicate","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isInclude","operator":"?=","terminal":{"$type":"Keyword","value":"include"}},{"$type":"Keyword","value":"exclude"}]},{"$type":"Assignment","feature":"expr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Globals","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"global"}},{"$type":"Keyword","value":"{"},{"$type":"Group","elements":[{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@135"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@136"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@138"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@139"},"arguments":[]}]},"cardinality":"*"}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalPredicateGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"predicateGroup"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@203"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalDynamicPredicateGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"dynamicPredicateGroup"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@203"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@67"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyleId","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@203"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@137"},"arguments":[]}},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@92"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyleGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"styleGroup"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@137"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@69"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LinkProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"link"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@175"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"ColorRef","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"themeColor","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@168"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"arguments":[]},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ColorProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"color"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"OpacityProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"opacity"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@198"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MultipleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"multiple"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"icon"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"libicon","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@2"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"RuleCall","rule":{"$ref":"#/rules@175"},"arguments":[]}]}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconColorProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconColor"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconSize"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconPositionValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"left"},{"$type":"Keyword","value":"right"},{"$type":"Keyword","value":"top"},{"$type":"Keyword","value":"bottom"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconPositionProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconPosition"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ShapeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"shape"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@169"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"BorderStyleValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},{"$type":"Keyword","value":"none"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"BorderProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"border"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SizeValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"xs"},{"$type":"Keyword","value":"sm"},{"$type":"Keyword","value":"md"},{"$type":"Keyword","value":"lg"},{"$type":"Keyword","value":"xl"},{"$type":"Keyword","value":"xsmall"},{"$type":"Keyword","value":"small"},{"$type":"Keyword","value":"medium"},{"$type":"Keyword","value":"large"},{"$type":"Keyword","value":"xlarge"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ShapeSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"size"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PaddingSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"padding"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TextSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"textSize"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StyleProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@142"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@143"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@146"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@147"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementStyleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"style"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LineProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"line"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ArrowProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"head"},{"$type":"Keyword","value":"tail"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationshipStyleProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@142"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@159"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@160"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TagRef","definition":{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@4"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationKindDotRef","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@195"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LineOptions","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"solid"},{"$type":"Keyword","value":"dashed"},{"$type":"Keyword","value":"dotted"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ArrowType","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"Keyword","value":"normal"},{"$type":"Keyword","value":"onormal"},{"$type":"Keyword","value":"dot"},{"$type":"Keyword","value":"odot"},{"$type":"Keyword","value":"diamond"},{"$type":"Keyword","value":"odiamond"},{"$type":"Keyword","value":"crow"},{"$type":"Keyword","value":"open"},{"$type":"Keyword","value":"vee"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewDisplayVariantValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"diagram"},{"$type":"Keyword","value":"sequence"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewFlowKeyword","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"alt"},{"$type":"Keyword","value":"opt"},{"$type":"Keyword","value":"par"},{"$type":"Keyword","value":"parallel"},{"$type":"Keyword","value":"loop"},{"$type":"Keyword","value":"when"},{"$type":"Keyword","value":"if"},{"$type":"Keyword","value":"else"},{"$type":"Keyword","value":"break"},{"$type":"Keyword","value":"try"},{"$type":"Keyword","value":"catch"},{"$type":"Keyword","value":"finally"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ThemeColor","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"primary"},{"$type":"Keyword","value":"secondary"},{"$type":"Keyword","value":"muted"},{"$type":"Keyword","value":"slate"},{"$type":"Keyword","value":"blue"},{"$type":"Keyword","value":"indigo"},{"$type":"Keyword","value":"sky"},{"$type":"Keyword","value":"red"},{"$type":"Keyword","value":"gray"},{"$type":"Keyword","value":"green"},{"$type":"Keyword","value":"amber"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementShape","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"rectangle"},{"$type":"Keyword","value":"component"},{"$type":"Keyword","value":"person"},{"$type":"Keyword","value":"browser"},{"$type":"Keyword","value":"mobile"},{"$type":"Keyword","value":"cylinder"},{"$type":"Keyword","value":"storage"},{"$type":"Keyword","value":"queue"},{"$type":"Keyword","value":"bucket"},{"$type":"Keyword","value":"document"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Participant","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"source"},{"$type":"Keyword","value":"target"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ColorLiteral","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@172"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@173"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RGBAColor","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"rgba"},{"$type":"Keyword","value":"rgb"}]},{"$type":"Keyword","value":"("},{"$type":"Assignment","feature":"red","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"green","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"blue","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"alpha","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@201"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@198"},"arguments":[]}]},"cardinality":"?"},{"$type":"Keyword","value":")"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"HexColor","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@193"},"arguments":[]},{"$type":"Assignment","feature":"hex","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@204"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@203"},"arguments":[]}]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconId","dataType":"string","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Uri","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@190"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MarkdownOrString","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"markdown","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@199"},"arguments":[]}},{"$type":"Assignment","feature":"text","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomColorId","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@203"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@169"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@170"},"arguments":[]},{"$type":"Keyword","value":"element"},{"$type":"Keyword","value":"model"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Id","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@203"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@169"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@168"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@170"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@167"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@62"},"arguments":[]},{"$type":"Keyword","value":"element"},{"$type":"Keyword","value":"model"},{"$type":"Keyword","value":"group"},{"$type":"Keyword","value":"node"},{"$type":"Keyword","value":"deployment"},{"$type":"Keyword","value":"instance"},{"$type":"Keyword","value":"relationship"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"HashId","dataType":"string","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@193"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EqOperator","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@196"},"arguments":[]}]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"is"}},{"$type":"Assignment","feature":"not","operator":"?=","terminal":{"$type":"Keyword","value":"not"},"cardinality":"?"}]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"IsEqual","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isEqual","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@196"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","hidden":true,"name":"BLOCK_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\//"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\/\\\\/[^\\\\n\\\\r]*/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"WS","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"NL","definition":{"$type":"RegexToken","regex":"/[\\\\r\\\\n]+/"},"fragment":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"RegexToken","regex":"/\\\\b(true|false)\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"LIB_ICON","definition":{"$type":"RegexToken","regex":"/(aws|azure|bootstrap|gcp|tech):[-\\\\w]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_WITH_SCHEMA","definition":{"$type":"RegexToken","regex":"/\\\\w+:\\\\/{2}\\\\S+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_RELATIVE","definition":{"$type":"RegexToken","regex":"/\\\\.{0,2}\\\\/[^\\\\/]\\\\S+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_ALIAS","definition":{"$type":"RegexToken","regex":"/@[a-zA-Z0-9_-]*\\\\/[^\\\\s]+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"DotUnderscore","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\._(?![_a-zA-Z])/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"DotWildcard","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\.\\\\*{1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Hash","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"#"}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"StickyDot","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\./"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Dot","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"."}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NotEqual","definition":{"$type":"RegexToken","regex":"/\\\\!\\\\={1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Eq","definition":{"$type":"RegexToken","regex":"/\\\\={1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Percent","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+%/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"MarkdownString","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalGroup","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"'''"}},{"$type":"UntilToken","terminal":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"'''"}}}]},{"$type":"TerminalGroup","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"\\"\\"\\""}},{"$type":"UntilToken","terminal":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"\\"\\"\\""}}}]}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"String","definition":{"$type":"RegexToken","regex":"/\\"(?:[^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'(?:[^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Float","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+\\\\.\\\\d+\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Number","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"IdTerminal","definition":{"$type":"RegexToken","regex":"/([a-zA-Z]|_+[a-zA-Z0-9])[-\\\\w]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Hex","definition":{"$type":"RegexToken","regex":"/[a-fA-F0-9]{3,}(?![-_g-zG-Z])/"},"fragment":false,"hidden":false}],"interfaces":[{"$type":"Interface","name":"ElementRef","attributes":[{"$type":"TypeAttribute","name":"modelElement","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"StrictFqnElementRef","attributes":[{"$type":"TypeAttribute","name":"parent","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@1"}}},{"$type":"TypeAttribute","name":"el","type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@21"}}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"FqnRef","attributes":[{"$type":"TypeAttribute","name":"parent","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}}},{"$type":"TypeAttribute","name":"value","type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/types@1"}}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"StrictFqnRef","attributes":[{"$type":"TypeAttribute","name":"parent","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@3"}}},{"$type":"TypeAttribute","name":"value","type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/types@1"}}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"StepsBlock","attributes":[{"$type":"TypeAttribute","name":"steps","type":{"$type":"ArrayType","elementType":{"$type":"SimpleType","typeRef":{"$ref":"#/types@10"}}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"SubflowStep","superTypes":[{"$ref":"#/interfaces@4"}],"attributes":[{"$type":"TypeAttribute","name":"kind","type":{"$type":"SimpleType","typeRef":{"$ref":"#/types@11"}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}]},{"$type":"Interface","name":"TryBlock","superTypes":[{"$ref":"#/interfaces@4"}],"attributes":[{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}]},{"$type":"Interface","name":"CatchBlock","attributes":[{"$type":"TypeAttribute","name":"try","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@6"}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"catch","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@4"}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"FinallyBlock","attributes":[{"$type":"TypeAttribute","name":"tryCatch","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@6"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@7"}}]},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"finally","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@4"}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"AltSteps","attributes":[{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"branches","type":{"$type":"ArrayType","elementType":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@5"}}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"AbstractStep","attributes":[{"$type":"TypeAttribute","name":"kind","isOptional":true,"type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@5"}}}},{"$type":"TypeAttribute","name":"dotKind","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@163"}}},{"$type":"TypeAttribute","name":"target","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@0"}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"custom","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@76"}}}],"superTypes":[]},{"$type":"Interface","name":"Step","superTypes":[{"$ref":"#/interfaces@10"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@0"}},"isOptional":false},{"$type":"TypeAttribute","name":"isBackward","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"boolean"}}],"$comment":"/**\\n * A single step in a dynamic view flow\\n * source -> target\\n */"},{"$type":"Interface","name":"StepSeries","superTypes":[{"$ref":"#/interfaces@10"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@11"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@12"}}]},"isOptional":false}],"$comment":"/**\\n * A series of steps in a dynamic view flow\\n * source -> target1 -> target2 -> ...\\n */"}],"types":[{"$type":"Type","name":"ModelReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@21"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"Referenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@120"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@122"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@21"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"LikeC4View","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@47"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@48"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@128"}}]}},{"$type":"Type","name":"StringProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@24"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@57"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@38"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@42"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@10"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@15"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@73"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@74"}}]}},{"$type":"Type","name":"AnyProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@3"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@56"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@54"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@23"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@37"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@161"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@77"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@157"}}]}},{"$type":"Type","name":"DeploymentNodeOrElementKind","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@3"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@7"}}]}},{"$type":"Type","name":"WhereTagEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@98/definition/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@105/definition/elements@5/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@105/definition/elements@2/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereKindEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@98/definition/elements@2/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@105/definition/elements@4/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@105/definition/elements@1/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereMetadataEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@98/definition/elements@0/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@105/definition/elements@3/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@105/definition/elements@0/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereExpression","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@93"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@100"}}]}},{"$type":"Type","name":"StepStatement","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@13"}},{"$type":"SimpleType","typeRef":{"$ref":"#/types@12"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@9"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@5"}}]}},{"$type":"Type","name":"SubflowKind","type":{"$type":"UnionType","types":[{"$type":"SimpleType","stringType":"opt"},{"$type":"SimpleType","stringType":"par"},{"$type":"SimpleType","stringType":"parallel"},{"$type":"SimpleType","stringType":"loop"},{"$type":"SimpleType","stringType":"when"},{"$type":"SimpleType","stringType":"if"},{"$type":"SimpleType","stringType":"else"},{"$type":"SimpleType","stringType":"break"}]}},{"$type":"Type","name":"TryStep","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@6"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@7"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@8"}}]}},{"$type":"Type","name":"StepOrSeries","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@11"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@12"}}]}},{"$type":"Type","name":"DeploymentElement","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@120"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@122"}}]}},{"$type":"Type","name":"FqnReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@21"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@25/definition/elements@1/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@124"}}]}},{"$type":"Type","name":"SizeProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@154"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@155"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@156"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@147"}}]}}],"definesHiddenTokens":false,"hiddenTokens":[],"imports":[],"usedGrammars":[]}`),sf={languageId:`likec4`,fileExtensions:[`.c4`,`.likec4`,`.like-c4`],caseInsensitive:!1,mode:`production`},cf={skipValidations:!0,recoveryEnabled:!0,nodeLocationTracking:`full`},lf={AstReflection:()=>new LikeC4AstReflection},uf={Grammar:()=>LikeC4Grammar(),LanguageMetaData:()=>sf,parser:{ParserConfig:()=>cf}},df=Symbol.for(`idattr`),ff={writeId(e,t){return e[df]=t,e},readId(e){return e[df]}},pf={writeId(e,t){return F(t)?e[df]=void 0:e[df]=t,e},readId(e){return e[df]}};function isLikeC4LangiumDocument(e){return e?.textDocument.languageId===sf.languageId}function isLikeC4UserDocument(e){return isLikeC4LangiumDocument(e)&&isNotLikeC4Builtin(e)}function parseMarkdownAsString(e){return e?.markdown||e?.text}function parseAstPercent(e){let t=parseFloat(e);return isNaN(t)?100:jn(t,{min:0,max:100})}function parseAstOpacityProperty({value:e}){return parseAstPercent(e)}function parseAstSizeValue({value:e}){switch(e){case`xs`:case`sm`:case`md`:case`lg`:case`xl`:return e;case`xsmall`:return`xs`;case`small`:return`sm`;case`medium`:return`md`;case`large`:return`lg`;case`xlarge`:return`xl`;default:yi(e)}}function parseAstIconPositionValue({value:e}){switch(e){case`left`:case`right`:case`top`:case`bottom`:return e;default:yi(e)}}function toRelationshipStyle(e,t){let r={};if(!e||e.length===0)return r;for(let o of e)if(t(o))switch(!0){case isColorProperty(o):{let e=toColor(o);L(e)&&(r.color=e);break}case isLineProperty(o):r.line=o.value;break;case isArrowProperty(o):switch(o.key){case`head`:r.head=o.value;break;case`tail`:r.tail=o.value;break;default:yi(o)}break;default:yi(o)}return r}function toColor(e){return e?.themeColor??e?.customColor?.$refText}function toAutoLayout(e){let t=e.rankSep,r=e.nodeSep,o;switch(e.direction){case`TopBottom`:o=`TB`;break;case`BottomTop`:o=`BT`;break;case`LeftRight`:o=`LR`;break;case`RightLeft`:o=`RL`;break;default:yi(e.direction)}return{direction:o,...r&&{nodeSep:r},...t&&{rankSep:t}}}function toAstViewLayoutDirection(e){switch(e){case`TB`:return`TopBottom`;case`BT`:return`BottomTop`;case`LR`:return`LeftRight`;case`RL`:return`RightLeft`;default:yi(e)}}function getViewRulePredicateContainer(e){return Ve(e,e=>isViewRulePredicate(e)||isDeploymentViewRulePredicate(e)||isDynamicViewIncludePredicate(e))}const _isModel=e=>isModel(e)||isElementBody(e)||isExtendElementBody(e)||isElementViewBody(e)||isDynamicViewBody(e)||isElementRef(e),mf=t(e=>isModelDeployments(e)||isDeploymentViewBody(e)||isDeploymentNodeBody(e)||isExtendDeploymentBody(e)||isDeployedInstanceBody(e),`_isDeployment`);function isFqnRefInsideGlobals(e){for(;;){if(mf(e)||_isModel(e))return!1;if(isGlobals(e)||isModelViews(e))return!0;if(e.$container)e=e.$container;else return!1}}function isFqnRefInsideModel(e){for(;;){if(mf(e))return!1;if(_isModel(e))return!0;if(e.$container)e=e.$container;else return!1}}function isFqnRefInsideDeployment(e){for(;;){if(_isModel(e))return!1;if(mf(e))return!0;if(e.$container)e=e.$container;else return!1}}function elementRef(e){try{let t=isStrictFqnElementRef(e)?e.el.ref:e.modelElement.value.ref;return t?.$type===`Imported`&&(t=t.imported.ref),t?.$type===`Element`?t:void 0}catch{return}}function readStrictFqn(e){let t=[e.$type===`StrictFqnRef`?e.value.$refText:e.el.$refText],r=e.parent;for(;r;)t.push(r.$type===`StrictFqnRef`?r.value.$refText:r.el.$refText),r=r.parent;return t.length===1?t[0]:t.reverse().join(`.`)}function referenceableParent(e){for(;e.parent;)e=e.parent;return e.value.ref??null}function instanceRef(e){let t;for(;t=e.value?.ref;){if(isDeploymentNode$1(t))return null;if(isDeployedInstance(t))return t;if(F(e.parent))return null;e=e.parent}return null}function importsRef(e){let t=referenceableParent(e);return t?.$type===`Imported`?t:null}function isReferenceToDeploymentModel(e){let t;for(;t=e.value?.ref;){if(isDeploymentElement(t))return!0;if(F(e.parent))return!1;e=e.parent}return!1}var IndexManager=class extends he{services;constructor(e){super(e),this.services=e}async updateContent(e,t){e.likec4ProjectId=this.services.workspace.ProjectsManager.ownerProjectId(e),await super.updateContent(e,t)}projectElements(e,t,r){let o=this.services.workspace.ProjectsManager;return at(this.symbolIndex.keys()).filter(t=>r&&!r.has(t)?!1:o.isIncluded(e,t)).flatMap(e=>this.getFileDescriptions(e,t))}},LangiumDocuments=class extends ut{services;constructor(e){super(e),this.services=e}get projectsManager(){return this.services.workspace.ProjectsManager}addDocument(e){let t=e.uri.toString();if(this.documentMap.has(t))throw Error(`A document with the URI '${t}' is already present.`);isLikeC4UserDocument(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e));let r=[...this.documentMap.values()],o=r.at(-1);if(!o||compareByUri(o,e)<=0){this.documentMap.set(t,e);return}r.push(e),r.sort(compareByUri),this.documentMap.clear();for(let e of r)this.documentMap.set(e.uri.toString(),e)}getDocument(e){let t=super.getDocument(e);return isLikeC4UserDocument(t)&&(t.likec4ProjectId=this.projectsManager.ownerProjectId(t)),t}get userDocuments(){return at(this.documentMap.values()).filter(e=>isLikeC4UserDocument(e)&&!this.projectsManager.isExcluded(e))}get all(){return at(this.documentMap.values()).map(e=>(isLikeC4UserDocument(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e)),e))}projectDocuments(e){let t=this.services.workspace.ProjectsManager;return at(this.documentMap.values()).filter(r=>isLikeC4UserDocument(r)&&t.isIncluded(e,r)?(r.likec4ProjectId=e,!0):!1)}groupedByProject(){let e=this.services.workspace.ProjectsManager;return I(this.userDocuments.toArray(),N(t=>(t.likec4ProjectId=e.ownerProjectId(t),t)),Yt(Pn(`likec4ProjectId`)))}resetProjectIds(){let e=[];for(let t of this.documentMap.values())delete t.likec4ProjectId,isLikeC4UserDocument(t)&&!this.projectsManager.isExcluded(t)&&e.push(t.uri);return e}},hf=e(Yn(),1);const Y=q.getChild(`projects`);function isLangiumDocument(e){return typeof e==`object`&&`uri`in e&&`textDocument`in e}function normalizeUri(e){return isLangiumDocument(e)?e.uri.toString():typeof e==`string`?vt(e,{acceptRelative:!1,strict:!0})?e:x.file(e).toString():e.toString()}const gf=/^\/?([A-Za-z]):(?=\/|$)/;function normalizeWindowsDrivePath(e){return e.replace(gf,(e,t)=>`/${t.toLowerCase()}:`)}function uriPathForMatcher(e){return x.isUri(e)?normalizeWindowsDrivePath(e.path):normalizeWindowsDrivePath(x.parse(e).path)}const _f=ui(`/`,!0),compareUri=(e,t)=>_f(pt(e.path),pt(t.path));function isParentFolderFor(e){return t=>e.startsWith(hi(t)?t:t.folder)}function _overlaps(e,t){let r=hi(e)?e:e.folder,o=hi(t)?t:t.folder;return r===o||r.startsWith(o)||o.startsWith(r)}function sameFolder(e,t){return(hi(e)?e:e.folder)===(hi(t)?t:t.folder)}function hasAmbiguousIncludePathOverlap(e,t){return _overlaps(e,t)&&!sameFolder(e,t)}function overlaps(...e){return On(_overlaps,e)}function _includes(e,t){return t.startsWith(e.folder)||e.includePaths?.some(isParentFolderFor(t))?!_excludes(e,t):!1}function _isInScope(e,t){return t.startsWith(e.folder)||(e.includePaths?.some(isParentFolderFor(t))??!1)}function _excludes(e,t){return e.exclude?.(uriPathForMatcher(t))??!1}function includes(...e){return On(_includes,e)}function isInScope(...e){return On(_isInScope,e)}function excludes(...e){return On(_excludes,e)}function ProjectFolder(e){return e=normalizeUri(e),ht(e)}const compareProjectByFolder=(e,t)=>compareUri(e.folderUri,t.folderUri);function ensureProjectsOrder(e){return e.length<=1?e:Dn(e,compareProjectByFolder)}const vf={id:`default`,config:{name:`default`,exclude:[`**/node_modules/**`]},exclude:(0,hf.default)(`**/node_modules/**`,{dot:!0}),includeConfig:{paths:[],maxDepth:3,fileThreshold:30}};function isExcludedByDefault(e){return vf.exclude(uriPathForMatcher(e))}function parseRegisterOptions(e){if(`configUri`in e){U(!tn(e.configUri),`configUri is emptyish`);let t=x.isUri(e.configUri)?e.configUri:x.parse(normalizeUri(e.configUri)),r=ProjectFolder(C.dirname(t));return{configUri:t,folder:r,folderUri:x.parse(r)}}U(!tn(e.folderUri),`folderUri is emptyish`);let t=ProjectFolder(e.folderUri),r=x.parse(t);return{configUri:C.joinPath(r,`likec4.config.json`),folder:t,folderUri:r}}var yf=class ProjectsManager extends ADisposable{services;static DefaultProjectId=vf.id;#e=[];#t=void 0;#n=void 0;#r=[];#i=new ii(e=>{if(e===ProjectsManager.DefaultProjectId){let t=this.getWorkspaceFolder(),r=C.joinPath(t,`likec4.config.json`),o=ProjectFolder(t);return{id:e,config:vf.config,folder:o,folderUri:x.parse(o),configUri:r,exclude:vf.exclude,includeConfig:{...vf.includeConfig}}}return vi(this.#r.find(t=>t.id===e),`Project ${e} not found`)});#a=new ii(e=>{if(this.isExcludedByWorkspace(e))return!0;let t=this.findOwnerProject(e);return t?excludes(t,e)?!this.#r.some(includes(e)):!1:this.#r.some(isInScope(e))?!this.#r.some(includes(e)):isExcludedByDefault(e)});#o=new ii(e=>this.findOwnerProject(e)??null);constructor(e){super(),this.services=e,this.onDispose(ne.create(()=>{this.#e.length=0})),Y.trace`created`}isExcludedByWorkspace(e){return this.#n?(x.isUri(e)&&(e=normalizeUri(e)),this.#n(uriPathForMatcher(e))):!1}setWorkspaceExcludePatterns(e){try{if(!Array.isArray(e)){this.#n=void 0;return}let t=I(e,M(L),N(e=>(e=normalizeWindowsDrivePath(e),!Bt(e)&&!e.startsWith(`**`)&&(e=_t(`**`,e)),e)));if(!A(t,1)){this.#n=void 0;return}Y.debug`set workspace exclude patterns: ${t}`,this.#n=(0,hf.default)(t,{dot:!0}),this.clearCaches()}catch(e){Y.warn(`Failed to set workspace exclude patterns`,{error:e}),this.#n=void 0}}get defaultProjectId(){if(this.#t)return this.#t;if(!(this.#r.length>1))return A(this.#r,1)?this.#r[0].id:ProjectsManager.DefaultProjectId}set defaultProjectId(e){if(e!==this.#t){if(this.#t=void 0,!e||e===ProjectsManager.DefaultProjectId){Y.debug`reset default project ID`;return}U(this.#r.find(t=>t.id===e),`Project "${e}" not found`),Y.debug`set default project ID to ${e}`,this.#t=e}}get default(){return this.#i.get(this.defaultProjectId??ProjectsManager.DefaultProjectId)}get all(){if(A(this.#r,1)){let e=[...N(this.#r,Pn(`id`)),vf.id];if(this.#t){let t=e.findIndex(e=>e===this.#t);t>0&&(e.splice(t,1),e.unshift(this.#t))}return e}return[vf.id]}getProject(e){let t=typeof e==`string`?e:this.ownerProjectId(e);return this.#i.get(t)}findOverlaped(e){if(this.#r.length===0)return[];let t=overlaps(ProjectFolder(e)),isInsideOrIncludes=e=>t(e)||!!e.includePaths&&!!un(e.includePaths,t);return this.#r.filter(isInsideOrIncludes)}ensureProjectId(e){return e===ProjectsManager.DefaultProjectId?this.defaultProjectId??ProjectsManager.DefaultProjectId:e?(U(this.#r.some(t=>e===t.id),`Project ID ${e} is not registered`),e):vi(this.defaultProjectId,()=>`Specify exact project, known: [${N(this.#r,Pn(`id`)).join(`, `)}]`)}ensureProject(e){return e=this.ensureProjectId(e),this.getProject(e)}hasMultipleProjects(){return this.#r.length>1}isExcluded(...e){let t=e.length===1?e[0]:e[1];return isLangiumDocument(t)&&isLikeC4Builtin(t)?!0:e.length===1?this.#a.get(normalizeUri(t)):excludes(this.#i.get(e[0]),normalizeUri(t))}isIncluded(e,t){let r=normalizeUri(t);return this.isExcludedByWorkspace(r)?!1:A(this.#r,1)?e===ProjectsManager.DefaultProjectId?!this.#o.get(r)&&!this.#a.get(r):includes(this.#i.get(e),r):!isExcludedByDefault(r)}async registerConfigFile(e,t){if(this.isExcludedByWorkspace(e))throw Error(`Skipping project config, path ${e.fsPath} is excluded by editor settings`);if(isExcludedByDefault(normalizeUri(e)))throw Error(`Failed to register project config, path ${e.fsPath} is excluded by default: ${vf.config.exclude.map(e=>`"${e}"`).join(`, `)}`);try{let r=await this.services.workspace.FileSystemProvider.loadProjectConfig(e);return await this.registerProject({config:r,configUri:e},t)}catch(t){if(!ie(t))throw wrapError(t,`Failed to register project config ${e.fsPath}:\n`);return Promise.reject(t)}}async registerProject(e,t){let r=Nt.validate(e.config),{configUri:o,folder:s,folderUri:c}=parseRegisterOptions(e),u=Nt.normalizeInclude(r.include),d=this.#r.find(e=>e.folder===s);return d?(d.config.name!==r.name&&(Y.info`project name changed from ${d.config.name} to ${r.name}`,Y.info`remove ${d.id}`,d.id=this.uniqueProjectId(r.name),Y.info`add ${d.id}`),this.warnIfConfigOverride(d,o),d.config=r,d.folder=s,d.folderUri=c,d.configUri=o,d.includeConfig=u):(d={id:this.uniqueProjectId(r.name),config:r,folder:s,configUri:o,folderUri:c,includeConfig:u},this.#r=ensureProjectsOrder([...this.#r,d]),Y.info`add ${d.id}`),safeCall(()=>this.updateIncludesExcludes(d)),this.isInitiatingOrReloading?d:(this.clearCaches(),this.notifyListeners(),await this.rebuildProject(d.id,t).catch(e=>ie(e)?Promise.reject(e):(Y.warn(`Failed to rebuild project {projectId} after config change`,{projectId:d.id,error:e}),Promise.resolve())),d)}ownerProjectId(e){return this.#o.get(normalizeUri(e))?.id??this.#t??ProjectsManager.DefaultProjectId}findOwnerProject(e){if(this.#r.length===0)return;let t=isParentFolderFor(e);return this.#r.find(t)??this.#r.find(includes(e))??void 0}relativePath(e){let t=normalizeUri(e),r=this.#o.get(t);return r?C.relative(r.folderUri,x.parse(t)):t}get isInitiatingOrReloading(){return!!this.#s||!this.services.workspace.WorkspaceManager.isReady}#s=null;async reloadProjects(e){return this.#s?(Y.debug`reload projects is already in progress, waiting`,await this.#s.catch(()=>{})):(Y.debug`schedule reload projects`,this.#s=Promise.resolve().then(()=>this._reloadProjects(e)).catch(e=>(ie(e)||Y.warn(`Failed to reload projects`,{error:e}),Promise.reject(e))).finally(()=>{this.#s=null}),await this.#s)}async _reloadProjects(e){let t=this.services.workspace.WorkspaceManager.workspaceFolders;if(!t||t.length===0){Y.warn(`Failed to reloadProjects, no workspace folders found`);return}Y.debug`start reload projects`;let r=[];for(let e of t){let t=x.parse(e.uri);Y.debug`scan projects in ${t.fsPath}`;try{let e=await this.services.workspace.FileSystemProvider.scanProjectFiles(t);for(let o of e)Y.debug`found config ${C.relative(t,o.uri)}`,r.push(o.uri)}catch(e){Y.warn(`Failed on scanProjectFiles in {folder}`,{folder:t.fsPath,error:e})}}if(r.length===0){if(this.#r.length===0){Y.warning(`No config files found`);return}Y.warning(`no config files found, but {count} projects were registered before`,{count:this.#r.length}),Y.warning(`reset`)}r.sort(compareUri);let o=new Map(this.#r.map(e=>[e.configUri.toString(),e]));this.#r=[],this.#i.clear();for(let e of r)try{await this.registerConfigFile(e)}catch(t){Y.warn(loggable(t));let r=o.get(e.toString());r&&(Y.debug`Update failed, restore project ${r.id}`,await this.registerProject(r).catch(e=>{Y.warn(`fail to restore project ${r.id}, ignoring`,{error:e})}))}this.clearCaches(),this.notifyListeners(),await this.services.workspace.WorkspaceManager.rebuildAll(e)}uniqueProjectId(e){let t=new Set(N(this.#r,Pn(`id`))),r=e;if(!t.has(r))return r;Y.warn`Project "${e}" already exists, generating unique ID`;let o=1;for(;t.has(r);)r=`${e}-${o++}`;return r}clearCaches(){Y.trace(`clearCaches`),this.#t&&!this.#r.some(e=>e.id===this.#t)&&(this.#t=void 0),this.#i.clear(),this.#o.clear(),this.#a.clear()}async rebuildProject(e,t){let r=this.#r.find(t=>t.id===e);if(!r)return e===ProjectsManager.DefaultProjectId?Y.info`Rebuilding all documents `:Y.warn`Project ${e} not found, rebuilding all`,await this.services.workspace.WorkspaceManager.rebuildAll(t);let o=Y.getChild(r.id),_includes=e=>includes(r,normalizeUri(e)),s=this.services.workspace.LangiumDocuments.userDocuments.filter(_includes).map(e=>e.uri).toArray();if(s.length===0){o.trace`no documents found for project ${r.id}, skipping rebuild`;return}o.info`rebuild project documents: ${s.length}`,this.clearCaches(),await this.services.workspace.DocumentBuilder.update(s,[],t).catch(e=>{o.warn(`Failed to rebuild project`,{error:e})})}getAllIncludePaths(){let e=[];for(let t of this.#r)if(t.includePaths)for(let r of t.includePaths)e.push({projectId:t.id,includePath:r.uri,includeConfig:t.includeConfig});return e}onProjectsUpdate(e){return this.#e.push(e),ne.create(()=>{let t=this.#e.indexOf(e);t>=0&&this.#e.splice(t,1)})}getWorkspaceFolder(){try{return this.services.workspace.WorkspaceManager.workspaceUri}catch(e){return Y.warn(`Failed to get workspace URI, using default folder`,{error:e}),x.file(`/`)}}notifyListeners(){for(let e of[...this.#e])try{e()}catch(e){Y.warn(loggable(e))}}updateIncludesExcludes(e){let t=e.config;delete e.includePaths,delete e.exclude;let r=e.includeConfig.paths;A(r,1)&&(e.includePaths=N(r,t=>{let r=C.resolvePath(e.folderUri,t);return{uri:r,folder:ProjectFolder(r)}}),Y.debug`project ${e.id} include paths: ${e.includePaths.map(e=>e.uri.fsPath).join(`, `)}`);let o=t.exclude;if(F(o))e.exclude=vf.exclude;else if(A(o,1)){let t=[e.folderUri,...N(e.includePaths??[],Pn(`uri`))].flatMap(e=>N(o,t=>(!mt(t)&&!t.startsWith(`**`)&&(t=_t(`**`,t)),yt(dt(uriPathForMatcher(e),t)))));e.exclude=(0,hf.default)(t,{contains:!0,dot:!0})}if(!e.includePaths)return e;for(let t of e.includePaths)for(let r of this.#r)r.id!==e.id&&(overlaps(t,r)&&Y.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" folder. Files in overlapping areas will only belong to one project.`,{projectId:e.id,includePath:t.folder,otherProjectId:r.id}),r.includePaths?.forEach(o=>{hasAmbiguousIncludePathOverlap(t,o)&&Y.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" include path "{otherIncludePath}". Files in overlapping areas will only belong to one project.`,{projectId:e.id,includePath:t.folder,otherProjectId:r.id,otherIncludePath:o.folder})}));return e}warnIfConfigOverride(e,t){try{let[r,o]=N([e.configUri,t],C.basename);r!==o&&Y.warn`config ${o} overrides ${r} in folder ${e.folder}`}catch{}}},bf=class TimeoutError extends Error{name=`TimeoutError`;constructor(e,t){super(e,t),Error.captureStackTrace?.(this,TimeoutError)}};const getAbortedReason=e=>e.reason??new DOMException(`This operation was aborted.`,`AbortError`);function pTimeout(e,t){let{milliseconds:r,fallback:o,message:s,customTimers:c={setTimeout,clearTimeout},signal:u}=t,d,abortHandler,p=new Promise((t,p)=>{if(typeof r!=`number`||Math.sign(r)!==1)throw TypeError(`Expected \`milliseconds\` to be a positive number, got \`${r}\``);if(u?.aborted){p(getAbortedReason(u));return}if(u&&(abortHandler=()=>{p(getAbortedReason(u))},u.addEventListener(`abort`,abortHandler,{once:!0})),e.then(t,p),r===1/0)return;let m=new bf;d=c.setTimeout.call(void 0,()=>{if(o){try{t(o())}catch(e){p(e)}return}typeof e.cancel==`function`&&e.cancel(),s===!1?t():s instanceof Error?p(s):(m.message=s??`Promise timed out after ${r} milliseconds`,p(m))},r)}).finally(()=>{p.clear(),abortHandler&&u&&u.removeEventListener(`abort`,abortHandler)});return p.clear=()=>{c.clearTimeout.call(void 0,d),d=void 0},p}var LikeC4WorkspaceManager=class extends ot{services;fileSystemProvider;#e=q.getChild(`workspace`);#t=!1;#n=[];initialBuildOptions={eagerLinking:!0,validation:!0};constructor(e){super(e),this.services=e,this.fileSystemProvider=e.workspace.FileSystemProvider}get documentFactory(){return this.services.workspace.LangiumDocumentFactory}get isReady(){return this.#t}async performStartup(e){this.#t&&this.#e.warn`workspace already initialized, invalid performStartup call`;try{this.#t=!1,await this.readExcludeConfig(),this.folders??=e;let t=e.map(e=>x.parse(e.uri)),r=[],o=[];for(let e of t){this.#e.debug`scanning folder ${e.fsPath} for likec4`;try{let t=await this.fileSystemProvider.scanProjectFiles(e);r.push(...t)}catch(t){this.#e.warn(`Failed to scan workspace folder {folder} for project config files`,{folder:e.fsPath,error:t})}try{o.push(...await this.fileSystemProvider.readDirectory(e,{recursive:!0}))}catch(t){this.#e.warn(`Failed to read workspace folder {folder} for likec4 files`,{folder:e.fsPath,error:t})}this.services.workspace.FileSystemWatcher.watch(e.fsPath)}let s=this.services.workspace.ProjectsManager,c=0;for(let e of r)try{await s.registerConfigFile(e.uri),c++}catch(t){this.#e.warn(`Failed to register config file {config}`,{config:e.uri.fsPath,error:t})}r.length===c?c>0&&this.#e.info`loaded ${c} projects`:this.#e.warn`loaded ${c} projects out of ${r.length}`,c>0&&o.push(...await this.scanProjectIncludePaths());let u=await this.loadDocuments(o);A(u,1)?this.#e.debug`found ${u.length} likec4 documents`:this.#e.warn(`No likec4 documents found in workspace`),u.push(this.documentFactory.fromString(Ic,x.parse(Rc)));for(let e of u)this.saveAddDocument(e);return u}finally{this.#t=!0,this._ready.resolve()}}async scanProjectIncludePaths(){let e=this.services.workspace.ProjectsManager.getAllIncludePaths();if(!A(e,1))return[];let t=Ht(e=>this.services.workspace.ProjectsManager.isExcludedByWorkspace(e.uri)),r=[];for(let{projectId:o,includePath:s,includeConfig:c}of e)try{this.#e.debug`scanning include path ${s.fsPath} for project ${o}`;let e=I(await this.fileSystemProvider.readDirectory(s,{recursive:!0,maxDepth:c.maxDepth}),M(t));r.push(...e),e.length===0?this.#e.trace`no files found in include path ${s.fsPath}`:(this.#e.debug`loaded ${e.length} files from include path ${s.fsPath}`,e.length>c.fileThreshold&&this.#e.warn(`Loaded ${e.length} files from include path ${s.fsPath} (project: ${o}) (threshold: ${c.fileThreshold}).\nLarge include directories may slow workspace initialization. Consider adjusting "include.fileThreshold" or "include.maxDepth" in your project configuration.`))}catch(e){this.#e.warn(`Failed to scan include path ${s.fsPath}`,{error:e})}return r}async loadDocuments(e){let t=I(e,Tn(e=>e.uri.path),Dn(compareByUri)),r=[];for(let e of t)try{r.push(await this.documentFactory.fromUri(e.uri))}catch(t){this.#e.warn(`Failed to load document ${e.uri}`,{error:t})}return r}saveAddDocument(e){this.langiumDocuments.hasDocument(e.uri)||this.langiumDocuments.addDocument(e)}workspace(){return this.folders&&A(this.folders,1)?this.folders[0]:null}async rebuildAll(e){let t=this.services.workspace.LangiumDocuments.resetProjectIds();this.#e.info(`invalidate and rebuild all {docs} documents`,{docs:t.length}),this.forceCleanCaches(),await this.documentBuilder.update(t,[],e)}get workspaceUri(){let e=this.workspace();return V(e,`Workspace not initialized`),x.parse(e.uri)}get workspaceURL(){let e=this.workspace();return V(e,`Workspace not initialized`),new URL(e.uri)}forceCleanCaches(){for(let e of[...this.#n])e();this.services.workspace.ProjectsManager.clearCaches(),this.services.workspace.ManualLayouts.clearCaches(),this.services.workspace.Cache.clear()}onForceCleanCache(e){return this.#n.push(e),ne.create(()=>{let t=this.#n.indexOf(e);t!==-1&&this.#n.splice(t,1)})}async readExcludeConfig(){if(!this.services.lsp.Connection){this.#e.debug`no LSP connection, skipping initial configuration read`;return}let e=this.services.workspace.ConfigurationProvider,wait=e=>pTimeout(e,{milliseconds:1e3,message:!1});try{this.#e.trace`waiting for ConfigurationProvider ready...`,await wait(e.ready),this.#e.trace`ConfigurationProvider ready, reading exclude patterns...`;let t=await wait(e.getConfiguration(`likec4`,`exclude`));t?(this.#e.trace`exclude configuration found ${t}`,this.services.workspace.ProjectsManager.setWorkspaceExcludePatterns(t)):this.#e.trace(`no initial exclude configuration found`)}catch(e){this.#e.warn(`Failed to read initial exclude configuration`,{error:e})}}};function projectIdFrom(e){if(isImported(e)){for(;e.$type===`Imported`&&e.$container;)e=e.$container;V(isImportsFromPoject(e))}if(isImportsFromPoject(e))return e.project;let t=we(e)?rt(e):e;return t.likec4ProjectId?t.likec4ProjectId:(q.warn`Document ${t.uri.fsPath} does not have a project ID assigned, this may lead to unexpected behavior.`,yf.DefaultProjectId)}function stringHash$1(...e){var t=e.length>1?e.join(`:::`):e[0];return Ti(t)}t(stringHash$1,`stringHash`);function safeCall(e){try{return e()}catch(e){q.trace(`Safe call failed`,{error:e});return}}function performanceNow(){try{return globalThis.performance.now()}catch{return Date.now()}}function performanceMark(){let e=performanceNow();return{get ms(){return performanceNow()-e},get pretty(){return Jn(performanceNow()-e)}}}const xf=q.getChild(`manual-layouts`),Sf=`.likec4.snap`,isManualLayoutFile=e=>e!==Sf&&e.endsWith(Sf);function fileName(e){return`${e}${Sf}`}function viewIdFromURI(e){let t=C.basename(e);return isManualLayoutFile(t)?t.slice(0,-12):null}function getManualLayoutsOutDir(e){return C.resolvePath(e.folderUri,e.config.manualLayouts?.outDir??`.likec4`)}const Cf={manualLayouts:e=>new DefaultLikeC4ManualLayouts(e)},wf=`file://./`;var DefaultLikeC4ManualLayouts=class extends ADisposable{services;cache;listeners=[];#e=pLimit(1);constructor(e){super(),this.services=e,this.cache=new y,this.onDispose(ne.create(()=>{this.listeners.length=0,this.cache.clear()})),bi(()=>{this.onDispose(e.workspace.ProjectsManager.onProjectsUpdate(()=>{this.clearCaches()}))})}async handleFileSystemUpdate(e){let t=e.update??e.delete,r=viewIdFromURI(t)??void 0,o=this.services.workspace.ProjectsManager.ownerProjectId(t);if(this.cache.delete(o),`delete`in e){this.triggerUpdate(Vr({removed:t,projectId:o,viewId:r}));return}let s=this.services.workspace.ProjectsManager.getProject(o);if(!r){let e=await this.readSnapshot(t,s);e?r=e.id:(xf.error(`Snapshot ${t.fsPath} does not exist or is invalid`),r=`index`)}this.triggerUpdate({updated:t,projectId:o,viewId:r})}onManualLayoutUpdate(e){return this.listeners.push(e),{dispose:()=>{let t=this.listeners.indexOf(e);t!==-1&&this.listeners.splice(t,1)}}}async readManualLayouts(e){let t=xf.getChild(e.id),r=this.services.workspace.FileSystemProvider,o=getManualLayoutsOutDir(e),s=[],c=`${o.toString()}`;try{let u=await r.scanDirectory(o,isManualLayoutFile);if(u.length===0)return null;u.sort((e,t)=>e.uri.path.localeCompare(t.uri.path));for(let o of u)try{let t=await r.readFile(o.uri),u=xt.parse(t);c=Ti(c+o.uri.toString()+t);let d=this.resolveIconPathsAfterRead(u,e.folderUri);s.push({...d,_layout:`manual`})}catch(e){t.warn(`Failed to read view snapshot ${o.uri.fsPath}`,{err:e})}s.length&&t.trace`read manual layouts for ${e.id}, found ${s.length}`}catch(r){t.warn(`Failed to read manual layouts for ${e.folderUri.fsPath}`,{err:r})}if(s.length===0)return null;let u=an(s,Pn(`id`));return{hash:c,views:u}}async readSnapshot(e,t){let r=this.services.workspace.FileSystemProvider;try{let o=await r.readFile(e),s=xt.parse(o);if(!t){let r=this.services.workspace.ProjectsManager.ownerProjectId(e);t=this.services.workspace.ProjectsManager.getProject(r)}return{...this.resolveIconPathsAfterRead(s,t.folderUri),_layout:`manual`}}catch(t){return xf.warn(`Failed to read view snapshot ${e.fsPath}`,{err:t}),null}}async read(e){return await this.#e(async()=>{let t=this.cache.get(e.id);if(t!==void 0)return xf.trace`cache hit project ${e.id}`,t;let r=await this.readManualLayouts(e);return this.cache.set(e.id,r),r})}async write(e,t){this.cache.delete(e.id);let r=xf.getChild(e.id),o=getManualLayoutsOutDir(e),s=C.joinPath(o,fileName(t.id));if(`manualLayout`in t){let{manualLayout:e,...r}=t;t=r}let c=xt.stringify(this.normalizeIconPathsForWrite(t,e.folderUri),{space:2,quote:`'`}),u={uri:s.toString(),range:fe.create(be.create(0,0),be.create(c.split(`
53
+ }`,loader:`js`}))}}]}});return Nt(Object.assign(o,s?.default??s))}const Fc={aws:`activate.alexa-for-business.amplify.apache-mxnet-on-aws.api-gateway.app-config.app-flow.app-mesh.app-runner.app-stream.app-sync.application-auto-scaling.application-composer.application-cost-profiler.application-discovery-service.application-migration-service.artifact.athena.audit-manager.augmented-ai-a2i.aurora.auto-scaling.backint-agent.backup.batch.billing-conductor.bottlerocket.braket.budgets.certificate-manager.chatbot.chime-sdk.chime-voice-connector.chime.clean-rooms.client-vpn.cloud-control-api.cloud-development-kit.cloud-directory.cloud-formation.cloud-front.cloud-hsm.cloud-map.cloud-search.cloud-shell.cloud-trail.cloud-wan.cloud-watch.cloud9.code-artifact.code-build.code-catalyst.code-commit.code-deploy.code-guru.code-pipeline.code-star.code-whisperer.cognito.command-line-interface.comprehend-medical.comprehend.compute-optimizer.config.connect.console-mobile-application.control-tower.corretto.cost-and-usage-report.cost-explorer.data-exchange.data-pipeline.data-sync.data-zone.database-migration-service.deep-composer.deep-learning-amis.deep-learning-containers.deep-lens.deep-racer.detective.dev-ops-guru.device-farm.direct-connect.directory-service.distro-for-open-telemetry.document-db.dynamo-db.ec2-auto-scaling.ec2-image-builder.ec2.ecs-anywhere.efs.eks-anywhere.eks-cloud.eks-distro.elasti-cache.elastic-beanstalk.elastic-block-store.elastic-container-registry.elastic-container-service.elastic-disaster-recovery.elastic-fabric-adapter.elastic-inference.elastic-kubernetes-service.elastic-load-balancing.elastic-transcoder.elemental-appliances-software.elemental-conductor.elemental-delta.elemental-link.elemental-live.elemental-media-connect.elemental-media-convert.elemental-media-live.elemental-media-package.elemental-media-store.elemental-media-tailor.elemental-server.emr.event-bridge.express-workflows.fargate.fault-injection-simulator.file-cache.fin-space.firewall-manager.forecast.fraud-detector.free-rtos.fsx-for-lustre.fsx-for-net-app-ontap.fsx-for-open-zfs.fsx-for-wfs.fsx.game-kit.game-lift.game-sparks.genomics-cli.global-accelerator.glue-data-brew.glue-elastic-views.glue.ground-station.guard-duty.health-lake.honeycode.iam-identity-center.identity-and-access-management.inspector.interactive-video-service.io-t-1-click.io-t-analytics.io-t-button.io-t-core.io-t-device-defender.io-t-device-management.io-t-edu-kit.io-t-events.io-t-express-link.io-t-fleet-wise.io-t-greengrass.io-t-robo-runner.io-t-site-wise.io-t-things-graph.io-t-twin-maker.iq.kendra.key-management-service.keyspaces.kinesis-data-analytics.kinesis-data-streams.kinesis-firehose.kinesis-video-streams.kinesis.lake-formation.lambda.launch-wizard.lex.license-manager.lightsail.local-zones.location-service.lookout-for-equipment.lookout-for-metrics.lookout-for-vision.lumberyard.macie.mainframe-modernization.managed-blockchain.managed-grafana.managed-service-for-prometheus.managed-services.managed-streaming-for-apache-kafka.managed-workflows-for-apache-airflow.management-console.marketplace-dark.marketplace-light.memory-db-for-redis.migration-evaluator.migration-hub.monitron.mq.neptune.network-firewall.neuron.nice-dcv.nice-engin-frame.nimble-studio.nitro-enclaves.omics.open-3d-engine.open-search-service.ops-works.organizations.outposts-family.outposts-rack.outposts-servers.panorama.parallel-cluster.personal-health-dashboard.personalize.pinpoint-apis.pinpoint.polly.private-5g.private-certificate-authority.private-link.professional-services.proton.quantum-ledger-database.quick-sight.rds-on-vmware.rds.re-post.red-hat-open-shift-service-on-aws.redshift.rekognition.reserved-instance-reporting.resilience-hub.resource-access-manager.resource-explorer.robo-maker.route-53.s3-on-outposts.sage-maker-ground-truth.sage-maker-studio-lab.sage-maker.savings-plans.secrets-manager.security-hub.security-lake.server-migration-service.serverless-application-repository.service-catalog.service-management-connector.shield.signer.sim-space-weaver.simple-email-service.simple-notification-service.simple-queue-service.simple-storage-service-glacier.simple-storage-service.site-to-site-vpn.snowball-edge.snowball.snowcone.snowmobile.step-functions.storage-gateway.sumerian.supply-chain.support.systems-manager.tensor-flow-on-aws.textract.thinkbox-deadline.thinkbox-frost.thinkbox-krakatoa.thinkbox-sequoia.thinkbox-stoke.thinkbox-xmesh.timestream.tools-and-sdks.torch-serve.training-certification.transcribe.transfer-family.transit-gateway.translate.trusted-advisor.verified-access.verified-permissions.virtual-private-cloud.vmware-cloud-on-aws.vpc-lattice.waf.wavelength.well-architected-tool.wickr.work-docs-sdk.work-docs.work-link.work-mail.work-spaces-family.x-ray`.split(`.`),azure:`abs-member.active-directory-connect-health.activity-log.administrative-units.advisor.ai-at-edge.ai-studio.aks-automatic.aks-istio.alerts.all-resources.analysis-services.anomaly-detector.api-center.api-connections.api-management-services.api-proxy.app-compliance-automation.app-configuration.app-registrations.app-service-certificates.app-service-domains.app-service-environments.app-service-plans.app-services.app-space-component.app-space.applens.application-gateway-containers.application-gateways.application-group.application-insights.application-security-groups.aquila.arc-data-services.arc-kubernetes.arc-machines.arc-postgre-sql.arc-sql-managed-instance.arc-sql-server.atm-multistack.auto-scale.automanaged-vm.automation-accounts.availability-sets.avs-vm.azure-a.azure-ad-b2c.azure-api-for-fhir.azure-applied-ai-services.azure-arc.azure-attestation.azure-backup-center.azure-blockchain-service.azure-center-for-sap.azure-chaos-studio.azure-cloud-shell.azure-communication-services.azure-communications-gateway.azure-compute-galleries.azure-consumption-commitment.azure-cosmos-db.azure-data-catalog.azure-data-explorer-clusters.azure-database-maria-db-server.azure-database-migration-services.azure-database-my-sql-server.azure-database-postgre-sql-server-group.azure-database-postgre-sql-server.azure-databox-gateway.azure-databricks.azure-deployment-environments.azure-dev-ops.azure-dev-tunnels.azure-edge-hardware-center.azure-experimentation-studio.azure-fileshares.azure-firewall-manager.azure-firewall-policy.azure-hcp-cache.azure-hpc-workbenches.azure-hybrid-center.azure-information-protection.azure-io-t-operations.azure-lighthouse.azure-load-testing.azure-managed-grafana.azure-managed-redis.azure-maps-accounts.azure-media-service.azure-migrate.azure-monitor-dashboard.azure-monitor-pipeline.azure-monitors-for-sap-solutions.azure-net-app-files.azure-network-function-manager-functions.azure-network-function-manager.azure-object-understanding.azure-open-ai.azure-operator-5g-core.azure-operator-insights.azure-operator-nexus.azure-operator-service-manager.azure-orbital.azure-programmable-connectivity.azure-purview-accounts.azure-quotas.azure-red-hat-open-shift.azure-sentinel.azure-service-bus.azure-sphere.azure-spring-apps.azure-sql-edge.azure-sql-server-stretch-databases.azure-sql-vm.azure-sql.azure-stack-edge.azure-stack-hci-sizer.azure-stack.azure-storage-mover.azure-support-center-blue.azure-sustainability.azure-synapse-analytics.azure-token-service.azure-video-indexer.azure-virtual-desktop.azure-vmware-solution.azure-workbooks.azurite.backlog.backup-vault.bare-metal-infrastructure.bastions.batch-accounts.batch-ai.biz-talk.blob-block.blob-page.blockchain-applications.blueprints.bonsai.bot-services.branch.breeze.browser.bug.builds.business-process-tracking.cache-redis.cache.capacity-reservation-groups.capacity.cdn-profiles.central-service-instance-for-sap.ceres.change-analysis.client-apps.cloud-services-classic.cloud-services-extended-support.cloud-test.code-optimization.code.cognitive-search.cognitive-services-decisions.cognitive-services.collaborative-service.commit.community-images.compliance-center.compliance.compute-fleet.computer-vision.conditional-access.confidential-ledgers.connected-cache.connected-vehicle-platform.connections.consortium.container-apps-environments.container-instances.container-registries.container-services-deprecated.content-moderators.content-safety.controls-horizontal.controls.cost-alerts.cost-analysis.cost-budgets.cost-export.cost-management-and-billing.cost-management.counter.cubes.custom-ip-prefix.custom-vision.customer-lockbox-for-microsoft-azure.dashboard-hub.dashboard.data-box.data-collection-rules.data-factories.data-lake-analytics.data-lake-storage-gen1.data-lake-store-gen1.data-share-invitations.data-shares.data-virtualization.database-instance-for-sap.ddo-s-protection-plans.dedicated-hsm.defender-cm-local-manager.defender-dcs-controller.defender-distributer-control-system.defender-engineering-station.defender-external-management.defender-freezer-monitor.defender-historian.defender-hmi.defender-industrial-packaging-system.defender-industrial-printer.defender-industrial-robot.defender-industrial-scale-system.defender-marquee.defender-meter.defender-plc.defender-pneumatic-device.defender-programable-board.defender-relay.defender-robot-controller.defender-rtu.defender-sensor.defender-slot.defender-web-guiding-system.detonation.dev-console.dev-ops-starter.dev-test-labs.device-compliance.device-configuration.device-enrollment.device-provisioning-services.device-security-apple.device-security-google.device-security-windows.device-update-io-t-hub.devices.diagnostics-settings.digital-twins.disk-encryption-sets.disk-pool.disks-classic.disks-snapshots.disks.dns-multistack.dns-private-resolver.dns-security-policy.dns-zones.download.e-books.edge-actions.edge-management.edge-storage-accelerator.education.elastic-job-agents.elastic-san.endpoint-analytics.engage-center-connect.enterprise-applications.entra-connect-health.entra-connect-sync.entra-connect.entra-domain-services.entra-global-secure-access.entra-id-protection.entra-identity-custom-roles.entra-identity-licenses.entra-identity-risky-signins.entra-identity-risky-users.entra-identity-roles-and-administrators.entra-internet-access.entra-managed-identities.entra-private-access.entra-privleged-identity-management.entra-verified-id.error.event-grid-domains.event-grid-subscriptions.event-grid-topics.event-hub-clusters.event-hubs.exchange-access.exchange-on-premises-access.express-route-circuits.express-route-direct.express-route-traffic-collector.extended-security-updates.extensions.external-id-modified.external-id.external-identities.face-apis.feature-previews.fhir-service.fiji.file.files.firewalls.folder-blank.folder-website.form-recognizers.frd-qa.free-services.front-door-and-cdn-profiles.ftp.function-apps.gear.genomics-accounts.genomics.globe-error.globe-success.globe-warning.groups.guide.hd-insight-clusters.hdi-aks-cluster.heart.help-and-support.host-groups.host-pools.hosts.hybrid-connectivity-hub.ic-m-troubleshooting.identity-governance.identity-multi-factor-authentication.identity-secure-score.image-definitions.image-templates.image-versions.image.images.immersive-readers.import-export-jobs.industrial-io-t.information.infrastructure-backup.input-output.instance-pools.integration-accounts.integration-environments.integration-service-environments.internet-analyzer-profiles.intune-app-protection.intune-for-education.intune-trends.intune.io-t-central-applications.io-t-edge.io-t-hub.ip-address-manager.ip-groups.journey-hub.key-vaults.keys.kubernetes-fleet-manager.kubernetes-services.lab-accounts.lab-services.landing-zone.language-understanding.language.launch-portal.learn.load-balancer-hub.load-balancers.load-test.load-testing.local-network-gateways.location.log-analytics-query-pack.log-analytics-workspaces.log-streaming.logic-apps-custom-connector.logic-apps-template.logic-apps.machine-learning-studio-classic-web-services.machine-learning-studio-web-service-plans.machine-learning-studio-workspaces.machine-learning.machines-azure-arc.maintenance-configuration.managed-applications-center.managed-database.managed-desktop.managed-dev-ops-pools.managed-file-shares.managed-identities.managed-instance-apache-cassandra.managed-service-fabric.management-groups.management-portal.marketplace-management.marketplace.med-tech-service.media-file.media.mesh-applications.metrics-advisor.metrics.microsoft-defender-easm.microsoft-defender-for-cloud.microsoft-defender-for-io-t.microsoft-dev-box.mindaro.mission-landing-zone.mobile-engagement.mobile-networks.mobile.modular-data-center.module.monitor-health-models.monitor.multi-tenancy.multifactor-authentication.my-customers.nat.network-foundation-hub.network-interfaces.network-managers.network-security-groups.network-security-hub.network-security-perimeters.network-watcher.notification-hub-namespaces.notification-hubs.offers.on-premises-data-gateways.open-supply-chain-platform.operation-log-classic.oracle-database.os-images-classic.osconfig.outbound-connection.partner-namespace.partner-registration.partner-topic.peering-service.peerings.personalizers.planetary-computer-pro.plans.policy.power-bi-embedded.power-platform.power-up.power.powershell.preview-features.private-endpoints.private-link-service.private-link-services.private-link.process-explorer.production-ready-database.promethus.proximity-placement-groups.public-ip-addresses-classic.public-ip-addresses.public-ip-prefixes.qn-a-makers.quickstart-center.recent.recovery-services-vaults.region-management.relays.remote-rendering.reservations.reserved-capacity.reserved-ip-addresses-classic.resource-explorer.resource-graph-explorer.resource-group-list.resource-groups.resource-guard.resource-linked.resource-management-private-link.resource-mover.resources-provider.restore-points-collections.restore-points.route-filters.route-tables.rtos.savings-plans.scheduler-job-collections.scheduler.scvmm-management-servers.search-grid.search.security-baselines.security.send-grid-accounts.server-farm.serverless-search.service-catalog-mad.service-endpoint-policies.service-fabric-clusters.service-group-relationships.service-groups.service-health.service-providers.shared-image-galleries.signal-r.software-as-a-service.software-updates.solutions.sonic-dash.spatial-anchor-accounts.speech-services.spot-vm.spot-vmss.sql-data-warehouses.sql-database-fleet-manager.sql-database.sql-elastic-pools.sql-managed-instance.sql-server-registries.sql-server.ssd.ssh-keys.ssis-lift-and-shift-ir.stack-hci-premium.static-apps.stor-simple-data-managers.stor-simple-device-managers.storage-accounts-classic.storage-accounts.storage-actions.storage-azure-files.storage-container.storage-explorer.storage-functions.storage-hubs.storage-queue.storage-sync-services.stream-analytics-jobs.subnet.subscriptions.system-topic.table.tag.tags.targets-management.template-specs.templates.tenant-properties.tenant-status.test-base.tfs-vc-repository.time-series-data-sets.time-series-insights-access-policies.time-series-insights-environments.time-series-insights-event-sources.toolbox.toolchain-orchestrator.traffic-manager-profiles.translator-text.troubleshoot.universal-print.update-management-center.updates.user-privacy.user-settings.user-subscriptions.users.verifiable-credentials.verification-as-a-service.versions.video-analyzers.virtual-clusters.virtual-enclaves.virtual-instance-for-sap.virtual-machine.virtual-machines-classic.virtual-network-gateways.virtual-networks-classic.virtual-networks.virtual-router.virtual-visits-builder.virtual-wan-hub.virtual-wans.vm-app-definitions.vm-app-versions.vm-image-version.vm-images-classic.vm-scale-sets.vpnclient-windows.wac-installer.wac.web-app-database.web-application-firewall-policies-waf.web-jobs.web-slots.web-test.website-power.website-staging.windows-notification-services.windows10-core-services.workbooks.worker-container-app.workflow.workload-orchestration.workspace-gateway.workspaces`.split(`.`),gcp:`access-context-manager.administration.advanced-agent-modeling.advanced-solutions-lab.agent-assist.ai-hub.ai-platform-unified.ai-platform.analytics-hub.anthos-config-management.anthos-service-mesh.anthos.api-analytics.api-monetization.api.apigee-api-platform.apigee-sense.app-engine.artifact-registry.asset-inventory.assured-workloads.auto-ml-natural-language.auto-ml-tables.auto-ml-translation.auto-ml-video-intelligence.auto-ml-vision.auto-ml.bare-metal-solutions.batch.beyondcorp.big-query.bigtable.billing.binary-authorization.catalog.certificate-authority-service.certificate-manager.cloud-api-gateway.cloud-apis.cloud-armor.cloud-asset-inventory.cloud-audit-logs.cloud-build.cloud-cdn.cloud-code.cloud-composer.cloud-data-fusion.cloud-deploy.cloud-deployment-manager.cloud-dns.cloud-domains.cloud-ekm.cloud-endpoints.cloud-external-ip-addresses.cloud-firewall-rules.cloud-for-marketing.cloud-functions.cloud-generic.cloud-gpu.cloud-healthcare-api.cloud-healthcare-marketplace.cloud-hsm.cloud-ids.cloud-inference-api.cloud-interconnect.cloud-jobs-api.cloud-load-balancing.cloud-logging.cloud-media-edge.cloud-monitoring.cloud-nat.cloud-natural-language-api.cloud-network.cloud-ops.cloud-optimization-ai-fleet-routing-api.cloud-optimization-ai.cloud-router.cloud-routes.cloud-run-for-anthos.cloud-run.cloud-scheduler.cloud-security-scanner.cloud-shell.cloud-spanner.cloud-sql.cloud-storage.cloud-tasks.cloud-test-lab.cloud-tpu.cloud-translation-api.cloud-vision-api.cloud-vpn.compute-engine.configuration-management.connectivity-test.connectors.contact-center-ai.container-optimized-os.container-registry.data-catalog.data-labeling.data-layers.data-loss-prevention-api.data-qn-a.data-studio.data-transfer.database-migration-service.dataflow.datalab.dataplex.datapol.dataprep.dataproc-metastore.dataproc.datashare.datastore.datastream.debugger.developer-portal.dialogflow-cx.dialogflow-insights.dialogflow.document-ai.early-access-center.error-reporting.eventarc.filestore.financial-services-marketplace.firestore.fleet-engine.free-trial.game-servers.gce-systems-management.genomics.gke-on-prem.google-cloud-marketplace.google-kubernetes-engine.google-maps-platform.healthcare-nlp-api.home.identity-and-access-management.identity-aware-proxy.identity-platform.iot-core.iot-edge.key-access-justifications.key-management-service.kuberun.launcher.local-ssd.looker.managed-service-for-microsoft-active-directory.media-translation-api.memorystore.migrate-for-anthos.migrate-for-compute-engine.my-cloud.network-connectivity-center.network-intelligence-center.network-security.network-tiers.network-topology.onboarding.os-configuration-management.os-inventory-management.os-patch-management.partner-interconnect.partner-portal.performance-dashboard.permissions.persistent-disk.phishing-protection.policy-analyzer.premium-network-tier.private-connectivity.private-service-connect.producer-portal.profiler.project.pub-sub.quantum-engine.quotas.real-world-insights.recommendations-ai.release-notes.retail-api.risk-manager.runtime-config.secret-manager.security-command-center.security-health-advisor.security-key-enforcement.security.service-discovery.speech-to-text.stackdriver.standard-network-tier.stream-suite.support.tensorflow-enterprise.text-to-speech.tools-for-powershell.trace.traffic-director.transfer-appliance.transfer.user-preferences.vertex-ai.video-intelligence-api.virtual-private-cloud.visual-inspection.vmware-engine.web-risk.web-security-scanner.workflows.workload-identity-pool`.split(`.`),tech:`100tb.500px.aarch64.active-campaign-icon.active-campaign.adobe-after-effects.adobe-animate.adobe-dreamweaver.adobe-icon.adobe-illustrator.adobe-incopy.adobe-indesign.adobe-lightroom.adobe-photoshop.adobe-premiere-pro.adobe-premiere.adobe-xd.adobe.adonis-js.adonisjs-icon.adroll.adyen.aerogear.aerospike-icon.aerospike.after-effects.aha.airbnb-icon.airbnb.airbrake.airflow-icon.airflow.airtable.aix.akamai.akka.alfresco.algolia.alpinejs-icon.alpinejs.altair.amazon-chime.amazon-connect.amazon-web-services.amd.amex-digital.amex.amp-icon.amp.ampersand.amplication-icon.amplication.amplitude-icon.amplitude.anaconda.analog.android-icon.android-studio.android-vertical.android.angellist.angular-icon.angular-js.angular.ansible.ant-design.anthropic-icon.anthropic.apache-camel.apache-cloudstack.apache-flink-icon.apache-flink.apache-spark.apache-superset-icon.apache-superset.apache.apiary.apidog-icon.apidog.apl.apollostack.apostrophe.appbaseio-icon.appbaseio.appcelerator.appcenter-icon.appcenter.appcircle-icon.appcircle.appcode.appdynamics-icon.appdynamics.appium.apple-app-store.apple-pay.apple-safari.apple.applitools-icon.applitools.appsignal-icon.appsignal.apptentive.appveyor.appwrite-icon.appwrite.arangodb-icon.arangodb.arc.architect-icon.architect.archlinux.arduino.argo-icon.argo.argocd.arm.armory-icon.armory.asana-icon.asana.asciidoctor.assembla-icon.assembla.astro-icon.astro.astronomer.async-api-icon.async-api.atlassian.atom-icon.atom.atomic-icon.atomic.atomicojs-icon.atomicojs.aurelia.aurora.auth0-icon.auth0.authy.autodesk-maya.autodesk-shot-grid.autoit.autoprefixer.ava.awesome.awk.aws-amplify.aws-api-gateway.aws-app-mesh.aws-appflow.aws-appsync.aws-athena.aws-aurora.aws-backup.aws-batch.aws-certificate-manager.aws-cloudformation.aws-cloudfront.aws-cloudsearch.aws-cloudtrail.aws-cloudwatch.aws-codebuild.aws-codecommit.aws-codedeploy.aws-codepipeline.aws-codestar.aws-cognito.aws-config.aws-documentdb.aws-dynamodb.aws-ec2.aws-ecs.aws-eks.aws-elastic-beanstalk.aws-elasticache.aws-elb.aws-eventbridge.aws-fargate.aws-glacier.aws-glue.aws-iam.aws-keyspaces.aws-kinesis.aws-kms.aws-lake-formation.aws-lambda.aws-lightsail.aws-mq.aws-msk.aws-neptune.aws-open-search.aws-opsworks.aws-quicksight.aws-rds.aws-redshift.aws-route53.aws-s3.aws-secrets-manager.aws-ses.aws-shield.aws-sns.aws-sqs.aws-step-functions.aws-systems-manager.aws-timestream.aws-vpc.aws-waf.aws-xray.aws.axios.azios.azure-devops.azure-sql-database.azure.babel.backbone-icon.backbone-js.backbone.backerkit.baker-street.balena.ballerina.bamboo.basecamp-icon.basecamp.basekit.baseline.bash-icon.bash.batch.beats.behance.bem-2.bem.bigpanda.bing.biomejs-icon.biomejs.bitbar.bitbucket.bitcoin.bitnami.bitrise-icon.bitrise.blender.blitzjs-icon.blitzjs.blocs.blogger.blossom.blueprint.bluesky.bluetooth.booqable-icon.booqable.bootstrap.bosun.botanalytics.bourbon.bower.box.brackets.brainjs.branch-icon.branch.brandfolder-icon.brandfolder.brave.braze-icon.braze.broadcom-icon.broadcom.broccoli.brotli.browserify-icon.browserify.browserling.browserslist.browserstack.browsersync.brunch.bubble-icon.bubble.buck.buddy.buffer.bugherd-icon.bugherd.bugsee.bugsnag.builder-io-icon.builder-io.buildkite-icon.buildkite.bulma.bun.bunny-net-icon.bunny-net.c.cachet.cairo-graphics.cake-php.cakephp-icon.calibre-icon.calibre.campaignmonitor-icon.campaignmonitor.canjs.canva.capacitor.capacitorjs-icon.capacitorjs.capistrano.carbide.cardano-icon.cardano.cassandra.cent-os.centos-icon.certbot.ceylon.chai.chalk.chargebee-icon.chargebee.chartjs.chef.chevereto.chroma.chromatic-icon.chromatic.chrome-web-store.chrome.cinder.circle-ci.cirrus-ci.cirrus.clarity.claude-icon.claude.clio-lang.clion.cljs.clojure-script.clojure.close.cloud9.cloudacademy-icon.cloudacademy.cloudcraft.cloudflare-icon.cloudflare-workers-icon.cloudflare-workers.cloudflare.cloudinary-icon.cloudinary.cloudlinux.cmake.cobalt.cockpit.cocoapods.coda-icon.coda.codacy.code-igniter.code-pen.codeac.codebase.codebeat.codecademy.codeception.codeclimate-icon.codeclimate.codecov-icon.codecov.codefactor-icon.codefactor.codeigniter-icon.codepen-icon.codersrank-icon.codersrank.coderwall.codesandbox-icon.codesandbox.codesee-icon.codesee.codio.codium-icon.codium.coffee-script.commitizen.compass.componentkit.compose-multiplatform.compose.composer.conan-io.concourse.concretecms-icon.concretecms.conda.confluence.consul.contao.contentful.convox-icon.convox.copyleft-pirate.copyleft.corda.cordova.cosmosdb.couchbase.couchdb-icon.couchdb.coursera.coveralls.cpanel.cplusplus.craftcms.crashlytics.crateio.create-react-app.createjs.crossplane-icon.crossplane.crucible.crystal.csharp.css3-official.css3.cssnext.cube-icon.cube.cucumber.curl.customerio-icon.customerio.cyclejs.cypress-icon.cypress.d3.d3js.dailydev-icon.dailydev.daisy-ui-icon.daisy-ui.danfo.dart.dashlane-icon.dashlane.data-grip.data-spell.data-station.database-labs.datadog-icon.datadog.datasette-icon.datasette.datocms-icon.datocms.dbeaver.dbt-icon.dbt.dcos-icon.dcos.debian.delighted-icon.delighted.deno.dependabot.deployhq-icon.deployhq.derby.descript-icon.descript.designernews.deviantart-icon.deviantart.devicon.dgraph-icon.dgraph.dialogflow.digital-ocean-icon.digital-ocean.dimer.dinersclub.discord-icon.discord-js.discord.discourse-icon.discourse.discover.disqus.django-icon.django-rest.django.dockbit.docker-icon.docker.doctrine.docusaurus.dojo-icon.dojo-toolkit.dojo.dolt.dotnet.dovetail-icon.dovetail.dreamhost.dribbble-icon.dribbble.drift.drip.drizzle-icon.drizzle.drone-icon.drone.drools-icon.drools.dropbox.dropmark.dropwizard.dropzone.drupal-icon.drupal.duckduckgo.dynatrace-icon.dynatrace.dyndns.ebanx.eclipse-ceylon.eclipse-icon.eclipse-ide.eclipse-vert-x.eclipse.ecma.edgedb.edgio-icon.edgio.editorconfig.effect-icon.effect.effector.egghead.elasticbeats.elasticpath-icon.elasticpath.elasticsearch.electron.element.elemental-ui.elementary.eleventy-11ty.eleventy.elixir.ello.elm-classic.elm.elo.emacs-classic.emacs.embedded-c.embedly.ember-js.ember-tomster.ember.emmet.enact.engine-yard-icon.engine-yard.envato.envoy-icon.envoy.envoyer.eraser-icon.eraser.erlang.esbuild.esdoc.eslint-old.eslint.eta-icon.eta.etcd.ethereum-color.ethereum.ethers.ethnio.eventbrite-icon.eventbrite.eventsentry.evergreen-icon.evergreen.expo-icon.expo.express.fabric.facebook.faker.falcor.fast-api.fastapi-icon.fastify-icon.fastify.fastlane.fastly.fauna-icon.fauna.feathers.feathersjs.fedora.fetch.ffmpeg-icon.ffmpeg.figma.file-zilla.firebase-icon.firebase.firefox.flannel.flarum.flask.flat-ui.flattr-icon.flattr.fleep.flickr-icon.flickr.flight.floodio.flow.flowxo.floydhub.flutter.flux.fluxxor.fly-icon.fly.fogbugz-icon.fogbugz.fomo-icon.fomo.font-awesome.forestadmin-icon.forestadmin.forever.formkeep.fortran.foundation.foundationdb-icon.foundationdb.framer.framework7-icon.framework7.freebsd.freedcamp-icon.freedcamp.freedomdefined.fresh.frontapp.fsharp.fuchsia.galliumos.game-analytics-icon.game-analytics.ganache-icon.ganache.gatling.gatsby.gazebo.gcc.geekbot.geetest-icon.geetest.gentoo.getyourguide.ghost.giantswarm.gimp.gin.git-icon.git.gitboard.gitbook.github-actions.github-codespaces.github-copilot.github-icon.github-octocat.github.gitkraken.gitlab-icon.gitlab.gitpod.gitter.gitup.glamorous-icon.glamorous.gleam.glimmerjs.glint.glitch-icon.glitch.gnome-icon.gnome.gnu-emacs.gnu-net.gnu.gnupg-icon.gnupg.go-land.go.gocd.godot-engine.godot-icon.godot.gohorse.google-360suite.google-admob.google-ads.google-adsense.google-analytics.google-bard-icon.google-bard.google-calendar.google-cloud-functions.google-cloud-run.google-cloud.google-data-studio.google-developers.google-domains-icon.google-domains.google-drive.google-fit.google-gemini.google-gmail.google-home.google-icon.google-keep.google-maps.google-marketing-platform.google-meet.google-one.google-optimize.google-palm.google-pay.google-photos.google-play-console-icon.google-play-console.google-play-icon.google-play.google-search-console.google-tag-manager.google-workspace.google.gopher.gradio-icon.gradio.gradle.grafana.grails.grammarly-icon.grammarly.graphene.graphql.grav.gravatar-icon.gravatar.graylog-icon.graylog.greensock-icon.greensock.gridsome-icon.gridsome.grommet.groovehq.groovy.grove.growth-book-icon.growth-book.grpc.grunt.gruntjs.gulp.gulpjs.gunicorn.gunjs.gusto.gwt.hack.hacker-one.hadoop.haiku-icon.haiku.haml.hanami.handlebars.hapi.hardhat-icon.hardhat.harness-icon.harness.harvester.hashicorp-icon.hashicorp-vault.hashicorp.hashnode-icon.hashnode.haskell-icon.haskell.hasura-icon.hasura.haxe.haxl.hbase.hcaptcha-icon.hcaptcha.headlessui-icon.headlessui.heap-icon.heap.helm.helpscout-icon.helpscout.hermes.heroku-icon.heroku-redis.heroku.hexo.hhvm.hibernate.highcharts.hipercard.homebrew.hono.hookstate.hootsuite-icon.hootsuite.hosted-graphite.hostgator-icon.hostgator.hotjar-icon.hotjar.houndci.html5-boilerplate.html5.htmx-icon.htmx.httpie-icon.httpie.hubspot.hugging-face-icon.hugging-face.huggy.hugo.humongous.hyper.hyperapp.ibm-spss-statistics.ibm.ie10.ieee.ietf.ifttt.imagemin.imba-icon.imba.immer-icon.immer.immutable.impala.importio-icon.importio.incident-icon.incident.infer.inferno.influxdb-icon.influxdb.ink.inkscape.insomnia.instagram-icon.instagram.intel.intellij-idea.intercom-icon.intercom.internet-computer-icon.internet-computer.internetexplorer.invision-icon.invision.ionic-icon.ionic.ios.iron-icon.iron.itsalive-icon.itsalive.jade.jaeger.jamstack-icon.jamstack.jasmine.java.javascript.jcb.jeet.jekyll.jenkins.jest.jetbrains-icon.jetbrains-space-icon.jetbrains-space.jetbrains.jfrog.jhipster-icon.jhipster.jira-align.jira.joomla.jotai.jquery-mobile.jquery.jruby.jsbin.jsdelivr.jsdom.jsfiddle.json-ld.json-schema-icon.json-schema.json.jspm.jss.juju.jule.julia.junit.jupyter.jwt-icon.jwt.k3os.k3s.kafka-icon.kafka.kaggle.kaios.kallithea.karate.karma.katalon-icon.katalon.kde.keen.kemal.keras.keycdn-icon.keycdn.keydb-icon.keydb.keystonejs.khan-academy-icon.khan-academy.kibana.kickstarter-icon.kickstarter.kinto-icon.kinto.kirby-icon.kirby.knex-js.knex.knockout.koa.kong-icon.kong.kops.koreio.kotlin-icon.kotlin.kraken.krakenjs.ktor-icon.ktor.kubernetes.kustomer.labview.languagetool.laravel.lastfm.lateral-icon.lateral.latex.launchdarkly-icon.launchdarkly.launchrock.leaflet.leankit-icon.leankit.lerna.less-js.less.lets-cloud.letsencrypt.leveldb.lexical-icon.lexical.liftweb.lighthouse.lightstep-icon.lightstep.lighttpd.linear-icon.linear.linkedin-icon.linkedin.linkerd.linode.linux-mint.linux-tux.linux.liquibase.lit-icon.lit.litmus.livewire.llvm.loader.lodash.logentries.logstash.lookback.looker-icon.looker.loom-icon.loom.loopback-icon.loopback.losant.lua.lucene-net.lucene.lumen.mac-os.madge.maestro.mageia.magento.mailchimp-freddie.mailchimp.maildeveloper.mailgun-icon.mailgun.mailjet-icon.mailjet.malinajs.manjaro.mantine-icon.mantine.mapbox-icon.mapbox.maps-me.mapzen-icon.mapzen.mariadb-icon.mariadb.marionette.markdown.marko.marvel.mastercard.mastodon-icon.mastodon.material-ui.materialize.materializecss.matlab.matomo-icon.matomo.matplotlib-icon.matplotlib.matter-icon.matter.mattermost-icon.mattermost.mautic-icon.mautic.maven.mdn.mdx.medium-icon.medium.medusa-icon.medusa.meilisearch.memcached.memgraph.mention.mercurial.mesos.messenger.meta-icon.meta.metabase.metamask-icon.metamask.meteor-icon.meteor-js.meteor.micro-icon.micro-python.micro.microcosm.micron-icon.micron.microsoft-azure.microsoft-edge.microsoft-icon.microsoft-onedrive.microsoft-power-bi.microsoft-sql-server.microsoft-teams.microsoft-windows-icon.microsoft-windows.microsoft.mida-icon.mida.middleman.midjourney.milligram.million-icon.million.milvus-icon.milvus.mindsdb-icon.mindsdb.minitab.mint-lang.mio.miro-icon.miro.mist.mistral-ai-icon.mistral-ai.mithril.mixmax.mixpanel.mlab.mob-x.mocha.mockflow-icon.mockflow.modernizr.modx-icon.modx.moleculer.momentjs.monday-icon.monday.monero.mongodb-icon.mongodb.mongoose-js.mono.moodle.moon.mootools.morpheus-icon.morpheus.mozilla.mparticle-icon.mparticle.mps-icon.mps.ms-dos.msw-icon.msw.multipass.mysql-icon.mysql.naiveui.namecheap.nano.nanonets.nasm.nativescript.nats-icon.nats.neat.neo4j.neon-icon.neon.neovim.nerog.nestjs.net-core.net.netbeans.netflix-icon.netflix.netlify-icon.netlify.network-x.neverinstall-icon.neverinstall.new-relic-icon.new-relic.new4j.nextjs-icon.nextjs.nginx.ngrok.nhibernate.nhost-icon.nhost.nightwatch.nim-lang.nim.nimble.nix.nocodb.nodal.node-sass.nodebots.nodejs-icon-alt.nodejs-icon.nodejs.nodemon.nodeos.nodewebkit.nomad-icon.nomad.notion-icon.notion.noysi.npm-icon.npm.nuclide.nuget.num-py.nuxt-icon.nuxt-js.nuxt.nvidia.nvm.nx.oauth.objective-c.observablehq.obsidian-icon.obsidian.ocaml.octodns.octopus-deploy.oh-my-zsh.okta-icon.okta.olark.onesignal.open-al.open-api.open-cl.open-cv.open-gl.open-graph.open-stack.open-suse.open-telemetry.open-zeppelin-icon.open-zeppelin.openai-icon.openai.openapi-icon.opencart.opencollective.openframeworks.openjs-foundation-icon.openjs-foundation.openlayers.opensearch-icon.opensearch.openshift.opensource.openstack-icon.opentelemetry-icon.opera.opsgenie.optimizely-icon.optimizely.oracle.oreilly.origami.origin.oshw.osquery.overloop-icon.overloop.p5js.packer.pagekit.pagekite.pagerduty-icon.pagerduty.panda.pandacss-icon.pandacss.pandas-icon.pandas.parcel-icon.parcel.parse.parsehub.partytown-icon.partytown.passbolt-icon.passbolt.passport.patreon.payload.paypal.peer5.pepperoni.percona.percy-icon.percy.perf-rocks.perl.perplexity-icon.perplexity.pf-sense.phalcon.phoenix-framework.phoenix.photon-engine.php-alt.php-storm.php.pinecone-icon.pinecone.pinia.pinterest.pipedream.pipedrive.pipefy.pivotal-tracker.pixijs.pkg.planetscale.planless-icon.planless.plasmic.plastic-scm.platformio.play.playwright.playwrite.ploty.pluralsight-icon.pluralsight.pm2-icon.pm2.pnpm.pocket-base.podman.poeditor.polygon.polymer.portainer.postcss.postgraphile.postgresql.posthog-icon.posthog.postman-icon.postman.pouchdb.powershell.preact.precursor.prerender-icon.prerender.prestashop-icon.prestashop.presto-icon.presto.prettier.prisma.prismic-icon.prismic.processing.processwire-icon.processwire.productboard-icon.productboard.producthunt.progress.prometheus.promises.proofy.protoio.protonet.protractor.prott.pug.pulumi-icon.pulumi.pumpkindb.puppet-icon.puppet.puppeteer.purescript-icon.purescript.pushbullet.pusher-icon.pusher.putty.pwa.pycharm.pypi.pyscript.pytest.python-poetry.python.pytorch-icon.pytorch.pyup.q.qdrant-icon.qdrant.qlik.qodana.qt.qualcomm.quarkus-icon.quarkus.quasar.quay.quobyte.quora.qwik-icon.qwik.r-lang.r.rabbitmq-icon.rabbitmq.rackspace-icon.rackspace.rails.ramda.raml.rancher-icon.rancher.raphael.raspberry-pi.rax.reach.react-bootstrap.react-query-icon.react-query.react-router.react-spring.react-styleguidist.react.reactivex.realm.reapp.reasonml-icon.reasonml.recaptcha.recoil-icon.recoil.red-cube-s-epic-compiler-thingy-programming-re-ct.reddit-icon.reddit.redhat-icon.redhat.redis.redsmin.redux-observable.redux-saga.redux.redwoodjs.reindex.relay.release.remix-icon.remix.ren-py.renovatebot.replay-icon.replay.replit-icon.replit.require.rescript-icon.rescript.rest-li.rethinkdb.retool-icon.retool.riak.rider.riot.risingwave-icon.risingwave.robot-operating-system-ros.rocket-chat-icon.rocket-chat.rocksdb.rocky-linux-icon.rocky-linux.rollbar-icon.rollbar.rollupjs.rome-icon.rome.ros.rsa.rsmq.rspec.rstudio.rubocop.ruby-mine.ruby-on-rails.ruby.rubygems.rum.runscope.rush-icon.rush.rust.rxdb.safari.sagui.sails.salesforce.sameroom.samsung.sanity.sap.sass-doc.sass.saucelabs.scala.scaledrone.scalingo.scribd-icon.scribd.sdl.seaborn-icon.seaborn.section-icon.section.segment-icon.segment.selenium.sema-software.semantic-release.semantic-ui.semaphoreci.sencha.sendgrid-icon.sendgrid.seneca.sensu-icon.sensu.sentry-icon.sentry.sequelize.serverless.sherlock-icon.sherlock.shields.shipit.shogun.shopify.shopware.shortcut-icon.shortcut.sidekiq-icon.sidekiq.signal.sigstore-icon.sigstore.sinatra.singlestore-icon.singlestore.sitepoint.sk-hynix.skaffolder.sketch.skylight.skype.slack-icon.slack.slides.slidev.slim.smartling.smashingmagazine.snap-svg.snaplet-icon.snaplet.snowflake-icon.snowflake.snowpack.snyk.socket-io.solarwinds.solid.solidity.solidjs-icon.solidjs.solr.sonarcloud-icon.sonarcloud.sonarlint-icon.sonarlint.sonarqube.soundcloud.sourcegraph.sourcetree.spark.sparkpost.speakerdeck.speedcurve.spidermonkey-icon.spidermonkey.spinnaker.splunk.spotify-icon.spotify.spree.spring-icon.spring.sql-developer.sqlalchemy.sqlite.square.squarespace.ssh.sst-icon.sst.stability-ai-icon.stability-ai.stackbit-icon.stackbit.stackblitz-icon.stackblitz.stackoverflow-icon.stackoverflow.stackshare.stata.stately-icon.stately.statuspage.stdlib-icon.stdlib.steam.stenciljs-icon.stenciljs.stetho.stickermule.stigg-icon.stigg.stimulus-icon.stimulus.stitch.stoplight.storyblocks-icon.storyblocks.storyblok-icon.storyblok.storybook-icon.storybook.strapi-icon.strapi.streamlit.strider.stripe.struts.styleci.stylefmt.stylelint.stylis.stylus.stytch.sublimetext-icon.sublimetext.subversion.sugarss.supabase-icon.supabase.supertokens-icon.supertokens.surge.surrealdb-icon.surrealdb.survicate-icon.survicate.suse.susy.svelte-icon.svelte-kit.svelte.svg.svgator.swagger.swc.swift.swiftype.swimm.swr.symfony.sysdig-icon.sysdig.t3.tableau-icon.tableau.taiga.tailwindcss-icon.tailwindcss.tapcart-icon.tapcart.taskade-icon.taskade.tastejs.tauri.tealium.teamcity.teamgrid.teamwork-icon.teamwork.telegram.tensorflow.terminal.terraform-icon.terraform.terser-icon.terser.testcafe.testing-library.testlodge.tex.the-algorithms.threejs.thymeleaf-icon.thymeleaf.tidal-icon.tidal.tiktok-icon.tiktok.titanium-sdk.tnw.todoist-icon.todoist.todomvc.tomcat.toml.tor-browser.tor.tortoise-git.tower.traackr.trac.traefik-mesh.traefik-proxy.travis-ci-monochrome.travis-ci.treasuredata-icon.treasuredata.treehouse-icon.treehouse.trello.trpc.truffle-icon.truffle.tsmc.tsnode.tsuru.tumblr-icon.tumblr.tunein.tuple.turbopack-icon.turbopack.turborepo-icon.turborepo.turret.twilio-icon.twilio.twitch.twitter.typeform-icon.typeform.typeorm.typescript-icon-round.typescript-icon.typescript.typesense-icon.typesense.typo3-icon.typo3.ubuntu.udacity-icon.udacity.udemy-icon.udemy.uikit.uml.umu.unbounce-icon.unbounce.undertow.unionpay.unitjs.unito-icon.unito.unity.unix.unjs.unocss.unrealengine-icon.unrealengine.upcase.upstash-icon.upstash.upwork.user-testing-icon.user-testing.uservoice-icon.uservoice.uwsgi.v8-ignition.v8-turbofan.v8.vaadin.vaddy.vagrant-icon.vagrant.vala.vault-icon.vault.vector.vercel-icon.vercel.verdaccio-icon.verdaccio.vernemq.veutify.vim.vimeo-icon.vimeo.visa.visaelectron.visual-studio-code.visual-studio.vite.vitejs.vitess.vitest.vivaldi-icon.vivaldi.vlang.vmware.void.volar.vorejs.vscode.vsphere.vue-storefront.vue.vuetifyjs.vueuse.vulkan.vultr-icon.vultr.vwo.vyper.w3c.waffle-icon.waffle.wagtail.wakatime.walkme.watchman.waypoint-icon.waypoint.wayscript-icon.wayscript.wearos.weave.web-dev-icon.web-dev.web3js.webassembly.webcomponents.webdriverio.webflow.webgpu.webhint-icon.webhint.webhooks.webix-icon.webix.webkit.weblate.webmin.webpack.webplatform.webrtc.websocket.webstorm.webtorrent.weebly.whalar-icon.whalar.whatsapp-icon.whatsapp-monochrome-icon.whatsapp.whatwg.wicket-icon.wicket.wifi.wildfly.windi-css.windows11.windows8.winglang-icon.winglang.wire.wix.wmr.woo-commerce.woocommerce-icon.woopra.wordpress-icon-alt.wordpress-icon.wordpress.workboard.workos-icon.workos.workplace-icon.workplace.wpengine.wufoo.x.xamarin.xampp.xata-icon.xata.xcart.xcode.xero.xml.xray-for-jira.xstate.xtend.xwiki-icon.xwiki.yahoo.yaml.yammer.yandex-ru.yarn.ycombinator.yeoman.yii-framework.yii.youtrack.youtube-icon.youtube.yugabyte-icon.yugabyte.yuno-host.zabbix.zapier.zend-framework.zendesk-icon.zendesk.zenhub-icon.zenhub.zeplin.zeroheight-icon.zeroheight.zig.zod.zoho.zoom-icon.zoom.zorin-os.zsh.zube.zulip-icon.zulip.zwave`.split(`.`),bootstrap:`0-circle-fill.0-circle.0-square-fill.0-square.1-circle-fill.1-circle.1-square-fill.1-square.123.2-circle-fill.2-circle.2-square-fill.2-square.3-circle-fill.3-circle.3-square-fill.3-square.4-circle-fill.4-circle.4-square-fill.4-square.5-circle-fill.5-circle.5-square-fill.5-square.6-circle-fill.6-circle.6-square-fill.6-square.7-circle-fill.7-circle.7-square-fill.7-square.8-circle-fill.8-circle.8-square-fill.8-square.9-circle-fill.9-circle.9-square-fill.9-square.activity.airplane-engines-fill.airplane-engines.airplane-fill.airplane.alarm-fill.alarm.alexa.align-bottom.align-center.align-end.align-middle.align-start.align-top.alipay.alphabet-uppercase.alphabet.alt.amazon.amd.android.android2.app-indicator.app.apple.archive-fill.archive.arrow-90deg-down.arrow-90deg-left.arrow-90deg-right.arrow-90deg-up.arrow-bar-down.arrow-bar-left.arrow-bar-right.arrow-bar-up.arrow-clockwise.arrow-counterclockwise.arrow-down-circle-fill.arrow-down-circle.arrow-down-left-circle-fill.arrow-down-left-circle.arrow-down-left-square-fill.arrow-down-left-square.arrow-down-left.arrow-down-right-circle-fill.arrow-down-right-circle.arrow-down-right-square-fill.arrow-down-right-square.arrow-down-right.arrow-down-short.arrow-down-square-fill.arrow-down-square.arrow-down-up.arrow-down.arrow-left-circle-fill.arrow-left-circle.arrow-left-right.arrow-left-short.arrow-left-square-fill.arrow-left-square.arrow-left.arrow-repeat.arrow-return-left.arrow-return-right.arrow-right-circle-fill.arrow-right-circle.arrow-right-short.arrow-right-square-fill.arrow-right-square.arrow-right.arrow-through-heart-fill.arrow-through-heart.arrow-up-circle-fill.arrow-up-circle.arrow-up-left-circle-fill.arrow-up-left-circle.arrow-up-left-square-fill.arrow-up-left-square.arrow-up-left.arrow-up-right-circle-fill.arrow-up-right-circle.arrow-up-right-square-fill.arrow-up-right-square.arrow-up-right.arrow-up-short.arrow-up-square-fill.arrow-up-square.arrow-up.arrows-angle-contract.arrows-angle-expand.arrows-collapse-vertical.arrows-collapse.arrows-expand-vertical.arrows-expand.arrows-fullscreen.arrows-move.arrows-vertical.arrows.aspect-ratio-fill.aspect-ratio.asterisk.at.award-fill.award.back.backpack-fill.backpack.backpack2-fill.backpack2.backpack3-fill.backpack3.backpack4-fill.backpack4.backspace-fill.backspace-reverse-fill.backspace-reverse.backspace.badge-3d-fill.badge-3d.badge-4k-fill.badge-4k.badge-8k-fill.badge-8k.badge-ad-fill.badge-ad.badge-ar-fill.badge-ar.badge-cc-fill.badge-cc.badge-hd-fill.badge-hd.badge-sd-fill.badge-sd.badge-tm-fill.badge-tm.badge-vo-fill.badge-vo.badge-vr-fill.badge-vr.badge-wc-fill.badge-wc.bag-check-fill.bag-check.bag-dash-fill.bag-dash.bag-fill.bag-heart-fill.bag-heart.bag-plus-fill.bag-plus.bag-x-fill.bag-x.bag.balloon-fill.balloon-heart-fill.balloon-heart.balloon.ban-fill.ban.bandaid-fill.bandaid.bank.bank2.bar-chart-fill.bar-chart-line-fill.bar-chart-line.bar-chart-steps.bar-chart.basket-fill.basket.basket2-fill.basket2.basket3-fill.basket3.battery-charging.battery-full.battery-half.battery.behance.bell-fill.bell-slash-fill.bell-slash.bell.bezier.bezier2.bicycle.bing.binoculars-fill.binoculars.blockquote-left.blockquote-right.bluetooth.body-text.book-fill.book-half.book.bookmark-check-fill.bookmark-check.bookmark-dash-fill.bookmark-dash.bookmark-fill.bookmark-heart-fill.bookmark-heart.bookmark-plus-fill.bookmark-plus.bookmark-star-fill.bookmark-star.bookmark-x-fill.bookmark-x.bookmark.bookmarks-fill.bookmarks.bookshelf.boombox-fill.boombox.bootstrap-fill.bootstrap-icons.bootstrap-reboot.bootstrap.border-all.border-bottom.border-center.border-inner.border-left.border-middle.border-outer.border-right.border-style.border-top.border-width.border.bounding-box-circles.bounding-box.box-arrow-down-left.box-arrow-down-right.box-arrow-down.box-arrow-in-down-left.box-arrow-in-down-right.box-arrow-in-down.box-arrow-in-left.box-arrow-in-right.box-arrow-in-up-left.box-arrow-in-up-right.box-arrow-in-up.box-arrow-left.box-arrow-right.box-arrow-up-left.box-arrow-up-right.box-arrow-up.box-fill.box-seam-fill.box-seam.box.box2-fill.box2-heart-fill.box2-heart.box2.boxes.braces-asterisk.braces.bricks.briefcase-fill.briefcase.brightness-alt-high-fill.brightness-alt-high.brightness-alt-low-fill.brightness-alt-low.brightness-high-fill.brightness-high.brightness-low-fill.brightness-low.brilliance.broadcast-pin.broadcast.browser-chrome.browser-edge.browser-firefox.browser-safari.brush-fill.brush.bucket-fill.bucket.bug-fill.bug.building-add.building-check.building-dash.building-down.building-exclamation.building-fill-add.building-fill-check.building-fill-dash.building-fill-down.building-fill-exclamation.building-fill-gear.building-fill-lock.building-fill-slash.building-fill-up.building-fill-x.building-fill.building-gear.building-lock.building-slash.building-up.building-x.building.buildings-fill.buildings.bullseye.bus-front-fill.bus-front.c-circle-fill.c-circle.c-square-fill.c-square.cake-fill.cake.cake2-fill.cake2.calculator-fill.calculator.calendar-check-fill.calendar-check.calendar-date-fill.calendar-date.calendar-day-fill.calendar-day.calendar-event-fill.calendar-event.calendar-fill.calendar-heart-fill.calendar-heart.calendar-minus-fill.calendar-minus.calendar-month-fill.calendar-month.calendar-plus-fill.calendar-plus.calendar-range-fill.calendar-range.calendar-week-fill.calendar-week.calendar-x-fill.calendar-x.calendar.calendar2-check-fill.calendar2-check.calendar2-date-fill.calendar2-date.calendar2-day-fill.calendar2-day.calendar2-event-fill.calendar2-event.calendar2-fill.calendar2-heart-fill.calendar2-heart.calendar2-minus-fill.calendar2-minus.calendar2-month-fill.calendar2-month.calendar2-plus-fill.calendar2-plus.calendar2-range-fill.calendar2-range.calendar2-week-fill.calendar2-week.calendar2-x-fill.calendar2-x.calendar2.calendar3-event-fill.calendar3-event.calendar3-fill.calendar3-range-fill.calendar3-range.calendar3-week-fill.calendar3-week.calendar3.calendar4-event.calendar4-range.calendar4-week.calendar4.camera-fill.camera-reels-fill.camera-reels.camera-video-fill.camera-video-off-fill.camera-video-off.camera-video.camera.camera2.capslock-fill.capslock.capsule-pill.capsule.car-front-fill.car-front.card-checklist.card-heading.card-image.card-list.card-text.caret-down-fill.caret-down-square-fill.caret-down-square.caret-down.caret-left-fill.caret-left-square-fill.caret-left-square.caret-left.caret-right-fill.caret-right-square-fill.caret-right-square.caret-right.caret-up-fill.caret-up-square-fill.caret-up-square.caret-up.cart-check-fill.cart-check.cart-dash-fill.cart-dash.cart-fill.cart-plus-fill.cart-plus.cart-x-fill.cart-x.cart.cart2.cart3.cart4.cash-coin.cash-stack.cash.cassette-fill.cassette.cast.cc-circle-fill.cc-circle.cc-square-fill.cc-square.chat-dots-fill.chat-dots.chat-fill.chat-heart-fill.chat-heart.chat-left-dots-fill.chat-left-dots.chat-left-fill.chat-left-heart-fill.chat-left-heart.chat-left-quote-fill.chat-left-quote.chat-left-text-fill.chat-left-text.chat-left.chat-quote-fill.chat-quote.chat-right-dots-fill.chat-right-dots.chat-right-fill.chat-right-heart-fill.chat-right-heart.chat-right-quote-fill.chat-right-quote.chat-right-text-fill.chat-right-text.chat-right.chat-square-dots-fill.chat-square-dots.chat-square-fill.chat-square-heart-fill.chat-square-heart.chat-square-quote-fill.chat-square-quote.chat-square-text-fill.chat-square-text.chat-square.chat-text-fill.chat-text.chat.check-all.check-circle-fill.check-circle.check-lg.check-square-fill.check-square.check.check2-all.check2-circle.check2-square.check2.chevron-bar-contract.chevron-bar-down.chevron-bar-expand.chevron-bar-left.chevron-bar-right.chevron-bar-up.chevron-compact-down.chevron-compact-left.chevron-compact-right.chevron-compact-up.chevron-contract.chevron-double-down.chevron-double-left.chevron-double-right.chevron-double-up.chevron-down.chevron-expand.chevron-left.chevron-right.chevron-up.circle-fill.circle-half.circle-square.circle.clipboard-check-fill.clipboard-check.clipboard-data-fill.clipboard-data.clipboard-fill.clipboard-heart-fill.clipboard-heart.clipboard-minus-fill.clipboard-minus.clipboard-plus-fill.clipboard-plus.clipboard-pulse.clipboard-x-fill.clipboard-x.clipboard.clipboard2-check-fill.clipboard2-check.clipboard2-data-fill.clipboard2-data.clipboard2-fill.clipboard2-heart-fill.clipboard2-heart.clipboard2-minus-fill.clipboard2-minus.clipboard2-plus-fill.clipboard2-plus.clipboard2-pulse-fill.clipboard2-pulse.clipboard2-x-fill.clipboard2-x.clipboard2.clock-fill.clock-history.clock.cloud-arrow-down-fill.cloud-arrow-down.cloud-arrow-up-fill.cloud-arrow-up.cloud-check-fill.cloud-check.cloud-download-fill.cloud-download.cloud-drizzle-fill.cloud-drizzle.cloud-fill.cloud-fog-fill.cloud-fog.cloud-fog2-fill.cloud-fog2.cloud-hail-fill.cloud-hail.cloud-haze-fill.cloud-haze.cloud-haze2-fill.cloud-haze2.cloud-lightning-fill.cloud-lightning-rain-fill.cloud-lightning-rain.cloud-lightning.cloud-minus-fill.cloud-minus.cloud-moon-fill.cloud-moon.cloud-plus-fill.cloud-plus.cloud-rain-fill.cloud-rain-heavy-fill.cloud-rain-heavy.cloud-rain.cloud-slash-fill.cloud-slash.cloud-sleet-fill.cloud-sleet.cloud-snow-fill.cloud-snow.cloud-sun-fill.cloud-sun.cloud-upload-fill.cloud-upload.cloud.clouds-fill.clouds.cloudy-fill.cloudy.code-slash.code-square.code.coin.collection-fill.collection-play-fill.collection-play.collection.columns-gap.columns.command.compass-fill.compass.cone-striped.cone.controller.cookie.copy.cpu-fill.cpu.credit-card-2-back-fill.credit-card-2-back.credit-card-2-front-fill.credit-card-2-front.credit-card-fill.credit-card.crop.crosshair.crosshair2.cup-fill.cup-hot-fill.cup-hot.cup-straw.cup.currency-bitcoin.currency-dollar.currency-euro.currency-exchange.currency-pound.currency-rupee.currency-yen.cursor-fill.cursor-text.cursor.dash-circle-dotted.dash-circle-fill.dash-circle.dash-lg.dash-square-dotted.dash-square-fill.dash-square.dash.database-add.database-check.database-dash.database-down.database-exclamation.database-fill-add.database-fill-check.database-fill-dash.database-fill-down.database-fill-exclamation.database-fill-gear.database-fill-lock.database-fill-slash.database-fill-up.database-fill-x.database-fill.database-gear.database-lock.database-slash.database-up.database-x.database.device-hdd-fill.device-hdd.device-ssd-fill.device-ssd.diagram-2-fill.diagram-2.diagram-3-fill.diagram-3.diamond-fill.diamond-half.diamond.dice-1-fill.dice-1.dice-2-fill.dice-2.dice-3-fill.dice-3.dice-4-fill.dice-4.dice-5-fill.dice-5.dice-6-fill.dice-6.disc-fill.disc.discord.display-fill.display.displayport-fill.displayport.distribute-horizontal.distribute-vertical.door-closed-fill.door-closed.door-open-fill.door-open.dot.download.dpad-fill.dpad.dribbble.dropbox.droplet-fill.droplet-half.droplet.duffle-fill.duffle.ear-fill.ear.earbuds.easel-fill.easel.easel2-fill.easel2.easel3-fill.easel3.egg-fill.egg-fried.egg.eject-fill.eject.emoji-angry-fill.emoji-angry.emoji-astonished-fill.emoji-astonished.emoji-dizzy-fill.emoji-dizzy.emoji-expressionless-fill.emoji-expressionless.emoji-frown-fill.emoji-frown.emoji-grimace-fill.emoji-grimace.emoji-grin-fill.emoji-grin.emoji-heart-eyes-fill.emoji-heart-eyes.emoji-kiss-fill.emoji-kiss.emoji-laughing-fill.emoji-laughing.emoji-neutral-fill.emoji-neutral.emoji-smile-fill.emoji-smile-upside-down-fill.emoji-smile-upside-down.emoji-smile.emoji-sunglasses-fill.emoji-sunglasses.emoji-surprise-fill.emoji-surprise.emoji-tear-fill.emoji-tear.emoji-wink-fill.emoji-wink.envelope-arrow-down-fill.envelope-arrow-down.envelope-arrow-up-fill.envelope-arrow-up.envelope-at-fill.envelope-at.envelope-check-fill.envelope-check.envelope-dash-fill.envelope-dash.envelope-exclamation-fill.envelope-exclamation.envelope-fill.envelope-heart-fill.envelope-heart.envelope-open-fill.envelope-open-heart-fill.envelope-open-heart.envelope-open.envelope-paper-fill.envelope-paper-heart-fill.envelope-paper-heart.envelope-paper.envelope-plus-fill.envelope-plus.envelope-slash-fill.envelope-slash.envelope-x-fill.envelope-x.envelope.eraser-fill.eraser.escape.ethernet.ev-front-fill.ev-front.ev-station-fill.ev-station.exclamation-circle-fill.exclamation-circle.exclamation-diamond-fill.exclamation-diamond.exclamation-lg.exclamation-octagon-fill.exclamation-octagon.exclamation-square-fill.exclamation-square.exclamation-triangle-fill.exclamation-triangle.exclamation.exclude.explicit-fill.explicit.exposure.eye-fill.eye-slash-fill.eye-slash.eye.eyedropper.eyeglasses.facebook.fan.fast-forward-btn-fill.fast-forward-btn.fast-forward-circle-fill.fast-forward-circle.fast-forward-fill.fast-forward.feather.feather2.file-arrow-down-fill.file-arrow-down.file-arrow-up-fill.file-arrow-up.file-bar-graph-fill.file-bar-graph.file-binary-fill.file-binary.file-break-fill.file-break.file-check-fill.file-check.file-code-fill.file-code.file-diff-fill.file-diff.file-earmark-arrow-down-fill.file-earmark-arrow-down.file-earmark-arrow-up-fill.file-earmark-arrow-up.file-earmark-bar-graph-fill.file-earmark-bar-graph.file-earmark-binary-fill.file-earmark-binary.file-earmark-break-fill.file-earmark-break.file-earmark-check-fill.file-earmark-check.file-earmark-code-fill.file-earmark-code.file-earmark-diff-fill.file-earmark-diff.file-earmark-easel-fill.file-earmark-easel.file-earmark-excel-fill.file-earmark-excel.file-earmark-fill.file-earmark-font-fill.file-earmark-font.file-earmark-image-fill.file-earmark-image.file-earmark-lock-fill.file-earmark-lock.file-earmark-lock2-fill.file-earmark-lock2.file-earmark-medical-fill.file-earmark-medical.file-earmark-minus-fill.file-earmark-minus.file-earmark-music-fill.file-earmark-music.file-earmark-pdf-fill.file-earmark-pdf.file-earmark-person-fill.file-earmark-person.file-earmark-play-fill.file-earmark-play.file-earmark-plus-fill.file-earmark-plus.file-earmark-post-fill.file-earmark-post.file-earmark-ppt-fill.file-earmark-ppt.file-earmark-richtext-fill.file-earmark-richtext.file-earmark-ruled-fill.file-earmark-ruled.file-earmark-slides-fill.file-earmark-slides.file-earmark-spreadsheet-fill.file-earmark-spreadsheet.file-earmark-text-fill.file-earmark-text.file-earmark-word-fill.file-earmark-word.file-earmark-x-fill.file-earmark-x.file-earmark-zip-fill.file-earmark-zip.file-earmark.file-easel-fill.file-easel.file-excel-fill.file-excel.file-fill.file-font-fill.file-font.file-image-fill.file-image.file-lock-fill.file-lock.file-lock2-fill.file-lock2.file-medical-fill.file-medical.file-minus-fill.file-minus.file-music-fill.file-music.file-pdf-fill.file-pdf.file-person-fill.file-person.file-play-fill.file-play.file-plus-fill.file-plus.file-post-fill.file-post.file-ppt-fill.file-ppt.file-richtext-fill.file-richtext.file-ruled-fill.file-ruled.file-slides-fill.file-slides.file-spreadsheet-fill.file-spreadsheet.file-text-fill.file-text.file-word-fill.file-word.file-x-fill.file-x.file-zip-fill.file-zip.file.files-alt.files.filetype-aac.filetype-ai.filetype-bmp.filetype-cs.filetype-css.filetype-csv.filetype-doc.filetype-docx.filetype-exe.filetype-gif.filetype-heic.filetype-html.filetype-java.filetype-jpg.filetype-js.filetype-json.filetype-jsx.filetype-key.filetype-m4p.filetype-md.filetype-mdx.filetype-mov.filetype-mp3.filetype-mp4.filetype-otf.filetype-pdf.filetype-php.filetype-png.filetype-ppt.filetype-pptx.filetype-psd.filetype-py.filetype-raw.filetype-rb.filetype-sass.filetype-scss.filetype-sh.filetype-sql.filetype-svg.filetype-tiff.filetype-tsx.filetype-ttf.filetype-txt.filetype-wav.filetype-woff.filetype-xls.filetype-xlsx.filetype-xml.filetype-yml.film.filter-circle-fill.filter-circle.filter-left.filter-right.filter-square-fill.filter-square.filter.fingerprint.fire.flag-fill.flag.floppy-fill.floppy.floppy2-fill.floppy2.flower1.flower2.flower3.folder-check.folder-fill.folder-minus.folder-plus.folder-symlink-fill.folder-symlink.folder-x.folder.folder2-open.folder2.fonts.forward-fill.forward.front.fuel-pump-diesel-fill.fuel-pump-diesel.fuel-pump-fill.fuel-pump.fullscreen-exit.fullscreen.funnel-fill.funnel.gear-fill.gear-wide-connected.gear-wide.gear.gem.gender-ambiguous.gender-female.gender-male.gender-neuter.gender-trans.geo-alt-fill.geo-alt.geo-fill.geo.gift-fill.gift.git.github.gitlab.globe-americas.globe-asia-australia.globe-central-south-asia.globe-europe-africa.globe.globe2.google-play.google.gpu-card.graph-down-arrow.graph-down.graph-up-arrow.graph-up.grid-1x2-fill.grid-1x2.grid-3x2-gap-fill.grid-3x2-gap.grid-3x2.grid-3x3-gap-fill.grid-3x3-gap.grid-3x3.grid-fill.grid.grip-horizontal.grip-vertical.h-circle-fill.h-circle.h-square-fill.h-square.hammer.hand-index-fill.hand-index-thumb-fill.hand-index-thumb.hand-index.hand-thumbs-down-fill.hand-thumbs-down.hand-thumbs-up-fill.hand-thumbs-up.handbag-fill.handbag.hash.hdd-fill.hdd-network-fill.hdd-network.hdd-rack-fill.hdd-rack.hdd-stack-fill.hdd-stack.hdd.hdmi-fill.hdmi.headphones.headset-vr.headset.heart-arrow.heart-fill.heart-half.heart-pulse-fill.heart-pulse.heart.heartbreak-fill.heartbreak.hearts.heptagon-fill.heptagon-half.heptagon.hexagon-fill.hexagon-half.hexagon.highlighter.highlights.hospital-fill.hospital.hourglass-bottom.hourglass-split.hourglass-top.hourglass.house-add-fill.house-add.house-check-fill.house-check.house-dash-fill.house-dash.house-door-fill.house-door.house-down-fill.house-down.house-exclamation-fill.house-exclamation.house-fill.house-gear-fill.house-gear.house-heart-fill.house-heart.house-lock-fill.house-lock.house-slash-fill.house-slash.house-up-fill.house-up.house-x-fill.house-x.house.houses-fill.houses.hr.hurricane.hypnotize.image-alt.image-fill.image.images.inbox-fill.inbox.inboxes-fill.inboxes.incognito.indent.infinity.info-circle-fill.info-circle.info-lg.info-square-fill.info-square.info.input-cursor-text.input-cursor.instagram.intersect.journal-album.journal-arrow-down.journal-arrow-up.journal-bookmark-fill.journal-bookmark.journal-check.journal-code.journal-medical.journal-minus.journal-plus.journal-richtext.journal-text.journal-x.journal.journals.joystick.justify-left.justify-right.justify.kanban-fill.kanban.key-fill.key.keyboard-fill.keyboard.ladder.lamp-fill.lamp.laptop-fill.laptop.layer-backward.layer-forward.layers-fill.layers-half.layers.layout-sidebar-inset-reverse.layout-sidebar-inset.layout-sidebar-reverse.layout-sidebar.layout-split.layout-text-sidebar-reverse.layout-text-sidebar.layout-text-window-reverse.layout-text-window.layout-three-columns.layout-wtf.life-preserver.lightbulb-fill.lightbulb-off-fill.lightbulb-off.lightbulb.lightning-charge-fill.lightning-charge.lightning-fill.lightning.line.link-45deg.link.linkedin.list-check.list-columns-reverse.list-columns.list-nested.list-ol.list-stars.list-task.list-ul.list.lock-fill.lock.luggage-fill.luggage.lungs-fill.lungs.magic.magnet-fill.magnet.mailbox-flag.mailbox.mailbox2-flag.mailbox2.map-fill.map.markdown-fill.markdown.marker-tip.mask.mastodon.medium.megaphone-fill.megaphone.memory.menu-app-fill.menu-app.menu-button-fill.menu-button-wide-fill.menu-button-wide.menu-button.menu-down.menu-up.messenger.meta.mic-fill.mic-mute-fill.mic-mute.mic.microsoft-teams.microsoft.minecart-loaded.minecart.modem-fill.modem.moisture.moon-fill.moon-stars-fill.moon-stars.moon.mortarboard-fill.mortarboard.motherboard-fill.motherboard.mouse-fill.mouse.mouse2-fill.mouse2.mouse3-fill.mouse3.music-note-beamed.music-note-list.music-note.music-player-fill.music-player.newspaper.nintendo-switch.node-minus-fill.node-minus.node-plus-fill.node-plus.noise-reduction.nut-fill.nut.nvidia.nvme-fill.nvme.octagon-fill.octagon-half.octagon.opencollective.optical-audio-fill.optical-audio.option.outlet.p-circle-fill.p-circle.p-square-fill.p-square.paint-bucket.palette-fill.palette.palette2.paperclip.paragraph.pass-fill.pass.passport-fill.passport.patch-check-fill.patch-check.patch-exclamation-fill.patch-exclamation.patch-minus-fill.patch-minus.patch-plus-fill.patch-plus.patch-question-fill.patch-question.pause-btn-fill.pause-btn.pause-circle-fill.pause-circle.pause-fill.pause.paypal.pc-display-horizontal.pc-display.pc-horizontal.pc.pci-card-network.pci-card-sound.pci-card.peace-fill.peace.pen-fill.pen.pencil-fill.pencil-square.pencil.pentagon-fill.pentagon-half.pentagon.people-fill.people.percent.person-add.person-arms-up.person-badge-fill.person-badge.person-bounding-box.person-check-fill.person-check.person-circle.person-dash-fill.person-dash.person-down.person-exclamation.person-fill-add.person-fill-check.person-fill-dash.person-fill-down.person-fill-exclamation.person-fill-gear.person-fill-lock.person-fill-slash.person-fill-up.person-fill-x.person-fill.person-gear.person-heart.person-hearts.person-lines-fill.person-lock.person-plus-fill.person-plus.person-raised-hand.person-rolodex.person-slash.person-square.person-standing-dress.person-standing.person-up.person-vcard-fill.person-vcard.person-video.person-video2.person-video3.person-walking.person-wheelchair.person-workspace.person-x-fill.person-x.person.phone-fill.phone-flip.phone-landscape-fill.phone-landscape.phone-vibrate-fill.phone-vibrate.phone.pie-chart-fill.pie-chart.piggy-bank-fill.piggy-bank.pin-angle-fill.pin-angle.pin-fill.pin-map-fill.pin-map.pin.pinterest.pip-fill.pip.play-btn-fill.play-btn.play-circle-fill.play-circle.play-fill.play.playstation.plug-fill.plug.plugin.plus-circle-dotted.plus-circle-fill.plus-circle.plus-lg.plus-slash-minus.plus-square-dotted.plus-square-fill.plus-square.plus.postage-fill.postage-heart-fill.postage-heart.postage.postcard-fill.postcard-heart-fill.postcard-heart.postcard.power.prescription.prescription2.printer-fill.printer.projector-fill.projector.puzzle-fill.puzzle.qr-code-scan.qr-code.question-circle-fill.question-circle.question-diamond-fill.question-diamond.question-lg.question-octagon-fill.question-octagon.question-square-fill.question-square.question.quora.quote.r-circle-fill.r-circle.r-square-fill.r-square.radar.radioactive.rainbow.receipt-cutoff.receipt.reception-0.reception-1.reception-2.reception-3.reception-4.record-btn-fill.record-btn.record-circle-fill.record-circle.record-fill.record.record2-fill.record2.recycle.reddit.regex.repeat-1.repeat.reply-all-fill.reply-all.reply-fill.reply.rewind-btn-fill.rewind-btn.rewind-circle-fill.rewind-circle.rewind-fill.rewind.robot.rocket-fill.rocket-takeoff-fill.rocket-takeoff.rocket.router-fill.router.rss-fill.rss.rulers.safe-fill.safe.safe2-fill.safe2.save-fill.save.save2-fill.save2.scissors.scooter.screwdriver.sd-card-fill.sd-card.search-heart-fill.search-heart.search.segmented-nav.send-arrow-down-fill.send-arrow-down.send-arrow-up-fill.send-arrow-up.send-check-fill.send-check.send-dash-fill.send-dash.send-exclamation-fill.send-exclamation.send-fill.send-plus-fill.send-plus.send-slash-fill.send-slash.send-x-fill.send-x.send.server.shadows.share-fill.share.shield-check.shield-exclamation.shield-fill-check.shield-fill-exclamation.shield-fill-minus.shield-fill-plus.shield-fill-x.shield-fill.shield-lock-fill.shield-lock.shield-minus.shield-plus.shield-shaded.shield-slash-fill.shield-slash.shield-x.shield.shift-fill.shift.shop-window.shop.shuffle.sign-dead-end-fill.sign-dead-end.sign-do-not-enter-fill.sign-do-not-enter.sign-intersection-fill.sign-intersection-side-fill.sign-intersection-side.sign-intersection-t-fill.sign-intersection-t.sign-intersection-y-fill.sign-intersection-y.sign-intersection.sign-merge-left-fill.sign-merge-left.sign-merge-right-fill.sign-merge-right.sign-no-left-turn-fill.sign-no-left-turn.sign-no-parking-fill.sign-no-parking.sign-no-right-turn-fill.sign-no-right-turn.sign-railroad-fill.sign-railroad.sign-stop-fill.sign-stop-lights-fill.sign-stop-lights.sign-stop.sign-turn-left-fill.sign-turn-left.sign-turn-right-fill.sign-turn-right.sign-turn-slight-left-fill.sign-turn-slight-left.sign-turn-slight-right-fill.sign-turn-slight-right.sign-yield-fill.sign-yield.signal.signpost-2-fill.signpost-2.signpost-fill.signpost-split-fill.signpost-split.signpost.sim-fill.sim-slash-fill.sim-slash.sim.sina-weibo.skip-backward-btn-fill.skip-backward-btn.skip-backward-circle-fill.skip-backward-circle.skip-backward-fill.skip-backward.skip-end-btn-fill.skip-end-btn.skip-end-circle-fill.skip-end-circle.skip-end-fill.skip-end.skip-forward-btn-fill.skip-forward-btn.skip-forward-circle-fill.skip-forward-circle.skip-forward-fill.skip-forward.skip-start-btn-fill.skip-start-btn.skip-start-circle-fill.skip-start-circle.skip-start-fill.skip-start.skype.slack.slash-circle-fill.slash-circle.slash-lg.slash-square-fill.slash-square.slash.sliders.sliders2-vertical.sliders2.smartwatch.snapchat.snow.snow2.snow3.sort-alpha-down-alt.sort-alpha-down.sort-alpha-up-alt.sort-alpha-up.sort-down-alt.sort-down.sort-numeric-down-alt.sort-numeric-down.sort-numeric-up-alt.sort-numeric-up.sort-up-alt.sort-up.soundwave.sourceforge.speaker-fill.speaker.speedometer.speedometer2.spellcheck.spotify.square-fill.square-half.square.stack-overflow.stack.star-fill.star-half.star.stars.steam.stickies-fill.stickies.sticky-fill.sticky.stop-btn-fill.stop-btn.stop-circle-fill.stop-circle.stop-fill.stop.stoplights-fill.stoplights.stopwatch-fill.stopwatch.strava.stripe.subscript.substack.subtract.suit-club-fill.suit-club.suit-diamond-fill.suit-diamond.suit-heart-fill.suit-heart.suit-spade-fill.suit-spade.suitcase-fill.suitcase-lg-fill.suitcase-lg.suitcase.suitcase2-fill.suitcase2.sun-fill.sun.sunglasses.sunrise-fill.sunrise.sunset-fill.sunset.superscript.symmetry-horizontal.symmetry-vertical.table.tablet-fill.tablet-landscape-fill.tablet-landscape.tablet.tag-fill.tag.tags-fill.tags.taxi-front-fill.taxi-front.telegram.telephone-fill.telephone-forward-fill.telephone-forward.telephone-inbound-fill.telephone-inbound.telephone-minus-fill.telephone-minus.telephone-outbound-fill.telephone-outbound.telephone-plus-fill.telephone-plus.telephone-x-fill.telephone-x.telephone.tencent-qq.terminal-dash.terminal-fill.terminal-plus.terminal-split.terminal-x.terminal.text-center.text-indent-left.text-indent-right.text-left.text-paragraph.text-right.text-wrap.textarea-resize.textarea-t.textarea.thermometer-half.thermometer-high.thermometer-low.thermometer-snow.thermometer-sun.thermometer.threads-fill.threads.three-dots-vertical.three-dots.thunderbolt-fill.thunderbolt.ticket-detailed-fill.ticket-detailed.ticket-fill.ticket-perforated-fill.ticket-perforated.ticket.tiktok.toggle-off.toggle-on.toggle2-off.toggle2-on.toggles.toggles2.tools.tornado.train-freight-front-fill.train-freight-front.train-front-fill.train-front.train-lightrail-front-fill.train-lightrail-front.translate.transparency.trash-fill.trash.trash2-fill.trash2.trash3-fill.trash3.tree-fill.tree.trello.triangle-fill.triangle-half.triangle.trophy-fill.trophy.tropical-storm.truck-flatbed.truck-front-fill.truck-front.truck.tsunami.tv-fill.tv.twitch.twitter-x.twitter.type-bold.type-h1.type-h2.type-h3.type-h4.type-h5.type-h6.type-italic.type-strikethrough.type-underline.type.ubuntu.ui-checks-grid.ui-checks.ui-radios-grid.ui-radios.umbrella-fill.umbrella.unindent.union.unity.universal-access-circle.universal-access.unlock-fill.unlock.upc-scan.upc.upload.usb-c-fill.usb-c.usb-drive-fill.usb-drive.usb-fill.usb-micro-fill.usb-micro.usb-mini-fill.usb-mini.usb-plug-fill.usb-plug.usb-symbol.usb.valentine.valentine2.vector-pen.view-list.view-stacked.vignette.vimeo.vinyl-fill.vinyl.virus.virus2.voicemail.volume-down-fill.volume-down.volume-mute-fill.volume-mute.volume-off-fill.volume-off.volume-up-fill.volume-up.vr.wallet-fill.wallet.wallet2.watch.water.webcam-fill.webcam.wechat.whatsapp.wifi-1.wifi-2.wifi-off.wifi.wikipedia.wind.window-dash.window-desktop.window-dock.window-fullscreen.window-plus.window-sidebar.window-split.window-stack.window-x.window.windows.wordpress.wrench-adjustable-circle-fill.wrench-adjustable-circle.wrench-adjustable.wrench.x-circle-fill.x-circle.x-diamond-fill.x-diamond.x-lg.x-octagon-fill.x-octagon.x-square-fill.x-square.x.xbox.yelp.yin-yang.youtube.zoom-in.zoom-out`.split(`.`)},Ic=Object.keys(Fc),Lc=Fc,Rc=[`likec4lib {`,` icons {`,...[...Object.entries(Fc)].flatMap(([e,t])=>t.map(t=>e+`:`+t)).map(e=>` `+e),` }`,`}`].join(`
54
+ `),zc=`likec4builtin`,Bc=`${zc}:///likec4/lib/icons.c4`;function isLikeC4Builtin(e){return(`uri`in e?e.uri:e).scheme===zc}function isNotLikeC4Builtin(e){return!isLikeC4Builtin(e)}const Vc=ui(`/`),compareByUri=(e,t)=>Vc(ft(e.uri.path),ft(t.uri.path)),Hc=ui(`/`,!0),compareByUriDeepFirst=(e,t)=>Hc(ft(e.uri.path),ft(t.uri.path));var ADisposable=class{toDispose=[];isDisposed=!1;onDispose(...e){this.toDispose.push(...e)}dispose(){this.throwIfDisposed(),this.isDisposed=!0;let e;for(;e=this.toDispose.pop();)try{e.dispose()}catch(e){logWarnError(e)}}throwIfDisposed(){this.isDisposed&&Y.warn(`this has already been disposed`)}};const Uc=`AnyProperty`;function isAnyProperty(e){return X.isInstance(e,Uc)}const Wc=`ColorLiteral`;function isColorLiteral(e){return X.isInstance(e,Wc)}const Gc=`DeploymentElement`;function isDeploymentElement(e){return X.isInstance(e,Gc)}const Kc=`DeploymentNodeOrElementKind`,qc=`DeploymentViewRule`;function isDeploymentViewRule(e){return X.isInstance(e,qc)}const Jc=`DynamicViewProperty`,Yc=`DynamicViewRule`;function isDynamicViewRule(e){return X.isInstance(e,Yc)}const Xc=`ElementProperty`;function isElementProperty(e){return X.isInstance(e,Xc)}const Zc=`ExpressionV2`;function isExpressionV2(e){return X.isInstance(e,Zc)}const Qc=`ExtendElementOrRelation`;function isExtendElementOrRelation(e){return X.isInstance(e,Qc)}const $c=`FqnExpr`;function isFqnExpr(e){return X.isInstance(e,$c)}const el=`FqnExprOrWhere`;function isFqnExprOrWhere(e){return X.isInstance(e,el)}const tl=`FqnExprOrWith`;function isFqnExprOrWith(e){return X.isInstance(e,tl)}const nl=`FqnReferenceable`,rl=`LikeC4View`;function isLikeC4View(e){return X.isInstance(e,rl)}const il=`MetadataProperty`;function isMetadataProperty(e){return X.isInstance(e,il)}const al=`MetadataValue`,ol=`ModelElement`,sl=`Referenceable`,cl=`RelationExpr`;function isRelationExpr(e){return X.isInstance(e,cl)}const ll=`RelationExprOrWhere`;function isRelationExprOrWhere(e){return X.isInstance(e,ll)}const ul=`RelationExprOrWith`;function isRelationExprOrWith(e){return X.isInstance(e,ul)}const dl=`RelationProperty`,fl=`RelationshipStyleProperty`;function isRelationshipStyleProperty(e){return X.isInstance(e,fl)}const pl=`SizeProperty`;function isSizeProperty(e){return X.isInstance(e,pl)}const ml=`StepOrSeries`;function isStepOrSeries(e){return X.isInstance(e,ml)}const hl=`StepStatement`;function isStepStatement(e){return X.isInstance(e,hl)}const gl=`StringProperty`;function isStringProperty(e){return X.isInstance(e,gl)}const _l=`StyleProperty`;function isStyleProperty(e){return X.isInstance(e,_l)}const vl=`TryStep`;function isTryStep(e){return X.isInstance(e,vl)}const yl=`ViewProperty`;function isViewProperty(e){return X.isInstance(e,yl)}const bl=`ViewRule`;function isViewRule(e){return X.isInstance(e,bl)}const xl=`ViewRuleStyleOrGlobalRef`;function isViewRuleStyleOrGlobalRef(e){return X.isInstance(e,xl)}const Sl=`WhereElement`;function isWhereElement(e){return X.isInstance(e,Sl)}const Cl=`WhereElementExpression`;function isWhereElementExpression(e){return X.isInstance(e,Cl)}const wl=`WhereExpression`,Tl=`WhereKindEqual`;function isWhereKindEqual(e){return X.isInstance(e,Tl)}const El=`WhereMetadataEqual`;function isWhereMetadataEqual(e){return X.isInstance(e,El)}const Dl=`WhereRelation`;function isWhereRelation(e){return X.isInstance(e,Dl)}const Ol=`WhereRelationExpression`;function isWhereRelationExpression(e){return X.isInstance(e,Ol)}const kl=`WhereTagEqual`;function isWhereTagEqual(e){return X.isInstance(e,kl)}const Al=`AbstractStep`,jl=`AltSteps`;function isAltSteps(e){return X.isInstance(e,jl)}const Ml=`ArrowProperty`;function isArrowProperty(e){return X.isInstance(e,Ml)}const Nl=`BorderProperty`;function isBorderProperty(e){return X.isInstance(e,Nl)}const Pl=`CatchBlock`;function isCatchBlock(e){return X.isInstance(e,Pl)}const Fl=`ColorProperty`;function isColorProperty(e){return X.isInstance(e,Fl)}const Il=`CustomColor`,Ll=`CustomElementProperties`;function isCustomElementProperties(e){return X.isInstance(e,Ll)}const Rl=`CustomRelationProperties`;function isCustomRelationProperties(e){return X.isInstance(e,Rl)}const zl=`DeployedInstance`;function isDeployedInstance(e){return X.isInstance(e,zl)}const Bl=`DeployedInstanceBody`;function isDeployedInstanceBody(e){return X.isInstance(e,Bl)}const Vl=`DeploymentNode`;function isDeploymentNode$1(e){return X.isInstance(e,Vl)}t(isDeploymentNode$1,`isDeploymentNode`);const Hl=`DeploymentNodeBody`;function isDeploymentNodeBody(e){return X.isInstance(e,Hl)}const Ul=`DeploymentNodeKind`;function isDeploymentNodeKind(e){return X.isInstance(e,Ul)}const Wl=`DeploymentRelation`;function isDeploymentRelation(e){return X.isInstance(e,Wl)}const Gl=`DeploymentRelationBody`;function isDeploymentRelationBody(e){return X.isInstance(e,Gl)}const Kl=`DeploymentView`;function isDeploymentView$1(e){return X.isInstance(e,Kl)}t(isDeploymentView$1,`isDeploymentView`);const ql=`DeploymentViewBody`;function isDeploymentViewBody(e){return X.isInstance(e,ql)}const Jl=`DeploymentViewRulePredicate`;function isDeploymentViewRulePredicate(e){return X.isInstance(e,Jl)}const Yl=`DeploymentViewRuleStyle`;function isDeploymentViewRuleStyle(e){return X.isInstance(e,Yl)}const Xl=`DirectedRelationExpr`;function isDirectedRelationExpr(e){return X.isInstance(e,Xl)}const Zl=`DynamicView`;function isDynamicView$1(e){return X.isInstance(e,Zl)}t(isDynamicView$1,`isDynamicView`);const Ql=`DynamicViewBody`;function isDynamicViewBody(e){return X.isInstance(e,Ql)}const $l=`DynamicViewDisplayVariantProperty`;function isDynamicViewDisplayVariantProperty(e){return X.isInstance(e,$l)}const eu=`DynamicViewGlobalPredicateRef`;function isDynamicViewGlobalPredicateRef(e){return X.isInstance(e,eu)}const tu=`DynamicViewIncludePredicate`;function isDynamicViewIncludePredicate(e){return X.isInstance(e,tu)}const nu=`DynamicViewRef`,ru=`Element`;function isElement(e){return X.isInstance(e,ru)}const iu=`ElementBody`;function isElementBody(e){return X.isInstance(e,iu)}const au=`ElementKind`;function isElementKind(e){return X.isInstance(e,au)}const ou=`ElementKindExpression`;function isElementKindExpression(e){return X.isInstance(e,ou)}const su=`ElementRef`;function isElementRef(e){return X.isInstance(e,su)}const cu=`ElementStringProperty`;function isElementStringProperty(e){return X.isInstance(e,cu)}const lu=`ElementStyleProperty`;function isElementStyleProperty(e){return X.isInstance(e,lu)}const uu=`ElementTagExpression`;function isElementTagExpression(e){return X.isInstance(e,uu)}const du=`ElementView`;function isElementView$1(e){return X.isInstance(e,du)}t(isElementView$1,`isElementView`);const fu=`ElementViewBody`;function isElementViewBody(e){return X.isInstance(e,fu)}const pu=`ElementViewRef`,mu=`Expressions`;function isExpressions(e){return X.isInstance(e,mu)}const hu=`ExtendDeployment`;function isExtendDeployment(e){return X.isInstance(e,hu)}const gu=`ExtendDeploymentBody`;function isExtendDeploymentBody(e){return X.isInstance(e,gu)}const _u=`ExtendElement`;function isExtendElement(e){return X.isInstance(e,_u)}const vu=`ExtendElementBody`;function isExtendElementBody(e){return X.isInstance(e,vu)}const yu=`ExtendRelation`;function isExtendRelation(e){return X.isInstance(e,yu)}const bu=`ExtendRelationBody`;function isExtendRelationBody(e){return X.isInstance(e,bu)}const xu=`FinallyBlock`;function isFinallyBlock(e){return X.isInstance(e,xu)}const Su=`FqnExpressions`;function isFqnExpressions(e){return X.isInstance(e,Su)}const Cu=`FqnExprWhere`;function isFqnExprWhere(e){return X.isInstance(e,Cu)}const wu=`FqnExprWith`;function isFqnExprWith(e){return X.isInstance(e,wu)}const Tu=`FqnRef`;function isFqnRef(e){return X.isInstance(e,Tu)}const Eu=`FqnRefExpr`;function isFqnRefExpr(e){return X.isInstance(e,Eu)}const Du=`GlobalDynamicPredicateGroup`;function isGlobalDynamicPredicateGroup(e){return X.isInstance(e,Du)}const Ou=`GlobalPredicateGroup`;function isGlobalPredicateGroup(e){return X.isInstance(e,Ou)}const ku=`Globals`;function isGlobals(e){return X.isInstance(e,ku)}const Au=`GlobalStyle`;function isGlobalStyle(e){return X.isInstance(e,Au)}const ju=`GlobalStyleGroup`;function isGlobalStyleGroup(e){return X.isInstance(e,ju)}const Mu=`GlobalStyleId`,Nu=`HexColor`;function isHexColor(e){return X.isInstance(e,Nu)}const Pu=`IconColorProperty`;function isIconColorProperty(e){return X.isInstance(e,Pu)}const Fu=`IconPositionProperty`;function isIconPositionProperty(e){return X.isInstance(e,Fu)}const Iu=`IconProperty`;function isIconProperty(e){return X.isInstance(e,Iu)}const Lu=`IconSizeProperty`;function isIconSizeProperty(e){return X.isInstance(e,Lu)}const Ru=`Imported`;function isImported(e){return X.isInstance(e,Ru)}const zu=`ImportsFromPoject`;function isImportsFromPoject(e){return X.isInstance(e,zu)}const Bu=`IncomingRelationExpr`;function isIncomingRelationExpr(e){return X.isInstance(e,Bu)}const Vu=`InOutRelationExpr`;function isInOutRelationExpr(e){return X.isInstance(e,Vu)}const Hu=`LibIcon`;function isLibIcon(e){return X.isInstance(e,Hu)}const Uu=`LikeC4Grammar`;function isLikeC4Grammar(e){return X.isInstance(e,Uu)}const Wu=`LikeC4Lib`;function isLikeC4Lib(e){return X.isInstance(e,Wu)}const Gu=`LineProperty`;function isLineProperty(e){return X.isInstance(e,Gu)}const Ku=`LinkProperty`;function isLinkProperty(e){return X.isInstance(e,Ku)}const qu=`MarkdownOrString`;function isMarkdownOrString(e){return X.isInstance(e,qu)}const Ju=`MetadataArray`;function isMetadataArray(e){return X.isInstance(e,Ju)}const Yu=`MetadataAttribute`;function isMetadataAttribute(e){return X.isInstance(e,Yu)}const Xu=`MetadataBody`;function isMetadataBody(e){return X.isInstance(e,Xu)}const Zu=`Model`;function isModel(e){return X.isInstance(e,Zu)}const Qu=`ModelDeployments`;function isModelDeployments(e){return X.isInstance(e,Qu)}const $u=`ModelViews`;function isModelViews(e){return X.isInstance(e,$u)}const ed=`MultipleProperty`;function isMultipleProperty(e){return X.isInstance(e,ed)}const td=`NavigateToProperty`;function isNavigateToProperty(e){return X.isInstance(e,td)}const nd=`NotationProperty`;function isNotationProperty(e){return X.isInstance(e,nd)}const rd=`NotesProperty`;function isNotesProperty(e){return X.isInstance(e,rd)}const id=`OpacityProperty`;function isOpacityProperty(e){return X.isInstance(e,id)}const ad=`OutgoingRelationExpr`;function isOutgoingRelationExpr(e){return X.isInstance(e,ad)}const od=`PaddingSizeProperty`;function isPaddingSizeProperty(e){return X.isInstance(e,od)}const sd=`Relation`;function isRelation(e){return X.isInstance(e,sd)}const cd=`RelationBody`;function isRelationBody(e){return X.isInstance(e,cd)}const ld=`RelationExprWhere`;function isRelationExprWhere(e){return X.isInstance(e,ld)}const ud=`RelationExprWith`;function isRelationExprWith(e){return X.isInstance(e,ud)}const dd=`RelationKindDotRef`;function isRelationKindDotRef(e){return X.isInstance(e,dd)}const fd=`RelationNavigateToProperty`;function isRelationNavigateToProperty(e){return X.isInstance(e,fd)}const pd=`RelationshipKind`;function isRelationshipKind(e){return X.isInstance(e,pd)}const md=`RelationStringProperty`;function isRelationStringProperty(e){return X.isInstance(e,md)}const hd=`RelationStyleProperty`;function isRelationStyleProperty(e){return X.isInstance(e,hd)}const gd=`RGBAColor`;function isRGBAColor(e){return X.isInstance(e,gd)}const _d=`ShapeProperty`;function isShapeProperty(e){return X.isInstance(e,_d)}const vd=`ShapeSizeProperty`;function isShapeSizeProperty(e){return X.isInstance(e,vd)}const yd=`SpecificationColor`;function isSpecificationColor(e){return X.isInstance(e,yd)}const bd=`SpecificationDeploymentNodeKind`;function isSpecificationDeploymentNodeKind(e){return X.isInstance(e,bd)}const xd=`SpecificationElementKind`;function isSpecificationElementKind(e){return X.isInstance(e,xd)}const Sd=`SpecificationElementStringProperty`;function isSpecificationElementStringProperty(e){return X.isInstance(e,Sd)}const Cd=`SpecificationRelationshipKind`;function isSpecificationRelationshipKind(e){return X.isInstance(e,Cd)}const wd=`SpecificationRelationshipStringProperty`;function isSpecificationRelationshipStringProperty(e){return X.isInstance(e,wd)}const Td=`SpecificationRule`;function isSpecificationRule(e){return X.isInstance(e,Td)}const Ed=`SpecificationTag`;function isSpecificationTag(e){return X.isInstance(e,Ed)}const Dd=`StepsBlock`;function isStepsBlock(e){return X.isInstance(e,Dd)}const Od=`StrictFqnElementRef`;function isStrictFqnElementRef(e){return X.isInstance(e,Od)}const kd=`StrictFqnRef`;function isStrictFqnRef(e){return X.isInstance(e,kd)}function isTag(e){return X.isInstance(e,`Tag`)}const Ad=`TagRef`;function isTagRef(e){return X.isInstance(e,Ad)}const jd=`Tags`;function isTags(e){return X.isInstance(e,jd)}const Md=`TextSizeProperty`;function isTextSizeProperty(e){return X.isInstance(e,Md)}const Nd=`ViewOrderProperty`;function isViewOrderProperty(e){return X.isInstance(e,Nd)}const Pd=`ViewRef`,Fd=`ViewRuleAncestors`;function isViewRuleAncestors(e){return X.isInstance(e,Fd)}const Id=`ViewRuleAutoLayout`;function isViewRuleAutoLayout(e){return X.isInstance(e,Id)}const Ld=`ViewRuleGlobalPredicateRef`;function isViewRuleGlobalPredicateRef(e){return X.isInstance(e,Ld)}const Rd=`ViewRuleGlobalStyle`;function isViewRuleGlobalStyle(e){return X.isInstance(e,Rd)}const zd=`ViewRuleGroup`;function isViewRuleGroup(e){return X.isInstance(e,zd)}const Bd=`ViewRulePredicate`;function isViewRulePredicate(e){return X.isInstance(e,Bd)}const Vd=`ViewRuleRank`;function isViewRuleRank(e){return X.isInstance(e,Vd)}const Hd=`ViewRuleStyle`;function isViewRuleStyle(e){return X.isInstance(e,Hd)}const Ud=`ViewStringProperty`;function isViewStringProperty(e){return X.isInstance(e,Ud)}const Wd=`WhereBinaryExpression`;function isWhereBinaryExpression(e){return X.isInstance(e,Wd)}const Gd=`WhereElementKind`;function isWhereElementKind(e){return X.isInstance(e,Gd)}const Kd=`WhereElementMetadata`;function isWhereElementMetadata(e){return X.isInstance(e,Kd)}const qd=`WhereElementNegation`;function isWhereElementNegation(e){return X.isInstance(e,qd)}const Jd=`WhereElementTag`;function isWhereElementTag(e){return X.isInstance(e,Jd)}const Yd=`WhereRelationKind`;function isWhereRelationKind(e){return X.isInstance(e,Yd)}const Xd=`WhereRelationMetadata`;function isWhereRelationMetadata(e){return X.isInstance(e,Xd)}const Zd=`WhereRelationNegation`;function isWhereRelationNegation(e){return X.isInstance(e,Zd)}const Qd=`WhereRelationParticipantKind`;function isWhereRelationParticipantKind(e){return X.isInstance(e,Qd)}const $d=`WhereRelationParticipantMetadata`;function isWhereRelationParticipantMetadata(e){return X.isInstance(e,$d)}const ef=`WhereRelationParticipantTag`;function isWhereRelationParticipantTag(e){return X.isInstance(e,ef)}const tf=`WhereRelationTag`;function isWhereRelationTag(e){return X.isInstance(e,tf)}const nf=`WildcardExpression`;function isWildcardExpression(e){return X.isInstance(e,nf)}const rf=`Step`;function isStep(e){return X.isInstance(e,rf)}const af=`StepSeries`;function isStepSeries(e){return X.isInstance(e,af)}const of=`SubflowStep`;function isSubflowStep(e){return X.isInstance(e,of)}const sf=`TryBlock`;function isTryBlock(e){return X.isInstance(e,sf)}var LikeC4AstReflection=class extends ct{getAllTypes(){return[Al,jl,Uc,Ml,Nl,Pl,Wc,Fl,Il,Ll,Rl,zl,Bl,Gc,Vl,Hl,Ul,Kc,Wl,Gl,Kl,ql,qc,Jl,Yl,Xl,Zl,Ql,$l,eu,tu,Jc,nu,Yc,ru,iu,au,ou,Xc,su,cu,lu,uu,du,fu,pu,Zc,mu,hu,gu,_u,vu,Qc,`ExtendElementProperty`,yu,bu,`ExtendRelationProperty`,xu,$c,el,tl,Cu,wu,Su,Tu,Eu,nl,Du,Ou,Au,ju,Mu,ku,Nu,Pu,Fu,Iu,Lu,Ru,zu,Vu,Bu,Hu,Uu,Wu,rl,Gu,Ku,qu,Ju,Yu,Xu,il,al,Zu,Qu,ol,`ModelReferenceable`,$u,ed,td,nd,rd,id,ad,od,gd,sl,sd,cd,cl,ll,ul,ld,ud,dd,fd,dl,md,hd,pd,fl,_d,vd,pl,yd,bd,xd,Sd,Cd,wd,Td,Ed,rf,ml,af,hl,Dd,Od,kd,gl,_l,of,`Tag`,Ad,jd,Md,sf,vl,Nd,yl,Pd,bl,Fd,Id,Ld,Rd,zd,Bd,Vd,Hd,xl,Ud,Wd,Sl,Cl,Gd,Kd,qd,Jd,wl,Tl,El,Dl,Ol,Yd,Xd,Zd,Qd,$d,ef,tf,kl,nf]}computeIsSubtype(e,t){switch(e){case jl:case ml:case vl:return this.isSubtype(hl,t);case Ml:case Gu:return this.isSubtype(fl,t);case Nl:case Pu:case Fu:case ed:case id:case _d:return this.isSubtype(_l,t);case Pl:case xu:return this.isSubtype(vl,t);case Fl:return this.isSubtype(`RelationshipStyleProperty`,t)||this.isSubtype(`StyleProperty`,t);case zl:case Vl:return this.isSubtype(`DeploymentElement`,t)||this.isSubtype(`Referenceable`,t);case Ul:case au:return this.isSubtype(Kc,t);case Kl:case Zl:case du:return this.isSubtype(rl,t);case Jl:case Yl:case Fd:return this.isSubtype(qc,t);case Xl:case Bu:case Vu:case ad:return this.isSubtype(cl,t);case $l:return this.isSubtype(Jc,t);case eu:case tu:return this.isSubtype(Yc,t);case Jc:case Xc:case td:case dl:case fl:case gl:case _l:return this.isSubtype(Uc,t);case ru:return this.isSubtype(`FqnReferenceable`,t)||this.isSubtype(`ModelElement`,t)||this.isSubtype(`ModelReferenceable`,t)||this.isSubtype(`Referenceable`,t);case ou:case uu:case Eu:case nf:return this.isSubtype($c,t);case cu:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`StringProperty`,t);case lu:return this.isSubtype(Xc,t);case hu:case sl:return this.isSubtype(nl,t);case _u:return this.isSubtype(`ExtendElementOrRelation`,t)||this.isSubtype(`FqnReferenceable`,t);case Qc:case sd:return this.isSubtype(ol,t);case yu:return this.isSubtype(Qc,t);case $c:case Cu:return this.isSubtype(el,t);case el:case wu:return this.isSubtype(tl,t);case tl:case ul:return this.isSubtype(Zc,t);case Nu:case gd:return this.isSubtype(Wc,t);case Iu:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`StyleProperty`,t);case Lu:case od:case vd:case Md:return this.isSubtype(`SizeProperty`,t)||this.isSubtype(`StyleProperty`,t);case Ru:return this.isSubtype(`ModelReferenceable`,t)||this.isSubtype(`Referenceable`,t);case Ku:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`ExtendElementProperty`,t)||this.isSubtype(`ExtendRelationProperty`,t)||this.isSubtype(`RelationProperty`,t)||this.isSubtype(`ViewProperty`,t);case qu:case Ju:return this.isSubtype(al,t);case Yu:case nd:case rd:case Sd:case wd:return this.isSubtype(gl,t);case Xu:return this.isSubtype(il,t);case il:return this.isSubtype(`ElementProperty`,t)||this.isSubtype(`ExtendElementProperty`,t)||this.isSubtype(`ExtendRelationProperty`,t)||this.isSubtype(`RelationProperty`,t);case cl:case ld:return this.isSubtype(ll,t);case ll:case ud:return this.isSubtype(ul,t);case fd:case hd:return this.isSubtype(dl,t);case md:return this.isSubtype(`RelationProperty`,t)||this.isSubtype(`StringProperty`,t);case rf:case af:return this.isSubtype(`AbstractStep`,t)||this.isSubtype(`StepOrSeries`,t);case of:return this.isSubtype(`StepStatement`,t)||this.isSubtype(`StepsBlock`,t);case sf:return this.isSubtype(`StepsBlock`,t)||this.isSubtype(`TryStep`,t);case Nd:return this.isSubtype(yl,t);case yl:return this.isSubtype(`AnyProperty`,t)||this.isSubtype(`DynamicViewProperty`,t);case Id:return this.isSubtype(`DeploymentViewRule`,t)||this.isSubtype(`DynamicViewRule`,t)||this.isSubtype(`ViewRule`,t);case Ld:case zd:case Bd:case Vd:return this.isSubtype(bl,t);case Rd:case Hd:return this.isSubtype(xl,t);case xl:return this.isSubtype(`DynamicViewRule`,t)||this.isSubtype(`ViewRule`,t);case Ud:return this.isSubtype(`StringProperty`,t)||this.isSubtype(`ViewProperty`,t);case Wd:return this.isSubtype(`WhereElementExpression`,t)||this.isSubtype(`WhereRelationExpression`,t);case Sl:case qd:return this.isSubtype(Cl,t);case Cl:case Ol:return this.isSubtype(wl,t);case Gd:return this.isSubtype(`WhereElement`,t)||this.isSubtype(`WhereKindEqual`,t);case Kd:return this.isSubtype(`WhereElement`,t)||this.isSubtype(`WhereMetadataEqual`,t);case Jd:return this.isSubtype(`WhereElement`,t)||this.isSubtype(`WhereTagEqual`,t);case Dl:case Zd:return this.isSubtype(Ol,t);case Yd:case Qd:return this.isSubtype(`WhereKindEqual`,t)||this.isSubtype(`WhereRelation`,t);case Xd:case $d:return this.isSubtype(`WhereMetadataEqual`,t)||this.isSubtype(`WhereRelation`,t);case ef:case tf:return this.isSubtype(`WhereRelation`,t)||this.isSubtype(`WhereTagEqual`,t);default:return!1}}getReferenceType(e){let t=`${e.container.$type}:${e.property}`;switch(t){case`AbstractStep:kind`:case`DeploymentRelation:kind`:case`ExtendRelation:kind`:case`OutgoingRelationExpr:kind`:case`Relation:kind`:case`RelationKindDotRef:kind`:case`Step:kind`:case`StepSeries:kind`:case`WhereRelationKind:value`:return pd;case`ColorProperty:customColor`:case`IconColorProperty:customColor`:case`SpecificationTag:customColor`:return Il;case`DeploymentNode:kind`:return Ul;case`DynamicViewGlobalPredicateRef:predicate`:return Du;case`DynamicViewRef:view`:return Zl;case`Element:kind`:case`ElementKindExpression:kind`:return au;case`ElementViewRef:view`:return du;case`FqnRef:value`:case`StrictFqnRef:value`:return sl;case`IconProperty:libicon`:return Hu;case`Imported:imported`:case`StrictFqnElementRef:el`:return ru;case`TagRef:tag`:return`Tag`;case`ViewRef:view`:return rl;case`ViewRuleGlobalPredicateRef:predicate`:return Ou;case`ViewRuleGlobalStyle:style`:return Mu;case`WhereElementKind:value`:case`WhereRelationParticipantKind:value`:return Kc;default:throw Error(`${t} is not a valid reference id.`)}}getTypeMetaData(e){switch(e){case Al:return{name:Al,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`target`},{name:`title`}]};case jl:return{name:jl,properties:[{name:`branches`,defaultValue:[]},{name:`title`}]};case Ml:return{name:Ml,properties:[{name:`key`},{name:`value`}]};case Nl:return{name:Nl,properties:[{name:`key`},{name:`value`}]};case Pl:return{name:Pl,properties:[{name:`catch`},{name:`title`},{name:`try`}]};case Fl:return{name:Fl,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case Il:return{name:Il,properties:[{name:`name`}]};case Ll:return{name:Ll,properties:[{name:`props`,defaultValue:[]}]};case Rl:return{name:Rl,properties:[{name:`props`,defaultValue:[]}]};case zl:return{name:zl,properties:[{name:`body`},{name:`name`},{name:`summary`},{name:`target`},{name:`title`}]};case Bl:return{name:Bl,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Vl:return{name:Vl,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`summary`},{name:`title`}]};case Hl:return{name:Hl,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case Ul:return{name:Ul,properties:[{name:`name`}]};case Wl:return{name:Wl,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`isBidirectional`,defaultValue:!1},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case Gl:return{name:Gl,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case Kl:return{name:Kl,properties:[{name:`body`},{name:`name`}]};case ql:return{name:ql,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case Jl:return{name:Jl,properties:[{name:`expr`},{name:`isInclude`,defaultValue:!1}]};case Yl:return{name:Yl,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case Xl:return{name:Xl,properties:[{name:`source`},{name:`target`}]};case Zl:return{name:Zl,properties:[{name:`body`},{name:`name`}]};case Ql:return{name:Ql,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`steps`,defaultValue:[]},{name:`tags`}]};case $l:return{name:$l,properties:[{name:`key`},{name:`value`}]};case eu:return{name:eu,properties:[{name:`predicate`}]};case tu:return{name:tu,properties:[{name:`exprs`}]};case nu:return{name:nu,properties:[{name:`view`}]};case ru:return{name:ru,properties:[{name:`body`},{name:`kind`},{name:`name`},{name:`props`,defaultValue:[]}]};case iu:return{name:iu,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case au:return{name:au,properties:[{name:`name`}]};case ou:return{name:ou,properties:[{name:`isEqual`,defaultValue:!1},{name:`kind`}]};case su:return{name:su,properties:[{name:`modelElement`}]};case cu:return{name:cu,properties:[{name:`key`},{name:`value`}]};case lu:return{name:lu,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case uu:return{name:uu,properties:[{name:`isEqual`,defaultValue:!1},{name:`tag`}]};case du:return{name:du,properties:[{name:`body`},{name:`extends`},{name:`name`},{name:`viewOf`}]};case fu:return{name:fu,properties:[{name:`props`,defaultValue:[]},{name:`rules`,defaultValue:[]},{name:`tags`}]};case pu:return{name:pu,properties:[{name:`view`}]};case mu:return{name:mu,properties:[{name:`prev`},{name:`value`}]};case hu:return{name:hu,properties:[{name:`body`},{name:`deploymentNode`}]};case gu:return{name:gu,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case _u:return{name:_u,properties:[{name:`body`},{name:`element`}]};case vu:return{name:vu,properties:[{name:`elements`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`tags`}]};case yu:return{name:yu,properties:[{name:`body`},{name:`dotKind`},{name:`isBidirectional`,defaultValue:!1},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case bu:return{name:bu,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case xu:return{name:xu,properties:[{name:`finally`},{name:`title`},{name:`tryCatch`}]};case Su:return{name:Su,properties:[{name:`prev`},{name:`value`}]};case Cu:return{name:Cu,properties:[{name:`subject`},{name:`where`}]};case wu:return{name:wu,properties:[{name:`custom`},{name:`subject`}]};case Tu:return{name:Tu,properties:[{name:`parent`},{name:`value`}]};case Eu:return{name:Eu,properties:[{name:`ref`},{name:`selector`}]};case Du:return{name:Du,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case Ou:return{name:Ou,properties:[{name:`name`},{name:`predicates`,defaultValue:[]}]};case ku:return{name:ku,properties:[{name:`name`},{name:`predicates`,defaultValue:[]},{name:`styles`,defaultValue:[]}]};case Au:return{name:Au,properties:[{name:`id`},{name:`props`,defaultValue:[]},{name:`targets`}]};case ju:return{name:ju,properties:[{name:`id`},{name:`styles`,defaultValue:[]}]};case Mu:return{name:Mu,properties:[{name:`name`}]};case Nu:return{name:Nu,properties:[{name:`hex`}]};case Pu:return{name:Pu,properties:[{name:`customColor`},{name:`key`},{name:`themeColor`}]};case Fu:return{name:Fu,properties:[{name:`key`},{name:`value`}]};case Iu:return{name:Iu,properties:[{name:`key`},{name:`libicon`},{name:`value`}]};case Lu:return{name:Lu,properties:[{name:`key`},{name:`value`}]};case Ru:return{name:Ru,properties:[{name:`imported`},{name:`prev`}]};case zu:return{name:zu,properties:[{name:`imports`},{name:`project`}]};case Bu:return{name:Bu,properties:[{name:`to`}]};case Vu:return{name:Vu,properties:[{name:`inout`}]};case Hu:return{name:Hu,properties:[{name:`name`}]};case Uu:return{name:Uu,properties:[{name:`deployments`,defaultValue:[]},{name:`globals`,defaultValue:[]},{name:`imports`,defaultValue:[]},{name:`likec4lib`,defaultValue:[]},{name:`models`,defaultValue:[]},{name:`specifications`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case Wu:return{name:Wu,properties:[{name:`icons`,defaultValue:[]}]};case Gu:return{name:Gu,properties:[{name:`key`},{name:`value`}]};case Ku:return{name:Ku,properties:[{name:`key`},{name:`title`},{name:`value`}]};case qu:return{name:qu,properties:[{name:`markdown`},{name:`text`}]};case Ju:return{name:Ju,properties:[{name:`values`,defaultValue:[]}]};case Yu:return{name:Yu,properties:[{name:`boolValue`,defaultValue:!1},{name:`key`},{name:`value`}]};case Xu:return{name:Xu,properties:[{name:`props`,defaultValue:[]}]};case Zu:return{name:Zu,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case Qu:return{name:Qu,properties:[{name:`elements`,defaultValue:[]},{name:`name`}]};case $u:return{name:$u,properties:[{name:`folder`},{name:`name`},{name:`styles`,defaultValue:[]},{name:`views`,defaultValue:[]}]};case ed:return{name:ed,properties:[{name:`key`},{name:`value`,defaultValue:!1}]};case td:return{name:td,properties:[{name:`key`},{name:`value`}]};case nd:return{name:nd,properties:[{name:`key`},{name:`value`}]};case rd:return{name:rd,properties:[{name:`key`},{name:`value`}]};case id:return{name:id,properties:[{name:`key`},{name:`value`}]};case ad:return{name:ad,properties:[{name:`dotKind`},{name:`from`},{name:`isBidirectional`,defaultValue:!1},{name:`kind`}]};case od:return{name:od,properties:[{name:`key`},{name:`value`}]};case sd:return{name:sd,properties:[{name:`body`},{name:`description`},{name:`dotKind`},{name:`isBidirectional`,defaultValue:!1},{name:`kind`},{name:`source`},{name:`tags`},{name:`target`},{name:`technology`},{name:`title`}]};case cd:return{name:cd,properties:[{name:`props`,defaultValue:[]},{name:`tags`}]};case ld:return{name:ld,properties:[{name:`subject`},{name:`where`}]};case ud:return{name:ud,properties:[{name:`custom`},{name:`subject`}]};case dd:return{name:dd,properties:[{name:`kind`}]};case fd:return{name:fd,properties:[{name:`key`},{name:`value`}]};case pd:return{name:pd,properties:[{name:`name`}]};case md:return{name:md,properties:[{name:`key`},{name:`value`}]};case hd:return{name:hd,properties:[{name:`key`},{name:`props`,defaultValue:[]}]};case gd:return{name:gd,properties:[{name:`alpha`},{name:`blue`},{name:`green`},{name:`red`}]};case _d:return{name:_d,properties:[{name:`key`},{name:`value`}]};case vd:return{name:vd,properties:[{name:`key`},{name:`value`}]};case yd:return{name:yd,properties:[{name:`color`},{name:`name`}]};case bd:return{name:bd,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case xd:return{name:xd,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case Sd:return{name:Sd,properties:[{name:`key`},{name:`value`}]};case Cd:return{name:Cd,properties:[{name:`kind`},{name:`props`,defaultValue:[]},{name:`tags`}]};case wd:return{name:wd,properties:[{name:`key`},{name:`value`}]};case Td:return{name:Td,properties:[{name:`colors`,defaultValue:[]},{name:`deploymentNodes`,defaultValue:[]},{name:`elements`,defaultValue:[]},{name:`name`},{name:`relationships`,defaultValue:[]},{name:`tags`,defaultValue:[]}]};case Ed:return{name:Ed,properties:[{name:`color`},{name:`customColor`},{name:`tag`},{name:`themeColor`}]};case Dd:return{name:Dd,properties:[{name:`steps`,defaultValue:[]}]};case Od:return{name:Od,properties:[{name:`el`},{name:`parent`}]};case kd:return{name:kd,properties:[{name:`parent`},{name:`value`}]};case`Tag`:return{name:`Tag`,properties:[{name:`name`}]};case Ad:return{name:Ad,properties:[{name:`tag`}]};case jd:return{name:jd,properties:[{name:`prev`},{name:`values`,defaultValue:[]}]};case Md:return{name:Md,properties:[{name:`key`},{name:`value`}]};case Nd:return{name:Nd,properties:[{name:`key`},{name:`value`}]};case Pd:return{name:Pd,properties:[{name:`view`}]};case Fd:return{name:Fd,properties:[{name:`key`},{name:`value`,defaultValue:!1}]};case Id:return{name:Id,properties:[{name:`direction`},{name:`nodeSep`},{name:`rankSep`}]};case Ld:return{name:Ld,properties:[{name:`predicate`}]};case Rd:return{name:Rd,properties:[{name:`style`}]};case zd:return{name:zd,properties:[{name:`groupRules`,defaultValue:[]},{name:`props`,defaultValue:[]},{name:`title`}]};case Bd:return{name:Bd,properties:[{name:`exprs`},{name:`isInclude`,defaultValue:!1}]};case Vd:return{name:Vd,properties:[{name:`targets`},{name:`value`}]};case Hd:return{name:Hd,properties:[{name:`props`,defaultValue:[]},{name:`targets`}]};case Ud:return{name:Ud,properties:[{name:`key`},{name:`value`}]};case Wd:return{name:Wd,properties:[{name:`left`},{name:`operator`},{name:`right`}]};case Gd:return{name:Gd,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Kd:return{name:Kd,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case qd:return{name:qd,properties:[{name:`value`}]};case Jd:return{name:Jd,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Yd:return{name:Yd,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Xd:return{name:Xd,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case Zd:return{name:Zd,properties:[{name:`value`}]};case Qd:return{name:Qd,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case $d:return{name:$d,properties:[{name:`key`},{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case ef:return{name:ef,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`participant`},{name:`value`}]};case tf:return{name:tf,properties:[{name:`not`,defaultValue:!1},{name:`operator`},{name:`value`}]};case nf:return{name:nf,properties:[{name:`isWildcard`,defaultValue:!1}]};case rf:return{name:rf,properties:[{name:`custom`},{name:`dotKind`},{name:`isBackward`,defaultValue:!1},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case af:return{name:af,properties:[{name:`custom`},{name:`dotKind`},{name:`kind`},{name:`source`},{name:`target`},{name:`title`}]};case of:return{name:of,properties:[{name:`kind`},{name:`steps`,defaultValue:[]},{name:`title`}]};case sf:return{name:sf,properties:[{name:`steps`,defaultValue:[]},{name:`title`}]};default:return{name:e,properties:[]}}}};const X=new LikeC4AstReflection;let cf;const LikeC4Grammar=()=>cf??=ot(`{"$type":"Grammar","isDeclared":true,"name":"LikeC4","rules":[{"$type":"ParserRule","entry":true,"name":"LikeC4Grammar","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"imports","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"Assignment","feature":"specifications","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}},{"$type":"Assignment","feature":"models","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"Assignment","feature":"views","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@45"},"arguments":[]}},{"$type":"Assignment","feature":"globals","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@134"},"arguments":[]}},{"$type":"Assignment","feature":"deployments","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@119"},"arguments":[]}},{"$type":"Assignment","feature":"likec4lib","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}}],"cardinality":"*"},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LikeC4Lib","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"likec4lib"},{"$type":"Keyword","value":"{"},{"$type":"Keyword","value":"icons"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"icons","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},"cardinality":"+"},{"$type":"Keyword","value":"}"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LibIcon","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Tag","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationshipKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomColor","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNodeKind","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRule","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"specification"}},{"$type":"Keyword","value":"{"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"relationships","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}},{"$type":"Assignment","feature":"colors","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}},{"$type":"Assignment","feature":"deploymentNodes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationElementKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"element"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@158"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationElementStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"notation"},{"$type":"Keyword","value":"summary"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationDeploymentNodeKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"deploymentNode"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@158"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationTag","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"tag"},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Group","elements":[{"$type":"Keyword","value":"color"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]},{"$type":"Assignment","feature":"color","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@171"},"arguments":[]}}]}],"cardinality":"?"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationColor","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"color"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"color","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@171"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRelationshipKind","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"relationship"},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SpecificationRelationshipStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"notation"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ImportsFromPoject","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"import"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"imports","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}},{"$type":"Keyword","value":"}"}]},{"$type":"Assignment","feature":"imports","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Keyword","value":"from"},{"$type":"Assignment","feature":"project","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Imported","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"imported","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@21"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Imported"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"imported","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@21"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Tags","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]},"cardinality":"+"},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Tags"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]},"cardinality":"*"}],"cardinality":"*"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Model","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"model"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ModelElement","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@25"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Element","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@158"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@40"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"summary"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElementOrRelation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ExtendRelation"}},{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@35"},"arguments":[]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ExtendElement"}},{"$type":"Assignment","feature":"element","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@31"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@26"},"arguments":[]}}]}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElementBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@27"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@34"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendElementProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@40"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendRelationProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@40"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementRef","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Assignment","feature":"modelElement","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StrictFqnElementRef","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@21"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@1"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Assignment","feature":"el","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@21"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnRef","returnType":{"$ref":"#/interfaces@2"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@2"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StrictFqnRef","returnType":{"$ref":"#/interfaces@3"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@3"},"feature":"parent","operator":"="},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@1"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Relation","parameters":[{"$type":"Parameter","name":"isExplicit"}],"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","guardCondition":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@34/parameters@0"}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}}]},{"$type":"Group","guardCondition":{"$type":"Negation","value":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@34/parameters@0"}}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]},"cardinality":"?"}]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@35"},"arguments":[]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@36"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"RelationConnector","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBidirectional","operator":"?=","terminal":{"$type":"Keyword","value":"]<->"}},{"$type":"Keyword","value":"]->"}]}]},{"$type":"Assignment","feature":"isBidirectional","operator":"?=","terminal":{"$type":"Keyword","value":"<->"}},{"$type":"Keyword","value":"->"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@38"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@78"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@39"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@40"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"technology"},{"$type":"Keyword","value":"description"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationStyleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"style"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataProperty","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@41"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@42"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataAttribute","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@43"},"arguments":[]}},{"$type":"Assignment","feature":"boolValue","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataValue","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@44"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataArray","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"["},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"values","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"]"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ModelViews","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"views"}},{"$type":"Assignment","feature":"folder","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"views","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@46"},"arguments":[]}},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@71"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LikeC4ViewRule","returnType":{"$ref":"#/types@2"},"definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@48"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@128"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@47"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"extends"},{"$type":"Assignment","feature":"extends","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@50"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"of"},{"$type":"Assignment","feature":"viewOf","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}}]}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@52"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"dynamic"},{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@53"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@2"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@47"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewRef","definition":{"$type":"Assignment","feature":"view","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@48"},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@56"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@60"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@54"},"arguments":[]},"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"steps","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@106"},"arguments":[]}},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@64"},"arguments":[]}}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@55"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@56"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewDisplayVariantProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"variant"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@57"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@58"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@140"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewStringProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"title"},{"$type":"Keyword","value":"description"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewOrderProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"order"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewLayoutDirection","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"TopBottom"},{"$type":"Keyword","value":"LeftRight"},{"$type":"Keyword","value":"BottomTop"},{"$type":"Keyword","value":"RightLeft"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@66"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@63"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@71"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@72"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@61"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleRank","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"rank"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@62"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@92"},"arguments":[]}},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RankValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"same"},{"$type":"Keyword","value":"min"},{"$type":"Keyword","value":"max"},{"$type":"Keyword","value":"source"},{"$type":"Keyword","value":"sink"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"group"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@142"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@143"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"groupRules","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@66"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@63"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@67"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@68"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@71"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@72"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRulePredicate","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isInclude","operator":"?=","terminal":{"$type":"Keyword","value":"include"}},{"$type":"Keyword","value":"exclude"}]},{"$type":"Assignment","feature":"exprs","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGlobalPredicateRef","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"predicate"},{"$type":"Assignment","feature":"predicate","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@135"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewIncludePredicate","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"include"},{"$type":"Assignment","feature":"exprs","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewGlobalPredicateRef","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"predicate"},{"$type":"Assignment","feature":"predicate","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@136"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@92"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleGlobalStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"global"},{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"style","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@137"},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleStyleOrGlobalRef","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@69"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@70"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleAutoLayout","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"autoLayout"},{"$type":"Assignment","feature":"direction","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@59"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"rankSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]}},{"$type":"Assignment","feature":"nodeSep","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NotationProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"notation"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NotesProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"notes"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@176"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomElementProperties","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@77"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomRelationProperties","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@78"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@38"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@74"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@161"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NavigateToProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"navigateTo"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@49"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationNavigateToProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"navigateTo"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@51"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Expressions","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@80"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"Expressions"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@80"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExpressionV2","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@83"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@81"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExprOrWith","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@82"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExprWith"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"with"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@75"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExprOrWhere","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExprWhere"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"where"},{"$type":"Assignment","feature":"where","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@93"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExprOrWith","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@84"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"RelationExprWith"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"with"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExprOrWhere","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@87"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"RelationExprWhere"},"feature":"subject","operator":"="},{"$type":"Keyword","value":"where"},{"$type":"Assignment","feature":"where","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@100"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExpr","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WildcardExpression"}},{"$type":"Assignment","feature":"isWildcard","operator":"?=","terminal":{"$type":"Keyword","value":"*"}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementTagExpression"}},{"$type":"Keyword","value":"element.tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]},{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"ElementKindExpression"}},{"$type":"Keyword","value":"element.kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@181"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@3"},"deprecatedSyntax":false}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@86"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnRefExpr","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"ref","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Assignment","feature":"selector","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@191"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@192"},"arguments":[]}]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationExpr","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@88"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@90"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"InOutRelationExpr","inferredType":{"$type":"InferredType","name":"RelationExpr"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@89"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"InOutRelationExpr"},"feature":"inout","operator":"="},{"$type":"Keyword","value":"->"}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IncomingRelationExpr","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"->"},{"$type":"Assignment","feature":"to","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DirectedRelationExpr","inferredType":{"$type":"InferredType","name":"RelationExpr"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@91"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"DirectedRelationExpr"},"feature":"source","operator":"="},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"OutgoingRelationExpr","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"from","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBidirectional","operator":"?=","terminal":{"$type":"Keyword","value":"<->"}},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FqnExpressions","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"FqnExpressions"},"feature":"prev","operator":"="},{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@85"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@94"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementOr","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"or"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@95"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementAnd","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"and"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@96"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementPrimary","inferredType":{"$type":"InferredType","name":"WhereElementExpression"},"definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"("},{"$type":"RuleCall","rule":{"$ref":"#/rules@93"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@97"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@98"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElementNegation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"not"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@93"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereElement","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementMetadata"}},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@99"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereElementKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@5"},"deprecatedSyntax":false}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MetadataFilterValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationExpression","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@101"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationOr","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"or"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@102"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationAnd","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@103"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereBinaryExpression"},"feature":"left","operator":"="},{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"and"}},{"$type":"Assignment","feature":"right","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@103"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationPrimary","inferredType":{"$type":"InferredType","name":"WhereRelationExpression"},"definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"("},{"$type":"RuleCall","rule":{"$ref":"#/rules@100"},"arguments":[]},{"$type":"Keyword","value":")"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@104"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@105"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelationNegation","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"not"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@100"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"WhereRelation","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantMetadata"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@170"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@99"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantKind"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@170"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/types@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationParticipantTag"}},{"$type":"Assignment","feature":"participant","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@170"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationMetadata"}},{"$type":"Keyword","value":"metadata"},{"$type":"RuleCall","rule":{"$ref":"#/rules@194"},"arguments":[]},{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@99"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationKind"}},{"$type":"Keyword","value":"kind"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}}]},{"$type":"Group","elements":[{"$type":"Action","inferredType":{"$type":"InferredType","name":"WhereRelationTag"}},{"$type":"Keyword","value":"tag"},{"$type":"RuleCall","rule":{"$ref":"#/rules@180"},"arguments":[]},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@162"},"arguments":[]}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StepStatement","returnType":{"$ref":"#/types@10"},"definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@115"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@111"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@117"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"StepsBlockFragment","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"steps","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@106"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SubflowKind","returnType":{"$ref":"#/types@11"},"definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"opt"},{"$type":"Keyword","value":"par"},{"$type":"Keyword","value":"parallel"},{"$type":"Keyword","value":"loop"},{"$type":"Keyword","value":"when"},{"$type":"Keyword","value":"if"},{"$type":"Keyword","value":"else"},{"$type":"Keyword","value":"break"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SubflowStep","returnType":{"$ref":"#/interfaces@5"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@108"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@107"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StepsBlock","returnType":{"$ref":"#/interfaces@4"},"definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@107"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false,"$comment":"/**\\n * Represents a block of step statements, i.e. { ... }\\n */"},{"$type":"ParserRule","name":"TryStep","returnType":{"$ref":"#/types@12"},"definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@112"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"FinallyBlock","returnType":{"$ref":"#/interfaces@8"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@113"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@8"},"feature":"tryCatch","operator":"="},{"$type":"Keyword","value":"finally"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"finally","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@110"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CatchBlock","returnType":{"$ref":"#/interfaces@7"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@114"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@7"},"feature":"try","operator":"="},{"$type":"Keyword","value":"catch"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"catch","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@110"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TryBlock","returnType":{"$ref":"#/interfaces@6"},"definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"try"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@107"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"AltSteps","returnType":{"$ref":"#/interfaces@9"},"definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"alt"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"branches","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@109"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"StepTarget","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StepSeries","returnType":{"$ref":"#/interfaces@12"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@118"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Action","type":{"$ref":"#/interfaces@12"},"feature":"source","operator":"="},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},"cardinality":"?"}],"cardinality":"*"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Step","returnType":{"$ref":"#/interfaces@11"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isBackward","operator":"?=","terminal":{"$type":"Keyword","value":"<-"}},{"$type":"Assignment","feature":"dotKind","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@163"},"arguments":[]}},{"$type":"Keyword","value":"->"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-["},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"deprecatedSyntax":false}},{"$type":"Keyword","value":"]->"}]}]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"custom","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@76"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ModelDeployments","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"deployment"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@120"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@126"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@124"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNode","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@7"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}}]}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@121"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentNodeBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@122"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@126"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@120"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeployedInstance","definition":{"$type":"Group","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]}],"cardinality":"?"},{"$type":"Keyword","value":"instanceOf"},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@30"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Assignment","feature":"summary","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@123"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeployedInstanceBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@126"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":false},"calledByName":false}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendDeployment","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"extend"},{"$type":"Assignment","feature":"deploymentNode","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@33"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@125"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ExtendDeploymentBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@27"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"elements","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@122"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@126"},"arguments":[{"$type":"NamedArgument","value":{"$type":"BooleanLiteral","true":true},"calledByName":false}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@120"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentRelation","parameters":[{"$type":"Parameter","name":"isExplicit"}],"definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","guardCondition":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@126/parameters@0"}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}}]},{"$type":"Group","guardCondition":{"$type":"Negation","value":{"$type":"ParameterReference","parameter":{"$ref":"#/rules@126/parameters@0"}}},"elements":[{"$type":"Assignment","feature":"source","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]},"cardinality":"?"}]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@35"},"arguments":[]},{"$type":"Assignment","feature":"target","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@32"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"description","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}},{"$type":"Assignment","feature":"technology","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"}],"cardinality":"?"}],"cardinality":"?"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@127"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentRelationBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@37"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentView","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"deployment"},{"$type":"Keyword","value":"view"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}},{"$type":"Assignment","feature":"body","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@129"},"arguments":[]},"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewBody","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"tags","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@56"},"arguments":[]},"cardinality":"*"},{"$type":"Assignment","feature":"rules","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@130"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRule","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@133"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@132"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@72"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@131"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ViewRuleAncestors","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"includeAncestors"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRuleStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@92"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DeploymentViewRulePredicate","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isInclude","operator":"?=","terminal":{"$type":"Keyword","value":"include"}},{"$type":"Keyword","value":"exclude"}]},{"$type":"Assignment","feature":"expr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@79"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Globals","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"global"}},{"$type":"Keyword","value":"{"},{"$type":"Group","elements":[{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@135"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@136"},"arguments":[]}]},"cardinality":"*"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@138"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@139"},"arguments":[]}]},"cardinality":"*"}],"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalPredicateGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"predicateGroup"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@203"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@65"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalDynamicPredicateGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"dynamicPredicateGroup"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@203"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"predicates","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@67"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyleId","definition":{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@203"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyle","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"style"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@137"},"arguments":[]}},{"$type":"Assignment","feature":"targets","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@92"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@73"},"arguments":[]}]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"GlobalStyleGroup","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"styleGroup"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@137"},"arguments":[]}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"styles","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@69"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LinkProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"link"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@175"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]},"cardinality":"?"},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"ColorRef","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"themeColor","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@168"},"arguments":[]}},{"$type":"Assignment","feature":"customColor","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@6"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@177"},"arguments":[]},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ColorProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"color"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"OpacityProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"opacity"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@198"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MultipleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"multiple"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@186"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"icon"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"libicon","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@2"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@174"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"RuleCall","rule":{"$ref":"#/rules@175"},"arguments":[]}]}}]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconColorProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconColor"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@141"},"arguments":[]},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconSize"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconPositionValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"left"},{"$type":"Keyword","value":"right"},{"$type":"Keyword","value":"top"},{"$type":"Keyword","value":"bottom"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconPositionProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"iconPosition"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ShapeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"shape"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@169"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"BorderStyleValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},{"$type":"Keyword","value":"none"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"BorderProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"border"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@151"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"SizeValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"xs"},{"$type":"Keyword","value":"sm"},{"$type":"Keyword","value":"md"},{"$type":"Keyword","value":"lg"},{"$type":"Keyword","value":"xl"},{"$type":"Keyword","value":"xsmall"},{"$type":"Keyword","value":"small"},{"$type":"Keyword","value":"medium"},{"$type":"Keyword","value":"large"},{"$type":"Keyword","value":"xlarge"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ShapeSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"size"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PaddingSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"padding"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TextSizeProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"textSize"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"StyleProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@142"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@150"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@152"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@143"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@145"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@146"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@144"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@154"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@155"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@156"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@147"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@149"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementStyleProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"style"}},{"$type":"Keyword","value":"{"},{"$type":"Assignment","feature":"props","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@157"},"arguments":[]},"cardinality":"*"},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LineProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Keyword","value":"line"}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ArrowProperty","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"key","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"head"},{"$type":"Keyword","value":"tail"}]}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]}},{"$type":"Keyword","value":";","cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationshipStyleProperty","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@142"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@159"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@160"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"TagRef","definition":{"$type":"Assignment","feature":"tag","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@4"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@179"},"arguments":[]},"deprecatedSyntax":false}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RelationKindDotRef","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@195"},"arguments":[]},{"$type":"Assignment","feature":"kind","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@5"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]},"deprecatedSyntax":false}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"LineOptions","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"solid"},{"$type":"Keyword","value":"dashed"},{"$type":"Keyword","value":"dotted"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ArrowType","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"none"},{"$type":"Keyword","value":"normal"},{"$type":"Keyword","value":"onormal"},{"$type":"Keyword","value":"dot"},{"$type":"Keyword","value":"odot"},{"$type":"Keyword","value":"diamond"},{"$type":"Keyword","value":"odiamond"},{"$type":"Keyword","value":"crow"},{"$type":"Keyword","value":"open"},{"$type":"Keyword","value":"vee"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewDisplayVariantValue","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"diagram"},{"$type":"Keyword","value":"sequence"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DynamicViewFlowKeyword","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"alt"},{"$type":"Keyword","value":"opt"},{"$type":"Keyword","value":"par"},{"$type":"Keyword","value":"parallel"},{"$type":"Keyword","value":"loop"},{"$type":"Keyword","value":"when"},{"$type":"Keyword","value":"if"},{"$type":"Keyword","value":"else"},{"$type":"Keyword","value":"break"},{"$type":"Keyword","value":"try"},{"$type":"Keyword","value":"catch"},{"$type":"Keyword","value":"finally"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ThemeColor","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"primary"},{"$type":"Keyword","value":"secondary"},{"$type":"Keyword","value":"muted"},{"$type":"Keyword","value":"slate"},{"$type":"Keyword","value":"blue"},{"$type":"Keyword","value":"indigo"},{"$type":"Keyword","value":"sky"},{"$type":"Keyword","value":"red"},{"$type":"Keyword","value":"gray"},{"$type":"Keyword","value":"green"},{"$type":"Keyword","value":"amber"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ElementShape","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"rectangle"},{"$type":"Keyword","value":"component"},{"$type":"Keyword","value":"person"},{"$type":"Keyword","value":"browser"},{"$type":"Keyword","value":"mobile"},{"$type":"Keyword","value":"cylinder"},{"$type":"Keyword","value":"storage"},{"$type":"Keyword","value":"queue"},{"$type":"Keyword","value":"bucket"},{"$type":"Keyword","value":"document"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Participant","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"source"},{"$type":"Keyword","value":"target"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ColorLiteral","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@172"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@173"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"RGBAColor","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"rgba"},{"$type":"Keyword","value":"rgb"}]},{"$type":"Keyword","value":"("},{"$type":"Assignment","feature":"red","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"green","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"blue","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]}},{"$type":"Keyword","value":",","cardinality":"?"},{"$type":"Assignment","feature":"alpha","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@201"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@198"},"arguments":[]}]},"cardinality":"?"},{"$type":"Keyword","value":")"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"HexColor","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@193"},"arguments":[]},{"$type":"Assignment","feature":"hex","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@204"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@202"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@203"},"arguments":[]}]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"IconId","dataType":"string","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@187"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Uri","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@188"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@189"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@190"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"MarkdownOrString","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"markdown","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@199"},"arguments":[]}},{"$type":"Assignment","feature":"text","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@200"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CustomColorId","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@203"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@169"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@170"},"arguments":[]},{"$type":"Keyword","value":"element"},{"$type":"Keyword","value":"model"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Id","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@203"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@169"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@168"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@165"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@164"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@170"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@153"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@166"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@167"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@148"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@62"},"arguments":[]},{"$type":"Keyword","value":"element"},{"$type":"Keyword","value":"model"},{"$type":"Keyword","value":"group"},{"$type":"Keyword","value":"node"},{"$type":"Keyword","value":"deployment"},{"$type":"Keyword","value":"instance"},{"$type":"Keyword","value":"relationship"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"HashId","dataType":"string","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@193"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@178"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EqOperator","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@196"},"arguments":[]}]}},{"$type":"Group","elements":[{"$type":"Assignment","feature":"operator","operator":"=","terminal":{"$type":"Keyword","value":"is"}},{"$type":"Assignment","feature":"not","operator":"?=","terminal":{"$type":"Keyword","value":"not"},"cardinality":"?"}]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"IsEqual","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"isEqual","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@197"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@196"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","hidden":true,"name":"BLOCK_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\//"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\/\\\\/[^\\\\n\\\\r]*/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"WS","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"NL","definition":{"$type":"RegexToken","regex":"/[\\\\r\\\\n]+/"},"fragment":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"RegexToken","regex":"/\\\\b(true|false)\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"LIB_ICON","definition":{"$type":"RegexToken","regex":"/(aws|azure|bootstrap|gcp|tech):[-\\\\w]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_WITH_SCHEMA","definition":{"$type":"RegexToken","regex":"/\\\\w+:\\\\/{2}\\\\S+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_RELATIVE","definition":{"$type":"RegexToken","regex":"/\\\\.{0,2}\\\\/[^\\\\/]\\\\S+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"URI_ALIAS","definition":{"$type":"RegexToken","regex":"/@[a-zA-Z0-9_-]*\\\\/[^\\\\s]+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"DotUnderscore","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\._(?![_a-zA-Z])/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"DotWildcard","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\.\\\\*{1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Hash","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"#"}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"StickyDot","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\./"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Dot","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"."}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NotEqual","definition":{"$type":"RegexToken","regex":"/\\\\!\\\\={1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Eq","definition":{"$type":"RegexToken","regex":"/\\\\={1,2}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Percent","definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+%/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"MarkdownString","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalGroup","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"'''"}},{"$type":"UntilToken","terminal":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"'''"}}}]},{"$type":"TerminalGroup","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"\\"\\"\\""}},{"$type":"UntilToken","terminal":{"$type":"CharacterRange","left":{"$type":"Keyword","value":"\\"\\"\\""}}}]}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"String","definition":{"$type":"RegexToken","regex":"/\\"(?:[^\\"\\\\\\\\]|\\\\\\\\.)*\\"|'(?:[^'\\\\\\\\]|\\\\\\\\.)*'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Float","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+\\\\.\\\\d+\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Number","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/\\\\b\\\\d+\\\\b/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"IdTerminal","definition":{"$type":"RegexToken","regex":"/([a-zA-Z]|_+[a-zA-Z0-9])[-\\\\w]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"Hex","definition":{"$type":"RegexToken","regex":"/[a-fA-F0-9]{3,}(?![-_g-zG-Z])/"},"fragment":false,"hidden":false}],"interfaces":[{"$type":"Interface","name":"ElementRef","attributes":[{"$type":"TypeAttribute","name":"modelElement","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"StrictFqnElementRef","attributes":[{"$type":"TypeAttribute","name":"parent","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@1"}}},{"$type":"TypeAttribute","name":"el","type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@21"}}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"FqnRef","attributes":[{"$type":"TypeAttribute","name":"parent","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@2"}}},{"$type":"TypeAttribute","name":"value","type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/types@1"}}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"StrictFqnRef","attributes":[{"$type":"TypeAttribute","name":"parent","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@3"}}},{"$type":"TypeAttribute","name":"value","type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/types@1"}}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"StepsBlock","attributes":[{"$type":"TypeAttribute","name":"steps","type":{"$type":"ArrayType","elementType":{"$type":"SimpleType","typeRef":{"$ref":"#/types@10"}}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"SubflowStep","superTypes":[{"$ref":"#/interfaces@4"}],"attributes":[{"$type":"TypeAttribute","name":"kind","type":{"$type":"SimpleType","typeRef":{"$ref":"#/types@11"}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}]},{"$type":"Interface","name":"TryBlock","superTypes":[{"$ref":"#/interfaces@4"}],"attributes":[{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}]},{"$type":"Interface","name":"CatchBlock","attributes":[{"$type":"TypeAttribute","name":"try","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@6"}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"catch","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@4"}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"FinallyBlock","attributes":[{"$type":"TypeAttribute","name":"tryCatch","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@6"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@7"}}]},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"finally","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@4"}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"AltSteps","attributes":[{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"branches","type":{"$type":"ArrayType","elementType":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@5"}}},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"AbstractStep","attributes":[{"$type":"TypeAttribute","name":"kind","isOptional":true,"type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@5"}}}},{"$type":"TypeAttribute","name":"dotKind","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@163"}}},{"$type":"TypeAttribute","name":"target","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@0"}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"custom","isOptional":true,"type":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@76"}}}],"superTypes":[]},{"$type":"Interface","name":"Step","superTypes":[{"$ref":"#/interfaces@10"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@0"}},"isOptional":false},{"$type":"TypeAttribute","name":"isBackward","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"boolean"}}],"$comment":"/**\\n * A single step in a dynamic view flow\\n * source -> target\\n */"},{"$type":"Interface","name":"StepSeries","superTypes":[{"$ref":"#/interfaces@10"}],"attributes":[{"$type":"TypeAttribute","name":"source","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@11"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@12"}}]},"isOptional":false}],"$comment":"/**\\n * A series of steps in a dynamic view flow\\n * source -> target1 -> target2 -> ...\\n */"}],"types":[{"$type":"Type","name":"ModelReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@21"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"Referenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@120"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@122"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@21"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@17"}}]}},{"$type":"Type","name":"LikeC4View","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@47"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@48"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@128"}}]}},{"$type":"Type","name":"StringProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@24"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@57"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@38"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@42"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@10"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@15"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@73"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@74"}}]}},{"$type":"Type","name":"AnyProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@3"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@56"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@54"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@23"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@37"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@161"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@77"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@157"}}]}},{"$type":"Type","name":"DeploymentNodeOrElementKind","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@3"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@7"}}]}},{"$type":"Type","name":"WhereTagEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@98/definition/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@105/definition/elements@5/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@105/definition/elements@2/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereKindEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@98/definition/elements@2/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@105/definition/elements@4/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@105/definition/elements@1/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereMetadataEqual","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@98/definition/elements@0/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@105/definition/elements@3/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@105/definition/elements@0/elements@0/inferredType"}}]}},{"$type":"Type","name":"WhereExpression","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@93"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@100"}}]}},{"$type":"Type","name":"StepStatement","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@13"}},{"$type":"SimpleType","typeRef":{"$ref":"#/types@12"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@9"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@5"}}]}},{"$type":"Type","name":"SubflowKind","type":{"$type":"UnionType","types":[{"$type":"SimpleType","stringType":"opt"},{"$type":"SimpleType","stringType":"par"},{"$type":"SimpleType","stringType":"parallel"},{"$type":"SimpleType","stringType":"loop"},{"$type":"SimpleType","stringType":"when"},{"$type":"SimpleType","stringType":"if"},{"$type":"SimpleType","stringType":"else"},{"$type":"SimpleType","stringType":"break"}]}},{"$type":"Type","name":"TryStep","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@6"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@7"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@8"}}]}},{"$type":"Type","name":"StepOrSeries","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@11"}},{"$type":"SimpleType","typeRef":{"$ref":"#/interfaces@12"}}]}},{"$type":"Type","name":"DeploymentElement","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@120"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@122"}}]}},{"$type":"Type","name":"FqnReferenceable","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/types@1"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@21"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@25/definition/elements@1/elements@1/elements@0/inferredType"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@124"}}]}},{"$type":"Type","name":"SizeProperty","type":{"$type":"UnionType","types":[{"$type":"SimpleType","typeRef":{"$ref":"#/rules@154"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@155"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@156"}},{"$type":"SimpleType","typeRef":{"$ref":"#/rules@147"}}]}}],"definesHiddenTokens":false,"hiddenTokens":[],"imports":[],"usedGrammars":[]}`),lf={languageId:`likec4`,fileExtensions:[`.c4`,`.likec4`,`.like-c4`],caseInsensitive:!1,mode:`production`},uf={skipValidations:!0,recoveryEnabled:!0,nodeLocationTracking:`full`},df={AstReflection:()=>new LikeC4AstReflection},ff={Grammar:()=>LikeC4Grammar(),LanguageMetaData:()=>lf,parser:{ParserConfig:()=>uf}},pf=Symbol.for(`idattr`),mf={writeId(e,t){return e[pf]=t,e},readId(e){return e[pf]}},hf={writeId(e,t){return L(t)?e[pf]=void 0:e[pf]=t,e},readId(e){return e[pf]}};function isLikeC4LangiumDocument(e){return e?.textDocument.languageId===lf.languageId}function isLikeC4UserDocument(e){return isLikeC4LangiumDocument(e)&&isNotLikeC4Builtin(e)}function parseMarkdownAsString(e){return e?.markdown||e?.text}function parseAstPercent(e){let t=parseFloat(e);return isNaN(t)?100:An(t,{min:0,max:100})}function parseAstOpacityProperty({value:e}){return parseAstPercent(e)}function parseAstSizeValue({value:e}){switch(e){case`xs`:case`sm`:case`md`:case`lg`:case`xl`:return e;case`xsmall`:return`xs`;case`small`:return`sm`;case`medium`:return`md`;case`large`:return`lg`;case`xlarge`:return`xl`;default:yi(e)}}function parseAstIconPositionValue({value:e}){switch(e){case`left`:case`right`:case`top`:case`bottom`:return e;default:yi(e)}}function toRelationshipStyle(e,t){let r={};if(!e||e.length===0)return r;for(let o of e)if(t(o))switch(!0){case isColorProperty(o):{let e=toColor(o);z(e)&&(r.color=e);break}case isLineProperty(o):r.line=o.value;break;case isArrowProperty(o):switch(o.key){case`head`:r.head=o.value;break;case`tail`:r.tail=o.value;break;default:yi(o)}break;default:yi(o)}return r}function toColor(e){return e?.themeColor??e?.customColor?.$refText}function toAutoLayout(e){let t=e.rankSep,r=e.nodeSep,o;switch(e.direction){case`TopBottom`:o=`TB`;break;case`BottomTop`:o=`BT`;break;case`LeftRight`:o=`LR`;break;case`RightLeft`:o=`RL`;break;default:yi(e.direction)}return{direction:o,...r&&{nodeSep:r},...t&&{rankSep:t}}}function toAstViewLayoutDirection(e){switch(e){case`TB`:return`TopBottom`;case`BT`:return`BottomTop`;case`LR`:return`LeftRight`;case`RL`:return`RightLeft`;default:yi(e)}}function getViewRulePredicateContainer(e){return Be(e,e=>isViewRulePredicate(e)||isDeploymentViewRulePredicate(e)||isDynamicViewIncludePredicate(e))}const _isModel=e=>isModel(e)||isElementBody(e)||isExtendElementBody(e)||isElementViewBody(e)||isDynamicViewBody(e)||isElementRef(e),gf=t(e=>isModelDeployments(e)||isDeploymentViewBody(e)||isDeploymentNodeBody(e)||isExtendDeploymentBody(e)||isDeployedInstanceBody(e),`_isDeployment`);function isFqnRefInsideGlobals(e){for(;;){if(gf(e)||_isModel(e))return!1;if(isGlobals(e)||isModelViews(e))return!0;if(e.$container)e=e.$container;else return!1}}function isFqnRefInsideModel(e){for(;;){if(gf(e))return!1;if(_isModel(e))return!0;if(e.$container)e=e.$container;else return!1}}function isFqnRefInsideDeployment(e){for(;;){if(_isModel(e))return!1;if(gf(e))return!0;if(e.$container)e=e.$container;else return!1}}function elementRef(e){try{let t=isStrictFqnElementRef(e)?e.el.ref:e.modelElement.value.ref;return t?.$type===`Imported`&&(t=t.imported.ref),t?.$type===`Element`?t:void 0}catch{return}}function readStrictFqn(e){let t=[e.$type===`StrictFqnRef`?e.value.$refText:e.el.$refText],r=e.parent;for(;r;)t.push(r.$type===`StrictFqnRef`?r.value.$refText:r.el.$refText),r=r.parent;return t.length===1?t[0]:t.reverse().join(`.`)}function referenceableParent(e){for(;e.parent;)e=e.parent;return e.value.ref??null}function instanceRef(e){let t;for(;t=e.value?.ref;){if(isDeploymentNode$1(t))return null;if(isDeployedInstance(t))return t;if(L(e.parent))return null;e=e.parent}return null}function importsRef(e){let t=referenceableParent(e);return t?.$type===`Imported`?t:null}function isReferenceToDeploymentModel(e){let t;for(;t=e.value?.ref;){if(isDeploymentElement(t))return!0;if(L(e.parent))return!1;e=e.parent}return!1}var IndexManager=class extends me{services;constructor(e){super(e),this.services=e}async updateContent(e,t){e.likec4ProjectId=this.services.workspace.ProjectsManager.ownerProjectId(e),await super.updateContent(e,t)}projectElements(e,t,r){let o=this.services.workspace.ProjectsManager;return it(this.symbolIndex.keys()).filter(t=>r&&!r.has(t)?!1:o.isIncluded(e,t)).flatMap(e=>this.getFileDescriptions(e,t))}},LangiumDocuments=class extends lt{services;constructor(e){super(e),this.services=e}get projectsManager(){return this.services.workspace.ProjectsManager}addDocument(e){let t=e.uri.toString();if(this.documentMap.has(t))throw Error(`A document with the URI '${t}' is already present.`);isLikeC4UserDocument(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e));let r=[...this.documentMap.values()],o=r.at(-1);if(!o||compareByUri(o,e)<=0){this.documentMap.set(t,e);return}r.push(e),r.sort(compareByUri),this.documentMap.clear();for(let e of r)this.documentMap.set(e.uri.toString(),e)}getDocument(e){let t=super.getDocument(e);return isLikeC4UserDocument(t)&&(t.likec4ProjectId=this.projectsManager.ownerProjectId(t)),t}get userDocuments(){return it(this.documentMap.values()).filter(e=>isLikeC4UserDocument(e)&&!this.projectsManager.isExcluded(e))}get all(){return it(this.documentMap.values()).map(e=>(isLikeC4UserDocument(e)&&(e.likec4ProjectId=this.projectsManager.ownerProjectId(e)),e))}projectDocuments(e){let t=this.services.workspace.ProjectsManager;return it(this.documentMap.values()).filter(r=>isLikeC4UserDocument(r)&&t.isIncluded(e,r)?(r.likec4ProjectId=e,!0):!1)}groupedByProject(){let e=this.services.workspace.ProjectsManager;return R(this.userDocuments.toArray(),F(t=>(t.likec4ProjectId=e.ownerProjectId(t),t)),Jt(Nn(`likec4ProjectId`)))}resetProjectIds(){let e=[];for(let t of this.documentMap.values())delete t.likec4ProjectId,isLikeC4UserDocument(t)&&!this.projectsManager.isExcluded(t)&&e.push(t.uri);return e}},_f=e(Jn(),1);const Z=Y.getChild(`projects`);function isLangiumDocument(e){return typeof e==`object`&&`uri`in e&&`textDocument`in e}function normalizeUri(e){return isLangiumDocument(e)?e.uri.toString():typeof e==`string`?_t(e,{acceptRelative:!1,strict:!0})?e:C.file(e).toString():e.toString()}const vf=/^\/?([A-Za-z]):(?=\/|$)/;function normalizeWindowsDrivePath(e){return e.replace(vf,(e,t)=>`/${t.toLowerCase()}:`)}function uriPathForMatcher(e){return C.isUri(e)?normalizeWindowsDrivePath(e.path):normalizeWindowsDrivePath(C.parse(e).path)}const yf=ui(`/`,!0),compareUri=(e,t)=>yf(ft(e.path),ft(t.path));function isParentFolderFor(e){return t=>e.startsWith(hi(t)?t:t.folder)}function _overlaps(e,t){let r=hi(e)?e:e.folder,o=hi(t)?t:t.folder;return r===o||r.startsWith(o)||o.startsWith(r)}function sameFolder(e,t){return(hi(e)?e:e.folder)===(hi(t)?t:t.folder)}function hasAmbiguousIncludePathOverlap(e,t){return _overlaps(e,t)&&!sameFolder(e,t)}function overlaps(...e){return Dn(_overlaps,e)}function _includes(e,t){return t.startsWith(e.folder)||e.includePaths?.some(isParentFolderFor(t))?!_excludes(e,t):!1}function _isInScope(e,t){return t.startsWith(e.folder)||(e.includePaths?.some(isParentFolderFor(t))??!1)}function _excludes(e,t){return e.exclude?.(uriPathForMatcher(t))??!1}function includes(...e){return Dn(_includes,e)}function isInScope(...e){return Dn(_isInScope,e)}function excludes(...e){return Dn(_excludes,e)}function ProjectFolder(e){return e=normalizeUri(e),mt(e)}const compareProjectByFolder=(e,t)=>compareUri(e.folderUri,t.folderUri);function ensureProjectsOrder(e){return e.length<=1?e:En(e,compareProjectByFolder)}const bf={id:`default`,config:{name:`default`,exclude:[`**/node_modules/**`]},exclude:(0,_f.default)(`**/node_modules/**`,{dot:!0}),includeConfig:{paths:[],maxDepth:3,fileThreshold:30}};function isExcludedByDefault(e){return bf.exclude(uriPathForMatcher(e))}function parseRegisterOptions(e){if(`configUri`in e){G(!en(e.configUri),`configUri is emptyish`);let t=C.isUri(e.configUri)?e.configUri:C.parse(normalizeUri(e.configUri)),r=ProjectFolder(T.dirname(t));return{configUri:t,folder:r,folderUri:C.parse(r)}}G(!en(e.folderUri),`folderUri is emptyish`);let t=ProjectFolder(e.folderUri),r=C.parse(t);return{configUri:T.joinPath(r,`likec4.config.json`),folder:t,folderUri:r}}var xf=class ProjectsManager extends ADisposable{services;static DefaultProjectId=bf.id;#e=[];#t=void 0;#n=void 0;#r=[];#i=new ii(e=>{if(e===ProjectsManager.DefaultProjectId){let t=this.getWorkspaceFolder(),r=T.joinPath(t,`likec4.config.json`),o=ProjectFolder(t);return{id:e,config:bf.config,folder:o,folderUri:C.parse(o),configUri:r,exclude:bf.exclude,includeConfig:{...bf.includeConfig}}}return vi(this.#r.find(t=>t.id===e),`Project ${e} not found`)});#a=new ii(e=>{if(this.isExcludedByWorkspace(e))return!0;let t=this.findOwnerProject(e);return t?excludes(t,e)?!this.#r.some(includes(e)):!1:this.#r.some(isInScope(e))?!this.#r.some(includes(e)):isExcludedByDefault(e)});#o=new ii(e=>this.findOwnerProject(e)??null);constructor(e){super(),this.services=e,this.onDispose(S.create(()=>{this.#e.length=0})),Z.trace`created`}isExcludedByWorkspace(e){return this.#n?(C.isUri(e)&&(e=normalizeUri(e)),this.#n(uriPathForMatcher(e))):!1}setWorkspaceExcludePatterns(e){try{if(!Array.isArray(e)){this.#n=void 0;return}let t=R(e,P(z),F(e=>(e=normalizeWindowsDrivePath(e),!zt(e)&&!e.startsWith(`**`)&&(e=gt(`**`,e)),e)));if(!M(t,1)){this.#n=void 0;return}Z.debug`set workspace exclude patterns: ${t}`,this.#n=(0,_f.default)(t,{dot:!0}),this.clearCaches()}catch(e){Z.warn(`Failed to set workspace exclude patterns`,{error:e}),this.#n=void 0}}get defaultProjectId(){if(this.#t)return this.#t;if(!(this.#r.length>1))return M(this.#r,1)?this.#r[0].id:ProjectsManager.DefaultProjectId}set defaultProjectId(e){if(e!==this.#t){if(this.#t=void 0,!e||e===ProjectsManager.DefaultProjectId){Z.debug`reset default project ID`;return}G(this.#r.find(t=>t.id===e),`Project "${e}" not found`),Z.debug`set default project ID to ${e}`,this.#t=e}}get default(){return this.#i.get(this.defaultProjectId??ProjectsManager.DefaultProjectId)}get all(){if(M(this.#r,1)){let e=[...F(this.#r,Nn(`id`)),bf.id];if(this.#t){let t=e.findIndex(e=>e===this.#t);t>0&&(e.splice(t,1),e.unshift(this.#t))}return e}return[bf.id]}getProject(e){let t=typeof e==`string`?e:this.ownerProjectId(e);return this.#i.get(t)}findOverlaped(e){if(this.#r.length===0)return[];let t=overlaps(ProjectFolder(e)),isInsideOrIncludes=e=>t(e)||!!e.includePaths&&!!ln(e.includePaths,t);return this.#r.filter(isInsideOrIncludes)}ensureProjectId(e){return e===ProjectsManager.DefaultProjectId?this.defaultProjectId??ProjectsManager.DefaultProjectId:e?(G(this.#r.some(t=>e===t.id),`Project ID ${e} is not registered`),e):vi(this.defaultProjectId,()=>`Specify exact project, known: [${F(this.#r,Nn(`id`)).join(`, `)}]`)}ensureProject(e){return e=this.ensureProjectId(e),this.getProject(e)}hasMultipleProjects(){return this.#r.length>1}isExcluded(...e){let t=e.length===1?e[0]:e[1];return isLangiumDocument(t)&&isLikeC4Builtin(t)?!0:e.length===1?this.#a.get(normalizeUri(t)):excludes(this.#i.get(e[0]),normalizeUri(t))}isIncluded(e,t){let r=normalizeUri(t);return this.isExcludedByWorkspace(r)?!1:M(this.#r,1)?e===ProjectsManager.DefaultProjectId?!this.#o.get(r)&&!this.#a.get(r):includes(this.#i.get(e),r):!isExcludedByDefault(r)}async registerConfigFile(e,t){if(this.isExcludedByWorkspace(e))throw Error(`Skipping project config, path ${e.fsPath} is excluded by editor settings`);if(isExcludedByDefault(normalizeUri(e)))throw Error(`Failed to register project config, path ${e.fsPath} is excluded by default: ${bf.config.exclude.map(e=>`"${e}"`).join(`, `)}`);try{let r=await this.services.workspace.FileSystemProvider.loadProjectConfig(e);return await this.registerProject({config:r,configUri:e},t)}catch(t){if(!re(t))throw wrapError(t,`Failed to register project config ${e.fsPath}:\n`);return Promise.reject(t)}}async registerProject(e,t){let r=Mt.validate(e.config),{configUri:o,folder:s,folderUri:c}=parseRegisterOptions(e),u=Mt.normalizeInclude(r.include),d=this.#r.find(e=>e.folder===s);return d?(d.config.name!==r.name&&(Z.info`project name changed from ${d.config.name} to ${r.name}`,Z.info`remove ${d.id}`,d.id=this.uniqueProjectId(r.name),Z.info`add ${d.id}`),this.warnIfConfigOverride(d,o),d.config=r,d.folder=s,d.folderUri=c,d.configUri=o,d.includeConfig=u):(d={id:this.uniqueProjectId(r.name),config:r,folder:s,configUri:o,folderUri:c,includeConfig:u},this.#r=ensureProjectsOrder([...this.#r,d]),Z.info`add ${d.id}`),safeCall(()=>this.updateIncludesExcludes(d)),this.isInitiatingOrReloading?d:(this.clearCaches(),this.notifyListeners(),await this.rebuildProject(d.id,t).catch(e=>re(e)?Promise.reject(e):(Z.warn(`Failed to rebuild project {projectId} after config change`,{projectId:d.id,error:e}),Promise.resolve())),d)}ownerProjectId(e){return this.#o.get(normalizeUri(e))?.id??this.#t??ProjectsManager.DefaultProjectId}findOwnerProject(e){if(this.#r.length===0)return;let t=isParentFolderFor(e);return this.#r.find(t)??this.#r.find(includes(e))??void 0}relativePath(e){let t=normalizeUri(e),r=this.#o.get(t);return r?T.relative(r.folderUri,C.parse(t)):t}get isInitiatingOrReloading(){return!!this.#s||!this.services.workspace.WorkspaceManager.isReady}#s=null;async reloadProjects(e){return this.#s?(Z.debug`reload projects is already in progress, waiting`,await this.#s.catch(()=>{})):(Z.debug`schedule reload projects`,this.#s=Promise.resolve().then(()=>this._reloadProjects(e)).catch(e=>(re(e)||Z.warn(`Failed to reload projects`,{error:e}),Promise.reject(e))).finally(()=>{this.#s=null}),await this.#s)}async _reloadProjects(e){let t=this.services.workspace.WorkspaceManager.workspaceFolders;if(!t||t.length===0){Z.warn(`Failed to reloadProjects, no workspace folders found`);return}Z.debug`start reload projects`;let r=[];for(let e of t){let t=C.parse(e.uri);Z.debug`scan projects in ${t.fsPath}`;try{let e=await this.services.workspace.FileSystemProvider.scanProjectFiles(t);for(let o of e)Z.debug`found config ${T.relative(t,o.uri)}`,r.push(o.uri)}catch(e){Z.warn(`Failed on scanProjectFiles in {folder}`,{folder:t.fsPath,error:e})}}if(r.length===0){if(this.#r.length===0){Z.warning(`No config files found`);return}Z.warning(`no config files found, but {count} projects were registered before`,{count:this.#r.length}),Z.warning(`reset`)}r.sort(compareUri);let o=new Map(this.#r.map(e=>[e.configUri.toString(),e]));this.#r=[],this.#i.clear();for(let e of r)try{await this.registerConfigFile(e)}catch(t){Z.warn(loggable(t));let r=o.get(e.toString());r&&(Z.debug`Update failed, restore project ${r.id}`,await this.registerProject(r).catch(e=>{Z.warn(`fail to restore project ${r.id}, ignoring`,{error:e})}))}this.clearCaches(),this.notifyListeners(),await this.services.workspace.WorkspaceManager.rebuildAll(e)}uniqueProjectId(e){let t=new Set(F(this.#r,Nn(`id`))),r=e;if(!t.has(r))return r;Z.warn`Project "${e}" already exists, generating unique ID`;let o=1;for(;t.has(r);)r=`${e}-${o++}`;return r}clearCaches(){Z.trace(`clearCaches`),this.#t&&!this.#r.some(e=>e.id===this.#t)&&(this.#t=void 0),this.#i.clear(),this.#o.clear(),this.#a.clear()}async rebuildProject(e,t){let r=this.#r.find(t=>t.id===e);if(!r)return e===ProjectsManager.DefaultProjectId?Z.info`Rebuilding all documents `:Z.warn`Project ${e} not found, rebuilding all`,await this.services.workspace.WorkspaceManager.rebuildAll(t);let o=Z.getChild(r.id),_includes=e=>includes(r,normalizeUri(e)),s=this.services.workspace.LangiumDocuments.userDocuments.filter(_includes).map(e=>e.uri).toArray();if(s.length===0){o.trace`no documents found for project ${r.id}, skipping rebuild`;return}o.info`rebuild project documents: ${s.length}`,this.clearCaches(),await this.services.workspace.DocumentBuilder.update(s,[],t).catch(e=>{o.warn(`Failed to rebuild project`,{error:e})})}getAllIncludePaths(){let e=[];for(let t of this.#r)if(t.includePaths)for(let r of t.includePaths)e.push({projectId:t.id,includePath:r.uri,includeConfig:t.includeConfig});return e}onProjectsUpdate(e){return this.#e.push(e),S.create(()=>{let t=this.#e.indexOf(e);t>=0&&this.#e.splice(t,1)})}getWorkspaceFolder(){try{return this.services.workspace.WorkspaceManager.workspaceUri}catch(e){return Z.warn(`Failed to get workspace URI, using default folder`,{error:e}),C.file(`/`)}}notifyListeners(){for(let e of[...this.#e])try{e()}catch(e){Z.warn(loggable(e))}}updateIncludesExcludes(e){let t=e.config;delete e.includePaths,delete e.exclude;let r=e.includeConfig.paths;M(r,1)&&(e.includePaths=F(r,t=>{let r=T.resolvePath(e.folderUri,t);return{uri:r,folder:ProjectFolder(r)}}),Z.debug`project ${e.id} include paths: ${e.includePaths.map(e=>e.uri.fsPath).join(`, `)}`);let o=t.exclude;if(L(o))e.exclude=bf.exclude;else if(M(o,1)){let t=[e.folderUri,...F(e.includePaths??[],Nn(`uri`))].flatMap(e=>F(o,t=>(!pt(t)&&!t.startsWith(`**`)&&(t=gt(`**`,t)),vt(ut(uriPathForMatcher(e),t)))));e.exclude=(0,_f.default)(t,{contains:!0,dot:!0})}if(!e.includePaths)return e;for(let t of e.includePaths)for(let r of this.#r)r.id!==e.id&&(overlaps(t,r)&&Z.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" folder. Files in overlapping areas will only belong to one project.`,{projectId:e.id,includePath:t.folder,otherProjectId:r.id}),r.includePaths?.forEach(o=>{hasAmbiguousIncludePathOverlap(t,o)&&Z.warn(`Project "{projectId}" include path "{includePath}" overlaps with project "{otherProjectId}" include path "{otherIncludePath}". Files in overlapping areas will only belong to one project.`,{projectId:e.id,includePath:t.folder,otherProjectId:r.id,otherIncludePath:o.folder})}));return e}warnIfConfigOverride(e,t){try{let[r,o]=F([e.configUri,t],T.basename);r!==o&&Z.warn`config ${o} overrides ${r} in folder ${e.folder}`}catch{}}},Sf=class TimeoutError extends Error{name=`TimeoutError`;constructor(e,t){super(e,t),Error.captureStackTrace?.(this,TimeoutError)}};const getAbortedReason=e=>e.reason??new DOMException(`This operation was aborted.`,`AbortError`);function pTimeout(e,t){let{milliseconds:r,fallback:o,message:s,customTimers:c={setTimeout,clearTimeout},signal:u}=t,d,abortHandler,p=new Promise((t,p)=>{if(typeof r!=`number`||Math.sign(r)!==1)throw TypeError(`Expected \`milliseconds\` to be a positive number, got \`${r}\``);if(u?.aborted){p(getAbortedReason(u));return}if(u&&(abortHandler=()=>{p(getAbortedReason(u))},u.addEventListener(`abort`,abortHandler,{once:!0})),e.then(t,p),r===1/0)return;let m=new Sf;d=c.setTimeout.call(void 0,()=>{if(o){try{t(o())}catch(e){p(e)}return}typeof e.cancel==`function`&&e.cancel(),s===!1?t():s instanceof Error?p(s):(m.message=s??`Promise timed out after ${r} milliseconds`,p(m))},r)}).finally(()=>{p.clear(),abortHandler&&u&&u.removeEventListener(`abort`,abortHandler)});return p.clear=()=>{c.clearTimeout.call(void 0,d),d=void 0},p}var LikeC4WorkspaceManager=class extends at{services;fileSystemProvider;#e=Y.getChild(`workspace`);#t=!1;#n=[];initialBuildOptions={eagerLinking:!0,validation:!0};constructor(e){super(e),this.services=e,this.fileSystemProvider=e.workspace.FileSystemProvider}get documentFactory(){return this.services.workspace.LangiumDocumentFactory}get isReady(){return this.#t}async performStartup(e){this.#t&&this.#e.warn`workspace already initialized, invalid performStartup call`;try{this.#t=!1,await this.readExcludeConfig(),this.folders??=e;let t=e.map(e=>C.parse(e.uri)),r=[],o=[];for(let e of t){this.#e.debug`scanning folder ${e.fsPath} for likec4`;try{let t=await this.fileSystemProvider.scanProjectFiles(e);r.push(...t)}catch(t){this.#e.warn(`Failed to scan workspace folder {folder} for project config files`,{folder:e.fsPath,error:t})}try{o.push(...await this.fileSystemProvider.readDirectory(e,{recursive:!0}))}catch(t){this.#e.warn(`Failed to read workspace folder {folder} for likec4 files`,{folder:e.fsPath,error:t})}this.services.workspace.FileSystemWatcher.watch(e.fsPath)}let s=this.services.workspace.ProjectsManager,c=0;for(let e of r)try{await s.registerConfigFile(e.uri),c++}catch(t){this.#e.warn(`Failed to register config file {config}`,{config:e.uri.fsPath,error:t})}r.length===c?c>0&&this.#e.info`loaded ${c} projects`:this.#e.warn`loaded ${c} projects out of ${r.length}`,c>0&&o.push(...await this.scanProjectIncludePaths());let u=await this.loadDocuments(o);M(u,1)?this.#e.debug`found ${u.length} likec4 documents`:this.#e.warn(`No likec4 documents found in workspace`),u.push(this.documentFactory.fromString(Rc,C.parse(Bc)));for(let e of u)this.saveAddDocument(e);return u}finally{this.#t=!0,this._ready.resolve()}}async scanProjectIncludePaths(){let e=this.services.workspace.ProjectsManager.getAllIncludePaths();if(!M(e,1))return[];let t=Vt(e=>this.services.workspace.ProjectsManager.isExcludedByWorkspace(e.uri)),r=[];for(let{projectId:o,includePath:s,includeConfig:c}of e)try{this.#e.debug`scanning include path ${s.fsPath} for project ${o}`;let e=R(await this.fileSystemProvider.readDirectory(s,{recursive:!0,maxDepth:c.maxDepth}),P(t));r.push(...e),e.length===0?this.#e.trace`no files found in include path ${s.fsPath}`:(this.#e.debug`loaded ${e.length} files from include path ${s.fsPath}`,e.length>c.fileThreshold&&this.#e.warn(`Loaded ${e.length} files from include path ${s.fsPath} (project: ${o}) (threshold: ${c.fileThreshold}).\nLarge include directories may slow workspace initialization. Consider adjusting "include.fileThreshold" or "include.maxDepth" in your project configuration.`))}catch(e){this.#e.warn(`Failed to scan include path ${s.fsPath}`,{error:e})}return r}async loadDocuments(e){let t=R(e,wn(e=>e.uri.path),En(compareByUri)),r=[];for(let e of t)try{r.push(await this.documentFactory.fromUri(e.uri))}catch(t){this.#e.warn(`Failed to load document ${e.uri}`,{error:t})}return r}saveAddDocument(e){this.langiumDocuments.hasDocument(e.uri)||this.langiumDocuments.addDocument(e)}workspace(){return this.folders&&M(this.folders,1)?this.folders[0]:null}async rebuildAll(e){let t=this.services.workspace.LangiumDocuments.resetProjectIds();this.#e.info(`invalidate and rebuild all {docs} documents`,{docs:t.length}),this.forceCleanCaches(),await this.documentBuilder.update(t,[],e)}get workspaceUri(){return $r(this,`workspaceUri`,()=>{let e=this.workspace();return U(e,`Workspace not initialized`),C.parse(e.uri)})}relativePath(e){return T.relative(this.workspaceUri,e)}get workspaceURL(){return $r(this,`workspaceURL`,()=>{let e=this.workspace();return U(e,`Workspace not initialized`),new URL(e.uri)})}forceCleanCaches(){for(let e of[...this.#n])e();this.services.workspace.ProjectsManager.clearCaches(),this.services.workspace.ManualLayouts.clearCaches(),this.services.workspace.Cache.clear()}onForceCleanCache(e){return this.#n.push(e),S.create(()=>{let t=this.#n.indexOf(e);t!==-1&&this.#n.splice(t,1)})}async readExcludeConfig(){if(!this.services.lsp.Connection){this.#e.debug`no LSP connection, skipping initial configuration read`;return}let e=this.services.workspace.ConfigurationProvider,wait=e=>pTimeout(e,{milliseconds:1e3,message:!1});try{this.#e.trace`waiting for ConfigurationProvider ready...`,await wait(e.ready),this.#e.trace`ConfigurationProvider ready, reading exclude patterns...`;let t=await wait(e.getConfiguration(`likec4`,`exclude`));t?(this.#e.trace`exclude configuration found ${t}`,this.services.workspace.ProjectsManager.setWorkspaceExcludePatterns(t)):this.#e.trace(`no initial exclude configuration found`)}catch(e){this.#e.warn(`Failed to read initial exclude configuration`,{error:e})}}};function projectIdFrom(e){if(isImported(e)){for(;e.$type===`Imported`&&e.$container;)e=e.$container;U(isImportsFromPoject(e))}if(isImportsFromPoject(e))return e.project;let t=Ce(e)?nt(e):e;return t.likec4ProjectId?t.likec4ProjectId:(Y.warn`Document ${t.uri.fsPath} does not have a project ID assigned, this may lead to unexpected behavior.`,xf.DefaultProjectId)}function stringHash$1(...e){var t=e.length>1?e.join(`:::`):e[0];return Ti(t)}t(stringHash$1,`stringHash`);function safeCall(e){try{return e()}catch(e){Y.trace(`Safe call failed`,{error:e});return}}function performanceNow(){try{return globalThis.performance.now()}catch{return Date.now()}}function performanceMark(){let e=performanceNow();return{get ms(){return performanceNow()-e},get pretty(){return qn(performanceNow()-e)}}}const Cf=Y.getChild(`manual-layouts`),wf=`.likec4.snap`,isManualLayoutFile=e=>e!==wf&&e.endsWith(wf);function fileName(e){return`${e}${wf}`}function viewIdFromURI(e){let t=T.basename(e);return isManualLayoutFile(t)?t.slice(0,-12):null}function getManualLayoutsOutDir(e){return T.resolvePath(e.folderUri,e.config.manualLayouts?.outDir??`.likec4`)}const Tf={manualLayouts:e=>new DefaultLikeC4ManualLayouts(e)},Ef=`file://./`;var DefaultLikeC4ManualLayouts=class extends ADisposable{services;cache;listeners=[];#e=pLimit(1);constructor(e){super(),this.services=e,this.cache=new b,this.onDispose(S.create(()=>{this.listeners.length=0,this.cache.clear()})),bi(()=>{this.onDispose(e.workspace.ProjectsManager.onProjectsUpdate(()=>{this.clearCaches()}))})}async handleFileSystemUpdate(e){let t=e.update??e.delete,r=viewIdFromURI(t)??void 0,o=this.services.workspace.ProjectsManager.ownerProjectId(t);if(this.cache.delete(o),`delete`in e){this.triggerUpdate(Br({removed:t,projectId:o,viewId:r}));return}let s=this.services.workspace.ProjectsManager.getProject(o);if(!r){let e=await this.readSnapshot(t,s);e?r=e.id:(Cf.error(`Snapshot ${t.fsPath} does not exist or is invalid`),r=`index`)}this.triggerUpdate({updated:t,projectId:o,viewId:r})}onManualLayoutUpdate(e){return this.listeners.push(e),{dispose:()=>{let t=this.listeners.indexOf(e);t!==-1&&this.listeners.splice(t,1)}}}async readManualLayouts(e){let t=Cf.getChild(e.id),r=this.services.workspace.FileSystemProvider,o=getManualLayoutsOutDir(e),s=[],c=`${o.toString()}`;try{let u=await r.scanDirectory(o,isManualLayoutFile);if(u.length===0)return null;u.sort((e,t)=>e.uri.path.localeCompare(t.uri.path));for(let o of u)try{let t=await r.readFile(o.uri),u=bt.parse(t);c=Ti(c+o.uri.toString()+t);let d=this.resolveIconPathsAfterRead(u,e.folderUri);s.push({...d,_layout:`manual`})}catch(e){t.warn(`Failed to read view snapshot ${o.uri.fsPath}`,{err:e})}s.length&&t.trace`read manual layouts for ${e.id}, found ${s.length}`}catch(r){t.warn(`Failed to read manual layouts for ${e.folderUri.fsPath}`,{err:r})}if(s.length===0)return null;let u=rn(s,Nn(`id`));return{hash:c,views:u}}async readSnapshot(e,t){let r=this.services.workspace.FileSystemProvider;try{let o=await r.readFile(e),s=bt.parse(o);if(!t){let r=this.services.workspace.ProjectsManager.ownerProjectId(e);t=this.services.workspace.ProjectsManager.getProject(r)}return{...this.resolveIconPathsAfterRead(s,t.folderUri),_layout:`manual`}}catch(t){return Cf.warn(`Failed to read view snapshot ${e.fsPath}`,{err:t}),null}}async read(e){return await this.#e(async()=>{let t=this.cache.get(e.id);if(t!==void 0)return Cf.trace`cache hit project ${e.id}`,t;let r=await this.readManualLayouts(e);return this.cache.set(e.id,r),r})}async write(e,t){this.cache.delete(e.id);let r=Cf.getChild(e.id),o=getManualLayoutsOutDir(e),s=T.joinPath(o,fileName(t.id));if(`manualLayout`in t){let{manualLayout:e,...r}=t;t=r}let c=bt.stringify(this.normalizeIconPathsForWrite(t,e.folderUri),{space:2,quote:`'`}),u={uri:s.toString(),range:de.create(ye.create(0,0),ye.create(c.split(`
57
55
  `).length-1,1))};r.debug`write snapshot of ${t.id} in project ${e.id} to ${s.fsPath}`;let d=this.services.workspace.FileSystemProvider;try{await d.writeFile(s,c+`
58
- `),this.triggerUpdate({updated:s,projectId:e.id,viewId:t.id})}catch(e){r.warn(`Failed to write snapshot ${t.id} to ${s.fsPath}`,{err:e})}return u}async remove(e,t){this.cache.delete(e.id);let r=xf.getChild(e.id),o=getManualLayoutsOutDir(e),s=C.joinPath(o,fileName(t));r.debug`delete snapshot of ${t} in project ${e.id}. File: ${s.fsPath}`;let c={uri:s.toString(),range:fe.create(0,0,0,0)};try{if(!await this.services.workspace.FileSystemProvider.deleteFile(s))return r.warn`Snapshot ${t} did not exist at ${s.fsPath}`,null;this.triggerUpdate({removed:s,projectId:e.id,viewId:t})}catch(e){r.warn(`Failed to delete snapshot ${t} from ${s.fsPath}`,{err:e})}return c}clearCaches(){xf.trace`clear caches`,this.cache.clear()}triggerUpdate(e){let t=[...this.listeners];for(let r of t)safeCall(()=>r(e))}normalizeIconPathsForWrite(e,t){let r=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(`file://`)){let r=x.parse(e.icon),o=C.relative(t,r);return o.startsWith(`..`)?e:{...e,icon:`${wf}${o}`}}return e});return{...e,nodes:r}}resolveIconPathsAfterRead(e,t){let r=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(wf)){let r=e.icon.substring(9),o=C.joinPath(t,r);return{...e,icon:o.toString()}}return e});return{...e,nodes:r}}};function hasLikeC4Ext(e){return sf.fileExtensions.some(t=>e!==t&&e.endsWith(t))}const Tf=[`node_modules`,`.git`,`.svn`,`.yarn`,`.pnpm`];function isNodeModulesOrRepo(e){return Tf.includes(e)}function insideNodeModulesOrRepo(e){for(let t of Tf)if(e.includes(t))return!0;return!1}const Ef=q.getChild(`chokidar`),Df={fileSystemWatcher:e=>new ChokidarFileSystemWatcher(e)},isAnyLikeC4File=e=>{let t=tr(e);return hasLikeC4Ext(t)||zt(t)||isManualLayoutFile(t)};var ChokidarFileSystemWatcher=class{services;watcher;queue=new Kn({concurrency:1,timeout:5e3});constructor(e){this.services=e,Ef.trace`ChokidarFileSystemWatcher created`}watch(e){if(this.watcher){Ef.debug`add watching folder: ${e}`,this.watcher.add(e);return}this.watcher=this.createWatcher(e)}async dispose(){if(this.watcher){let e=this.watcher;this.watcher=void 0;try{await e.close()}catch{}}}createWatcher(e){Ef.debug`create watcher for folder: ${e}`;let t=Hi.watch(e,{ignored:[e=>insideNodeModulesOrRepo(e),(e,t)=>!!t&&t.isFile()&&!isAnyLikeC4File(e),e=>this.services.workspace.ProjectsManager.isExcluded(x.file(e))],followSymlinks:!0,ignoreInitial:!0}),onAddOrChange=(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`addOrChange: `+e,async()=>{await this.onAddOrChange(e)})},onRemove=(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`remove: `+e,async()=>{await this.onRemove(e)})};return t.on(`add`,onAddOrChange).on(`change`,onAddOrChange).on(`unlink`,onRemove).on(`unlinkDir`,e=>{this.enqueueFileOp(`removeDir: `+e,async()=>{await this.onRemoveDir(e)})}),t}enqueueFileOp(e,t){this.queue.add(async()=>{try{await t()}catch(t){Ef.warn(`Failed on {fileop}`,{fileop:e,error:t})}}).catch(t=>{Ef.error(`Error on {fileop}`,{fileop:e,error:t})})}async onAddOrChange(e){let t=this.services.workspace,r=tr(e),o=x.file(e);switch(!0){case zt(r):Ef.debug`project config changed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.registerConfigFile(o);break;case isManualLayoutFile(r):Ef.debug`manual layout file changed: ${e}`,await t.ManualLayouts.handleFileSystemUpdate({update:o});break;case hasLikeC4Ext(r):Ef.debug`file changed: ${e}`,await t.DocumentBuilder.update([o],[]);break;default:Ef.warn`Unknown file change: ${e}`}}async onRemove(e){let t=this.services.workspace,r=tr(e),o=x.file(e);switch(!0){case zt(r):Ef.debug`project file removed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects();break;case hasLikeC4Ext(r):Ef.debug`file removed: ${e}`,await t.DocumentBuilder.update([],[o]);break;case isManualLayoutFile(r):Ef.debug`manual layout file removed: ${e}`,await t.ManualLayouts.handleFileSystemUpdate({delete:o});break;default:Ef.warn`Unknown file removal: ${e}`}}async onRemoveDir(e){Ef.debug`directory removed: ${e}`;let t=this.services.workspace;t.ProjectsManager.findOverlaped(e).length>0&&(t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects())}},NoopFileSystemProvider=class{scanProjectFiles(){return Promise.resolve([])}scanDirectory(){return Promise.resolve([])}readFile(e){if(isLikeC4Builtin(e))return Promise.resolve(Ic);throw Error(`No file system is available (${e.toString()})`)}readDirectory(){return Promise.resolve([])}loadProjectConfig(){throw Error(`No file system is available.`)}writeFile(){throw Error(`No file system is available.`)}deleteFile(){throw Error(`No file system is available.`)}},NoopFileSystemWatcher=class{constructor(){q.debug`NoopFileSystemWatcher created`}watch(){}dispose(){return Promise.resolve()}},NoopLikeC4ManualLayouts=class{constructor(){q.debug`NoopLikeC4ManualLayouts created`}handleFileSystemUpdate(){return Promise.resolve()}readSnapshot(){return Promise.resolve(null)}read(){return Promise.resolve(null)}write(){return Promise.reject(Error(`NoopLikeC4ManualLayouts: write operation is not supported`))}remove(){return Promise.resolve(null)}clearCaches(){}onManualLayoutUpdate(){return{dispose:()=>{}}}dispose(){}};const Of={fileSystemWatcher:()=>new NoopFileSystemWatcher},kf={fileSystemProvider:()=>new NoopFileSystemProvider,...Of},Af={manualLayouts:()=>new NoopLikeC4ManualLayouts};function isLikeC4ConfigFile(e,t=!1){return!t&&zt(tr(e))}function isLikeC4File(e,t=!1){return!t&&hasLikeC4Ext(tr(e))}const WithFileSystem=(e=!1)=>({fileSystemProvider:()=>new SymLinkTraversingFileSystemProvider,...e?Df:Of});var SymLinkTraversingFileSystemProvider=class extends et{#e=q.getChild(`filesystem`);async readFile(e){if(isLikeC4Builtin(e))return Promise.resolve(Ic);try{return await super.readFile(e)}catch(t){return this.#e.warn(`Failed to read file ${e.fsPath}`,{error:t}),``}}async readDirectory(e,t){let r=t?.recursive??!0,o=t?.maxDepth??1/0,s=[];try{let t=new Vi().withSymlinks({resolvePaths:!1}).exclude(isNodeModulesOrRepo).withFullPaths().filter(isLikeC4File);r?o!==1/0&&(t=t.withMaxDepth(o)):t=t.withMaxDepth(1);let c=await t.crawl(e.fsPath).withPromise();for(let e of c)s.push({isFile:!0,isDirectory:!1,uri:x.file(e)});return s.sort(compareByUri)}catch(t){return this.#e.warn(`Failed to read directory ${e.fsPath}`,{error:t}),[]}}async scanProjectFiles(e){let t=await this.scanDirectory(e,isLikeC4ConfigFile);return t.length<=1?t:t.sort(compareByUriDeepFirst)}async scanDirectory(e,t){let r=[];try{let o=await new Vi().withSymlinks({resolvePaths:!1}).exclude(isNodeModulesOrRepo).withFullPaths().filter(t).crawl(e.fsPath).withPromise();for(let e of o)r.push({isFile:!0,isDirectory:!1,uri:x.file(e)})}catch(t){this.#e.warn(`Failed to scan directory {path}`,{path:e.fsPath,error:t})}return r}async loadProjectConfig(e){return await loadConfig(e)}async writeFile(e,t){let r=nr(e.fsPath),o=Fi(r,{throwIfNoEntry:!1});if(o?.isFile())throw Error(`Cannot create directory ${r} because a file with the same name exists.`);return o||(this.#e.debug(`creating directory {path}`,{path:r}),Pi(r,{recursive:!0})),this.#e.debug(`writing file {path}`,{path:e.fsPath}),await er(e.fsPath,t,{encoding:`utf-8`})}async deleteFile(e){try{let t=e.fsPath,r=Fi(t,{throwIfNoEntry:!1});return r?.isFile()||r?.isSymbolicLink()?(await $n(t),this.#e.debug(`deleted file {path}`,{path:t}),!0):(this.#e.warn(`deleteFile failed: {path} does not exist, or is not a file`,{path:t}),!1)}catch(t){this.#e.warn(`Failed to delete file ${e.fsPath}`,{error:t})}return!1}},LikeC4DocumentationProvider=class extends ee{parser;locator;constructor(e){super(e),this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getDocumentation(e){if(!isDeploymentNode$1(e)&&!isDeployedInstance(e)&&!isElement(e))return super.getDocumentation(e);try{let t=rt(e);if(t.state<b.Linked)return super.getDocumentation(e);let r=this.parser.forDocument(t);switch(!0){case isDeploymentNode$1(e):{let t=r.parseDeploymentNode(e);return t?`**${t.title}**`:void 0}case isDeployedInstance(e):{let o=r.parseDeployedInstance(e);if(!o)return;let[s,c]=z.isImportRef(o.element)?[o.element.project,o.element.model]:[t.likec4ProjectId,o.element.model],u=s?this.locator.getParsedElement(c,s):this.locator.getParsedElement(c),d=[`_instance of_ \`${c}\``];return u&&d.push(`**${u.element.title}**`),d.join(`
56
+ `),this.triggerUpdate({updated:s,projectId:e.id,viewId:t.id})}catch(e){r.warn(`Failed to write snapshot ${t.id} to ${s.fsPath}`,{err:e})}return u}async remove(e,t){this.cache.delete(e.id);let r=Cf.getChild(e.id),o=getManualLayoutsOutDir(e),s=T.joinPath(o,fileName(t));r.debug`delete snapshot of ${t} in project ${e.id}. File: ${s.fsPath}`;let c={uri:s.toString(),range:de.create(0,0,0,0)};try{if(!await this.services.workspace.FileSystemProvider.deleteFile(s))return r.warn`Snapshot ${t} did not exist at ${s.fsPath}`,null;this.triggerUpdate({removed:s,projectId:e.id,viewId:t})}catch(e){r.warn(`Failed to delete snapshot ${t} from ${s.fsPath}`,{err:e})}return c}clearCaches(){Cf.trace`clear caches`,this.cache.clear()}triggerUpdate(e){let t=[...this.listeners];for(let r of t)safeCall(()=>r(e))}normalizeIconPathsForWrite(e,t){let r=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(`file://`)){let r=C.parse(e.icon),o=T.relative(t,r);return o.startsWith(`..`)?e:{...e,icon:`${Ef}${o}`}}return e});return{...e,nodes:r}}resolveIconPathsAfterRead(e,t){let r=e.nodes.map(e=>{if(!e.icon||typeof e.icon!=`string`)return e;if(e.icon.startsWith(Ef)){let r=e.icon.substring(9),o=T.joinPath(t,r);return{...e,icon:o.toString()}}return e});return{...e,nodes:r}}};function hasLikeC4Ext(e){return lf.fileExtensions.some(t=>e!==t&&e.endsWith(t))}const Df=[`node_modules`,`.git`,`.svn`,`.yarn`,`.pnpm`];function isNodeModulesOrRepo(e){return Df.includes(e)}function insideNodeModulesOrRepo(e){for(let t of Df)if(e.includes(t))return!0;return!1}const Of=Y.getChild(`chokidar`),kf={fileSystemWatcher:e=>new ChokidarFileSystemWatcher(e)},isAnyLikeC4File=e=>{let t=er(e);return hasLikeC4Ext(t)||Rt(t)||isManualLayoutFile(t)};var ChokidarFileSystemWatcher=class{services;watcher;queue=new Gn({concurrency:1,timeout:5e3});constructor(e){this.services=e,Of.trace`ChokidarFileSystemWatcher created`}watch(e){if(this.watcher){Of.debug`add watching folder: ${e}`,this.watcher.add(e);return}this.watcher=this.createWatcher(e)}async dispose(){if(this.watcher){let e=this.watcher;this.watcher=void 0;try{await e.close()}catch{}}}createWatcher(e){Of.debug`create watcher for folder: ${e}`;let t=Wi.watch(e,{ignored:[e=>insideNodeModulesOrRepo(e),(e,t)=>!!t&&t.isFile()&&!isAnyLikeC4File(e),e=>this.services.workspace.ProjectsManager.isExcluded(C.file(e))],followSymlinks:!0,ignoreInitial:!0}),onAddOrChange=(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`addOrChange: `+e,async()=>{await this.onAddOrChange(e)})},onRemove=(e,t)=>{t?.isDirectory()||this.enqueueFileOp(`remove: `+e,async()=>{await this.onRemove(e)})};return t.on(`add`,onAddOrChange).on(`change`,onAddOrChange).on(`unlink`,onRemove).on(`unlinkDir`,e=>{this.enqueueFileOp(`removeDir: `+e,async()=>{await this.onRemoveDir(e)})}),t}enqueueFileOp(e,t){this.queue.add(async()=>{try{await t()}catch(t){Of.warn(`Failed on {fileop}`,{fileop:e,error:t})}}).catch(t=>{Of.error(`Error on {fileop}`,{fileop:e,error:t})})}async onAddOrChange(e){let t=this.services.workspace,r=er(e),o=C.file(e);switch(!0){case Rt(r):Of.debug`project config changed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.registerConfigFile(o);break;case isManualLayoutFile(r):Of.debug`manual layout file changed: ${e}`,await t.ManualLayouts.handleFileSystemUpdate({update:o});break;case hasLikeC4Ext(r):Of.debug`file changed: ${e}`,await t.DocumentBuilder.update([o],[]);break;default:Of.warn`Unknown file change: ${e}`}}async onRemove(e){let t=this.services.workspace,r=er(e),o=C.file(e);switch(!0){case Rt(r):Of.debug`project file removed: ${e}`,t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects();break;case hasLikeC4Ext(r):Of.debug`file removed: ${e}`,await t.DocumentBuilder.update([],[o]);break;case isManualLayoutFile(r):Of.debug`manual layout file removed: ${e}`,await t.ManualLayouts.handleFileSystemUpdate({delete:o});break;default:Of.warn`Unknown file removal: ${e}`}}async onRemoveDir(e){Of.debug`directory removed: ${e}`;let t=this.services.workspace;t.ProjectsManager.findOverlaped(e).length>0&&(t.ManualLayouts.clearCaches(),await t.ProjectsManager.reloadProjects())}},NoopFileSystemProvider=class{scanProjectFiles(){return Promise.resolve([])}scanDirectory(){return Promise.resolve([])}readFile(e){if(isLikeC4Builtin(e))return Promise.resolve(Rc);throw Error(`No file system is available (${e.toString()})`)}readDirectory(){return Promise.resolve([])}loadProjectConfig(){throw Error(`No file system is available.`)}writeFile(){throw Error(`No file system is available.`)}deleteFile(){throw Error(`No file system is available.`)}},NoopFileSystemWatcher=class{constructor(){Y.debug`NoopFileSystemWatcher created`}watch(){}dispose(){return Promise.resolve()}},NoopLikeC4ManualLayouts=class{constructor(){Y.debug`NoopLikeC4ManualLayouts created`}handleFileSystemUpdate(){return Promise.resolve()}readSnapshot(){return Promise.resolve(null)}read(){return Promise.resolve(null)}write(){return Promise.reject(Error(`NoopLikeC4ManualLayouts: write operation is not supported`))}remove(){return Promise.resolve(null)}clearCaches(){}onManualLayoutUpdate(){return{dispose:()=>{}}}dispose(){}};const Af={fileSystemWatcher:()=>new NoopFileSystemWatcher},jf={fileSystemProvider:()=>new NoopFileSystemProvider,...Af},Mf={manualLayouts:()=>new NoopLikeC4ManualLayouts};function isLikeC4ConfigFile(e,t=!1){return!t&&Rt(er(e))}function isLikeC4File(e,t=!1){return!t&&hasLikeC4Ext(er(e))}const WithFileSystem=(e=!1)=>({fileSystemProvider:e=>new SymLinkTraversingFileSystemProvider(e),...e?kf:Af});var SymLinkTraversingFileSystemProvider=class extends $e{services;#e=Y.getChild(`filesystem`);constructor(e){super(),this.services=e}isExcluded(e){return this.services.workspace.ProjectsManager.isExcludedByWorkspace(C.file(e))}excludeDirectory=(e,t)=>isNodeModulesOrRepo(e)||this.isExcluded(t);async readFile(e){if(isLikeC4Builtin(e))return Promise.resolve(Rc);try{return await super.readFile(e)}catch(t){return this.#e.warn(`Failed to read file ${e.fsPath}`,{error:t}),``}}async readDirectory(e,t){if(this.isExcluded(e.fsPath))return[];let r=t?.recursive??!0,o=t?.maxDepth??1/0,s=[];try{let t=new Ui().withSymlinks({resolvePaths:!1}).exclude(this.excludeDirectory).withFullPaths().filter(e=>isLikeC4File(e)&&!this.isExcluded(e));r?o!==1/0&&(t=t.withMaxDepth(o)):t=t.withMaxDepth(1);let c=await t.crawl(e.fsPath).withPromise();for(let e of c)s.push({isFile:!0,isDirectory:!1,uri:C.file(e)});return s.sort(compareByUri)}catch(t){return this.#e.warn(`Failed to read directory ${e.fsPath}`,{error:t}),[]}}async scanProjectFiles(e){let t=await this.scanDirectory(e,isLikeC4ConfigFile);return t.length<=1?t:t.sort(compareByUriDeepFirst)}async scanDirectory(e,t){if(this.isExcluded(e.fsPath))return[];let r=[];try{let o=await new Ui().withSymlinks({resolvePaths:!1}).exclude(this.excludeDirectory).withFullPaths().filter((e,r)=>!this.isExcluded(e)&&t(e,r)).crawl(e.fsPath).withPromise();for(let e of o)r.push({isFile:!0,isDirectory:!1,uri:C.file(e)})}catch(t){this.#e.warn(`Failed to scan directory {path}`,{path:e.fsPath,error:t})}return r}async loadProjectConfig(e){return await loadConfig(e)}async writeFile(e,t){let r=tr(e.fsPath),o=Li(r,{throwIfNoEntry:!1});if(o?.isFile())throw Error(`Cannot create directory ${r} because a file with the same name exists.`);return o||(this.#e.debug(`creating directory {path}`,{path:r}),Ii(r,{recursive:!0})),this.#e.debug(`writing file {path}`,{path:e.fsPath}),await $n(e.fsPath,t,{encoding:`utf-8`})}async deleteFile(e){try{let t=e.fsPath,r=Li(t,{throwIfNoEntry:!1});return r?.isFile()||r?.isSymbolicLink()?(await Qn(t),this.#e.debug(`deleted file {path}`,{path:t}),!0):(this.#e.warn(`deleteFile failed: {path} does not exist, or is not a file`,{path:t}),!1)}catch(t){this.#e.warn(`Failed to delete file ${e.fsPath}`,{error:t})}return!1}},LikeC4DocumentationProvider=class extends ee{parser;locator;constructor(e){super(e),this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getDocumentation(e){if(!isDeploymentNode$1(e)&&!isDeployedInstance(e)&&!isElement(e))return super.getDocumentation(e);try{let t=nt(e);if(t.state<x.Linked)return super.getDocumentation(e);let r=this.parser.forDocument(t);switch(!0){case isDeploymentNode$1(e):{let t=r.parseDeploymentNode(e);return t?`**${t.title}**`:void 0}case isDeployedInstance(e):{let o=r.parseDeployedInstance(e);if(!o)return;let[s,c]=H.isImportRef(o.element)?[o.element.project,o.element.model]:[t.likec4ProjectId,o.element.model],u=s?this.locator.getParsedElement(c,s):this.locator.getParsedElement(c),d=[`_instance of_ \`${c}\``];return u&&d.push(`**${u.element.title}**`),d.join(`
59
57
  `)}case isElement(e):{let t=r.parseElement(e);return t?[`**${t.title}**`,`<small>kind: \`${t.kind}\`</small>`].join(`
60
- `):void 0}default:return e}}catch(e){logWarnError(e)}}},jf=Je(),Mf=Ae();function areOverlap(e,t){return[e,t]=compareRanges(e,t)>0?[t,e]:[e,t],isInRagne(e.range,t.range.start)}function compareRanges(e,t){let r=e.range.start.line-t.range.start.line;return r===0?e.range.start.character-t.range.start.character:r}function isInRagne(e,t){return!(t.line<e.start.line||t.line>e.end.line||t.line==e.start.line&&t.character<e.start.character||t.line==e.end.line&&t.character>e.end.character)}function isMultiline(e){return!!e&&e.range.start.line!=e.range.end.line}function isSameLine(e,t){if(!e||!t)return!1;let[r,o]=e.range.start.line<t.range.start.line?[e,t]:[t,e];return r.range.end.line===o.range.start.line}const X={newLine:Ze.newLine({allowMore:!0}),oneSpace:Ze.oneSpace(),noSpace:Ze.noSpace(),indent:Ze.indent({allowMore:!0}),noIndent:Ze.noIndent()};var LikeC4Formatter=class extends We{options={quoteStyle:`auto`};extendedFormattingCommands=[];constructor(e){super(),e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(e=>this.onConfigurationUpdate(e.configuration.formatting))}doDocumentFormat(e,t,r){this.extendedFormattingCommands=[];let o=super.doDocumentFormat(e,t,r);return this.doExtendedFormatting(o),o}format(e){this.removeIndentFromTopLevelStatements(e),this.indentContentInBraces(e),this.normalizeQuotes(e),this.formatImports(e),this.formatSpecificationRule(e),this.formatGlobals(e),this.formatElementDeclaration(e),this.formatExtendElement(e),this.formatRelation(e),this.formatMetadataProperty(e),this.formatDeploymentNodeDeclaration(e),this.formatDeployedInstance(e),this.formatDeploymentRelation(e),this.formatExtendDeployment(e),this.formatView(e),this.formatViewRuleGroup(e),this.formatViewRuleGlobalStyle(e),this.formatViewRuleGlobalPredicate(e),this.formatIncludeExcludeExpressions(e),this.formatWhereExpression(e),this.formatWhereRelationExpression(e),this.formatWhereElementExpression(e),this.formatRelationExpression(e),this.formatAutolayoutProperty(e),this.formatWithPredicate(e),this.formatSteps(e),this.formatViewRuleStyle(e),this.formatLeafProperty(e),this.formatLinkProperty(e),this.formatNavigateToProperty(e),this.formatTags(e)}formatTags(e){this.on(e,isTags,(e,t)=>{let r=qe(e.$cstNode,`values`).filter(L).slice(1);t.cst(r).prepend(X.oneSpace),t.keywords(`,`).prepend(X.noSpace).append(X.oneSpace)})}formatDeploymentRelation(e){this.on(e,isDeploymentRelation,(e,t)=>{let r=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(r).append(X.oneSpace),t.keywords(`]->`).prepend(X.noSpace),t.keywords(`-[`).append(X.noSpace),t.nodes(...M([e.target,e.tags],L)).prepend(X.oneSpace),t.properties(`title`,`description`,`technology`).prepend(X.oneSpace)})}formatExtendDeployment(e){this.on(e,isExtendDeployment,(e,t)=>{t.keywords(`extend`).append(X.oneSpace)})}formatRelation(e){this.on(e,e=>isRelation(e)||isDeploymentRelation(e),(e,t)=>{let r=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(r).append(X.oneSpace),t.keywords(`]->`,`]<->`).prepend(X.noSpace),t.keywords(`-[`).append(X.noSpace),t.nodes(...M([e.target,e.tags],L)).prepend(X.oneSpace),t.properties(`title`,`description`,`technology`).prepend(X.oneSpace)}),this.on(e,isStepOrSeries,(e,t)=>{t.keywords(`->`,`<-`).surround(X.oneSpace),t.property(`dotKind`).prepend(X.oneSpace).append(X.oneSpace),t.keywords(`]->`).prepend(X.noSpace).append(X.oneSpace),t.keywords(`-[`).prepend(X.oneSpace).append(X.noSpace),t.properties(`title`).prepend(X.oneSpace),(isStepSeries(e)&&isMultiline(e.$cstNode)||isStep(e)&&isStepSeries(e.$container)&&isMultiline(e.$container.$cstNode))&&(t.property(`dotKind`).prepend(Ze.indent({allowLess:!1,allowMore:!0,priority:2})),t.keywords(`->`,`-[`).prepend(Ze.indent({allowLess:!1,allowMore:!0,priority:2})),e.custom?.$cstNode&&isMultiline(e.custom.$cstNode)&&t.property(`custom`).prepend({options:{allowLess:!1,allowMore:!0,priority:2},moves:[{tabs:1}]}))})}removeIndentFromTopLevelStatements(e){isLikeC4Grammar(e.$container)&&this.getNodeFormatter(e).keywords(`specification`,`model`,`views`,`likec4lib`,`global`,`deployments`,`import`).prepend(X.noIndent)}indentContentInBraces(e){if(isLikeC4Lib(e)||isSpecificationRule(e)||isSpecificationElementKind(e)||isSpecificationRelationshipKind(e)||isSpecificationDeploymentNodeKind(e)||isGlobals(e)||isGlobalStyle(e)||isGlobalStyleGroup(e)||isGlobalPredicateGroup(e)||isGlobalDynamicPredicateGroup(e)||isGlobalStyleGroup(e)||isModel(e)||isElementBody(e)||isExtendElementBody(e)||isRelationBody(e)||isRelationStyleProperty(e)||isMetadataBody(e)||isModelViews(e)||isElementViewBody(e)||isDynamicViewBody(e)||isDeploymentViewBody(e)||isViewRuleStyle(e)||isViewRuleGroup(e)||isCustomElementProperties(e)||isCustomRelationProperties(e)||isElementStyleProperty(e)||isStepsBlock(e)||isAltSteps(e)||isModelDeployments(e)||isDeploymentNodeBody(e)||isDeploymentRelationBody(e)||isDeployedInstanceBody(e)||isExtendDeploymentBody(e)){let t=this.getNodeFormatter(e),r=t.keywords(`{`);r.prepend(X.noIndent).prepend(X.oneSpace);let o=isMultiline(e.$cstNode),s=t.keywords(`}`),c=t.interior(r,s),u=null;for(let e of c.nodes){if(!o){t.cst([e]).surround(X.oneSpace);continue}(!u||!areOverlap(u,e))&&t.cst([e]).prepend(Ze.newLine({allowMore:!0})).prepend(X.indent),u=e}o?s.prepend(X.noIndent).prepend(Ze.newLine({allowMore:!0})):s.prepend(Ze.oneSpace({allowLess:!0}))}}appendKeywordsWithSpace(e){this.on(e,isElementKind)?.keywords(`element`).append(X.oneSpace)}formatView(e){this.on(e,isElementView$1,(e,t)=>{(e.extends||e.viewOf||e.name)&&t.keywords(`view`).append(X.oneSpace),t.keywords(`of`,`extends`).surround(X.oneSpace)}),this.on(e,isDynamicView$1)?.keywords(`dynamic`,`view`).append(X.oneSpace),this.on(e,isDeploymentView$1)?.keywords(`deployment`,`view`).append(X.oneSpace)}formatLeafProperty(e){if(isElementStringProperty(e)||isRelationStringProperty(e)||isViewStringProperty(e)||isViewOrderProperty(e)||isNotationProperty(e)||isNotesProperty(e)||isSpecificationElementStringProperty(e)||isSpecificationRelationshipStringProperty(e)||isColorProperty(e)||isLineProperty(e)||isArrowProperty(e)||isIconProperty(e)||isShapeProperty(e)||isBorderProperty(e)||isOpacityProperty(e)||isMultipleProperty(e)||isIconColorProperty(e)||isIconSizeProperty(e)||isIconPositionProperty(e)||isShapeSizeProperty(e)||isPaddingSizeProperty(e)||isTextSizeProperty(e)){let t=this.getNodeFormatter(e),r=t.keyword(`:`),o=t.keywords(`title`,`description`,`order`,`technology`,`summary`,`notation`,`notes`,`color`,`line`,`head`,`tail`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`shape`,`border`,`opacity`,`multiple`,`size`,`padding`,`textSize`);r.nodes.length===0?o.append(X.oneSpace):r.prepend(X.noSpace).append(X.oneSpace),t.keyword(`;`).prepend(X.noSpace).append(X.newLine)}}formatLinkProperty(e){this.on(e,isLinkProperty,(e,t)=>{t.keyword(`link`).append(X.oneSpace),t.property(`value`).append(X.oneSpace),t.keyword(`:`).prepend(X.noSpace).append(X.oneSpace),t.keyword(`;`).prepend(X.noSpace).append(X.newLine)})}formatNavigateToProperty(e){this.on(e,isNavigateToProperty)?.property(`key`).append(X.oneSpace)}formatAutolayoutProperty(e){this.on(e,isViewRuleAutoLayout,(e,t)=>{t.keyword(`autoLayout`).append(X.oneSpace),t.property(`rankSep`).prepend(X.oneSpace),t.property(`nodeSep`).prepend(X.oneSpace)})}formatMetadataProperty(e){this.on(e,isMetadataAttribute,(e,t)=>{t.property(`key`).append(X.oneSpace),t.keyword(`:`).prepend(X.noSpace).append(X.oneSpace),t.keyword(`;`).prepend(X.noSpace).append(X.newLine)})}formatElementDeclaration(e){this.on(e,isElement,(e,t)=>{let r=Ce(e.$cstNode,`kind`),o=Ce(e.$cstNode,`name`);o&&r&&(compareRanges(o,r)>0?t.cst([r]).append(X.oneSpace):(t.cst([o]).append(X.oneSpace),t.cst([r]).prepend(X.oneSpace))),t.properties(`props`).prepend(X.oneSpace)})}formatExtendElement(e){this.on(e,isExtendElementOrRelation,(e,t)=>{t.keywords(`extend`).append(X.oneSpace)})}formatGlobals(e){this.on(e,isGlobalStyle,(e,t)=>{t.keyword(`style`).append(X.oneSpace),t.property(`id`).append(X.oneSpace)}),this.on(e,isGlobalStyleGroup,(e,t)=>{t.keyword(`styleGroup`).append(X.oneSpace)}),this.on(e,isGlobalPredicateGroup,(e,t)=>{t.keyword(`predicateGroup`).append(X.oneSpace)}),this.on(e,isGlobalDynamicPredicateGroup,(e,t)=>{t.keyword(`dynamicPredicateGroup`).append(X.oneSpace)})}formatImports(e){this.on(e,isImportsFromPoject,(e,t)=>{t.keyword(`import`).append(X.oneSpace),t.keywords(`{`,`}`,`from`).surround(X.oneSpace)}),this.on(e,isImported,(e,t)=>{t.keywords(`,`).prepend(X.noSpace).append(X.oneSpace)})}formatSpecificationRule(e){if((isSpecificationElementKind(e)||isSpecificationRelationshipKind(e)||isSpecificationTag(e)||isSpecificationDeploymentNodeKind(e))&&this.getNodeFormatter(e).keywords(`element`,`relationship`,`tag`,`deploymentNode`).append(X.oneSpace),isSpecificationColor(e)){let t=this.getNodeFormatter(e);t.keyword(`color`).append(X.oneSpace),t.property(`name`).append(X.oneSpace)}}formatWithPredicate(e){(isFqnExprWith(e)||isRelationExprWith(e))&&this.getNodeFormatter(e).keyword(`with`).prepend(X.oneSpace)}formatDeploymentNodeDeclaration(e){this.on(e,isDeploymentNode$1,(e,t)=>{let r=Ce(e.$cstNode,`kind`),o=Ce(e.$cstNode,`name`);o&&r&&(compareRanges(o,r)>0?t.cst([r]).append(X.oneSpace):(t.cst([o]).append(X.oneSpace),t.cst([r]).prepend(X.oneSpace))),t.properties(`title`).prepend(X.oneSpace)})}formatDeployedInstance(e){this.on(e,isDeployedInstance,(e,t)=>{let r=e.$cstNode?.content.find(e=>e.text===`=`);r&&t.cst([r]).surround(X.oneSpace),t.keyword(`instanceOf`).append(X.oneSpace),t.property(`title`).prepend(X.oneSpace)})}formatViewRuleGlobalStyle(e){this.on(e,isViewRuleGlobalStyle,(e,t)=>{t.keywords(`global`,`style`).append(X.oneSpace)})}formatViewRuleGlobalPredicate(e){let t=this.getNodeFormatter(e);(isViewRuleGlobalPredicateRef(e)||isDynamicViewGlobalPredicateRef(e))&&t.keywords(`global`,`predicate`).append(X.oneSpace)}formatViewRuleGroup(e){this.on(e,isViewRuleGroup,(e,t)=>{t.keyword(`group`).append(X.oneSpace)})}formatViewRuleStyle(e){this.on(e,isViewRuleStyle)?.keyword(`style`).append(X.oneSpace),this.on(e,isDeploymentViewRuleStyle)?.keyword(`style`).append(X.oneSpace),this.on(e,isExpressions)?.keyword(`,`).prepend(X.noSpace).append(X.oneSpace),this.on(e,isFqnExpressions)?.keyword(`,`).prepend(X.noSpace).append(X.oneSpace)}formatWhereExpression(e){(isRelationExprWhere(e)||isFqnExprWhere(e))&&this.getNodeFormatter(e).keyword(`where`).append(X.oneSpace)}formatWhereRelationExpression(e){if(this.on(e,isWhereRelationExpression,(e,t)=>{t.property(`operator`).surround(X.oneSpace)}),this.on(e,isWhereRelationNegation,(e,t)=>{t.keyword(`not`).append(X.oneSpace)}),isWhereRelation(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(X.oneSpace),t.property(`not`).surround(X.oneSpace)}}formatWhereElementExpression(e){if(this.on(e,isWhereElementExpression,(e,t)=>{t.property(`operator`).surround(X.oneSpace)}),this.on(e,isWhereElementNegation,(e,t)=>{t.keyword(`not`).append(X.oneSpace)}),isWhereElement(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(X.oneSpace),t.property(`not`).surround(X.oneSpace)}}formatIncludeExcludeExpressions(e){if(isDynamicViewRule(e)||isViewRulePredicate(e)||isDeploymentViewRulePredicate(e)){let t=this.getNodeFormatter(e);(!e.$cstNode||!isMultiline(e.$cstNode))&&t.keywords(`include`,`exclude`).append(X.oneSpace)}if(isExpressions(e)){let t=this.getNodeFormatter(e),r=this.findPredicateExpressionRoot(e),o=r?.$cstNode&&isMultiline(r?.$cstNode);o&&t.property(`value`).prepend(X.indent),t.keyword(`,`).prepend(X.noSpace).append(o?X.newLine:X.oneSpace)}}formatRelationExpression(e){this.on(e,isIncomingRelationExpr,(e,t)=>{t.keyword(`->`).append(X.oneSpace)}),this.on(e,isInOutRelationExpr,(e,t)=>{t.keyword(`->`).prepend(X.oneSpace)}),this.on(e,isOutgoingRelationExpr,(e,t)=>{t.keywords(`->`,`<->`).prepend(X.oneSpace),t.keywords(`-[`).prepend(X.oneSpace).append(X.noSpace),t.keywords(`]->`).prepend(X.noSpace).append(X.oneSpace),t.property(`dotKind`).prepend(X.oneSpace).append(X.oneSpace)}),this.on(e,isDirectedRelationExpr,(e,t)=>{t.property(`target`).prepend(X.oneSpace)})}formatSteps(e){this.on(e,Gr(isAltSteps,isTryBlock,isCatchBlock,isFinallyBlock),(e,t)=>{if(t.keywords(`try`,`alt`).append(X.oneSpace),t.property(`title`).surround(X.oneSpace),isCatchBlock(e)){let r=t.keyword(`catch`);isSameLine(e.try.$cstNode,r.nodes[0])?r.prepend(X.oneSpace):r.prepend(Ze.newLine()),r.append(X.oneSpace)}if(isFinallyBlock(e)){let r=t.keyword(`finally`);isSameLine(e.tryCatch.$cstNode,r.nodes[0])?r.prepend(X.oneSpace):r.prepend(Ze.newLine()),r.append(X.oneSpace)}}),this.on(e,isSubflowStep,(e,t)=>{t.property(`kind`).append(X.oneSpace),t.property(`title`).surround(X.oneSpace)})}findPredicateExpressionRoot(e){let t=e.$container;for(;;){if(!t||isDynamicViewRule(t)||isViewRulePredicate(t)||isDeploymentViewRulePredicate(t))return t;t=t.$container}}on(e,t,r){let o=t(e)?this.getNodeFormatter(e):void 0;try{r&&o&&r(e,o)}catch(t){q.warn(`Error formatting node ${e.$type}`,{error:t})}return o}doExtendedFormatting(e){let t=this.quotesNormalizerFactory(this.extendedFormattingCommands);for(let r of this.extendedFormattingCommands)switch(r.type){case`normalizeQuotes`:t(r,e);break;default:H(r.type)}}normalizeQuotes(e){if(this.options.quoteStyle===`ignore`)return;let t=null;if(isMetadataAttribute(e)){let r=e.value;isMetadataArray(r)?t=this.getNodeFormatter(r).nodes(...r.values):r&&(t=this.getNodeFormatter(e).property(`value`))}else t=this.on(e,isStringProperty)?.property(`value`);t??=this.on(e,isElement)?.properties(`props`),t??=this.on(e,isImportsFromPoject)?.properties(`project`),t??=this.on(e,isRelation)?.properties(`title`,`technology`),t??=this.on(e,isViewRuleGroup)?.properties(`title`),t??=this.on(e,isStepStatement)?.properties(`title`),t??=this.on(e,isDeploymentNode$1)?.properties(`title`),t??=this.on(e,isDeployedInstance)?.properties(`title`),t??=this.on(e,isDeploymentRelation)?.properties(`title`,`technology`),t??=this.on(e,isLinkProperty)?.properties(`title`),t&&this.extendedFormattingCommands.push({type:`normalizeQuotes`,region:t})}quotesNormalizerFactory(e){let t=this.options.quoteStyle==`auto`?this.getAutoQuoteStyle(e):this.options.quoteStyle;return(e,r)=>{let o=t===`single`?`"`:`'`,s=t===`single`?`'`:`"`,c=s.repeat(3),u=s,d=e.region.nodes.map(e=>{let t=e.text.startsWith(`"""`)||e.text.startsWith(`'''`)?c:u;return{range:e.range,newText:t+this.escapeQuotesInternalQuotes(e.text.slice(t.length,-t.length),o,s)+t}});r.push(...d)}}escapeQuotesInternalQuotes(e,t,r){let o=``,s=0;for(;s>=0;){let t=e.indexOf(r,s);if(t<0){o+=e.slice(s);break}o+=e.slice(s,t),s=t+1;let c=!1;for(;t>0&&e[t-1]==`\\`;)c=!c,t--;o+=c?r:`\\${r}`}return o}getAutoQuoteStyle(e){let t=e.flatMap(e=>e.region.nodes);return t.filter(e=>e.text[0]==`"`).length*2>=t.length?`double`:`single`}onConfigurationUpdate(e){this.options={...this.options,...e??{quoteStyle:`auto`}}}};Qe();const Nf=q.getChild(`LanguageServices`),isErrorDiagnostic=e=>e.severity===ye.Error;var DefaultLikeC4LanguageServices=class{services;builder;editor;projectsManager;constructor(e){this.services=e,this.builder=e.likec4.ModelBuilder,this.projectsManager=e.shared.workspace.ProjectsManager,this.editor=e.likec4.ModelChanges}get views(){return this.services.likec4.Views}get workspaceUri(){return this.services.shared.workspace.WorkspaceManager.workspaceUri}get workspacePath(){return this.workspaceUri.fsPath}projects(){let e=this.services.shared.workspace.ProjectsManager,t=I(this.services.shared.workspace.LangiumDocuments.groupedByProject(),rn(),N(([t,r])=>{let o=t,{folderUri:s,config:c}=e.getProject(o);return{id:o,folder:s,title:c.title??c.name,documents:N(r,Pn(`uri`)),config:c}}));if(A(t,2)&&e.defaultProjectId){let r=t.findIndex(t=>t.id===e.defaultProjectId);if(r>0){let[e]=t.splice(r,1);return[e,...t]}return t}if(A(t,1))return t;let{id:r,folderUri:o,config:s}=e.default;return[{id:r,folder:o,title:s.title??s.name,documents:[],config:s}]}project(e){let{id:t,folderUri:r,config:o}=this.projectsManager.ensureProject(e),s=N(this.services.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),Pn(`uri`));return{id:t,folder:r,title:o.title??o.name,documents:s,config:o}}async diagrams(e,t){let r=this.projectsManager.ensureProjectId(e);return await this.views.diagrams(r,t)}async computedModel(e,t){let r=this.projectsManager.ensureProjectId(e);return await this.builder.computeModel(r,t)}async layoutedModel(e,t){let r=this.projectsManager.ensureProjectId(e),o=await this.builder.computeModel(r,t);if(!o)throw Error(`Failed to compute model, empty project?`);let s=await this.views.layoutAllViews(r,t);return Ai.create({...o.$data,_stage:`layouted`,views:I(s,N(Pn(`diagram`)),an(Pn(`id`)))})}async projectsOverview(e){let t=this.services.shared.workspace.ProjectsManager.all,r=[];for(let o of t){let t=await this.builder.computeModel(o,e);if(e?.isCancellationRequested)throw Error(`Operation cancelled`);if(t===Ai.EMPTY){Nf.debug(`Project ${o} is empty, skipping`);continue}r.push(t)}if(!A(r,1))throw Error(`No models found`);let o=Wi(r);return await this.views.layouter.layoutProjectsView(o)}getErrors(){return I(this.services.shared.workspace.LangiumDocuments.userDocuments.toArray(),Qt(e=>I(e.diagnostics??[],M(isErrorDiagnostic),N(({message:t,range:r})=>({message:t,line:r.start.line,range:r,sourceFsPath:e.uri.fsPath})))))}locate(e){switch(!0){case`element`in e:return this.services.likec4.ModelLocator.locateElement(e.element,e.projectId);case`relation`in e:return this.services.likec4.ModelLocator.locateRelation(e.relation,e.projectId);case`view`in e:return this.services.likec4.ModelLocator.locateView(e.view,e.projectId);case`deployment`in e:return this.services.likec4.ModelLocator.locateDeploymentElement(e.deployment,e.projectId);default:H(e)}}documentText(e){return this.services.shared.workspace.LangiumDocuments.getDocument(x.parse(e))?.textDocument.getText()}async format(e){let t=this.services.shared.workspace.LangiumDocuments,r=this.services.lsp.Formatter,o=buildFormattingOptions(e),s=this.collectDocumentsToFormat(t,e);s.sort((e,t)=>e.uri.toString().localeCompare(t.uri.toString()));let c=new Map;for(let e of s){let t=e.uri.toString(),s=await r.formatDocument(e,{options:o,textDocument:{uri:t}}),u=s.length===0?e.textDocument.getText():ge.applyEdits(e.textDocument,s);c.set(t,u)}return c}collectDocumentsToFormat(e,t){let r=t?.projectIds??[],o=t?.documentUris??[],s=new Map;if(r.length>0)for(let t of r)for(let r of e.projectDocuments(t))s.set(r.uri.toString(),r);else if(o.length===0)for(let t of this.projectsManager.all)for(let r of e.projectDocuments(t))s.set(r.uri.toString(),r);for(let t of o){if(s.has(t))continue;let r;try{r=e.getDocument(x.parse(t))}catch{Nf.warn(`format: skipping unknown document ${t}`);continue}if(!isLikeC4LangiumDocument(r)){Nf.warn(`format: skipping unknown document ${t}`);continue}s.set(t,r)}return[...s.values()]}async dispose(){try{Nf.debug(`disposing LikeC4LanguageServices`),this.services.likec4.FqnIndex.dispose(),this.services.likec4.DeploymentsIndex.dispose(),this.services.likec4.ModelParser.dispose(),this.services.likec4.ModelBuilder.dispose(),this.services.likec4.Views.dispose(),this.services.likec4.LastSeen.dispose(),this.services.Rpc.dispose(),this.services.shared.workspace.ManualLayouts.dispose(),this.services.shared.workspace.ProjectsManager.dispose(),await this.services.shared.workspace.FileSystemWatcher.dispose()}catch(e){Nf.error(loggable(e))}finally{Nf.debug(`LikeC4LanguageServices disposed`)}}};function buildFormattingOptions(e){return{tabSize:e?.tabSize??2,insertSpaces:e?.insertSpaces??!0,...e?.trimTrailingWhitespace!=null&&{trimTrailingWhitespace:e.trimTrailingWhitespace},...e?.insertFinalNewline!=null&&{insertFinalNewline:e.insertFinalNewline},...e?.trimFinalNewlines!=null&&{trimFinalNewlines:e.trimFinalNewlines}}}var LikeC4CodeLensProvider=class{services;constructor(e){this.services=e}async provideCodeLens(e,t,r){if(isLikeC4LangiumDocument(e))return e.state<b.Linked&&(q.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(b.Linked,e.uri,r),q.debug(`Document is linked`)),e.parseResult.value.views.flatMap(e=>e.views).flatMap(e=>{let t=ff.readId(e),r=e.$cstNode?.range;if(!r||!t)return[];let o=projectIdFrom(e);return{range:{start:r.start,end:{line:r.start.line,character:r.start.character+4}},command:{command:`likec4.open-preview`,arguments:[t,o],title:`open preview`}}})}};Qe();function isCompletionForPojectName(e,t){return Fe(t.feature)&&t.property===`project`&&isImportsFromPoject(e.node)}const Pf=`view_\${CURRENT_MINUTE}_\${CURRENT_SECOND} {
58
+ `):void 0}default:return e}}catch(e){logWarnError(e)}}},Nf=qe(),Pf=ke();function areOverlap(e,t){return[e,t]=compareRanges(e,t)>0?[t,e]:[e,t],isInRagne(e.range,t.range.start)}function compareRanges(e,t){let r=e.range.start.line-t.range.start.line;return r===0?e.range.start.character-t.range.start.character:r}function isInRagne(e,t){return!(t.line<e.start.line||t.line>e.end.line||t.line==e.start.line&&t.character<e.start.character||t.line==e.end.line&&t.character>e.end.character)}function isMultiline(e){return!!e&&e.range.start.line!=e.range.end.line}function isSameLine(e,t){if(!e||!t)return!1;let[r,o]=e.range.start.line<t.range.start.line?[e,t]:[t,e];return r.range.end.line===o.range.start.line}const Q={newLine:Xe.newLine({allowMore:!0}),oneSpace:Xe.oneSpace(),noSpace:Xe.noSpace(),indent:Xe.indent({allowMore:!0}),noIndent:Xe.noIndent()};var LikeC4Formatter=class extends Ue{options={quoteStyle:`auto`};extendedFormattingCommands=[];constructor(e){super(),e.shared.workspace.ConfigurationProvider.onConfigurationSectionUpdate(e=>this.onConfigurationUpdate(e.configuration.formatting))}doDocumentFormat(e,t,r){this.extendedFormattingCommands=[];let o=super.doDocumentFormat(e,t,r);return this.doExtendedFormatting(o),o}format(e){this.removeIndentFromTopLevelStatements(e),this.indentContentInBraces(e),this.normalizeQuotes(e),this.formatImports(e),this.formatSpecificationRule(e),this.formatGlobals(e),this.formatElementDeclaration(e),this.formatExtendElement(e),this.formatRelation(e),this.formatMetadataProperty(e),this.formatDeploymentNodeDeclaration(e),this.formatDeployedInstance(e),this.formatDeploymentRelation(e),this.formatExtendDeployment(e),this.formatView(e),this.formatViewRuleGroup(e),this.formatViewRuleGlobalStyle(e),this.formatViewRuleGlobalPredicate(e),this.formatIncludeExcludeExpressions(e),this.formatWhereExpression(e),this.formatWhereRelationExpression(e),this.formatWhereElementExpression(e),this.formatRelationExpression(e),this.formatAutolayoutProperty(e),this.formatWithPredicate(e),this.formatSteps(e),this.formatViewRuleStyle(e),this.formatLeafProperty(e),this.formatLinkProperty(e),this.formatNavigateToProperty(e),this.formatTags(e)}formatTags(e){this.on(e,isTags,(e,t)=>{let r=Ke(e.$cstNode,`values`).filter(z).slice(1);t.cst(r).prepend(Q.oneSpace),t.keywords(`,`).prepend(Q.noSpace).append(Q.oneSpace)})}formatDeploymentRelation(e){this.on(e,isDeploymentRelation,(e,t)=>{let r=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(r).append(Q.oneSpace),t.keywords(`]->`).prepend(Q.noSpace),t.keywords(`-[`).append(Q.noSpace),t.nodes(...P([e.target,e.tags],z)).prepend(Q.oneSpace),t.properties(`title`,`description`,`technology`).prepend(Q.oneSpace)})}formatExtendDeployment(e){this.on(e,isExtendDeployment,(e,t)=>{t.keywords(`extend`).append(Q.oneSpace)})}formatRelation(e){this.on(e,e=>isRelation(e)||isDeploymentRelation(e),(e,t)=>{let r=e?.source?.$cstNode?[e?.source?.$cstNode]:[];t.cst(r).append(Q.oneSpace),t.keywords(`]->`,`]<->`).prepend(Q.noSpace),t.keywords(`-[`).append(Q.noSpace),t.nodes(...P([e.target,e.tags],z)).prepend(Q.oneSpace),t.properties(`title`,`description`,`technology`).prepend(Q.oneSpace)}),this.on(e,isStepOrSeries,(e,t)=>{t.keywords(`->`,`<-`).surround(Q.oneSpace),t.property(`dotKind`).prepend(Q.oneSpace).append(Q.oneSpace),t.keywords(`]->`).prepend(Q.noSpace).append(Q.oneSpace),t.keywords(`-[`).prepend(Q.oneSpace).append(Q.noSpace),t.properties(`title`).prepend(Q.oneSpace),(isStepSeries(e)&&isMultiline(e.$cstNode)||isStep(e)&&isStepSeries(e.$container)&&isMultiline(e.$container.$cstNode))&&(t.property(`dotKind`).prepend(Xe.indent({allowLess:!1,allowMore:!0,priority:2})),t.keywords(`->`,`-[`).prepend(Xe.indent({allowLess:!1,allowMore:!0,priority:2})),e.custom?.$cstNode&&isMultiline(e.custom.$cstNode)&&t.property(`custom`).prepend({options:{allowLess:!1,allowMore:!0,priority:2},moves:[{tabs:1}]}))})}removeIndentFromTopLevelStatements(e){isLikeC4Grammar(e.$container)&&this.getNodeFormatter(e).keywords(`specification`,`model`,`views`,`likec4lib`,`global`,`deployments`,`import`).prepend(Q.noIndent)}indentContentInBraces(e){if(isLikeC4Lib(e)||isSpecificationRule(e)||isSpecificationElementKind(e)||isSpecificationRelationshipKind(e)||isSpecificationDeploymentNodeKind(e)||isGlobals(e)||isGlobalStyle(e)||isGlobalStyleGroup(e)||isGlobalPredicateGroup(e)||isGlobalDynamicPredicateGroup(e)||isGlobalStyleGroup(e)||isModel(e)||isElementBody(e)||isExtendElementBody(e)||isRelationBody(e)||isRelationStyleProperty(e)||isMetadataBody(e)||isModelViews(e)||isElementViewBody(e)||isDynamicViewBody(e)||isDeploymentViewBody(e)||isViewRuleStyle(e)||isViewRuleGroup(e)||isCustomElementProperties(e)||isCustomRelationProperties(e)||isElementStyleProperty(e)||isStepsBlock(e)||isAltSteps(e)||isModelDeployments(e)||isDeploymentNodeBody(e)||isDeploymentRelationBody(e)||isDeployedInstanceBody(e)||isExtendDeploymentBody(e)){let t=this.getNodeFormatter(e),r=t.keywords(`{`);r.prepend(Q.noIndent).prepend(Q.oneSpace);let o=isMultiline(e.$cstNode),s=t.keywords(`}`),c=t.interior(r,s),u=null;for(let e of c.nodes){if(!o){t.cst([e]).surround(Q.oneSpace);continue}(!u||!areOverlap(u,e))&&t.cst([e]).prepend(Xe.newLine({allowMore:!0})).prepend(Q.indent),u=e}o?s.prepend(Q.noIndent).prepend(Xe.newLine({allowMore:!0})):s.prepend(Xe.oneSpace({allowLess:!0}))}}appendKeywordsWithSpace(e){this.on(e,isElementKind)?.keywords(`element`).append(Q.oneSpace)}formatView(e){this.on(e,isElementView$1,(e,t)=>{(e.extends||e.viewOf||e.name)&&t.keywords(`view`).append(Q.oneSpace),t.keywords(`of`,`extends`).surround(Q.oneSpace)}),this.on(e,isDynamicView$1)?.keywords(`dynamic`,`view`).append(Q.oneSpace),this.on(e,isDeploymentView$1)?.keywords(`deployment`,`view`).append(Q.oneSpace)}formatLeafProperty(e){if(isElementStringProperty(e)||isRelationStringProperty(e)||isViewStringProperty(e)||isViewOrderProperty(e)||isNotationProperty(e)||isNotesProperty(e)||isSpecificationElementStringProperty(e)||isSpecificationRelationshipStringProperty(e)||isColorProperty(e)||isLineProperty(e)||isArrowProperty(e)||isIconProperty(e)||isShapeProperty(e)||isBorderProperty(e)||isOpacityProperty(e)||isMultipleProperty(e)||isIconColorProperty(e)||isIconSizeProperty(e)||isIconPositionProperty(e)||isShapeSizeProperty(e)||isPaddingSizeProperty(e)||isTextSizeProperty(e)){let t=this.getNodeFormatter(e),r=t.keyword(`:`),o=t.keywords(`title`,`description`,`order`,`technology`,`summary`,`notation`,`notes`,`color`,`line`,`head`,`tail`,`icon`,`iconColor`,`iconSize`,`iconPosition`,`shape`,`border`,`opacity`,`multiple`,`size`,`padding`,`textSize`);r.nodes.length===0?o.append(Q.oneSpace):r.prepend(Q.noSpace).append(Q.oneSpace),t.keyword(`;`).prepend(Q.noSpace).append(Q.newLine)}}formatLinkProperty(e){this.on(e,isLinkProperty,(e,t)=>{t.keyword(`link`).append(Q.oneSpace),t.property(`value`).append(Q.oneSpace),t.keyword(`:`).prepend(Q.noSpace).append(Q.oneSpace),t.keyword(`;`).prepend(Q.noSpace).append(Q.newLine)})}formatNavigateToProperty(e){this.on(e,isNavigateToProperty)?.property(`key`).append(Q.oneSpace)}formatAutolayoutProperty(e){this.on(e,isViewRuleAutoLayout,(e,t)=>{t.keyword(`autoLayout`).append(Q.oneSpace),t.property(`rankSep`).prepend(Q.oneSpace),t.property(`nodeSep`).prepend(Q.oneSpace)})}formatMetadataProperty(e){this.on(e,isMetadataAttribute,(e,t)=>{t.property(`key`).append(Q.oneSpace),t.keyword(`:`).prepend(Q.noSpace).append(Q.oneSpace),t.keyword(`;`).prepend(Q.noSpace).append(Q.newLine)})}formatElementDeclaration(e){this.on(e,isElement,(e,t)=>{let r=Se(e.$cstNode,`kind`),o=Se(e.$cstNode,`name`);o&&r&&(compareRanges(o,r)>0?t.cst([r]).append(Q.oneSpace):(t.cst([o]).append(Q.oneSpace),t.cst([r]).prepend(Q.oneSpace))),t.properties(`props`).prepend(Q.oneSpace)})}formatExtendElement(e){this.on(e,isExtendElementOrRelation,(e,t)=>{t.keywords(`extend`).append(Q.oneSpace)})}formatGlobals(e){this.on(e,isGlobalStyle,(e,t)=>{t.keyword(`style`).append(Q.oneSpace),t.property(`id`).append(Q.oneSpace)}),this.on(e,isGlobalStyleGroup,(e,t)=>{t.keyword(`styleGroup`).append(Q.oneSpace)}),this.on(e,isGlobalPredicateGroup,(e,t)=>{t.keyword(`predicateGroup`).append(Q.oneSpace)}),this.on(e,isGlobalDynamicPredicateGroup,(e,t)=>{t.keyword(`dynamicPredicateGroup`).append(Q.oneSpace)})}formatImports(e){this.on(e,isImportsFromPoject,(e,t)=>{t.keyword(`import`).append(Q.oneSpace),t.keywords(`{`,`}`,`from`).surround(Q.oneSpace)}),this.on(e,isImported,(e,t)=>{t.keywords(`,`).prepend(Q.noSpace).append(Q.oneSpace)})}formatSpecificationRule(e){if((isSpecificationElementKind(e)||isSpecificationRelationshipKind(e)||isSpecificationTag(e)||isSpecificationDeploymentNodeKind(e))&&this.getNodeFormatter(e).keywords(`element`,`relationship`,`tag`,`deploymentNode`).append(Q.oneSpace),isSpecificationColor(e)){let t=this.getNodeFormatter(e);t.keyword(`color`).append(Q.oneSpace),t.property(`name`).append(Q.oneSpace)}}formatWithPredicate(e){(isFqnExprWith(e)||isRelationExprWith(e))&&this.getNodeFormatter(e).keyword(`with`).prepend(Q.oneSpace)}formatDeploymentNodeDeclaration(e){this.on(e,isDeploymentNode$1,(e,t)=>{let r=Se(e.$cstNode,`kind`),o=Se(e.$cstNode,`name`);o&&r&&(compareRanges(o,r)>0?t.cst([r]).append(Q.oneSpace):(t.cst([o]).append(Q.oneSpace),t.cst([r]).prepend(Q.oneSpace))),t.properties(`title`).prepend(Q.oneSpace)})}formatDeployedInstance(e){this.on(e,isDeployedInstance,(e,t)=>{let r=e.$cstNode?.content.find(e=>e.text===`=`);r&&t.cst([r]).surround(Q.oneSpace),t.keyword(`instanceOf`).append(Q.oneSpace),t.property(`title`).prepend(Q.oneSpace)})}formatViewRuleGlobalStyle(e){this.on(e,isViewRuleGlobalStyle,(e,t)=>{t.keywords(`global`,`style`).append(Q.oneSpace)})}formatViewRuleGlobalPredicate(e){let t=this.getNodeFormatter(e);(isViewRuleGlobalPredicateRef(e)||isDynamicViewGlobalPredicateRef(e))&&t.keywords(`global`,`predicate`).append(Q.oneSpace)}formatViewRuleGroup(e){this.on(e,isViewRuleGroup,(e,t)=>{t.keyword(`group`).append(Q.oneSpace)})}formatViewRuleStyle(e){this.on(e,isViewRuleStyle)?.keyword(`style`).append(Q.oneSpace),this.on(e,isDeploymentViewRuleStyle)?.keyword(`style`).append(Q.oneSpace),this.on(e,isExpressions)?.keyword(`,`).prepend(Q.noSpace).append(Q.oneSpace),this.on(e,isFqnExpressions)?.keyword(`,`).prepend(Q.noSpace).append(Q.oneSpace)}formatWhereExpression(e){(isRelationExprWhere(e)||isFqnExprWhere(e))&&this.getNodeFormatter(e).keyword(`where`).append(Q.oneSpace)}formatWhereRelationExpression(e){if(this.on(e,isWhereRelationExpression,(e,t)=>{t.property(`operator`).surround(Q.oneSpace)}),this.on(e,isWhereRelationNegation,(e,t)=>{t.keyword(`not`).append(Q.oneSpace)}),isWhereRelation(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Q.oneSpace),t.property(`not`).surround(Q.oneSpace)}}formatWhereElementExpression(e){if(this.on(e,isWhereElementExpression,(e,t)=>{t.property(`operator`).surround(Q.oneSpace)}),this.on(e,isWhereElementNegation,(e,t)=>{t.keyword(`not`).append(Q.oneSpace)}),isWhereElement(e)){let t=this.getNodeFormatter(e);t.property(`operator`).surround(Q.oneSpace),t.property(`not`).surround(Q.oneSpace)}}formatIncludeExcludeExpressions(e){if(isDynamicViewRule(e)||isViewRulePredicate(e)||isDeploymentViewRulePredicate(e)){let t=this.getNodeFormatter(e);(!e.$cstNode||!isMultiline(e.$cstNode))&&t.keywords(`include`,`exclude`).append(Q.oneSpace)}if(isExpressions(e)){let t=this.getNodeFormatter(e),r=this.findPredicateExpressionRoot(e),o=r?.$cstNode&&isMultiline(r?.$cstNode);o&&t.property(`value`).prepend(Q.indent),t.keyword(`,`).prepend(Q.noSpace).append(o?Q.newLine:Q.oneSpace)}}formatRelationExpression(e){this.on(e,isIncomingRelationExpr,(e,t)=>{t.keyword(`->`).append(Q.oneSpace)}),this.on(e,isInOutRelationExpr,(e,t)=>{t.keyword(`->`).prepend(Q.oneSpace)}),this.on(e,isOutgoingRelationExpr,(e,t)=>{t.keywords(`->`,`<->`).prepend(Q.oneSpace),t.keywords(`-[`).prepend(Q.oneSpace).append(Q.noSpace),t.keywords(`]->`).prepend(Q.noSpace).append(Q.oneSpace),t.property(`dotKind`).prepend(Q.oneSpace).append(Q.oneSpace)}),this.on(e,isDirectedRelationExpr,(e,t)=>{t.property(`target`).prepend(Q.oneSpace)})}formatSteps(e){this.on(e,Wr(isAltSteps,isTryBlock,isCatchBlock,isFinallyBlock),(e,t)=>{if(t.keywords(`try`,`alt`).append(Q.oneSpace),t.property(`title`).surround(Q.oneSpace),isCatchBlock(e)){let r=t.keyword(`catch`);isSameLine(e.try.$cstNode,r.nodes[0])?r.prepend(Q.oneSpace):r.prepend(Xe.newLine()),r.append(Q.oneSpace)}if(isFinallyBlock(e)){let r=t.keyword(`finally`);isSameLine(e.tryCatch.$cstNode,r.nodes[0])?r.prepend(Q.oneSpace):r.prepend(Xe.newLine()),r.append(Q.oneSpace)}}),this.on(e,isSubflowStep,(e,t)=>{t.property(`kind`).append(Q.oneSpace),t.property(`title`).surround(Q.oneSpace)})}findPredicateExpressionRoot(e){let t=e.$container;for(;;){if(!t||isDynamicViewRule(t)||isViewRulePredicate(t)||isDeploymentViewRulePredicate(t))return t;t=t.$container}}on(e,t,r){let o=t(e)?this.getNodeFormatter(e):void 0;try{r&&o&&r(e,o)}catch(t){Y.warn(`Error formatting node ${e.$type}`,{error:t})}return o}doExtendedFormatting(e){let t=this.quotesNormalizerFactory(this.extendedFormattingCommands);for(let r of this.extendedFormattingCommands)switch(r.type){case`normalizeQuotes`:t(r,e);break;default:W(r.type)}}normalizeQuotes(e){if(this.options.quoteStyle===`ignore`)return;let t=null;if(isMetadataAttribute(e)){let r=e.value;isMetadataArray(r)?t=this.getNodeFormatter(r).nodes(...r.values):r&&(t=this.getNodeFormatter(e).property(`value`))}else t=this.on(e,isStringProperty)?.property(`value`);t??=this.on(e,isElement)?.properties(`props`),t??=this.on(e,isImportsFromPoject)?.properties(`project`),t??=this.on(e,isRelation)?.properties(`title`,`technology`),t??=this.on(e,isViewRuleGroup)?.properties(`title`),t??=this.on(e,isStepStatement)?.properties(`title`),t??=this.on(e,isDeploymentNode$1)?.properties(`title`),t??=this.on(e,isDeployedInstance)?.properties(`title`),t??=this.on(e,isDeploymentRelation)?.properties(`title`,`technology`),t??=this.on(e,isLinkProperty)?.properties(`title`),t&&this.extendedFormattingCommands.push({type:`normalizeQuotes`,region:t})}quotesNormalizerFactory(e){let t=this.options.quoteStyle==`auto`?this.getAutoQuoteStyle(e):this.options.quoteStyle;return(e,r)=>{let o=t===`single`?`"`:`'`,s=t===`single`?`'`:`"`,c=s.repeat(3),u=s,d=e.region.nodes.map(e=>{let t=e.text.startsWith(`"""`)||e.text.startsWith(`'''`)?c:u;return{range:e.range,newText:t+this.escapeQuotesInternalQuotes(e.text.slice(t.length,-t.length),o,s)+t}});r.push(...d)}}escapeQuotesInternalQuotes(e,t,r){let o=``,s=0;for(;s>=0;){let t=e.indexOf(r,s);if(t<0){o+=e.slice(s);break}o+=e.slice(s,t),s=t+1;let c=!1;for(;t>0&&e[t-1]==`\\`;)c=!c,t--;o+=c?r:`\\${r}`}return o}getAutoQuoteStyle(e){let t=e.flatMap(e=>e.region.nodes);return t.filter(e=>e.text[0]==`"`).length*2>=t.length?`double`:`single`}onConfigurationUpdate(e){this.options={...this.options,...e??{quoteStyle:`auto`}}}};Ze();const Ff=Y.getChild(`LanguageServices`),isErrorDiagnostic=e=>e.severity===ve.Error;var DefaultLikeC4LanguageServices=class{services;builder;editor;projectsManager;workspaceManager;constructor(e){this.services=e,this.builder=e.likec4.ModelBuilder,this.projectsManager=e.shared.workspace.ProjectsManager,this.workspaceManager=e.shared.workspace.WorkspaceManager,this.editor=e.likec4.ModelChanges}get views(){return this.services.likec4.Views}get workspaceUri(){try{return this.workspaceManager.workspaceUri}catch(e){return Ff.warn(`Failed to get workspace URI, using default folder`,{error:e}),C.file(`/`)}}get workspacePath(){return this.workspaceUri.fsPath}projects(){let e=this.services.shared.workspace.ProjectsManager,t=R(this.services.shared.workspace.LangiumDocuments.groupedByProject(),nn(),F(([t,r])=>{let o=t,{folderUri:s,config:c}=e.getProject(o);return{id:o,folder:s,path:this.workspaceManager.relativePath(s),title:c.title??c.name,documents:F(r,Nn(`uri`)),config:c}}));if(M(t,2)&&e.defaultProjectId){let r=t.findIndex(t=>t.id===e.defaultProjectId);if(r>0){let[e]=t.splice(r,1);return[e,...t]}return t}if(M(t,1))return t;let{id:r,folderUri:o,config:s}=e.default;return[{id:r,folder:o,path:this.workspaceManager.relativePath(o),title:s.title??s.name,documents:[],config:s}]}project(e){let{id:t,folderUri:r,config:o}=this.projectsManager.ensureProject(e),s=F(this.services.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),Nn(`uri`));return{id:t,folder:r,path:this.workspaceManager.relativePath(r),title:o.title??o.name,documents:s,config:o}}async diagrams(e,t){let r=this.projectsManager.ensureProjectId(e);return await this.views.diagrams(r,t)}async computedModel(e,t){let r=this.projectsManager.ensureProjectId(e);return await this.builder.computeModel(r,t)}async layoutedModel(e,t){let r=this.projectsManager.ensureProjectId(e),o=await this.builder.computeModel(r,t);if(!o)throw Error(`Failed to compute model, empty project?`);let s=await this.views.layoutAllViews(r,t);return Ai.create({...o.$data,_stage:`layouted`,views:R(s,F(Nn(`diagram`)),rn(Nn(`id`)))})}async projectsOverview(e){let t=this.services.shared.workspace.ProjectsManager.all,r=[];for(let o of t){let t=await this.builder.computeModel(o,e);if(e?.isCancellationRequested)throw Error(`Operation cancelled`);if(t===Ai.EMPTY){Ff.debug(`Project ${o} is empty, skipping`);continue}r.push(t)}if(!M(r,1))throw Error(`No models found`);let o=Ki(r);return await this.views.layouter.layoutProjectsView(o)}getErrors(){return R(this.services.shared.workspace.LangiumDocuments.userDocuments.toArray(),Zt(e=>R(e.diagnostics??[],P(isErrorDiagnostic),F(({message:t,range:r})=>({message:t,line:r.start.line,range:r,sourceFsPath:e.uri.fsPath})))))}locate(e){switch(!0){case`element`in e:return this.services.likec4.ModelLocator.locateElement(e.element,e.projectId);case`relation`in e:return this.services.likec4.ModelLocator.locateRelation(e.relation,e.projectId);case`view`in e:return this.services.likec4.ModelLocator.locateView(e.view,e.projectId);case`deployment`in e:return this.services.likec4.ModelLocator.locateDeploymentElement(e.deployment,e.projectId);default:W(e)}}documentText(e){return this.services.shared.workspace.LangiumDocuments.getDocument(C.parse(e))?.textDocument.getText()}async format(e){let t=this.services.shared.workspace.LangiumDocuments,r=this.services.lsp.Formatter,o=buildFormattingOptions(e),s=this.collectDocumentsToFormat(t,e);s.sort((e,t)=>e.uri.toString().localeCompare(t.uri.toString()));let c=new Map;for(let e of s){let t=e.uri.toString(),s=await r.formatDocument(e,{options:o,textDocument:{uri:t}}),u=s.length===0?e.textDocument.getText():he.applyEdits(e.textDocument,s);c.set(t,u)}return c}collectDocumentsToFormat(e,t){let r=t?.projectIds??[],o=t?.documentUris??[],s=new Map;if(r.length>0)for(let t of r)for(let r of e.projectDocuments(t))s.set(r.uri.toString(),r);else if(o.length===0)for(let t of this.projectsManager.all)for(let r of e.projectDocuments(t))s.set(r.uri.toString(),r);for(let t of o){if(s.has(t))continue;let r;try{r=e.getDocument(C.parse(t))}catch{Ff.warn(`format: skipping unknown document ${t}`);continue}if(!isLikeC4LangiumDocument(r)){Ff.warn(`format: skipping unknown document ${t}`);continue}s.set(t,r)}return[...s.values()]}async dispose(){try{Ff.debug(`disposing LikeC4LanguageServices`),this.services.likec4.FqnIndex.dispose(),this.services.likec4.DeploymentsIndex.dispose(),this.services.likec4.ModelParser.dispose(),this.services.likec4.ModelBuilder.dispose(),this.services.likec4.Views.dispose(),this.services.likec4.LastSeen.dispose(),this.services.Rpc.dispose(),this.services.shared.workspace.ManualLayouts.dispose(),this.services.shared.workspace.ProjectsManager.dispose(),await this.services.shared.workspace.FileSystemWatcher.dispose()}catch(e){Ff.error(loggable(e))}finally{Ff.debug(`LikeC4LanguageServices disposed`)}}};function buildFormattingOptions(e){return{tabSize:e?.tabSize??2,insertSpaces:e?.insertSpaces??!0,...e?.trimTrailingWhitespace!=null&&{trimTrailingWhitespace:e.trimTrailingWhitespace},...e?.insertFinalNewline!=null&&{insertFinalNewline:e.insertFinalNewline},...e?.trimFinalNewlines!=null&&{trimFinalNewlines:e.trimFinalNewlines}}}var LikeC4CodeLensProvider=class{services;constructor(e){this.services=e}async provideCodeLens(e,t,r){if(isLikeC4LangiumDocument(e))return e.state<x.Linked&&(Y.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(x.Linked,e.uri,r),Y.debug(`Document is linked`)),e.parseResult.value.views.flatMap(e=>e.views).flatMap(e=>{let t=mf.readId(e),r=e.$cstNode?.range;if(!r||!t)return[];let o=projectIdFrom(e);return{range:{start:r.start,end:{line:r.start.line,character:r.start.character+4}},command:{command:`likec4.open-preview`,arguments:[t,o],title:`open preview`}}})}};Ze();function isCompletionForPojectName(e,t){return Pe(t.feature)&&t.property===`project`&&isImportsFromPoject(e.node)}const If=`view_\${CURRENT_MINUTE}_\${CURRENT_SECOND} {
61
59
  title 'Untitled'
62
60
 
63
61
  include \${0:*}
64
- }`;var LikeC4CompletionProvider=class extends De{services;constructor(e){super(e),this.services=e}completionOptions={triggerCharacters:[`.`,`#`]};completionFor(e,t,r){switch(!0){case Ue(t.feature):return this.completionForKeyword(e,t.feature,r);case Ye(t.feature)&&!!e.node:return this.completionForCrossReference(e,t,r);case isCompletionForPojectName(e,t):return this.completionForImportedProject(e,r)}}completionForKeyword(e,t,r){if(!this.filterKeyword(e,t))return;let acceptReplacing=(o,s)=>{let c=this.buildCompletionTextEdit(e,t.value,s);c&&r(e,{label:t.value,insertTextFormat:ve.Snippet,...o,textEdit:c})},acceptProperty=e=>{acceptReplacing({detail:`Insert ${t.value} property`,kind:S.Property},`${t.value} ${e}`)},acceptSnippet=({insertText:e,...r})=>{acceptReplacing({detail:`Insert ${t.value}`,kind:S.Snippet,...r},`${t.value} ${e}`)},acceptPropertyAndSuggest=e=>{acceptProperty(`\${1|${e.join(`,`)}|}$0`)};switch(!0){case t.value===`import`:acceptSnippet({insertText:`{ $0 } from '\${1|${this.services.shared.workspace.ProjectsManager.all.join(`,`)}|}'`});break;case t.value===`deployment`&&Oe(e.node,isModelViews):acceptSnippet({detail:`Insert deployment view`,kind:S.Class,insertText:`view ${Pf}`});break;case t.value===`dynamic`&&Oe(e.node,isModelViews):acceptSnippet({detail:`Insert dynamic view`,kind:S.Class,insertText:["view view_${CURRENT_MINUTE}_${CURRENT_SECOND} {",` title 'Untitled'`,` `,` $0`,`}`].join(`
65
- `)});break;case t.value===`view`&&Oe(e.node,isModelViews):acceptSnippet({detail:`Insert element view`,kind:S.Class,insertText:Pf});break;case t.value===`opacity`:acceptPropertyAndSuggest([`0%`,`20%`,`60%`,`100%`]);break;case t.value===`shape`:acceptPropertyAndSuggest(sr);break;case[`color`,`iconColor`].includes(t.value):acceptPropertyAndSuggest(pr);break;case[`size`,`textSize`,`padding`].includes(t.value):acceptPropertyAndSuggest(fr);break;case t.value===`border`:acceptPropertyAndSuggest(or);break;case t.value===`autoLayout`:acceptPropertyAndSuggest([`TopBottom`,`BottomTop`,`LeftRight`,`RightLeft`]);break;case[`title`,`description`,`technology`,`summary`,`notes`,`notation`].includes(t.value):acceptProperty(`'$0'`);break;case t.value===`metadata`:acceptProperty(`{
62
+ }`;var LikeC4CompletionProvider=class extends Ee{services;constructor(e){super(e),this.services=e}completionOptions={triggerCharacters:[`.`,`#`]};completionFor(e,t,r){switch(!0){case He(t.feature):return this.completionForKeyword(e,t.feature,r);case Je(t.feature)&&!!e.node:return this.completionForCrossReference(e,t,r);case isCompletionForPojectName(e,t):return this.completionForImportedProject(e,r)}}completionForKeyword(e,t,r){if(!this.filterKeyword(e,t))return;let acceptReplacing=(o,s)=>{let c=this.buildCompletionTextEdit(e,t.value,s);c&&r(e,{label:t.value,insertTextFormat:_e.Snippet,...o,textEdit:c})},acceptProperty=e=>{acceptReplacing({detail:`Insert ${t.value} property`,kind:w.Property},`${t.value} ${e}`)},acceptSnippet=({insertText:e,...r})=>{acceptReplacing({detail:`Insert ${t.value}`,kind:w.Snippet,...r},`${t.value} ${e}`)},acceptPropertyAndSuggest=e=>{acceptProperty(`\${1|${e.join(`,`)}|}$0`)};switch(!0){case t.value===`import`:acceptSnippet({insertText:`{ $0 } from '\${1|${this.services.shared.workspace.ProjectsManager.all.join(`,`)}|}'`});break;case t.value===`deployment`&&De(e.node,isModelViews):acceptSnippet({detail:`Insert deployment view`,kind:w.Class,insertText:`view ${If}`});break;case t.value===`dynamic`&&De(e.node,isModelViews):acceptSnippet({detail:`Insert dynamic view`,kind:w.Class,insertText:["view view_${CURRENT_MINUTE}_${CURRENT_SECOND} {",` title 'Untitled'`,` `,` $0`,`}`].join(`
63
+ `)});break;case t.value===`view`&&De(e.node,isModelViews):acceptSnippet({detail:`Insert element view`,kind:w.Class,insertText:If});break;case t.value===`opacity`:acceptPropertyAndSuggest([`0%`,`20%`,`60%`,`100%`]);break;case t.value===`shape`:acceptPropertyAndSuggest(or);break;case[`color`,`iconColor`].includes(t.value):acceptPropertyAndSuggest(fr);break;case[`size`,`textSize`,`padding`].includes(t.value):acceptPropertyAndSuggest(dr);break;case t.value===`border`:acceptPropertyAndSuggest(ar);break;case t.value===`autoLayout`:acceptPropertyAndSuggest([`TopBottom`,`BottomTop`,`LeftRight`,`RightLeft`]);break;case[`title`,`description`,`technology`,`summary`,`notes`,`notation`].includes(t.value):acceptProperty(`'$0'`);break;case t.value===`metadata`:acceptProperty(`{
66
64
  $0
67
- }`);break;case[`views`,`specification`,`model`,`deployment`,`with`].includes(t.value):acceptSnippet({kind:S.Module,insertText:`{
65
+ }`);break;case[`views`,`specification`,`model`,`deployment`,`with`].includes(t.value):acceptSnippet({kind:w.Module,insertText:`{
68
66
  $0
69
- }`});break;case t.value===`group`:acceptSnippet({kind:S.Module,insertText:`'\${1:Title}' {
67
+ }`});break;case t.value===`group`:acceptSnippet({kind:w.Module,insertText:`'\${1:Title}' {
70
68
  $0
71
- }`});break;case[`par`,`parallel`].includes(t.value):acceptSnippet({detail:`Insert parallel steps`,kind:S.Module,insertText:`{
69
+ }`});break;case[`par`,`parallel`].includes(t.value):acceptSnippet({detail:`Insert parallel steps`,kind:w.Module,insertText:`{
72
70
  $0
73
- }`});break;case t.value===`style`&&e.node&&Oe(e.node,isGlobalStyle):acceptSnippet({kind:S.Module,insertText:`\${1:name} \${2:*} {
71
+ }`});break;case t.value===`style`&&e.node&&De(e.node,isGlobalStyle):acceptSnippet({kind:w.Module,insertText:`\${1:name} \${2:*} {
74
72
  $0
75
- }`});break;case t.value===`style`&&e.node&&Oe(e.node,mn([isModelViews,isGlobalStyleGroup])):acceptSnippet({kind:S.Module,insertText:`\${1:*} {
73
+ }`});break;case t.value===`style`&&e.node&&De(e.node,pn([isModelViews,isGlobalStyleGroup])):acceptSnippet({kind:w.Module,insertText:`\${1:*} {
76
74
  $0
77
- }`});break;case t.value===`style`:acceptSnippet({kind:S.Module,insertText:`{
75
+ }`});break;case t.value===`style`:acceptSnippet({kind:w.Module,insertText:`{
78
76
  $0
79
- }`});break;case t.value===`extend`:acceptSnippet({detail:`Extend another view`,kind:S.Class,insertText:`$1 {
77
+ }`});break;case t.value===`extend`:acceptSnippet({detail:`Extend another view`,kind:w.Class,insertText:`$1 {
80
78
  $0
81
- }`});break;case t.value===`mode`:acceptPropertyAndSuggest([`sequence`,`diagram`]);break;case[`include`,`exclude`].includes(t.value):acceptReplacing({kind:S.Operator,detail:`Insert ${t.value} predicate`,insertTextFormat:ve.PlainText},`${t.value} `);break;default:r(e,{label:t.value,kind:this.getKeywordCompletionItemKind(t),detail:`Keyword`,sortText:`1`})}}completionForImportedProject(e,t){let r=this.services.shared.workspace.ProjectsManager,o=e.document.textDocument,s={start:o.positionAt(e.tokenOffset),end:o.positionAt(e.tokenEndOffset)},c=o.getText(s),u=j(c)?`'`:c.substring(0,1);for(let o of r.all){let r=u+o+u;t(e,{label:o,kind:S.Folder,insertText:r,filterText:r,textEdit:Ge.replace(s,r),detail:`Project`,sortText:`0_`+o})}}},LikeC4DocumentHighlightProvider=class extends nt{createDocumentHighlight(e){return Mf.DocumentHighlight.create(e.segment.range,Mf.DocumentHighlightKind.Read)}},LikeC4DocumentLinkProvider=class{services;constructor(e){this.services=e}async getDocumentLinks(e,t,r){return!isLikeC4LangiumDocument(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:je(e.parseResult.value).filter(isLinkProperty).map(t=>{try{let r=Ce(t.$cstNode,`value`)?.range,o=r&&this.resolveLink(e,t.value);if(o&&vt(o))return{range:r,target:o}}catch(e){logWarnError(e)}return null}).nonNullable().toArray()}resolveLink(e,t){if(vt(t)||gt(t))return t;if(mt(t))return dt(e.uri.toString(),`../`,t);let r=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri;return dt(r.toString(),t)}relativeLink(e,t){if(gt(t))return ft(t);if(mt(t)){let r=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri.toString(),o=new URL(e.uri.toString()),s=new URL(t,o).toString();return ft(bt(s,r))}return null}};Qe();const Ff=q.getChild(`DocumentSymbolProvider`);var LikeC4DocumentSymbolProvider=class{services;nodeKindProvider;nameProvider;parser;locator;constructor(e){this.services=e,this.nodeKindProvider=e.shared.lsp.NodeKindProvider,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator,this.nameProvider=e.references.NameProvider}async getSymbols(e,t,r){if(!isLikeC4LangiumDocument(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e))return[];e.state<b.Linked&&(Ff.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(b.Linked,e.uri,r),Ff.debug(`document is Linked`));let{parseResult:{value:{specifications:o,models:s,deployments:c,views:u,likec4lib:d}}}=e;return[...d.map(e=>()=>this.getLikec4LibSymbol(e)),...o.map(e=>()=>this.getSpecSymbol(e)),...s.map(e=>()=>this.getModelSymbol(e)),...c.map(e=>()=>this.getDeploymentModelSymbol(e)),...u.map(e=>()=>this.getModelViewsSymbol(e))].flatMap(e=>{try{return e()??[]}catch(e){return logWarnError(e),[]}})}getLikec4LibSymbol(e){let t=e?.$cstNode;if(!t)return[];let r=e.icons.map(e=>this.getLibIconSymbol(e)).filter(L);return r.length===0?[]:[{kind:tt.Namespace,name:`icons`,range:t.range,selectionRange:Le(t,`icons`)?.range??t.range,children:r}]}getSpecSymbol(e){let t=e?.$cstNode;if(!t)return[];let r=Ce(t,`name`);if(!r)return[];let o=I([...e.elements,...e.tags,...e.relationships],N(e=>{try{if(isSpecificationElementKind(e)||isSpecificationRelationshipKind(e)||isSpecificationDeploymentNodeKind(e))return this.getKindSymbol(e);if(isSpecificationTag(e))return this.getTagSymbol(e)}catch(e){return logWarnError(e),null}H(e)}),M(L));return o.length===0?[]:[{kind:tt.Namespace,name:e.name,range:t.range,selectionRange:r.range,children:o}]}getModelSymbol(e){let t=e.$cstNode;if(!t)return[];let r=Ce(t,`name`);return r?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:r.range,children:e.elements.flatMap(e=>isExtendRelation(e)?[]:this.getElementsSymbol(e))}]:[]}getDeploymentModelSymbol(e){let t=e.$cstNode;if(!t)return[];let r=Ce(t,`name`);return r?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:r.range,children:e.elements.flatMap(e=>this.getDeploymentElementSymbol(e))}]:[]}getElementsSymbol(e,t){try{if(isExtendElement(e))return this.getExtendElementSymbol(e);if(isElement(e))return this.getElementSymbol(e)}catch(e){logWarnError(e)}return[]}getExtendElementSymbol(e){let t=e.$cstNode,r=e.element.$cstNode,o=e.body;return!t||!r?[]:[{kind:this.symbolKind(e),name:readStrictFqn(e.element),range:t.range,selectionRange:r.range,children:o.elements.flatMap(t=>this.getElementsSymbol(t,readStrictFqn(e.element)))}]}getElementSymbol(e){let t=e.$cstNode,r=Ce(t,`name`);if(!r||!t)return[];let o=e.name,s=`(${e.kind.$refText})`;return[{kind:this.symbolKind(e),name:o,range:t.range,selectionRange:r.range,detail:s,children:e.body?.elements.flatMap(e=>this.getElementsSymbol(e))??[]}]}getModelViewsSymbol(e){let t=e.$cstNode,r=Ce(t,`name`);return!r||!t?[]:[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:r.range,children:e.views.flatMap(e=>this.getViewSymbol(e))}]}getKindSymbol(e){return!e.$cstNode||!e.kind.$cstNode||j(e.kind.name)?null:{kind:this.symbolKind(e),name:e.kind.name,range:e.$cstNode.range,selectionRange:e.kind.$cstNode.range}}getTagSymbol(e){return!e.$cstNode||!e.tag.$cstNode||j(e.tag.name)?null:{kind:this.symbolKind(e),name:`#`+e.tag.name,range:e.$cstNode.range,selectionRange:e.tag.$cstNode.range}}getLibIconSymbol(e){return!e.$cstNode||j(e.name)?null:{kind:this.symbolKind(e),name:e.name,range:e.$cstNode.range,selectionRange:e.$cstNode.range}}getViewSymbol(e){let t=e?.$cstNode;if(!t)return[];let r=e.name?Ce(t,`name`):null;return r?[{kind:this.symbolKind(e),name:r.text,range:t.range,selectionRange:r.range,children:[]}]:[]}getDeploymentElementSymbol(e){try{if(isDeploymentNode$1(e))return this.getDeploymentNodeSymbol(e);if(isDeployedInstance(e))return this.getDeployedInstanceSymbol(e);if(isExtendDeployment(e))return[]}catch(e){logWarnError(e)}return[]}getDeploymentNodeSymbol(e){let t=e.$cstNode,r=this.nameProvider.getNameNode(e);if(!r||!t)return[];let o=this.nameProvider.getNameStrict(e),s=`(${e.kind.$refText})`;return[{kind:this.symbolKind(e),name:o,range:t.range,selectionRange:r.range,detail:s,children:e.body?.elements.flatMap(e=>this.getDeploymentElementSymbol(e))??[]}]}getDeployedInstanceSymbol(e){let t=e.$cstNode,r=this.nameProvider.getNameNode(e);if(!r||!t)return[];let o=rt(e),s=this.parser.forDocument(o).parseDeployedInstance(e),c=this.nameProvider.getNameStrict(e),u=`instance of `+s.element.model;return[{kind:this.symbolKind(e),name:c,range:t.range,selectionRange:r.range,detail:u,children:[]}]}symbolKind(e){return this.nodeKindProvider.getSymbolKind(e)}};const If=`
79
+ }`});break;case t.value===`mode`:acceptPropertyAndSuggest([`sequence`,`diagram`]);break;case[`include`,`exclude`].includes(t.value):acceptReplacing({kind:w.Operator,detail:`Insert ${t.value} predicate`,insertTextFormat:_e.PlainText},`${t.value} `);break;default:r(e,{label:t.value,kind:this.getKeywordCompletionItemKind(t),detail:`Keyword`,sortText:`1`})}}completionForImportedProject(e,t){let r=this.services.shared.workspace.ProjectsManager,o=e.document.textDocument,s={start:o.positionAt(e.tokenOffset),end:o.positionAt(e.tokenEndOffset)},c=o.getText(s),u=N(c)?`'`:c.substring(0,1);for(let o of r.all){let r=u+o+u;t(e,{label:o,kind:w.Folder,insertText:r,filterText:r,textEdit:We.replace(s,r),detail:`Project`,sortText:`0_`+o})}}},LikeC4DocumentHighlightProvider=class extends tt{createDocumentHighlight(e){return Pf.DocumentHighlight.create(e.segment.range,Pf.DocumentHighlightKind.Read)}},LikeC4DocumentLinkProvider=class{services;constructor(e){this.services=e}async getDocumentLinks(e,t,r){return!isLikeC4LangiumDocument(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:Ae(e.parseResult.value).filter(isLinkProperty).map(t=>{try{let r=Se(t.$cstNode,`value`)?.range,o=r&&this.resolveLink(e,t.value);if(o&&_t(o))return{range:r,target:o}}catch(e){logWarnError(e)}return null}).nonNullable().toArray()}resolveLink(e,t){if(_t(t)||ht(t))return t;if(pt(t))return ut(e.uri.toString(),`../`,t);let r=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri;return ut(r.toString(),t)}relativeLink(e,t){if(ht(t))return dt(t);if(pt(t)){let r=this.services.shared.workspace.ProjectsManager.getProject(e).folderUri.toString(),o=new URL(e.uri.toString()),s=new URL(t,o).toString();return dt(yt(s,r))}return null}};Ze();const Lf=Y.getChild(`DocumentSymbolProvider`);var LikeC4DocumentSymbolProvider=class{services;nodeKindProvider;nameProvider;parser;locator;constructor(e){this.services=e,this.nodeKindProvider=e.shared.lsp.NodeKindProvider,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator,this.nameProvider=e.references.NameProvider}async getSymbols(e,t,r){if(!isLikeC4LangiumDocument(e)||this.services.shared.workspace.ProjectsManager.isExcluded(e))return[];e.state<x.Linked&&(Lf.debug(`Waiting for document ${e.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(x.Linked,e.uri,r),Lf.debug(`document is Linked`));let{parseResult:{value:{specifications:o,models:s,deployments:c,views:u,likec4lib:d}}}=e;return[...d.map(e=>()=>this.getLikec4LibSymbol(e)),...o.map(e=>()=>this.getSpecSymbol(e)),...s.map(e=>()=>this.getModelSymbol(e)),...c.map(e=>()=>this.getDeploymentModelSymbol(e)),...u.map(e=>()=>this.getModelViewsSymbol(e))].flatMap(e=>{try{return e()??[]}catch(e){return logWarnError(e),[]}})}getLikec4LibSymbol(e){let t=e?.$cstNode;if(!t)return[];let r=e.icons.map(e=>this.getLibIconSymbol(e)).filter(z);return r.length===0?[]:[{kind:et.Namespace,name:`icons`,range:t.range,selectionRange:Ie(t,`icons`)?.range??t.range,children:r}]}getSpecSymbol(e){let t=e?.$cstNode;if(!t)return[];let r=Se(t,`name`);if(!r)return[];let o=R([...e.elements,...e.tags,...e.relationships],F(e=>{try{if(isSpecificationElementKind(e)||isSpecificationRelationshipKind(e)||isSpecificationDeploymentNodeKind(e))return this.getKindSymbol(e);if(isSpecificationTag(e))return this.getTagSymbol(e)}catch(e){return logWarnError(e),null}W(e)}),P(z));return o.length===0?[]:[{kind:et.Namespace,name:e.name,range:t.range,selectionRange:r.range,children:o}]}getModelSymbol(e){let t=e.$cstNode;if(!t)return[];let r=Se(t,`name`);return r?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:r.range,children:e.elements.flatMap(e=>isExtendRelation(e)?[]:this.getElementsSymbol(e))}]:[]}getDeploymentModelSymbol(e){let t=e.$cstNode;if(!t)return[];let r=Se(t,`name`);return r?[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:r.range,children:e.elements.flatMap(e=>this.getDeploymentElementSymbol(e))}]:[]}getElementsSymbol(e,t){try{if(isExtendElement(e))return this.getExtendElementSymbol(e);if(isElement(e))return this.getElementSymbol(e)}catch(e){logWarnError(e)}return[]}getExtendElementSymbol(e){let t=e.$cstNode,r=e.element.$cstNode,o=e.body;return!t||!r?[]:[{kind:this.symbolKind(e),name:readStrictFqn(e.element),range:t.range,selectionRange:r.range,children:o.elements.flatMap(t=>this.getElementsSymbol(t,readStrictFqn(e.element)))}]}getElementSymbol(e){let t=e.$cstNode,r=Se(t,`name`);if(!r||!t)return[];let o=e.name,s=`(${e.kind.$refText})`;return[{kind:this.symbolKind(e),name:o,range:t.range,selectionRange:r.range,detail:s,children:e.body?.elements.flatMap(e=>this.getElementsSymbol(e))??[]}]}getModelViewsSymbol(e){let t=e.$cstNode,r=Se(t,`name`);return!r||!t?[]:[{kind:this.symbolKind(e),name:e.name,range:t.range,selectionRange:r.range,children:e.views.flatMap(e=>this.getViewSymbol(e))}]}getKindSymbol(e){return!e.$cstNode||!e.kind.$cstNode||N(e.kind.name)?null:{kind:this.symbolKind(e),name:e.kind.name,range:e.$cstNode.range,selectionRange:e.kind.$cstNode.range}}getTagSymbol(e){return!e.$cstNode||!e.tag.$cstNode||N(e.tag.name)?null:{kind:this.symbolKind(e),name:`#`+e.tag.name,range:e.$cstNode.range,selectionRange:e.tag.$cstNode.range}}getLibIconSymbol(e){return!e.$cstNode||N(e.name)?null:{kind:this.symbolKind(e),name:e.name,range:e.$cstNode.range,selectionRange:e.$cstNode.range}}getViewSymbol(e){let t=e?.$cstNode;if(!t)return[];let r=e.name?Se(t,`name`):null;return r?[{kind:this.symbolKind(e),name:r.text,range:t.range,selectionRange:r.range,children:[]}]:[]}getDeploymentElementSymbol(e){try{if(isDeploymentNode$1(e))return this.getDeploymentNodeSymbol(e);if(isDeployedInstance(e))return this.getDeployedInstanceSymbol(e);if(isExtendDeployment(e))return[]}catch(e){logWarnError(e)}return[]}getDeploymentNodeSymbol(e){let t=e.$cstNode,r=this.nameProvider.getNameNode(e);if(!r||!t)return[];let o=this.nameProvider.getNameStrict(e),s=`(${e.kind.$refText})`;return[{kind:this.symbolKind(e),name:o,range:t.range,selectionRange:r.range,detail:s,children:e.body?.elements.flatMap(e=>this.getDeploymentElementSymbol(e))??[]}]}getDeployedInstanceSymbol(e){let t=e.$cstNode,r=this.nameProvider.getNameNode(e);if(!r||!t)return[];let o=nt(e),s=this.parser.forDocument(o).parseDeployedInstance(e),c=this.nameProvider.getNameStrict(e),u=`instance of `+s.element.model;return[{kind:this.symbolKind(e),name:c,range:t.range,selectionRange:r.range,detail:u,children:[]}]}symbolKind(e){return this.nodeKindProvider.getSymbolKind(e)}};const Rf=`
82
80
  ---
83
- `;var LikeC4HoverProvider=class extends Be{services;parser;locator;constructor(e){super(e),this.services=e,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getAstNodeHoverContent(e){if(isTag(e))return{contents:{kind:`markdown`,value:"tag `"+e.name+"`"}};if(isElementKind(e))return{contents:{kind:`markdown`,value:"element kind `"+e.name+"`"}};if(isDeploymentNodeKind(e))return{contents:{kind:`markdown`,value:"deployment node `"+e.name+"`"}};if(isRelationshipKind(e))return{contents:{kind:`markdown`,value:"relationship kind `"+e.name+"`"}};try{if(isElement(e))return this.getElementHover(e);if(isDeploymentNode$1(e))return this.getDeploymentNodeHover(e);if(isDeployedInstance(e))return this.getDeployedInstanceHover(e)}catch(e){q.debug(loggable(e))}}getElementHover(e){let t=this.locator.getParsedElement(e);if(!t)return;let r=t.element,o=[`<sup>\`${r.id}\`</sup> `,`### ${r.title} `],s=ni(r);s&&o.push(``,(s.md??s.txt).split(`
81
+ `;var LikeC4HoverProvider=class extends ze{services;parser;locator;constructor(e){super(e),this.services=e,this.parser=e.likec4.ModelParser,this.locator=e.likec4.ModelLocator}getAstNodeHoverContent(e){if(isTag(e))return{contents:{kind:`markdown`,value:"tag `"+e.name+"`"}};if(isElementKind(e))return{contents:{kind:`markdown`,value:"element kind `"+e.name+"`"}};if(isDeploymentNodeKind(e))return{contents:{kind:`markdown`,value:"deployment node `"+e.name+"`"}};if(isRelationshipKind(e))return{contents:{kind:`markdown`,value:"relationship kind `"+e.name+"`"}};try{if(isElement(e))return this.getElementHover(e);if(isDeploymentNode$1(e))return this.getDeploymentNodeHover(e);if(isDeployedInstance(e))return this.getDeployedInstanceHover(e)}catch(e){Y.debug(loggable(e))}}getElementHover(e){let t=this.locator.getParsedElement(e);if(!t)return;let r=t.element,o=[`<sup>\`${r.id}\`</sup> `,`### ${r.title} `],s=ni(r);s&&o.push(``,(s.md??s.txt).split(`
84
82
  `).join(`
85
83
  `));let c=this.services.likec4.LastSeen.model(t.projectId)?.findElement(r.id),u=c&&this.getElementModelHover(c,t.projectId);return o.push(u||`
86
84
  <small>_Model not processed yet, open any view to trigger_</small> `),{contents:{kind:`markdown`,value:o.join(`
87
- `)}}}getElementModelHover(e,t){let r=[],o=[...e.incoming(`direct`)].length,s=[...e.outgoing(`direct`)].length;(o>0||s>0)&&r.push(If,`<small>**${o}** incoming, **${s}** outgoing relationships</small> `);let printViewLink=e=>{let r=[e.id,t],o=x.parse(`command:likec4.open-preview?${encodeURIComponent(JSON.stringify(r))}`);return` - [${e.titleOrId}](${o})`},c=[...e.scopedViews()].map(printViewLink);c.length>0&&r.push(If,`<small>Element views:</small>`,...c);let u=[...e.views()].map(t=>t.isScopedElementView()&&t.viewOf===e?null:printViewLink(t)).filter(P);if(u.length>0){let e=c.length>0?`Also appears in views:`:`Appears in views:`;r.push(c.length>0?``:If,`<small>${e}</small>`,...u,` `)}return r.length>0?r.join(`
88
- `):void 0}getDeploymentNodeHover(e){let t=rt(e),r=this.parser.forDocument(t).parseDeploymentNode(e),o=[r.id+` `];r.title!==e.name&&o.push(`### ${r.title}`),o.push("deployment node `"+r.kind+"` ");let s=ni(r);return s&&o.push(``,s.md??s.txt),{contents:{kind:`markdown`,value:o.join(`
89
- `)}}}getDeployedInstanceHover(e){let t=rt(e),r=this.parser.forDocument(t).parseDeployedInstance(e),[o,s]=z.isImportRef(r.element)?[r.element.project,r.element.model]:[t.likec4ProjectId,r.element.model],c=o?this.locator.getParsedElement(s,o):this.locator.getParsedElement(s),u=[r.id+` `,`instance of \`${z.flatten(r.element)}\``];return c&&u.push(`### ${c.element.title}`,"element kind `"+c.element.kind+"` "),{contents:{kind:`markdown`,value:u.join(`
90
- `)}}}},LikeC4CodeActionProvider=class{getCodeActions(e,t){}};Qe();const Lf=q.getChild(`SemanticTokenProvider`),Rf={...ke},zf={...v};function createSemanticTypeMethods(e){let t=[],r=new Proxy({},{get(o,s){if(s===`modifier`)return e=>(t.push(e),r);if(s in zf)return t.push(zf[s]),r;if(s in Rf)return()=>e(Rf[s],t);throw Error(`Unknown semantic token type or modifier: ${s}`)}});return r}const Bf=`Stop Highlighting`,stopHighlight=()=>{throw Bf};var LikeC4SemanticTokenProvider=class extends Te{services;rules=[];constructor(e){super(e),this.services=e,this.initRules()}initRules(){this.rules=[];let when=(e,t)=>{let r={predicate:e,highlightFn:t};this.rules.push(r)};when(isRelationshipKind,e=>{e.property(`name`).function()}),when(Sr(isRelation,isOutgoingRelationExpr,isDeploymentRelation),e=>{e.property(`kind`).function()}),when(isLibIcon,e=>{e.property(`name`).definition.function(),stopHighlight()}),when(Sr(isNavigateToProperty,isRelationNavigateToProperty),e=>{e.property(`value`).readonly.definition.interface()}),when(isWildcardExpression,e=>{e.cst().readonly.definition.variable(),stopHighlight()}),when(isFqnRefExpr,e=>{e.node.selector&&(e.node.ref.parent?e.property(`selector`).property():e.property(`selector`).readonly.definition.variable())}),when(isTagRef,e=>{e.cst().type()}),when(isRelationKindDotRef,e=>{e.cst().function()}),when(isWhereRelationKind,e=>{L(e.node.value?.$refText)&&e.property(`value`).function()}),when(Sr(isWhereElementMetadata,isWhereRelationMetadata,isWhereRelationParticipantMetadata),e=>{e.keyword(`metadata`).keyword(),e.property(`key`).property()}),when(Sr(isWhereElementTag,isWhereElementKind,isWhereRelationTag,isWhereRelationKind),e=>{L(e.node.value)&&e.property(`value`).readonly.definition.type()}),when(Sr(isWhereRelationParticipantKind,isWhereRelationParticipantTag,isWhereRelationParticipantMetadata),e=>{e.property(`participant`).keyword()}),when(isElementKindExpression,e=>{L(e.node.kind)&&e.property(`kind`).definition.type()}),when(Sr(isGlobalStyleGroup,isGlobalStyle),e=>{e.property(`id`).readonly.definition.variable()}),when(isViewRuleGlobalStyle,e=>{e.property(`style`).readonly.definition.variable()}),when(Sr(isGlobalPredicateGroup,isGlobalDynamicPredicateGroup),e=>{e.property(`name`).readonly.definition.variable()}),when(isViewRuleGlobalPredicateRef,e=>{e.property(`predicate`).readonly.definition.variable()}),when(isElementTagExpression,e=>{L(e.node.tag)&&e.property(`tag`).definition.type()}),when(Sr(isFqnRef,isStrictFqnRef),e=>{if(e.node.parent){e.property(`value`).property();return}let t=e.node.value.$refText;t!==`this`&&t!==`it`&&e.property(`value`).readonly.definition.variable()}),when(isStrictFqnElementRef,e=>{e.node.parent?e.property(`el`).property():e.property(`el`).readonly.definition.variable()}),when(isSpecificationColor,e=>{e.keyword(`color`).keyword(),e.property(`name`).readonly.declaration.type()}),when(isSpecificationTag,e=>{(L(e.node.color)||L(e.node.themeColor)||L(e.node.customColor))&&e.keyword(`color`).property(),L(e.node.customColor)&&e.property(`customColor`).enum(),L(e.node.themeColor)&&e.property(`themeColor`).enum()}),when(Sr(isSpecificationElementKind,isSpecificationRelationshipKind,isSpecificationDeploymentNodeKind),e=>{e.property(`kind`).readonly.declaration.type()}),when(isTag,e=>{e.property(`name`).definition.type()}),when(isOpacityProperty,e=>{e.property(`value`).number()}),when(isIconProperty,e=>{if(e.node.libicon||e.node.value===`none`){e.property(e.node.libicon?`libicon`:`value`).defaultLibrary.enum();return}e.property(`value`).string()}),when(isLinkProperty,e=>{L(e.node.value)&&e.property(`value`).string()}),when(Sr(isColorProperty,isIconColorProperty),e=>{L(e.node.customColor)&&e.property(`customColor`).enum(),L(e.node.themeColor)&&e.property(`themeColor`).enum()}),when(e=>isAnyProperty(e)&&!Sr(isMetadataProperty,isElementStyleProperty,isRelationStyleProperty)(e)&&L(e.key),e=>e.property(`key`).property()),when(Sr(isShapeProperty,isArrowProperty,isLineProperty,isBorderProperty,isSizeProperty,isIconPositionProperty,isIconSizeProperty,isDynamicViewDisplayVariantProperty),e=>{L(e.node.value)&&e.property(`value`).enum()})}highlightElement(e,t){if(Sr(isElement,isDeploymentNode$1,isDeployedInstance)(e))return this.highlightNameAndKind(e);if(isLikeC4View(e))return this.highlightView(e);let r;for(let{predicate:t,highlightFn:o}of this.rules)if(t(e))try{r??=this.mark(e),o(r)}catch(t){if(t===Bf)return`prune`;Lf.warn(`Error highlighting node of type ${e._type}`,{error:t})}}highlightNameAndKind(e){if(this.mark(e).property(`name`).declaration.readonly.variable(),isDeployedInstance(e)||this.mark(e).property(`kind`).keyword(),isElement(e)){e.props.length>0&&this.mark(e).property(`props`).string();return}e.title&&this.mark(e).property(`title`).string()}highlightView(e){e.name&&this.mark(e).property(`name`).modifier(`local`).declaration.readonly.interface()}mark(e){let cst=t=>createSemanticTypeMethods((r,o)=>this.highlightToken({range:vi(t??e.$cstNode,`AST node has no CST node`).range,type:r,modifier:o})),keyword=t=>createSemanticTypeMethods((r,o)=>this.highlightKeyword({node:e,keyword:t,type:r,modifier:o})),property=(t,r)=>createSemanticTypeMethods((o,s)=>this.highlightProperty({node:e,property:t,type:o,modifier:s,...r===void 0?{}:{index:r}}));return{node:e,cst,keyword,property}}};const Vf=Sr(isElement,isExtendElement);var FqnIndex=class extends ADisposable{services;projects;langiumDocuments;documentCache;workspaceCache;logger=q.getChild(`fqn-index`);constructor(e){super(),this.services=e,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.projects=e.shared.workspace.ProjectsManager,this.documentCache=new ai(e=>this.createDocumentIndex(e)),this.workspaceCache=new Re(e.shared,b.IndexedContent),this.onDispose(e.shared.workspace.DocumentBuilder.onDocumentPhase(b.IndexedContent,e=>{isLikeC4UserDocument(e)&&this.documentCache.delete(e)}))}documents(e){return this.langiumDocuments.projectDocuments(e).filter(e=>e.state>=b.IndexedContent)}get(e){return e.state<b.IndexedContent&&this.logger.warn(`document {doc} is in state {state}, expected at least IndexedContent ({expect}). This may lead to incorrect FQN resolution.`,{doc:C.basename(e.uri),state:e.state,expect:b.IndexedContent}),this.documentCache.get(e)}resolve(e){return e.$type===`Imported`?this.getFqn(e.imported.ref):e.$type===`Element`?this.getFqn(e):this.services.likec4.DeploymentsIndex.getFqn(e)}getFqn(e){V(isElement(e)||isDeploymentElement(e));let t=pf.readId(e);if(L(t))return t;let r=rt(e);return r.state<b.IndexedContent&&this.logger.warn(`document {doc} is not yet indexed, creating on the fly to resolve FQN for element {el}`,{el:e.name??e.$type,doc:C.basename(r.uri)}),V(isLikeC4LangiumDocument(r)),this.get(r),ti(pf.readId(e),`Element fqn must be set, invalid state`)}byFqn(e,t){return at(this.workspaceCache.get(`${e}:fqn:${t}`,()=>this.documents(e).flatMap(e=>this.get(e).byFqn(t)).toArray()))}rootElements(e){return at(this.workspaceCache.get(`${e}:rootElements`,()=>{let t=new oi;for(let r of this.documents(e))for(let e of this.get(r).rootElements())t.set(e.name,e);return uniqueByName(t)}))}directChildrenOf(e,t){return at(this.workspaceCache.get(`${e}:directChildrenOf:${t}`,()=>{let r=new oi;for(let o of this.documents(e))for(let e of this.get(o).children(t))r.set(e.name,e);return uniqueByName(r)}))}uniqueDescedants(e,t){return at(this.workspaceCache.get(`${e}:uniqueDescedants:${t}`,()=>{let r=new oi,o=new oi;for(let s of this.documents(e)){let e=this.get(s);for(let o of e.children(t))r.set(o.name,o);for(let r of e.descendants(t))o.set(r.name,r)}let s=uniqueByName(r),c=[...o.associations()].flatMap(([e,t])=>t.length===1&&!r.has(e)?t:[]);return[...s,...Ci(c)]}))}createDocumentIndex(e){let t=e.parseResult.value.models.flatMap(e=>e.elements.filter(Vf));if(t.length===0)return Hf.EMPTY;let r=e.likec4ProjectId??this.projects.ownerProjectId(e),o=[],s=new oi,c=new oi,u=new oi,d=this.services.workspace.AstNodeDescriptionProvider,createAndSaveDescription=(t,o,s)=>{let c=Object.assign(d.createDescription(t,o,e),{id:s,likec4ProjectId:r});return pf.writeId(t,s),u.set(s,c),c};function traverseElement(e,t){let r=gr(e.name,t),u=createAndSaveDescription(e,e.name,r);t?s.set(t,u):o.push(u);let d=M(e.body?.elements??[],Vf);if(!A(d,1))return[u];let p=Qt(d,e=>traverseElement(e,r));for(let e of p)c.set(r,e);return[u,...p]}function traverseExtendElement(e){let t=readStrictFqn(e.element),r=I(e.body?.elements??[],M(isElement),Qt(e=>traverseElement(e,t)));if(r.length!==0)for(let e of[t,...si(t)])for(let t of r)c.set(e,t)}for(let r of t)try{if(isExtendElement(r)){traverseExtendElement(r);continue}traverseElement(r,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:r.$type,doc:C.basename(e.uri),error:t})}return new Hf(o,s,c,u,r)}};function uniqueByName(e){return[...e.associations()].flatMap(([e,t])=>t.length===1?t:[]).sort((e,t)=>li(e.name,t.name))}var Hf=class DocumentFqnIndex{_rootElements;_children;_descendants;_byfqn;projectId;static EMPTY=new DocumentFqnIndex([],new oi,new oi,new oi,yf.DefaultProjectId);constructor(e,t,r,o,s){this._rootElements=e,this._children=t,this._descendants=r,this._byfqn=o,this.projectId=s}rootElements(){return this._rootElements}byFqn(e){return this._byfqn.get(e)??[]}children(e){return this._children.get(e)??[]}descendants(e){return this._descendants.get(e)??[]}};const Uf=Gr(isDeploymentElement,isExtendDeployment);var DeploymentsIndex=class extends FqnIndex{services;Names;logger=q.getChild(`deployments-index`);constructor(e){super(e),this.services=e,this.Names=e.references.NameProvider}createDocumentIndex(e){let t=e.parseResult.value.deployments.flatMap(e=>e.elements.filter(Uf));if(t.length===0)return Hf.EMPTY;let r=e.likec4ProjectId??this.projects.ownerProjectId(e),o=[],s=new oi,c=new oi,u=new oi,d=this.Names,p=this.services.workspace.AstNodeDescriptionProvider,createAndSaveDescription=(t,o,s)=>{let c={...p.createDescription(t,o,e),id:s,likec4ProjectId:r};return pf.writeId(t,s),u.set(s,c),c};function traverseElement(e,t){let r=d.getName(e);if(!L(r))return[];let u=Dr(r,t),p=createAndSaveDescription(e,r,u);if(t?s.set(t,p):o.push(p),isDeployedInstance(e))return[p];let m=M(e.body?.elements??[],Uf);if(!A(m,1))return[p];let h=Qt(m,e=>traverseElement(e,u));for(let e of h)c.set(u,e);return[p,...h]}function traverseExtend(e){let t=readStrictFqn(e.deploymentNode),r=I(e.body?.elements??[],M(Uf),Qt(e=>traverseElement(e,t)));if(r.length!==0)for(let e of[t,...Lr(t)])for(let t of r)c.set(e,t)}for(let r of t)try{if(isExtendDeployment(r)){traverseExtend(r);continue}traverseElement(r,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:r.$type,doc:C.basename(e.uri),error:t})}return new Hf(o,s,c,u,r)}};const Wf=/^(aws|azure|gcp|tech):(.+)$/;function deriveTechnologyFromIcon(e){if(!e)return;let t=Wf.exec(e);if(t)return t[2].replace(/-icon$/,``).split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}var MergedSpecification=class{specs={elements:{},deployments:{},relationships:{},colors:{}};tags;globals={predicates:{},dynamicPredicates:{},styles:{}};imports=new oi(Set);projectId;inferTechFromIcon;constructor(e,t){let r={},o=[];for(let t of e){let{c4Specification:e,c4Globals:s,c4Imports:c}=t,u=t.likec4ProjectId;P(u)&&(o.length===0||o[0]!==u)&&o.push(t.likec4ProjectId),Object.assign(r,e.tags),Object.assign(this.specs.elements,e.elements),Object.assign(this.specs.relationships,e.relationships),Object.assign(this.specs.colors,e.colors),Object.assign(this.specs.deployments,e.deployments),Object.assign(this.globals.predicates,s.predicates),Object.assign(this.globals.dynamicPredicates,s.dynamicPredicates),Object.assign(this.globals.styles,s.styles);for(let[e,t]of c)this.imports.set(e,t)}this.tags=mr(r),this.projectId=wn(o),this.inferTechFromIcon=t?.inferTechFromIcon??!0}toModelElement=({tags:e,links:t,style:r,id:o,kind:s,title:c,description:u,technology:d,summary:p,metadata:m})=>{try{let h=this.specs.elements[s];if(!h)return q.warn`No kind '${s}' found for ${o}`,null;d??=h.technology,u??=h.description,p??=h.summary,t??=h.links,tn(c)&&(c=h.title||_i(o)),h.tags&&mi(h.tags)&&(e=e?An([...h.tags,...e]):h.tags);let g=xr({...h.style,...r});return!d&&this.inferTechFromIcon&&(d=deriveTechnologyFromIcon(g.icon)),xr({metadata:m&&!j(m)?m:void 0,notation:h.notation,style:g,links:t,tags:e,summary:p,technology:d,description:u,title:c,kind:s,id:o})}catch(e){logWarnError(e)}return null};toModelRelation=({astPath:e,source:t,target:r,kind:o,links:s,id:c,title:u,tags:d,isBidirectional:p,...m})=>{let bidirectionalRelationship=e=>p?{...e,isBidirectional:p,tail:e.tail??e.head??`normal`}:e;if(P(o)&&this.specs.relationships[o]){let{multiple:e,tags:p,...h}=this.specs.relationships[o];return p&&mi(p)&&(d=d?An([...p,...d]):p),bidirectionalRelationship({...h,...m,...s&&{links:s},...d&&{tags:d},title:tn(u)?h.title??u:u,source:t,target:r,kind:o,id:c})}return bidirectionalRelationship({...s&&{links:s},...m,...d&&{tags:d},source:t,target:r,id:c,title:u})};toDeploymentElement=e=>{if(`element`in e&&!(`kind`in e))return{...e,element:vr.flatten(e.element)};if(`element`in e)return q.warn`Invalid ParsedAstDeployment ${e.id}, has both element and kind properties`,null;try{let t=this.specs.deployments[e.kind];if(!t)return q.warn`No kind ${e.kind} found for ${e.id}`,null;let{id:r,style:o,title:s,...c}=e;return s=s===_i(e.id)&&t.title?t.title:s,xr({...t,...c,title:s,style:xr({...t.style,...o}),id:r})}catch(e){logWarnError(e)}return null};toDeploymentRelation=({astPath:e,source:t,target:r,kind:o,links:s,id:c,tags:u,...d})=>{if(P(o)&&this.specs.relationships[o]){let{multiple:e,tags:p,...m}=this.specs.relationships[o];return p&&mi(p)&&(u=u?An([...p,...u]):p),{...m,...d,...s&&{links:s},...u&&{tags:u},source:t,target:r,kind:o,id:c}}return{...s&&{links:s},...d,...u&&{tags:u},source:t,target:r,id:c}}},LastSeenArtifacts=class extends ADisposable{#e=new Map;#t=new Map;#n=new Map;constructor(e){super();let clearCache=()=>{this.#e.clear(),this.#t.clear(),this.#n.clear()};this.onDispose(e.shared.workspace.WorkspaceManager.onForceCleanCache(clearCache),ne.create(clearCache))}rememberSpecification(e){return e.projectId&&this.#e.set(e.projectId,e),e}rememberModel(e){let t=e.projectId,r=e.$styles,o=this.#t.get(t);return(!o||!o.equals(r))&&this.#t.set(t,r),this.#n.set(t,e),e}specification(e){return this.#e.get(e)}styles(e){return this.#t.get(e)}model(e){return this.#n.get(e)}};function assignNavigateTo(e){let t=new Map;for(let r of e)if(Yr(r)&&r.viewOf&&F(r.extends)){let e=t.get(r.viewOf)??[];e.push(r.id),t.set(r.viewOf,e)}for(let{id:r,nodes:o}of e)for(let e of o){let o=e.modelRef;if(e.navigateTo||!o)continue;let s=un(t.get(o)??[],e=>e!==r);s&&(e.navigateTo=s)}return e}function relationFingerprint({source:e,target:t,kind:r,title:o,isBidirectional:s}){let c=vr.flatten(e),u=vr.flatten(t);if(s&&u<c){let e=u;u=c,c=e}return stringHash$1(`extend-relation`,c,u,r??`default`,o??``,s?`bidirectional`:`directed`)}var MergedExtends=class{mergedData=new Map;mergeMetadata(e,t){let r={...e};for(let[e,o]of Object.entries(t)){let t=r[e];if(t===void 0){r[e]=o;continue}let s=Array.isArray(t)?t:[t],c=Array.isArray(o)?o:[o],u=An([...s,...c]);r[e]=u.length===1?u[0]:u}return r}merge(e){for(let t of e){let{id:e,links:r,tags:o,metadata:s}=t,c=this.mergedData.get(e)??{links:[],tags:[],metadata:{}};r&&c.links.push(...r),o&&(c.tags=An([...c.tags,...o])),s&&(c.metadata=this.mergeMetadata(c.metadata,s)),this.mergedData.set(e,c)}}applyExtended(e){let t=this.mergedData.get(e.id);if(!t)return e;let r=t.links;e.links&&e.links.length>0&&(r=[...e.links,...r]);let o=t.tags;e.tags&&e.tags.length>0&&(o=An([...e.tags,...o]));let s=t.metadata;return e.metadata&&(s=this.mergeMetadata(e.metadata,t.metadata)),{...e,tags:A(o,1)?o:null,links:A(r,1)?r:null,...!j(s)&&{metadata:s}}}};function buildModelData(e,t,r){let o=new MergedSpecification(r,{inferTechFromIcon:t.config.inferTechnologyFromIcon??!0});o.projectId===t.id&&e.likec4.LastSeen.rememberSpecification(o);let s=Fn(o.specs.colors,e=>hr(e.color)),c=new Set,u=new MergedExtends,d=new MergedExtends,p=r.flatMap(e=>e.c4ExtendRelations),m=new Set,scanMetadataKeys=e=>{e?.metadata&&on(e.metadata).forEach(e=>c.add(e))},h=I(r,Qt(e=>(u.merge(e.c4ExtendElements),N(e.c4Elements,o.toModelElement))),M(L),wi,hn((e,t)=>{let r=xi(t.id);return r&&F(e[r])?(q.debug`No parent found for ${t.id}`,e):(e[t.id]=u.applyExtended(t),scanMetadataKeys(e[t.id]),e)},{})),g=I(r,Qt(e=>N(e.c4Relations,o.toModelRelation)),M(e=>{if(!e)return!1;let t=vr.flatten(e.source),r=vr.flatten(e.target);return F(h[t])&&!Xr(t)||F(h[r])&&!Xr(r)?(q.debug`Invalid relation ${e.id}
85
+ `)}}}getElementModelHover(e,t){let r=[],o=[...e.incoming(`direct`)].length,s=[...e.outgoing(`direct`)].length;(o>0||s>0)&&r.push(Rf,`<small>**${o}** incoming, **${s}** outgoing relationships</small> `);let printViewLink=e=>{let r=[e.id,t],o=C.parse(`command:likec4.open-preview?${encodeURIComponent(JSON.stringify(r))}`);return` - [${e.titleOrId}](${o})`},c=[...e.scopedViews()].map(printViewLink);c.length>0&&r.push(Rf,`<small>Element views:</small>`,...c);let u=[...e.views()].map(t=>t.isScopedElementView()&&t.viewOf===e?null:printViewLink(t)).filter(I);if(u.length>0){let e=c.length>0?`Also appears in views:`:`Appears in views:`;r.push(c.length>0?``:Rf,`<small>${e}</small>`,...u,` `)}return r.length>0?r.join(`
86
+ `):void 0}getDeploymentNodeHover(e){let t=nt(e),r=this.parser.forDocument(t).parseDeploymentNode(e),o=[r.id+` `];r.title!==e.name&&o.push(`### ${r.title}`),o.push("deployment node `"+r.kind+"` ");let s=ni(r);return s&&o.push(``,s.md??s.txt),{contents:{kind:`markdown`,value:o.join(`
87
+ `)}}}getDeployedInstanceHover(e){let t=nt(e),r=this.parser.forDocument(t).parseDeployedInstance(e),[o,s]=H.isImportRef(r.element)?[r.element.project,r.element.model]:[t.likec4ProjectId,r.element.model],c=o?this.locator.getParsedElement(s,o):this.locator.getParsedElement(s),u=[r.id+` `,`instance of \`${H.flatten(r.element)}\``];return c&&u.push(`### ${c.element.title}`,"element kind `"+c.element.kind+"` "),{contents:{kind:`markdown`,value:u.join(`
88
+ `)}}}},LikeC4CodeActionProvider=class{getCodeActions(e,t){}};Ze();const zf=Y.getChild(`SemanticTokenProvider`),Bf={...Oe},Vf={...y};function createSemanticTypeMethods(e){let t=[],r=new Proxy({},{get(o,s){if(s===`modifier`)return e=>(t.push(e),r);if(s in Vf)return t.push(Vf[s]),r;if(s in Bf)return()=>e(Bf[s],t);throw Error(`Unknown semantic token type or modifier: ${s}`)}});return r}const Hf=`Stop Highlighting`,stopHighlight=()=>{throw Hf};var LikeC4SemanticTokenProvider=class extends we{services;rules=[];constructor(e){super(e),this.services=e,this.initRules()}initRules(){this.rules=[];let when=(e,t)=>{let r={predicate:e,highlightFn:t};this.rules.push(r)};when(isRelationshipKind,e=>{e.property(`name`).function()}),when(xr(isRelation,isOutgoingRelationExpr,isDeploymentRelation),e=>{e.property(`kind`).function()}),when(isLibIcon,e=>{e.property(`name`).definition.function(),stopHighlight()}),when(xr(isNavigateToProperty,isRelationNavigateToProperty),e=>{e.property(`value`).readonly.definition.interface()}),when(isWildcardExpression,e=>{e.cst().readonly.definition.variable(),stopHighlight()}),when(isFqnRefExpr,e=>{e.node.selector&&(e.node.ref.parent?e.property(`selector`).property():e.property(`selector`).readonly.definition.variable())}),when(isTagRef,e=>{e.cst().type()}),when(isRelationKindDotRef,e=>{e.cst().function()}),when(isWhereRelationKind,e=>{z(e.node.value?.$refText)&&e.property(`value`).function()}),when(xr(isWhereElementMetadata,isWhereRelationMetadata,isWhereRelationParticipantMetadata),e=>{e.keyword(`metadata`).keyword(),e.property(`key`).property()}),when(xr(isWhereElementTag,isWhereElementKind,isWhereRelationTag,isWhereRelationKind),e=>{z(e.node.value)&&e.property(`value`).readonly.definition.type()}),when(xr(isWhereRelationParticipantKind,isWhereRelationParticipantTag,isWhereRelationParticipantMetadata),e=>{e.property(`participant`).keyword()}),when(isElementKindExpression,e=>{z(e.node.kind)&&e.property(`kind`).definition.type()}),when(xr(isGlobalStyleGroup,isGlobalStyle),e=>{e.property(`id`).readonly.definition.variable()}),when(isViewRuleGlobalStyle,e=>{e.property(`style`).readonly.definition.variable()}),when(xr(isGlobalPredicateGroup,isGlobalDynamicPredicateGroup),e=>{e.property(`name`).readonly.definition.variable()}),when(isViewRuleGlobalPredicateRef,e=>{e.property(`predicate`).readonly.definition.variable()}),when(isElementTagExpression,e=>{z(e.node.tag)&&e.property(`tag`).definition.type()}),when(xr(isFqnRef,isStrictFqnRef),e=>{if(e.node.parent){e.property(`value`).property();return}let t=e.node.value.$refText;t!==`this`&&t!==`it`&&e.property(`value`).readonly.definition.variable()}),when(isStrictFqnElementRef,e=>{e.node.parent?e.property(`el`).property():e.property(`el`).readonly.definition.variable()}),when(isSpecificationColor,e=>{e.keyword(`color`).keyword(),e.property(`name`).readonly.declaration.type()}),when(isSpecificationTag,e=>{(z(e.node.color)||z(e.node.themeColor)||z(e.node.customColor))&&e.keyword(`color`).property(),z(e.node.customColor)&&e.property(`customColor`).enum(),z(e.node.themeColor)&&e.property(`themeColor`).enum()}),when(xr(isSpecificationElementKind,isSpecificationRelationshipKind,isSpecificationDeploymentNodeKind),e=>{e.property(`kind`).readonly.declaration.type()}),when(isTag,e=>{e.property(`name`).definition.type()}),when(isOpacityProperty,e=>{e.property(`value`).number()}),when(isIconProperty,e=>{if(e.node.libicon||e.node.value===`none`){e.property(e.node.libicon?`libicon`:`value`).defaultLibrary.enum();return}e.property(`value`).string()}),when(isLinkProperty,e=>{z(e.node.value)&&e.property(`value`).string()}),when(xr(isColorProperty,isIconColorProperty),e=>{z(e.node.customColor)&&e.property(`customColor`).enum(),z(e.node.themeColor)&&e.property(`themeColor`).enum()}),when(e=>isAnyProperty(e)&&!xr(isMetadataProperty,isElementStyleProperty,isRelationStyleProperty)(e)&&z(e.key),e=>e.property(`key`).property()),when(xr(isShapeProperty,isArrowProperty,isLineProperty,isBorderProperty,isSizeProperty,isIconPositionProperty,isIconSizeProperty,isDynamicViewDisplayVariantProperty),e=>{z(e.node.value)&&e.property(`value`).enum()})}highlightElement(e,t){if(xr(isElement,isDeploymentNode$1,isDeployedInstance)(e))return this.highlightNameAndKind(e);if(isLikeC4View(e))return this.highlightView(e);let r;for(let{predicate:t,highlightFn:o}of this.rules)if(t(e))try{r??=this.mark(e),o(r)}catch(t){if(t===Hf)return`prune`;zf.warn(`Error highlighting node of type ${e._type}`,{error:t})}}highlightNameAndKind(e){if(this.mark(e).property(`name`).declaration.readonly.variable(),isDeployedInstance(e)||this.mark(e).property(`kind`).keyword(),isElement(e)){e.props.length>0&&this.mark(e).property(`props`).string();return}e.title&&this.mark(e).property(`title`).string()}highlightView(e){e.name&&this.mark(e).property(`name`).modifier(`local`).declaration.readonly.interface()}mark(e){let cst=t=>createSemanticTypeMethods((r,o)=>this.highlightToken({range:vi(t??e.$cstNode,`AST node has no CST node`).range,type:r,modifier:o})),keyword=t=>createSemanticTypeMethods((r,o)=>this.highlightKeyword({node:e,keyword:t,type:r,modifier:o})),property=(t,r)=>createSemanticTypeMethods((o,s)=>this.highlightProperty({node:e,property:t,type:o,modifier:s,...r===void 0?{}:{index:r}}));return{node:e,cst,keyword,property}}};const Uf=xr(isElement,isExtendElement);var FqnIndex=class extends ADisposable{services;projects;langiumDocuments;documentCache;workspaceCache;logger=Y.getChild(`fqn-index`);constructor(e){super(),this.services=e,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.projects=e.shared.workspace.ProjectsManager,this.documentCache=new ai(e=>this.createDocumentIndex(e)),this.workspaceCache=new Le(e.shared,x.IndexedContent),this.onDispose(e.shared.workspace.DocumentBuilder.onDocumentPhase(x.IndexedContent,e=>{isLikeC4UserDocument(e)&&this.documentCache.delete(e)}))}documents(e){return this.langiumDocuments.projectDocuments(e).filter(e=>e.state>=x.IndexedContent)}get(e){return e.state<x.IndexedContent&&this.logger.warn(`document {doc} is in state {state}, expected at least IndexedContent ({expect}). This may lead to incorrect FQN resolution.`,{doc:T.basename(e.uri),state:e.state,expect:x.IndexedContent}),this.documentCache.get(e)}resolve(e){return e.$type===`Imported`?this.getFqn(e.imported.ref):e.$type===`Element`?this.getFqn(e):this.services.likec4.DeploymentsIndex.getFqn(e)}getFqn(e){U(isElement(e)||isDeploymentElement(e));let t=hf.readId(e);if(z(t))return t;let r=nt(e);return r.state<x.IndexedContent&&this.logger.warn(`document {doc} is not yet indexed, creating on the fly to resolve FQN for element {el}`,{el:e.name??e.$type,doc:T.basename(r.uri)}),U(isLikeC4LangiumDocument(r)),this.get(r),ti(hf.readId(e),`Element fqn must be set, invalid state`)}byFqn(e,t){return it(this.workspaceCache.get(`${e}:fqn:${t}`,()=>this.documents(e).flatMap(e=>this.get(e).byFqn(t)).toArray()))}rootElements(e){return it(this.workspaceCache.get(`${e}:rootElements`,()=>{let t=new oi;for(let r of this.documents(e))for(let e of this.get(r).rootElements())t.set(e.name,e);return uniqueByName(t)}))}directChildrenOf(e,t){return it(this.workspaceCache.get(`${e}:directChildrenOf:${t}`,()=>{let r=new oi;for(let o of this.documents(e))for(let e of this.get(o).children(t))r.set(e.name,e);return uniqueByName(r)}))}uniqueDescedants(e,t){return it(this.workspaceCache.get(`${e}:uniqueDescedants:${t}`,()=>{let r=new oi,o=new oi;for(let s of this.documents(e)){let e=this.get(s);for(let o of e.children(t))r.set(o.name,o);for(let r of e.descendants(t))o.set(r.name,r)}let s=uniqueByName(r),c=[...o.associations()].flatMap(([e,t])=>t.length===1&&!r.has(e)?t:[]);return[...s,...Ci(c)]}))}createDocumentIndex(e){let t=e.parseResult.value.models.flatMap(e=>e.elements.filter(Uf));if(t.length===0)return Wf.EMPTY;let r=e.likec4ProjectId??this.projects.ownerProjectId(e),o=[],s=new oi,c=new oi,u=new oi,d=this.services.workspace.AstNodeDescriptionProvider,createAndSaveDescription=(t,o,s)=>{let c=Object.assign(d.createDescription(t,o,e),{id:s,likec4ProjectId:r});return hf.writeId(t,s),u.set(s,c),c};function traverseElement(e,t){let r=hr(e.name,t),u=createAndSaveDescription(e,e.name,r);t?s.set(t,u):o.push(u);let d=P(e.body?.elements??[],Uf);if(!M(d,1))return[u];let p=Zt(d,e=>traverseElement(e,r));for(let e of p)c.set(r,e);return[u,...p]}function traverseExtendElement(e){let t=readStrictFqn(e.element),r=R(e.body?.elements??[],P(isElement),Zt(e=>traverseElement(e,t)));if(r.length!==0)for(let e of[t,...si(t)])for(let t of r)c.set(e,t)}for(let r of t)try{if(isExtendElement(r)){traverseExtendElement(r);continue}traverseElement(r,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:r.$type,doc:T.basename(e.uri),error:t})}return new Wf(o,s,c,u,r)}};function uniqueByName(e){return[...e.associations()].flatMap(([e,t])=>t.length===1?t:[]).sort((e,t)=>li(e.name,t.name))}var Wf=class DocumentFqnIndex{_rootElements;_children;_descendants;_byfqn;projectId;static EMPTY=new DocumentFqnIndex([],new oi,new oi,new oi,xf.DefaultProjectId);constructor(e,t,r,o,s){this._rootElements=e,this._children=t,this._descendants=r,this._byfqn=o,this.projectId=s}rootElements(){return this._rootElements}byFqn(e){return this._byfqn.get(e)??[]}children(e){return this._children.get(e)??[]}descendants(e){return this._descendants.get(e)??[]}};const Gf=Wr(isDeploymentElement,isExtendDeployment);var DeploymentsIndex=class extends FqnIndex{services;Names;logger=Y.getChild(`deployments-index`);constructor(e){super(e),this.services=e,this.Names=e.references.NameProvider}createDocumentIndex(e){let t=e.parseResult.value.deployments.flatMap(e=>e.elements.filter(Gf));if(t.length===0)return Wf.EMPTY;let r=e.likec4ProjectId??this.projects.ownerProjectId(e),o=[],s=new oi,c=new oi,u=new oi,d=this.Names,p=this.services.workspace.AstNodeDescriptionProvider,createAndSaveDescription=(t,o,s)=>{let c={...p.createDescription(t,o,e),id:s,likec4ProjectId:r};return hf.writeId(t,s),u.set(s,c),c};function traverseElement(e,t){let r=d.getName(e);if(!z(r))return[];let u=Er(r,t),p=createAndSaveDescription(e,r,u);if(t?s.set(t,p):o.push(p),isDeployedInstance(e))return[p];let m=P(e.body?.elements??[],Gf);if(!M(m,1))return[p];let h=Zt(m,e=>traverseElement(e,u));for(let e of h)c.set(u,e);return[p,...h]}function traverseExtend(e){let t=readStrictFqn(e.deploymentNode),r=R(e.body?.elements??[],P(Gf),Zt(e=>traverseElement(e,t)));if(r.length!==0)for(let e of[t,...Ir(t)])for(let t of r)c.set(e,t)}for(let r of t)try{if(isExtendDeployment(r)){traverseExtend(r);continue}traverseElement(r,null)}catch(t){this.logger.warn(`Error while traversing element {el} in document {doc}`,{el:r.$type,doc:T.basename(e.uri),error:t})}return new Wf(o,s,c,u,r)}};const Kf=/^(aws|azure|gcp|tech):(.+)$/;function deriveTechnologyFromIcon(e){if(!e)return;let t=Kf.exec(e);if(t)return t[2].replace(/-icon$/,``).split(`-`).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(` `)}function applyBidirectional(e,t){return t?{...e,isBidirectional:t,tail:e.tail??e.head??`normal`}:e}var MergedSpecification=class{specs={elements:{},deployments:{},relationships:{},colors:{}};tags;globals={predicates:{},dynamicPredicates:{},styles:{}};imports=new oi(Set);projectId;inferTechFromIcon;constructor(e,t){let r={},o=[];for(let t of e){let{c4Specification:e,c4Globals:s,c4Imports:c}=t,u=t.likec4ProjectId;I(u)&&(o.length===0||o[0]!==u)&&o.push(t.likec4ProjectId),Object.assign(r,e.tags),Object.assign(this.specs.elements,e.elements),Object.assign(this.specs.relationships,e.relationships),Object.assign(this.specs.colors,e.colors),Object.assign(this.specs.deployments,e.deployments),Object.assign(this.globals.predicates,s.predicates),Object.assign(this.globals.dynamicPredicates,s.dynamicPredicates),Object.assign(this.globals.styles,s.styles);for(let[e,t]of c)this.imports.set(e,t)}this.tags=pr(r),this.projectId=Cn(o),this.inferTechFromIcon=t?.inferTechFromIcon??!0}toModelElement=({tags:e,links:t,style:r,id:o,kind:s,title:c,description:u,technology:d,summary:p,metadata:m})=>{try{let h=this.specs.elements[s];if(!h)return Y.warn`No kind '${s}' found for ${o}`,null;d??=h.technology,u??=h.description,p??=h.summary,t??=h.links,en(c)&&(c=h.title||_i(o)),h.tags&&mi(h.tags)&&(e=e?kn([...h.tags,...e]):h.tags);let g=br({...h.style,...r});return!d&&this.inferTechFromIcon&&(d=deriveTechnologyFromIcon(g.icon)),br({metadata:m&&!N(m)?m:void 0,notation:h.notation,style:g,links:t,tags:e,summary:p,technology:d,description:u,title:c,kind:s,id:o})}catch(e){logWarnError(e)}return null};toModelRelation=({astPath:e,source:t,target:r,kind:o,links:s,id:c,title:u,tags:d,isBidirectional:p,...m})=>{if(I(o)&&this.specs.relationships[o]){let{multiple:e,tags:h,...g}=this.specs.relationships[o];return h&&mi(h)&&(d=d?kn([...h,...d]):h),applyBidirectional({...g,...m,...s&&{links:s},...d&&{tags:d},title:en(u)?g.title??u:u,source:t,target:r,kind:o,id:c},p)}return applyBidirectional({...s&&{links:s},...m,...d&&{tags:d},source:t,target:r,id:c,title:u},p)};toDeploymentElement=e=>{if(`element`in e&&!(`kind`in e))return{...e,element:_r.flatten(e.element)};if(`element`in e)return Y.warn`Invalid ParsedAstDeployment ${e.id}, has both element and kind properties`,null;try{let t=this.specs.deployments[e.kind];if(!t)return Y.warn`No kind ${e.kind} found for ${e.id}`,null;let{id:r,style:o,title:s,...c}=e;return s=s===_i(e.id)&&t.title?t.title:s,br({...t,...c,title:s,style:br({...t.style,...o}),id:r})}catch(e){logWarnError(e)}return null};toDeploymentRelation=({astPath:e,source:t,target:r,kind:o,links:s,id:c,tags:u,isBidirectional:d,...p})=>{if(I(o)&&this.specs.relationships[o]){let{multiple:e,tags:m,...h}=this.specs.relationships[o];return m&&mi(m)&&(u=u?kn([...m,...u]):m),applyBidirectional({...h,...p,...s&&{links:s},...u&&{tags:u},source:t,target:r,kind:o,id:c},d)}return applyBidirectional({...s&&{links:s},...p,...u&&{tags:u},source:t,target:r,id:c},d)}},LastSeenArtifacts=class extends ADisposable{#e=new Map;#t=new Map;#n=new Map;constructor(e){super();let clearCache=()=>{this.#e.clear(),this.#t.clear(),this.#n.clear()};this.onDispose(e.shared.workspace.WorkspaceManager.onForceCleanCache(clearCache),S.create(clearCache))}rememberSpecification(e){return e.projectId&&this.#e.set(e.projectId,e),e}rememberModel(e){let t=e.projectId,r=e.$styles,o=this.#t.get(t);return(!o||!o.equals(r))&&this.#t.set(t,r),this.#n.set(t,e),e}specification(e){return this.#e.get(e)}styles(e){return this.#t.get(e)}model(e){return this.#n.get(e)}};function assignNavigateTo(e){let t=new Map;for(let r of e)if(Jr(r)&&r.viewOf&&L(r.extends)){let e=t.get(r.viewOf)??[];e.push(r.id),t.set(r.viewOf,e)}for(let{id:r,nodes:o}of e)for(let e of o){let o=e.modelRef;if(e.navigateTo||!o)continue;let s=ln(t.get(o)??[],e=>e!==r);s&&(e.navigateTo=s)}return e}function relationFingerprint({source:e,target:t,kind:r,title:o,isBidirectional:s}){let c=_r.flatten(e),u=_r.flatten(t);if(s&&u<c){let e=u;u=c,c=e}return stringHash$1(`extend-relation`,c,u,r??`default`,o??``,s?`bidirectional`:`directed`)}var MergedExtends=class{mergedData=new Map;mergeMetadata(e,t){let r={...e};for(let[e,o]of Object.entries(t)){let t=r[e];if(t===void 0){r[e]=o;continue}let s=Array.isArray(t)?t:[t],c=Array.isArray(o)?o:[o],u=kn([...s,...c]);r[e]=u.length===1?u[0]:u}return r}merge(e){for(let t of e){let{id:e,links:r,tags:o,metadata:s}=t,c=this.mergedData.get(e)??{links:[],tags:[],metadata:{}};r&&c.links.push(...r),o&&(c.tags=kn([...c.tags,...o])),s&&(c.metadata=this.mergeMetadata(c.metadata,s)),this.mergedData.set(e,c)}}applyExtended(e){let t=this.mergedData.get(e.id);if(!t)return e;let r=t.links;e.links&&e.links.length>0&&(r=[...e.links,...r]);let o=t.tags;e.tags&&e.tags.length>0&&(o=kn([...e.tags,...o]));let s=t.metadata;return e.metadata&&(s=this.mergeMetadata(e.metadata,t.metadata)),{...e,tags:M(o,1)?o:null,links:M(r,1)?r:null,...!N(s)&&{metadata:s}}}};function buildModelData(e,t,r){let o=new MergedSpecification(r,{inferTechFromIcon:t.config.inferTechnologyFromIcon??!0});o.projectId===t.id&&e.likec4.LastSeen.rememberSpecification(o);let s=Pn(o.specs.colors,e=>mr(e.color)),c=new Set,u=new MergedExtends,d=new MergedExtends,p=r.flatMap(e=>e.c4ExtendRelations),m=new Set,scanMetadataKeys=e=>{e?.metadata&&an(e.metadata).forEach(e=>c.add(e))},h=R(r,Zt(e=>(u.merge(e.c4ExtendElements),F(e.c4Elements,o.toModelElement))),P(z),wi,mn((e,t)=>{let r=xi(t.id);return r&&L(e[r])?(Y.debug`No parent found for ${t.id}`,e):(e[t.id]=u.applyExtended(t),scanMetadataKeys(e[t.id]),e)},{})),g=R(r,Zt(e=>F(e.c4Relations,o.toModelRelation)),P(e=>{if(!e)return!1;let t=_r.flatten(e.source),r=_r.flatten(e.target);return L(h[t])&&!Yr(t)||L(h[r])&&!Yr(r)?(Y.debug`Invalid relation ${e.id}
91
89
  source: ${t} resolved: ${!!h[t]}
92
- target: ${r} resolved: ${!!h[r]}\n`,!1):!0}),N(e=>{let t=relationFingerprint(e),r=p.filter(e=>e.id===t);if(r.length===0)return e;r.forEach(e=>m.add(e.astPath));let o=e.tags?[...e.tags]:[],s=e.links?[...e.links]:[],c=e.metadata?{...e.metadata}:{};for(let e of r){if(e.tags&&o.push(...e.tags),e.links)for(let t of e.links)s.some(e=>e.url===t.url&&(e.title||``)===(t.title||``))||s.push(t);if(e.metadata)for(let[t,r]of Object.entries(e.metadata)){let e=c[t];if(e===void 0)c[t]=r;else{let o=Array.isArray(e)?e:[e],s=Array.isArray(r)?r:[r],u=An([...o,...s]);c[t]=u.length===1?u[0]:u}}}let u=An(o),d=s;return{...e,...A(u,1)&&{tags:u},...A(d,1)&&{links:d},...!j(c)&&{metadata:c}}}),Jt(scanMetadataKeys),an(Pn(`id`))),_=I(r,Qt(e=>(d.merge(e.c4ExtendDeployments),N(e.c4Deployments,o.toDeploymentElement))),M(L),wi,hn((e,t)=>{let r=xi(t.id);return r&&F(e[r])?(q.debug`No parent found for deployment element ${t.id}`,e):(e[t.id]=Kr(t)?d.applyExtended(t):t,scanMetadataKeys(e[t.id]),e)},{})),v=I(r,Qt(e=>N(e.c4DeploymentRelations,o.toDeploymentRelation)),M(e=>e?F(_[e.source.deployment])||F(_[e.target.deployment])?(q.debug`Invalid deployment relation ${e.id}
90
+ target: ${r} resolved: ${!!h[r]}\n`,!1):!0}),F(e=>{let t=relationFingerprint(e),r=p.filter(e=>e.id===t);if(r.length===0)return e;r.forEach(e=>m.add(e.astPath));let o=e.tags?[...e.tags]:[],s=e.links?[...e.links]:[],c=e.metadata?{...e.metadata}:{};for(let e of r){if(e.tags&&o.push(...e.tags),e.links)for(let t of e.links)s.some(e=>e.url===t.url&&(e.title||``)===(t.title||``))||s.push(t);if(e.metadata)for(let[t,r]of Object.entries(e.metadata)){let e=c[t];if(e===void 0)c[t]=r;else{let o=Array.isArray(e)?e:[e],s=Array.isArray(r)?r:[r],u=kn([...o,...s]);c[t]=u.length===1?u[0]:u}}}let u=kn(o),d=s;return{...e,...M(u,1)&&{tags:u},...M(d,1)&&{links:d},...!N(c)&&{metadata:c}}}),qt(scanMetadataKeys),rn(Nn(`id`))),_=R(r,Zt(e=>(d.merge(e.c4ExtendDeployments),F(e.c4Deployments,o.toDeploymentElement))),P(z),wi,mn((e,t)=>{let r=xi(t.id);return r&&L(e[r])?(Y.debug`No parent found for deployment element ${t.id}`,e):(e[t.id]=Gr(t)?d.applyExtended(t):t,scanMetadataKeys(e[t.id]),e)},{})),v=R(r,Zt(e=>F(e.c4DeploymentRelations,o.toDeploymentRelation)),P(e=>e?L(_[e.source.deployment])||L(_[e.target.deployment])?(Y.debug`Invalid deployment relation ${e.id}
93
91
  source: ${e.source.deployment} resolved: ${!!_[e.source.deployment]}
94
- target: ${e.target.deployment} resolved: ${!!_[e.target.deployment]}\n`,!1):!0:!1),hn((e,t)=>qt(e[t.id])?(q.debug`Duplicate deployment relation ${t.id}`,e):(scanMetadataKeys(t),e[t.id]=t,e),{}));function toC4View(e){let r=e.uri.toString();return e=>{let{id:o,title:s,description:c,astPath:u,...d}=e;return e[br]===`element`&&F(s)&&`viewOf`in e&&(s=h[e.viewOf]?.title??null),F(s)&&o===`index`&&(s=`Landscape view`),{...yn(d,e=>e===void 0),[yr]:`parsed`,sourcePath:C.relative(t.folderUri,r),docUri:r,description:c,title:s,id:o}}}let y=r.flatMap(e=>N(e.c4Views,toC4View(e)));if(y.some(e=>e.id===`index`)||y.unshift({[yr]:`parsed`,[br]:`element`,id:`index`,title:`Landscape view`,description:null,rules:[{include:[{wildcard:!0}]}]}),t.config.implicitViews===!0){let e=new Set;for(let t of y)t[br]===`element`&&`viewOf`in t&&t.viewOf&&e.add(t.viewOf);let t=new Set(y.map(e=>e.id));for(let r of on(h)){if(e.has(r)||Xr(r))continue;let o=`__`+r.replaceAll(`.`,`_`);t.has(o)||(t.add(o),y.push({[yr]:`parsed`,[br]:`element`,id:o,viewOf:r,title:`Auto / ${(h[r]?.title??r).replaceAll(`
95
- `,` `)}`,description:null,rules:[{include:[{wildcard:!0}]}]}))}}let b=I(y,an(Pn(`id`)));y.some(Cr)&&(b=Ki(b));for(let e of p)m.has(e.astPath)||q.warn(`Relation extend at ${e.astPath} does not match any relation in the model`);let ee=Fn(h,e=>e.title.includes(`\\/`)?{...e,title:e.title.replaceAll(`\\/`,`/`)}:e);return{data:{[yr]:`parsed`,projectId:t.id,project:xr({id:t.id,title:t.config.title??t.config.name,styles:t.config.styles,contactPerson:t.config.contactPerson,metadata:t.config.metadata,manualLayouts:t.config.manualLayouts,inferTechnologyFromIcon:t.config.inferTechnologyFromIcon}),specification:{tags:o.tags,elements:o.specs.elements,relationships:Fn(o.specs.relationships,({notation:e,technology:t,...r})=>({...e&&{notation:e},...t&&{technology:t},style:r})),deployments:o.specs.deployments,...c.size>0&&{metadataKeys:[...c].sort(li)},customColors:s},elements:ee,relations:g,globals:o.globals,views:b,deployments:{elements:_,relations:v},imports:{}},imports:o.imports}}const Z=q.getChild(`builder`);function isRequestedImportedElement(e,t){for(let r of e)if(t.id===r||t.id.startsWith(`${r}.`))return!0;return!1}function importedElementTitles(e){let t=new Map;for(let[r,o]of rn(e))for(let e of o)t.set(kr(r,e.id),e.title);return t}function withImportedScopedViewTitles(e,t){let r=importedElementTitles(t);return r.size===0?e:Fn(e,e=>{if(e[Ir]===`element`&&e.title===null&&e.viewOf){let t=r.get(e.viewOf);if(t!==void 0)return{...e,title:t}}return e})}var DefaultLikeC4ModelBuilder=class extends ADisposable{services;projects;parser;listeners=[];cache;DocumentBuilder;manualLayouts;mutex;lastSeen;constructor(e){super(),this.services=e,this.projects=e.shared.workspace.ProjectsManager,this.parser=e.likec4.ModelParser,this.DocumentBuilder=e.shared.workspace.DocumentBuilder,this.mutex=e.shared.workspace.WorkspaceLock,this.manualLayouts=e.shared.workspace.ManualLayouts,this.lastSeen=e.likec4.LastSeen,this.cache=new ProjectModelCache(e),this.onDispose(this.cache,ne.create(()=>{this.listeners.length=0}),this.DocumentBuilder.onUpdate((e,t)=>{t.length>0&&this.notifyListeners(t)}),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.clearCache()}),this.manualLayouts.onManualLayoutUpdate(({projectId:e})=>{this.notifyListeners(e)}));let t=gn(Rn(),M(e=>isNotLikeC4Builtin(e)&&!this.projects.isExcluded(e)),N(e=>e.uri));this.onDispose(this.DocumentBuilder.onBuildPhase(b.Validated,(e,r)=>{let o=t(e);o.length>0&&this.notifyListeners(o)})),Z.debug`created`}unsafeSyncParseModelData(e){return this.cache.parsedData(e,()=>{let t=Z.getChild(e);try{let r=this.projects.getProject(e),o=this.documents(e);return o.length===0?(t.trace`unsafeSyncParseModelData: ${`skipped due to no documents`}`,null):(t.trace`unsafeSyncParseModelData: ${`completed`}`,buildModelData(this.services,r,o))}catch(t){return Z.warn(`unsafeSyncParseModelData failed for project ${e}`,{err:t}),null}})}unsafeSyncJoinedModelData(e){return this.cache.parsedJoinedData(e,()=>{let t=Z.getChild(e),r=this.unsafeSyncParseModelData(e);if(!r)return null;if(r.imports.size===0)return t.trace(`unsafeSyncJoinedModelData: no imports`),r.data;t.debug(`unsafeSyncJoinedModelData: processing imports`);let o=[...r.imports.associations()].reduce((e,[t,r])=>{if(r.size===0)return e;let o=this.unsafeSyncParseModelData(t);if(o){let s=Nn(o.data.elements).filter(e=>isRequestedImportedElement(r,e));A(s,1)&&(e[t]=structuredClone(s))}return e},{});return{...r.data,imports:o,views:withImportedScopedViewTitles(r.data.views,o)}})}async parseModel(e,t){return e=this.projects.ensureProjectId(e),await this.mutex.read(async()=>(t?.isCancellationRequested&&await _e(t),this.cache.parsedModel(e,()=>{let t=Z.getChild(e),r=this.unsafeSyncJoinedModelData(e);return r?Ai.create(r):(t.debug`parseModel: returning EMPTY`,Ai.EMPTY.asParsed)})))}unsafeSyncComputeModel(e,t){return this.cache.computedModel(e,t??null,()=>{let r=Z.getChild(e),o=this.unsafeSyncJoinedModelData(e);if(!o)return e!==yf.DefaultProjectId&&r.warn`unsafeSyncComputeModel: returning EMPTY`,Ai.EMPTY.asComputed;let s=performanceMark(),c=Ai.create(o),u=[];for(let e of Nn(o.views)){let o=Gi(e,c);if(!o.isSuccess){r.warn(loggable(o.error));continue}t?.views[e.id]&&Object.assign(o.view,{hasManualLayout:!0}),u.push(o.view)}assignNavigateTo(u);let d={...o,manualLayouts:{...t?.views},[Fr]:`computed`,views:an(u,Pn(`id`))};return r.debug(`computeModel${t?` with manual layouts`:``}: {status} in ${s.pretty}`,{status:`completed`}),this.lastSeen.rememberModel(Ai.create(d))})}async computeModel(e,t){e=this.projects.ensureProjectId(e);let r=Z.getChild(e);return await this.mutex.read(async()=>{t?.isCancellationRequested&&await _e(t);let o=this.projects.getProject(e),s=await this.manualLayouts.read(o),c=this.unsafeSyncComputeModel(e,s);return c===Ai.EMPTY&&e!==yf.DefaultProjectId&&r.warn(`computeModel returned EMPTY`),c})}onModelParsed(e){return this.listeners.push(e),ne.create(()=>{let t=this.listeners.indexOf(e);t>=0&&this.listeners.splice(t,1)})}clearCache(){Z.debug(`clear all caches`),this.cache.clear()}documents(e){return this.parser.documents(e).toArray()}notifyListeners(e){if(this.listeners.length===0)return;let t;if($t(e)){if(t=I(e,Yt(e=>this.projects.ownerProjectId(e)),rn()),tn(t))return}else t=[[e,[]]];for(let e of[...this.listeners])for(let[r,o]of t)try{e(r,o)}catch(e){Z.warn(loggable(e))}}},ProjectModelCache=class extends ze{constructor(e){super(e=>typeof e==`string`?e:e.id),this.toDispose.push(e.shared.workspace.DocumentBuilder.onDocumentPhase(b.Validated,t=>{let r=e.shared.workspace.ProjectsManager.ownerProjectId(t);this.clear(r)}),e.shared.workspace.DocumentBuilder.onUpdate((t,r)=>{if(r.length>0){let t=e.shared.workspace.ProjectsManager,o=An(N(r,t.ownerProjectId.bind(t)));if(!A(o,1))return;Z.trace`clear project caches for: ${o} (on delete ${r.map(e=>e.fsPath)})`;for(let e of o)this.clear(e)}}))}parsedData(e,t){let r=`parsed-data`,o=this.get(e,r);if(o!==void 0)return Z.trace`cache hit project ${e} key: ${r}`,o;let s=t();return this.set(e,r,s),Z.trace`cache miss project ${e} key: ${r}`,s}parsedJoinedData(e,t){let r=`parsed-joined-data`,o=this.get(e,r);if(o!==void 0)return Z.trace`cache hit project ${e} key: ${r}`,o;let s=t();return this.set(e,r,s),Z.trace`cache miss project ${e} key: ${r}`,s}parsedModel(e,t){let r=`parsed-model`,o=this.get(e,r);if(o!==void 0)return Z.trace`cache hit project ${e} key: ${r}`,o;let s=t();return this.set(e,r,s),Z.trace`cache miss project ${e} key: ${r}`,s}computedModel(e,t,r){let o=t?`computed-model-${t.hash}`:`computed-model`,s=this.get(e,o);if(s!==void 0)return Z.trace`cache hit project ${e} key: ${o}`,s;let c=r();return this.set(e,o,c),Z.trace`cache miss project ${e} key: ${o}`,c}};const{findNodeForKeyword:Gf,findNodeForProperty:Kf}=$e,{getDocument:qf,streamAllContents:Jf}=Ee,Yf=q.getChild(`locator`);var LikeC4ModelLocator=class{services;fqnIndex;deploymentsIndex;langiumDocuments;parser;projects;constructor(e){this.services=e,this.fqnIndex=e.likec4.FqnIndex,this.deploymentsIndex=e.likec4.DeploymentsIndex,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.parser=e.likec4.ModelParser,this.projects=e.shared.workspace.ProjectsManager}documents(e){return this.parser.documents(e)}getParsedElement(...e){try{let t,r;if(e.length===2?(t=e[0],r=e[1]):(t=e[0],r=sn(t)?this.projects.ensureProjectId():projectIdFrom(t)),sn(t)){let e=t,o=this.fqnIndex.byFqn(r,e).head();if(!o)return null;let s=this.langiumDocuments.getDocument(o.documentUri),c=this.findParsedElementByFqnIn(e,s);return c&&s?{projectId:r,element:c,document:s}:null}let o=this.fqnIndex.getFqn(t),s=qf(t),c=this.findParsedElementByFqnIn(o,s);return c&&s?{projectId:r,element:c,document:s}:null}catch(e){return Yf.debug(loggable(e)),null}}findParsedElementByFqnIn(e,t){if(t)return this.parser.parse(t).c4Elements.find(t=>t.id===e)}locateElement(e,t){let[r,o]=ri(e);r??=this.projects.ensureProjectId(t);let s=this.fqnIndex.byFqn(r,o).head(),c=s?.nameSegment??s?.selectionSegment;return!s||!c?null:{uri:s.documentUri.toString(),range:c.range}}locateDeploymentElement(e,t){let r=this.projects.ensureProjectId(t),o=e,s=this.deploymentsIndex.byFqn(r,o).head(),c=s?.nameSegment??s?.selectionSegment;return!s||!c?null:{uri:s.documentUri.toString(),range:c.range}}locateRelation(e,t){let r=this.projects.ensureProjectId(t);for(let t of this.documents(r)){let r=t.c4Relations.find(t=>t.id===e)??t.c4DeploymentRelations.find(t=>t.id===e);if(!r)continue;let o=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,r.astPath);if(!isRelation(o)&&!isDeploymentRelation(o))continue;let s=o.kind?Kf(o.$cstNode,`kind`):void 0;if(s??=o.dotKind?Kf(o.$cstNode,`dotKind`):void 0,s??=Gf(o.$cstNode,`->`),s??=Kf(o.$cstNode,`title`),s??=Kf(o.$cstNode,`target`),s??=o.$cstNode,s)return{uri:t.uri.toString(),range:{start:s.range.start,end:s.range.start}}}return null}locateViewAst(e,t){let r=this.projects.ensureProjectId(t);for(let t of this.documents(r)){let r=t.c4Views.find(t=>t.id===e);if(!r)continue;let o=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,r.astPath);if(isLikeC4View(o))return{doc:t,view:r,viewAst:o}}return null}locateView(e,t){let r=this.locateViewAst(e,t);if(!r)return null;let o=r.viewAst,s=o.name?Kf(o.$cstNode,`name`):void 0;return s??=Gf(o.$cstNode,`view`),s??=o.$cstNode,s?{uri:r.doc.uri.toString(),range:{start:s.range.start,end:s.range.start}}:null}async locateDocumentTags(e,t){let r=this.langiumDocuments.getDocument(e);if(!r||!r.likec4ProjectId)return null;r.state<b.Linked&&(Yf.debug(`Waiting for document ${r.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(b.Linked,r.uri,t));let o=projectIdFrom(r);Yf.trace`locate document tags for ${r.uri.fsPath} in project ${o}`;try{let e=this.services.likec4.LastSeen.specification(o)?.tags,t=this.services.likec4.LastSeen.styles(o)??lr.DEFAULT;if(!e)return Yf.trace(`No specification or styles found for project ${o}, cannot locate tags for document ${r.uri.fsPath}`),null;let s=I(Jf(r.parseResult.value),pi(e=>isTag(e)||isTagRef(e)),Ei(),Qt(r=>{let o,s;try{isTag(r)?(o=r.name,s=r.$cstNode):(o=r.tag.$refText,s=r.tag.$refNode);let c=e[o];return U(c,`Tag ${o} not found in merged specification`),U(s,`Tag ${o} does not have a $cstNode`),{name:o,color:t.tagColor(c.color).fill,range:s.range,isSpecification:isTag(r)}}catch(e){return Yf.warn(`Fail on tag ${o}`,{err:e}),[]}}));return Yf.debug(`Found ${s.length} tags in document ${r.uri.path}`),s}catch(e){return Yf.warn(loggable(e)),null}}locateDynamicViewStep(e){let{doc:t,viewAst:r}=this.locateViewAst(e.view,e.projectId)??{};if(!t||!r)return null;if(!isDynamicView$1(r)||!r.body)return Yf.warn(`View ${e.view} is not a dynamic view`),null;let o=this.services.workspace.AstNodeLocator.getAstNodePath(r.body)+e.astPath,s=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,o);if(!s||!isStepOrSeries(s))return Yf.warn(`Failed to locate dynamic view step ${o} in view ${e.view}`),null;let c=s.kind?Kf(s.$cstNode,`kind`):void 0;return c??=s.dotKind?Kf(s.$cstNode,`dotKind`):void 0,c??=Gf(s.$cstNode,`->`),c??=Gf(s.$cstNode,`<-`),c??=Kf(s.$cstNode,`title`),c??=Kf(s.$cstNode,`target`),c??=s.$cstNode,c?{uri:t.uri.toString(),range:{start:c.range.start,end:c.range.start}}:null}};const Xf=[`this`,`it`,`self`,`super`,`likec4lib`,`global`];function tryOrLog(e){return async function tryOrLogFn(t,r,o){try{let s=e(t,r,o);Kt(s)&&await s;return}catch(e){let o=e instanceof Error?e.message:String(e);r(`error`,`Validation failed: ${o}`,{node:t}),q.debug(`Validation failed: ${o}`,{error:e})}}}const{getDocument:Zf}=Ee,deploymentNodeChecks=e=>{let t=e.likec4.DeploymentsIndex,r=e.references.NameProvider;return tryOrLog((e,o)=>{let s=r.getName(e);if(!s){o(`error`,`DeploymentNode must be named`,{node:e});return}let c=ti(r.getNameNode(e),`name CstNode not found`).range;Xf.includes(s)&&o(`error`,`Reserved word: ${s}`,{node:e,range:c});let u=projectIdFrom(e),d=t.getFqn(e);t.byFqn(u,d).limit(2).toArray().length>1&&o(`error`,`Duplicate node name "${d}"`,{node:e,range:c})})},deployedInstanceChecks=e=>{let t=e.likec4.DeploymentsIndex,r=e.references.NameProvider;return tryOrLog((e,o)=>{let s=r.getName(e);if(!s){o(`error`,`Deployed instance must be named, unique inside node`,{node:e});return}let c=ti(r.getNameNode(e),`name CstNode not found`).range;Xf.includes(s)&&o(`error`,`Reserved word: ${s}`,{node:e,range:c});let u=projectIdFrom(e),d=t.getFqn(e);t.byFqn(u,d).limit(2).toArray().length>1&&o(`error`,`Duplicate instance name "${d}"`,{node:e,range:c})})},deploymentRelationChecks=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{if(!e.target?.value?.ref){r(`error`,`DeploymentRelation target '${e.target?.$cstNode?.text??``}' not resolved`,{node:e,property:`target`});return}let o=Zf(e),s=t.forDocument(o),c;try{c=s._resolveDeploymentRelationSource(e)}catch(t){q.warn(loggable(t)),r(`error`,`DeploymentRelation source not resolved`,{node:e,property:`source`});return}if(z.isImportRef(c)){r(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`source`});return}if(z.isModelRef(c)){r(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`source`});return}let u=s.parseFqnRef(e.target);if(z.isImportRef(u)){r(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`target`});return}if(z.isModelRef(u)){r(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`target`});return}$r(c.deployment,u.deployment)&&r(`error`,`Invalid parent-child relationship`,{node:e})})},extendDeploymentChecks=e=>tryOrLog((e,t)=>{let r=e.deploymentNode.value.ref;(!r||!isDeploymentNode$1(r))&&t(`error`,`ExtendDeployment allows only DeploymentNode`,{node:e,property:`deploymentNode`})}),stepSingle=e=>{let t=e.likec4.FqnIndex;return tryOrLog((e,r)=>{let o=elementRef(e.source),s=o&&t.getFqn(o);s||r(`error`,`Source not found (not parsed/indexed yet)`,{node:e,property:`source`});let c=elementRef(e.target),u=c&&t.getFqn(c);u||r(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`}),s&&u&&$r(s,u)&&s!==u&&r(`error`,`Invalid parent-child relationship`,{node:e})})},stepSeries=e=>{let t=e.likec4.FqnIndex;return tryOrLog((e,r)=>{let o=e.source;isStep(o)&&o.isBackward&&r(`error`,`Invalid chain after backward step`,{node:e});let s=elementRef(e.target);s&&t.getFqn(s)||r(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`})})},subflowStep=e=>{let isParallel=e=>e.kind===`par`||e.kind===`parallel`,isAltBranch=e=>e.kind===`else`||e.kind===`if`||e.kind===`when`;return tryOrLog((e,t)=>{isParallel(e)&&isSubflowStep(e.$container)&&isParallel(e.$container)&&t(`error`,`Nested parallel blocks are not allowed`,{node:e,property:`kind`}),isAltBranch(e)?isAltSteps(e.$container)||t(`error`,`"${e.kind}" alternative branch must be inside "alt"`,{node:e,property:`kind`}):isAltSteps(e.$container)&&t(`error`,`"${e.kind}" can not be used as an alternative branch, only "if", "when" or "else" are allowed`,{node:e,property:`kind`})})},dynamicViewDisplayVariant=e=>tryOrLog((e,t)=>{if(j(e.value)||e.value!==`diagram`&&e.value!==`sequence`){t(`error`,`Invalid display variant: "diagram" or "sequence" are allowed`,{node:e,property:`value`});return}Oe(e,isDynamicViewBody)||t(`error`,`Display mode can be defined only inside dynamic view`,{node:e})}),{getDocument:Qf}=Ee,checkElement=e=>{let t=e.likec4.FqnIndex,r=e.workspace.AstNodeLocator;return tryOrLog((e,o)=>{let s=t.getFqn(e);if(!s){o(`error`,`Not indexed element`,{node:e,property:`name`});return}Xf.includes(e.name)&&o(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let c=Qf(e),u=c.uri,d=r.getAstNodePath(e),p=t.byFqn(projectIdFrom(c),s).filter(e=>e.documentUri!==u||e.path!==d).head();if(p){let t=p.documentUri!==u;o(`error`,`Duplicate element name ${e.name===s?e.name:e.name+` (`+s+`)`}`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:p.nameSegment?.range??p.selectionSegment?.range,uri:p.documentUri.toString()},message:`conflicting element`}]}})}})},checkElementRef=e=>tryOrLog((e,t)=>{isReferenceToDeploymentModel(e.modelElement)&&t(`error`,`Only model elements allowed here`,{node:e,property:`modelElement`})}),{getDocument:$f}=Ee,checkImportsFromPoject=e=>{let t=e.shared.workspace.ProjectsManager;return tryOrLog((e,r)=>{if(!t.all.includes(e.project)){r(`error`,`Imported project not found`,{node:e,property:`project`});return}let o=projectIdFrom($f(e));if(e.project===o){r(`error`,`Imported project cannot be the same as the current project`,{node:e,property:`project`});return}})},opacityPropertyRuleChecks=e=>tryOrLog((e,t)=>{let r=parseFloat(e.value);(isNaN(r)||r<0||r>100)&&t(`warning`,`Value ignored, must be between 0% and 100%`,{node:e,property:`value`})}),iconPropertyRuleChecks=e=>(e,t)=>{let r=e.$container;r.props.some(t=>isIconProperty(t)&&t!==e)&&t(`error`,`Icon must be defined once`,{node:e}),isElementStyleProperty(r)&&isElementBody(r.$container)&&r.$container.props.some(e=>isIconProperty(e))&&t(`warning`,`Redundant as icon defined on element`,{node:e}),e.value?.startsWith(`file://`)&&t(`error`,`Icon URI must not start with file://`,{node:e,property:`value`})},colorLiteralRuleChecks=e=>(e,t)=>{if(e.$type===`HexColor`){if(e.hex===void 0||sn(e.hex)&&!e.hex.match(/^[a-fA-F0-9]+$/)){t(`error`,`Invalid HEX`,{node:e,property:`hex`});return}let r=nn(e.hex)?e.hex.toString().length:e.hex.length;r!==6&&r!==3&&r!==8&&t(`error`,`Invalid value "${e.$cstNode?.text}", must be 3, 6 or 8 characters long`,{node:e,property:`hex`});return}if(e.$type===`RGBAColor`){if((!nn(e.red)||e.red<0||e.red>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`red`}),(!nn(e.green)||e.green<0||e.green>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`green`}),(!nn(e.blue)||e.blue<0||e.blue>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`blue`}),nn(e.alpha)&&(e.alpha<0||e.alpha>1)&&t(`error`,`Invalid value, must be between 0 and 1`,{node:e,property:`alpha`}),sn(e.alpha)){let r=parseFloat(e.alpha);(r<0||r>100)&&t(`error`,`Invalid value, must be between 0% and 100%`,{node:e,property:`alpha`})}return}H(e)},relationChecks=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{let o=t.forDocument(rt(e)),s=safeCall(()=>o._resolveRelationSource(e));if(!s){r(`error`,`Source not resolved`,{node:e,property:`source`});return}let c=safeCall(()=>o.parseFqnRef(e.target));if(!c){r(`error`,`Target not resolved`,{node:e,property:`target`});return}z.isImportRef(s)&&(z.isImportRef(c)?r(`warning`,`Relationship between imported elements may not be visible in origin projects`,{node:e}):r(`warning`,`Relationship from imported element to local element may not be visible in origin project`,{node:e,property:`source`})),$r(z.flatten(s),z.flatten(c))&&r(`error`,`Invalid parent-child relationship`,{node:e})})},checkRelationBody=e=>tryOrLog((e,t)=>{e.$container.tags?.values&&e.tags?.values&&t(`error`,`Relation cannot have tags in both header and body`,{node:e.tags})}),extendRelationChecks=e=>{let t=e.likec4.ModelParser,r=new Re(e.shared,b.Linked);function getProjectFingerprints(t){return r.get(t,()=>new Set(I(e.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),Qt(e=>e.c4Relations??[]),N(e=>relationFingerprint(e)))))}return tryOrLog((e,r)=>{let o=rt(e),s=t.forDocument(o),c=safeCall(()=>s.parseFqnRef(e.source));if(!c){r(`error`,`Source not resolved`,{node:e,property:`source`});return}let u=safeCall(()=>s.parseFqnRef(e.target));if(!u){r(`error`,`Target not resolved`,{node:e,property:`target`});return}if(!z.isModelRef(c)&&!z.isImportRef(c)){r(`error`,`Source must reference a model element`,{node:e,property:`source`});return}if(!z.isModelRef(u)&&!z.isImportRef(u)){r(`error`,`Target must reference a model element`,{node:e,property:`target`});return}let d=projectIdFrom(o),p=(e.kind??e.dotKind?.kind)?.ref?.name??`default`,{title:m=``}=s.parseBaseProps({},{title:e.title}),h=relationFingerprint({source:c,target:u,kind:p,title:m,isBidirectional:e.isBidirectional||void 0});getProjectFingerprints(d).has(h)||r(`warning`,`This extend does not match any relation (by source, kind, target, title, and directionality)`,{node:e})})},checkSpecificationRule=e=>tryOrLog((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one specification per document`,{node:e,property:`name`})}),checkModel=e=>tryOrLog((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one model per document`,{node:e,property:`name`})}),checkGlobals=e=>tryOrLog((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one global block per document`,{node:e,property:`name`})}),checkElementKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{Xf.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let o=projectIdFrom(e),s=t.projectElements(o,ru).filter(t=>t.name===e.name&&t.node!==e).head();if(s){let t=s.documentUri!==rt(e).uri;r(`error`,`Duplicate element kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:s.nameSegment.range,uri:s.documentUri.toString()},message:`conflicting definition`}]}})}})},checkDeploymentNodeKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{Xf.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let o=projectIdFrom(e),s=t.projectElements(o,Vl).filter(t=>t.name===e.name&&t.node!==e).head();if(s){let t=s.documentUri!==rt(e).uri;r(`error`,`Duplicate deploymentNode kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:s.nameSegment.range,uri:s.documentUri.toString()},message:`conflicting definition`}]}})}})},checkTag=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{let o=e.name,s=projectIdFrom(e),c=t.projectElements(s,`Tag`).filter(t=>t.name===o&&t.node!==e).head();if(c){let t=c.documentUri!==rt(e).uri;r(`error`,`Duplicate tag '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:c.nameSegment.range,uri:c.documentUri.toString()},message:`conflicting definition`}]}})}})},checkRelationshipKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{Xf.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let o=projectIdFrom(e);t.projectElements(o,`RelationshipKind`).filter(t=>t.name===e.name).limit(2).count()>1&&r(`error`,`Duplicate RelationshipKind '${e.name}'`,{node:e,property:`name`})})},checkGlobalPredicate=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{let o=projectIdFrom(e),s=t.projectElements(o,Eu),c=t.projectElements(o,Tu);s.concat(c).filter(t=>t.name===e.name).limit(2).count()>1&&r(`error`,`Duplicate GlobalPredicateGroup or GlobalDynamicPredicateGroup name '${e.name}'`,{node:e,property:`name`})})},checkGlobalStyleId=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{let o=projectIdFrom(e);t.projectElements(o,`GlobalStyleId`).filter(t=>t.name===e.name).limit(2).count()>1&&r(`error`,`Duplicate GlobalStyleId name '${e.name}'`,{node:e,property:`name`})})},ep=/@likec4-generated/,viewChecks=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{let o=Ne(e.$cstNode,[`BLOCK_COMMENT`]);if(o&&ep.test(o.text)&&r(`warning`,`ManualLayoutV1 is no longer supported; remove this block`,{node:e,range:o.range}),!e.name)return;Xf.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let s=projectIdFrom(e);t.projectElements(s,`LikeC4View`).filter(t=>t.name===e.name).limit(2).count()>1&&r(`error`,`Duplicate view '${e.name}'`,{node:e,property:`name`})})},viewOrderChecks=e=>tryOrLog((e,t)=>{(!Number.isSafeInteger(e.value)||e.value<0)&&t(`error`,`View order must be a non-negative safe integer`,{node:e,property:`value`})});function collectFqnExprs(e){let t=[],r=e;for(;r;)r.value&&t.push(r.value),r=r.prev;return t.reverse()}const viewRuleRankChecks=e=>tryOrLog((e,t)=>{let r=collectFqnExprs(e.targets);r.length<2&&e.value===`same`&&t(`warning`,`Rank rule should have at least 2 targets`,{node:e,property:`targets`});let o=r.filter(isFqnRefExpr),s=o[0]?.ref?.parent;for(let r=1;r<o.length;r++){let c=o[r];e.value===`same`&&!areSame(s,c?.ref?.parent)&&t(`error`,`All targets must have the same parent rank same`,{node:e,property:`targets`})}});function areSame(e,t){return!e&&!t?!0:!e||!t||e.value.ref!==t.value.ref?!1:areSame(e.parent,t.parent)}const checkFqnExprWith=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{let o=getViewRulePredicateContainer(e);if(o?.$type!==`DynamicViewIncludePredicate`&&o?.isInclude!==!0){r(`error`,`Invalid usage inside "exclude"`,{node:e});return}let s=o.$type===`DynamicViewIncludePredicate`,c=t.forDocument(rt(o)),u=_r.unwrap(c.parseFqnExprWith(e).custom.expr);switch(!0){case _r.isWildcard(u)&&s:case _r.isElementKindExpr(u)&&s:case _r.isElementTagExpr(u)&&s:r(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return;case _r.isWildcard(u):case _r.isModelRef(u):case _r.isDeploymentRef(u):return;case _r.isElementKindExpr(u):case _r.isElementTagExpr(u):r(`error`,`Invalid target (expect reference to specific element)`,{node:e,property:`subject`});return;default:yi(u)}})},checkFqnRefExpr=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{let o=t.forDocument(rt(e)).parseFqnRefExpr(e),s=getViewRulePredicateContainer(e),c=isFqnRefInsideDeployment(e)&&!Oe(e,e=>isDeploymentViewRuleStyle(e)||isViewRuleStyle(e));if(s?.$type===`DeploymentViewRulePredicate`||c){if(!Oe(e,isRelationExpr)){if(_r.isModelRef(o)){r(`error`,`Deployment view predicate must reference deployment model`,{node:e});return}if(_r.isDeploymentRef(o)&&vr.isInsideInstanceRef(o.ref)){r(`error`,`Must reference deployment nodes or instances, but not internals`,{node:e});return}}L(e.selector)&&!isDeploymentNode$1(e.ref.value?.ref)&&r(`warning`,`Selector '${e.selector}' applies to deployment nodes only, ignored here`,{node:e,property:`selector`});return}if(s?.$type===`DynamicViewIncludePredicate`)switch(!0){case _r.isElementKindExpr(o):case _r.isElementTagExpr(o):case _r.isWildcard(o):r(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return}})},checkIncomingRelationExpr=e=>tryOrLog((e,t)=>{if(e.to.$type===`WildcardExpression`&&!isInOutRelationExpr(e.$container)){let r=Ve(e,isElementView$1);F(r?.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}}),checkOutgoingRelationExpr=e=>tryOrLog((e,t)=>{if(getViewRulePredicateContainer(e)?.$type===`ViewRulePredicate`&&e.$container.$type!==`DirectedRelationExpr`&&e.from.$type===`WildcardExpression`){let r=Ve(e,isElementView$1);r&&F(r.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}}),checkRelationExpr=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{let o=Ve(e,isDeploymentViewRulePredicate);if(!o||o.isInclude!==!0)return;let s=rt(e),c=t.forDocument(s),u=Mr.unwrap(c.parseRelationExpr(e)),d=`Model reference is allowed in exclude predicate only`;if(Mr.isDirect(u)){(Or.isModelRef(u.source)||Or.isModelRef(u.target))&&r(`error`,d,{node:e});return}let p;if(p=Mr.isIncoming(u)?u.incoming:Mr.isOutgoing(u)?u.outgoing:u.inout,Or.isModelRef(p)){r(`error`,d,{node:e});return}})},checkRelationExprWith=e=>tryOrLog((e,t)=>{let r=getViewRulePredicateContainer(e);if(!(!r||r.$type==`DynamicViewIncludePredicate`)&&!r.isInclude){t(`error`,`Invalid usage inside "exclude"`,{node:e});return}});var LikeC4DocumentValidator=class extends te{services;constructor(e){super(e),this.services=e}async validateDocument(e,t,r){return this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:await super.validateDocument(e,t,r)}};Qe();const tp=Sr(isImportsFromPoject,isImported,isGlobals,isGlobalPredicateGroup,isGlobalDynamicPredicateGroup,isGlobalStyle,isGlobalStyleGroup,isFqnExprWith,isRelationExprWith,isFqnExpr,isRelationExpr,isStepStatement,isDeploymentViewRule,isDeploymentViewRulePredicate,isExpressionV2,isRelationExpr,isFqnRefExpr,isViewProperty,isStyleProperty,isTags,isViewRule,isDynamicViewRule,isLikeC4View,isViewRuleStyleOrGlobalRef,isDeployedInstance,isDeploymentNode$1,isDeploymentRelation,isRelationshipStyleProperty,isDynamicViewDisplayVariantProperty,isMetadataBody,isMetadataProperty,isRelation,isRelationBody,isElementProperty,isStringProperty,isNavigateToProperty,isElement,isElementBody,isElementStyleProperty,isElementRef,isExtendElement,isExtendElementBody,isExtendDeployment,isExtendDeploymentBody,isExtendRelation,isExtendRelationBody,isSpecificationElementKind,isSpecificationRelationshipKind,isSpecificationDeploymentNodeKind,isSpecificationTag,isSpecificationColor,isSpecificationRule,isExpressions,isColorLiteral),findInvalidContainer=e=>{let t=e;for(;t&&!isLikeC4Grammar(t);){if(tp(t))return t;t=t.$container}};function checksFromDiagnostics(e){let t=e.state>=b.Validated?e.diagnostics?.filter(e=>e.severity===ye.Error)??[]:[],r=new WeakSet;for(let{node:e}of t)if(!(F(e)||r.has(e))&&(r.add(e),!tp(e))){let t=findInvalidContainer(e);t&&r.add(t)}let isValid=e=>!r.has(e);return{isValid,invalidNodes:r}}function registerValidationChecks(e){q.debug(`registerValidationChecks`),e.validation.ValidationRegistry.register({DeployedInstance:deployedInstanceChecks(e),DeploymentNodeKind:checkDeploymentNodeKind(e),DeploymentNode:deploymentNodeChecks(e),DeploymentRelation:deploymentRelationChecks(e),ExtendDeployment:extendDeploymentChecks(e),ExtendRelation:extendRelationChecks(e),FqnRefExpr:checkFqnRefExpr(e),RelationExpr:checkRelationExpr(e),OpacityProperty:opacityPropertyRuleChecks(e),IconProperty:iconPropertyRuleChecks(e),SpecificationRule:checkSpecificationRule(e),Model:checkModel(e),Globals:checkGlobals(e),GlobalPredicateGroup:checkGlobalPredicate(e),GlobalDynamicPredicateGroup:checkGlobalPredicate(e),GlobalStyleId:checkGlobalStyleId(e),Step:stepSingle(e),StepSeries:stepSeries(e),SubflowStep:subflowStep(e),LikeC4View:viewChecks(e),Element:checkElement(e),ElementRef:checkElementRef(e),ElementKind:checkElementKind(e),Relation:relationChecks(e),RelationBody:checkRelationBody(e),Tag:checkTag(e),FqnExprWith:checkFqnExprWith(e),RelationExprWith:checkRelationExprWith(e),RelationshipKind:checkRelationshipKind(e),IncomingRelationExpr:checkIncomingRelationExpr(e),OutgoingRelationExpr:checkOutgoingRelationExpr(e),ImportsFromPoject:checkImportsFromPoject(e),ColorLiteral:colorLiteralRuleChecks(e),DynamicViewDisplayVariantProperty:dynamicViewDisplayVariant(e),ViewRuleRank:viewRuleRankChecks(e),ViewOrderProperty:viewOrderChecks(e)});let t=e.shared.lsp.Connection;t&&bi(()=>{e.shared.workspace.DocumentBuilder.onUpdate((e,r)=>{for(let e of r)q.debug(`clear diagnostics for deleted ${e.path}`),t.sendDiagnostics({uri:e.toString(),diagnostics:[]}).catch(e=>q.error(loggable(e)))})})}const np=q.getChild(`parser`),rp={b:`\b`,f:`\f`,n:`
96
- `,r:`\r`,t:` `,v:`\v`,0:`\0`};function unescapeKeepingSlash(e){let t=``;for(let r=1;r<e.length-1;r++){let o=e[r];if(o===`\\`){let o=e[++r]??``;t+=o===`/`?`\\/`:rp[o]??o}else t+=o}return t}function parseTitleKeepingEscapedSlash(e){if(!e||!sn(e.text))return;let t=e.$cstNode?.text;return t?unescapeKeepingSlash(t):e.text}function parseInlineTitleKeepingEscapedSlash(e,t,r=0){let o=Ce(e?.$cstNode,t,r)?.text;return o?unescapeKeepingSlash(o):void 0}function toSingleLine(e){if(e==null)return;let t=removeIndent(e);return sn(t)?t.split(`
92
+ target: ${e.target.deployment} resolved: ${!!_[e.target.deployment]}\n`,!1):!0:!1),mn((e,t)=>Kt(e[t.id])?(Y.debug`Duplicate deployment relation ${t.id}`,e):(scanMetadataKeys(t),e[t.id]=t,e),{}));function toC4View(e){let r=e.uri.toString();return e=>{let{id:o,title:s,description:c,astPath:u,...d}=e;return e[yr]===`element`&&L(s)&&`viewOf`in e&&(s=h[e.viewOf]?.title??null),L(s)&&o===`index`&&(s=`Landscape view`),{...vn(d,e=>e===void 0),[vr]:`parsed`,sourcePath:T.relative(t.folderUri,r),docUri:r,description:c,title:s,id:o}}}let y=r.flatMap(e=>F(e.c4Views,toC4View(e)));if(y.some(e=>e.id===`index`)||y.unshift({[vr]:`parsed`,[yr]:`element`,id:`index`,title:`Landscape view`,description:null,rules:[{include:[{wildcard:!0}]}]}),t.config.implicitViews===!0){let e=new Set;for(let t of y)t[yr]===`element`&&`viewOf`in t&&t.viewOf&&e.add(t.viewOf);let t=new Set(y.map(e=>e.id));for(let r of an(h)){if(e.has(r)||Yr(r))continue;let o=`__`+r.replaceAll(`.`,`_`);t.has(o)||(t.add(o),y.push({[vr]:`parsed`,[yr]:`element`,id:o,viewOf:r,title:`Auto / ${(h[r]?.title??r).replaceAll(`
93
+ `,` `)}`,description:null,rules:[{include:[{wildcard:!0}]}]}))}}let b=R(y,rn(Nn(`id`)));y.some(Sr)&&(b=Ji(b));for(let e of p)m.has(e.astPath)||Y.warn(`Relation extend at ${e.astPath} does not match any relation in the model`);let x=Pn(h,e=>e.title.includes(`\\/`)?{...e,title:e.title.replaceAll(`\\/`,`/`)}:e);return{data:{[vr]:`parsed`,projectId:t.id,project:br({id:t.id,title:t.config.title??t.config.name,styles:t.config.styles,contactPerson:t.config.contactPerson,metadata:t.config.metadata,manualLayouts:t.config.manualLayouts,inferTechnologyFromIcon:t.config.inferTechnologyFromIcon}),specification:{tags:o.tags,elements:o.specs.elements,relationships:Pn(o.specs.relationships,({notation:e,technology:t,...r})=>({...e&&{notation:e},...t&&{technology:t},style:r})),deployments:o.specs.deployments,...c.size>0&&{metadataKeys:[...c].sort(li)},customColors:s},elements:x,relations:g,globals:o.globals,views:b,deployments:{elements:_,relations:v},imports:{}},imports:o.imports}}const qf=Y.getChild(`builder`);function isRequestedImportedElement(e,t){for(let r of e)if(t.id===r||t.id.startsWith(`${r}.`))return!0;return!1}function importedElementTitles(e){let t=new Map;for(let[r,o]of nn(e))for(let e of o)t.set(Or(r,e.id),e.title);return t}function withImportedScopedViewTitles(e,t){let r=importedElementTitles(t);return r.size===0?e:Pn(e,e=>{if(e[Fr]===`element`&&e.title===null&&e.viewOf){let t=r.get(e.viewOf);if(t!==void 0)return{...e,title:t}}return e})}var DefaultLikeC4ModelBuilder=class extends ADisposable{services;projects;parser;listeners=[];cache;DocumentBuilder;manualLayouts;mutex;lastSeen;constructor(e){super(),this.services=e,this.projects=e.shared.workspace.ProjectsManager,this.parser=e.likec4.ModelParser,this.DocumentBuilder=e.shared.workspace.DocumentBuilder,this.mutex=e.shared.workspace.WorkspaceLock,this.manualLayouts=e.shared.workspace.ManualLayouts,this.lastSeen=e.likec4.LastSeen,this.cache=new ProjectModelCache(e),this.onDispose(this.cache,S.create(()=>{this.listeners.length=0}),this.DocumentBuilder.onUpdate((e,t)=>{t.length>0&&this.notifyListeners(t)}),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{this.clearCache()}),this.manualLayouts.onManualLayoutUpdate(({projectId:e})=>{this.notifyListeners(e)}));let t=hn(Ln(),P(e=>isNotLikeC4Builtin(e)&&!this.projects.isExcluded(e)),F(e=>e.uri));this.onDispose(this.DocumentBuilder.onBuildPhase(x.Validated,(e,r)=>{let o=t(e);o.length>0&&this.notifyListeners(o)})),qf.debug`created`}unsafeSyncParseModelData(e){return this.cache.parsedData(e,()=>{let t=qf.getChild(e);try{let r=this.projects.getProject(e),o=this.documents(e);return o.length===0?(t.trace`unsafeSyncParseModelData: ${`skipped due to no documents`}`,null):(t.trace`unsafeSyncParseModelData: ${`completed`}`,buildModelData(this.services,r,o))}catch(t){return qf.warn(`unsafeSyncParseModelData failed for project ${e}`,{err:t}),null}})}unsafeSyncJoinedModelData(e){return this.cache.parsedJoinedData(e,()=>{let t=qf.getChild(e),r=this.unsafeSyncParseModelData(e);if(!r)return null;if(r.imports.size===0)return t.trace(`unsafeSyncJoinedModelData: no imports`),r.data;t.debug(`unsafeSyncJoinedModelData: processing imports`);let o=[...r.imports.associations()].reduce((e,[t,r])=>{if(r.size===0)return e;let o=this.unsafeSyncParseModelData(t);if(o){let s=Mn(o.data.elements).filter(e=>isRequestedImportedElement(r,e));M(s,1)&&(e[t]=structuredClone(s))}return e},{});return{...r.data,imports:o,views:withImportedScopedViewTitles(r.data.views,o)}})}async parseModel(e,t){return e=this.projects.ensureProjectId(e),await this.mutex.read(async()=>(t?.isCancellationRequested&&await ge(t),this.cache.parsedModel(e,()=>{let t=qf.getChild(e),r=this.unsafeSyncJoinedModelData(e);return r?Ai.create(r):(t.debug`parseModel: returning EMPTY`,Ai.EMPTY.asParsed)})))}unsafeSyncComputeModel(e,t){return this.cache.computedModel(e,t??null,()=>{let r=qf.getChild(e),o=this.unsafeSyncJoinedModelData(e);if(!o)return e!==xf.DefaultProjectId&&r.warn`unsafeSyncComputeModel: returning EMPTY`,Ai.EMPTY.asComputed;let s=performanceMark(),c=Ai.create(o),u=[];for(let e of Mn(o.views)){let o=qi(e,c);if(!o.isSuccess){r.warn(loggable(o.error));continue}t?.views[e.id]&&Object.assign(o.view,{hasManualLayout:!0}),u.push(o.view)}assignNavigateTo(u);let d={...o,manualLayouts:{...t?.views},[Pr]:`computed`,views:rn(u,Nn(`id`))};return r.debug(`computeModel${t?` with manual layouts`:``}: {status} in ${s.pretty}`,{status:`completed`}),this.lastSeen.rememberModel(Ai.create(d))})}async computeModel(e,t){e=this.projects.ensureProjectId(e);let r=qf.getChild(e);return await this.mutex.read(async()=>{t?.isCancellationRequested&&await ge(t);let o=this.projects.getProject(e),s=await this.manualLayouts.read(o),c=this.unsafeSyncComputeModel(e,s);return c===Ai.EMPTY&&e!==xf.DefaultProjectId&&r.warn(`computeModel returned EMPTY`),c})}onModelParsed(e){return this.listeners.push(e),S.create(()=>{let t=this.listeners.indexOf(e);t>=0&&this.listeners.splice(t,1)})}clearCache(){qf.debug(`clear all caches`),this.cache.clear()}documents(e){return this.parser.documents(e).toArray()}notifyListeners(e){if(this.listeners.length===0)return;let t;if(Qt(e)){if(t=R(e,Jt(e=>this.projects.ownerProjectId(e)),nn()),en(t))return}else t=[[e,[]]];for(let e of[...this.listeners])for(let[r,o]of t)try{e(r,o)}catch(e){qf.warn(loggable(e))}}},ProjectModelCache=class extends Re{constructor(e){super(e=>typeof e==`string`?e:e.id),this.toDispose.push(e.shared.workspace.DocumentBuilder.onDocumentPhase(x.Validated,t=>{let r=e.shared.workspace.ProjectsManager.ownerProjectId(t);this.clear(r)}),e.shared.workspace.DocumentBuilder.onUpdate((t,r)=>{if(r.length>0){let t=e.shared.workspace.ProjectsManager,o=kn(F(r,t.ownerProjectId.bind(t)));if(!M(o,1))return;qf.trace`clear project caches for: ${o} (on delete ${r.map(e=>e.fsPath)})`;for(let e of o)this.clear(e)}}))}parsedData(e,t){let r=`parsed-data`,o=this.get(e,r);if(o!==void 0)return qf.trace`cache hit project ${e} key: ${r}`,o;let s=t();return this.set(e,r,s),qf.trace`cache miss project ${e} key: ${r}`,s}parsedJoinedData(e,t){let r=`parsed-joined-data`,o=this.get(e,r);if(o!==void 0)return qf.trace`cache hit project ${e} key: ${r}`,o;let s=t();return this.set(e,r,s),qf.trace`cache miss project ${e} key: ${r}`,s}parsedModel(e,t){let r=`parsed-model`,o=this.get(e,r);if(o!==void 0)return qf.trace`cache hit project ${e} key: ${r}`,o;let s=t();return this.set(e,r,s),qf.trace`cache miss project ${e} key: ${r}`,s}computedModel(e,t,r){let o=t?`computed-model-${t.hash}`:`computed-model`,s=this.get(e,o);if(s!==void 0)return qf.trace`cache hit project ${e} key: ${o}`,s;let c=r();return this.set(e,o,c),qf.trace`cache miss project ${e} key: ${o}`,c}};const{findNodeForKeyword:Jf,findNodeForProperty:Yf}=Qe,{getDocument:Xf,streamAllContents:Zf}=Te,Qf=Y.getChild(`locator`);var LikeC4ModelLocator=class{services;fqnIndex;deploymentsIndex;langiumDocuments;parser;projects;constructor(e){this.services=e,this.fqnIndex=e.likec4.FqnIndex,this.deploymentsIndex=e.likec4.DeploymentsIndex,this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.parser=e.likec4.ModelParser,this.projects=e.shared.workspace.ProjectsManager}documents(e){return this.parser.documents(e)}getParsedElement(...e){try{let t,r;if(e.length===2?(t=e[0],r=e[1]):(t=e[0],r=on(t)?this.projects.ensureProjectId():projectIdFrom(t)),on(t)){let e=t,o=this.fqnIndex.byFqn(r,e).head();if(!o)return null;let s=this.langiumDocuments.getDocument(o.documentUri),c=this.findParsedElementByFqnIn(e,s);return c&&s?{projectId:r,element:c,document:s}:null}let o=this.fqnIndex.getFqn(t),s=Xf(t),c=this.findParsedElementByFqnIn(o,s);return c&&s?{projectId:r,element:c,document:s}:null}catch(e){return Qf.debug(loggable(e)),null}}findParsedElementByFqnIn(e,t){if(t)return this.parser.parse(t).c4Elements.find(t=>t.id===e)}locateElement(e,t){let[r,o]=ri(e);r??=this.projects.ensureProjectId(t);let s=this.fqnIndex.byFqn(r,o).head(),c=s?.nameSegment??s?.selectionSegment;return!s||!c?null:{uri:s.documentUri.toString(),range:c.range}}locateDeploymentElement(e,t){let r=this.projects.ensureProjectId(t),o=e,s=this.deploymentsIndex.byFqn(r,o).head(),c=s?.nameSegment??s?.selectionSegment;return!s||!c?null:{uri:s.documentUri.toString(),range:c.range}}locateRelation(e,t){let r=this.projects.ensureProjectId(t);for(let t of this.documents(r)){let r=t.c4Relations.find(t=>t.id===e)??t.c4DeploymentRelations.find(t=>t.id===e);if(!r)continue;let o=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,r.astPath);if(!isRelation(o)&&!isDeploymentRelation(o))continue;let s=o.kind?Yf(o.$cstNode,`kind`):void 0;if(s??=o.dotKind?Yf(o.$cstNode,`dotKind`):void 0,s??=Jf(o.$cstNode,`->`),s??=Yf(o.$cstNode,`title`),s??=Yf(o.$cstNode,`target`),s??=o.$cstNode,s)return{uri:t.uri.toString(),range:{start:s.range.start,end:s.range.start}}}return null}locateViewAst(e,t){let r=this.projects.ensureProjectId(t);for(let t of this.documents(r)){let r=t.c4Views.find(t=>t.id===e);if(!r)continue;let o=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,r.astPath);if(isLikeC4View(o))return{doc:t,view:r,viewAst:o}}return null}locateView(e,t){let r=this.locateViewAst(e,t);if(!r)return null;let o=r.viewAst,s=o.name?Yf(o.$cstNode,`name`):void 0;return s??=Jf(o.$cstNode,`view`),s??=o.$cstNode,s?{uri:r.doc.uri.toString(),range:{start:s.range.start,end:s.range.start}}:null}async locateDocumentTags(e,t){let r=this.langiumDocuments.getDocument(e);if(!r||!r.likec4ProjectId)return null;r.state<x.Linked&&(Qf.debug(`Waiting for document ${r.uri.path} to be Linked`),await this.services.shared.workspace.DocumentBuilder.waitUntil(x.Linked,r.uri,t));let o=projectIdFrom(r);Qf.trace`locate document tags for ${r.uri.fsPath} in project ${o}`;try{let e=this.services.likec4.LastSeen.specification(o)?.tags,t=this.services.likec4.LastSeen.styles(o)??cr.DEFAULT;if(!e)return Qf.trace(`No specification or styles found for project ${o}, cannot locate tags for document ${r.uri.fsPath}`),null;let s=R(Zf(r.parseResult.value),pi(e=>isTag(e)||isTagRef(e)),Ei(),Zt(r=>{let o,s;try{isTag(r)?(o=r.name,s=r.$cstNode):(o=r.tag.$refText,s=r.tag.$refNode);let c=e[o];return G(c,`Tag ${o} not found in merged specification`),G(s,`Tag ${o} does not have a $cstNode`),{name:o,color:t.tagColor(c.color).fill,range:s.range,isSpecification:isTag(r)}}catch(e){return Qf.warn(`Fail on tag ${o}`,{err:e}),[]}}));return Qf.debug(`Found ${s.length} tags in document ${r.uri.path}`),s}catch(e){return Qf.warn(loggable(e)),null}}locateDynamicViewStep(e){let{doc:t,viewAst:r}=this.locateViewAst(e.view,e.projectId)??{};if(!t||!r)return null;if(!isDynamicView$1(r)||!r.body)return Qf.warn(`View ${e.view} is not a dynamic view`),null;let o=this.services.workspace.AstNodeLocator.getAstNodePath(r.body)+e.astPath,s=this.services.workspace.AstNodeLocator.getAstNode(t.parseResult.value,o);if(!s||!isStepOrSeries(s))return Qf.warn(`Failed to locate dynamic view step ${o} in view ${e.view}`),null;let c=s.kind?Yf(s.$cstNode,`kind`):void 0;return c??=s.dotKind?Yf(s.$cstNode,`dotKind`):void 0,c??=Jf(s.$cstNode,`->`),c??=Jf(s.$cstNode,`<-`),c??=Yf(s.$cstNode,`title`),c??=Yf(s.$cstNode,`target`),c??=s.$cstNode,c?{uri:t.uri.toString(),range:{start:c.range.start,end:c.range.start}}:null}};const $f=[`this`,`it`,`self`,`super`,`likec4lib`,`global`];function tryOrLog(e){return async function tryOrLogFn(t,r,o){try{let s=e(t,r,o);Gt(s)&&await s;return}catch(e){let o=e instanceof Error?e.message:String(e);r(`error`,`Validation failed: ${o}`,{node:t}),Y.debug(`Validation failed: ${o}`,{error:e})}}}const{getDocument:ep}=Te,deploymentNodeChecks=e=>{let t=e.likec4.DeploymentsIndex,r=e.references.NameProvider;return tryOrLog((e,o)=>{let s=r.getName(e);if(!s){o(`error`,`DeploymentNode must be named`,{node:e});return}let c=ti(r.getNameNode(e),`name CstNode not found`).range;$f.includes(s)&&o(`error`,`Reserved word: ${s}`,{node:e,range:c});let u=projectIdFrom(e),d=t.getFqn(e);t.byFqn(u,d).limit(2).toArray().length>1&&o(`error`,`Duplicate node name "${d}"`,{node:e,range:c})})},deployedInstanceChecks=e=>{let t=e.likec4.DeploymentsIndex,r=e.references.NameProvider;return tryOrLog((e,o)=>{let s=r.getName(e);if(!s){o(`error`,`Deployed instance must be named, unique inside node`,{node:e});return}let c=ti(r.getNameNode(e),`name CstNode not found`).range;$f.includes(s)&&o(`error`,`Reserved word: ${s}`,{node:e,range:c});let u=projectIdFrom(e),d=t.getFqn(e);t.byFqn(u,d).limit(2).toArray().length>1&&o(`error`,`Duplicate instance name "${d}"`,{node:e,range:c})})},deploymentRelationChecks=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{if(!e.target?.value?.ref){r(`error`,`DeploymentRelation target '${e.target?.$cstNode?.text??``}' not resolved`,{node:e,property:`target`});return}let o=ep(e),s=t.forDocument(o),c;try{c=s._resolveDeploymentRelationSource(e)}catch(t){Y.warn(loggable(t)),r(`error`,`DeploymentRelation source not resolved`,{node:e,property:`source`});return}if(H.isImportRef(c)){r(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`source`});return}if(H.isModelRef(c)){r(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`source`});return}let u=s.parseFqnRef(e.target);if(H.isImportRef(u)){r(`error`,`DeploymentRelation cannot refer imported model (not implemented yet)`,{node:e,property:`target`});return}if(H.isModelRef(u)){r(`error`,`DeploymentRelation must refer deployment element`,{node:e,property:`target`});return}Qr(c.deployment,u.deployment)&&r(`error`,`Invalid parent-child relationship`,{node:e})})},extendDeploymentChecks=e=>tryOrLog((e,t)=>{let r=e.deploymentNode.value.ref;(!r||!isDeploymentNode$1(r))&&t(`error`,`ExtendDeployment allows only DeploymentNode`,{node:e,property:`deploymentNode`})}),stepSingle=e=>{let t=e.likec4.FqnIndex;return tryOrLog((e,r)=>{let o=elementRef(e.source),s=o&&t.getFqn(o);s||r(`error`,`Source not found (not parsed/indexed yet)`,{node:e,property:`source`});let c=elementRef(e.target),u=c&&t.getFqn(c);u||r(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`}),s&&u&&Qr(s,u)&&s!==u&&r(`error`,`Invalid parent-child relationship`,{node:e})})},stepSeries=e=>{let t=e.likec4.FqnIndex;return tryOrLog((e,r)=>{let o=e.source;isStep(o)&&o.isBackward&&r(`error`,`Invalid chain after backward step`,{node:e});let s=elementRef(e.target);s&&t.getFqn(s)||r(`error`,`Target not found (not parsed/indexed yet)`,{node:e,property:`target`})})},subflowStep=e=>{let isParallel=e=>e.kind===`par`||e.kind===`parallel`,isAltBranch=e=>e.kind===`else`||e.kind===`if`||e.kind===`when`;return tryOrLog((e,t)=>{isParallel(e)&&isSubflowStep(e.$container)&&isParallel(e.$container)&&t(`error`,`Nested parallel blocks are not allowed`,{node:e,property:`kind`}),isAltBranch(e)?isAltSteps(e.$container)||t(`error`,`"${e.kind}" alternative branch must be inside "alt"`,{node:e,property:`kind`}):isAltSteps(e.$container)&&t(`error`,`"${e.kind}" can not be used as an alternative branch, only "if", "when" or "else" are allowed`,{node:e,property:`kind`})})},dynamicViewDisplayVariant=e=>tryOrLog((e,t)=>{if(N(e.value)||e.value!==`diagram`&&e.value!==`sequence`){t(`error`,`Invalid display variant: "diagram" or "sequence" are allowed`,{node:e,property:`value`});return}De(e,isDynamicViewBody)||t(`error`,`Display mode can be defined only inside dynamic view`,{node:e})}),{getDocument:tp}=Te,checkElement=e=>{let t=e.likec4.FqnIndex,r=e.workspace.AstNodeLocator;return tryOrLog((e,o)=>{let s=t.getFqn(e);if(!s){o(`error`,`Not indexed element`,{node:e,property:`name`});return}$f.includes(e.name)&&o(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let c=tp(e),u=c.uri,d=r.getAstNodePath(e),p=t.byFqn(projectIdFrom(c),s).filter(e=>e.documentUri!==u||e.path!==d).head();if(p){let t=p.documentUri!==u;o(`error`,`Duplicate element name ${e.name===s?e.name:e.name+` (`+s+`)`}`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:p.nameSegment?.range??p.selectionSegment?.range,uri:p.documentUri.toString()},message:`conflicting element`}]}})}})},checkElementRef=e=>tryOrLog((e,t)=>{isReferenceToDeploymentModel(e.modelElement)&&t(`error`,`Only model elements allowed here`,{node:e,property:`modelElement`})}),{getDocument:np}=Te,checkImportsFromPoject=e=>{let t=e.shared.workspace.ProjectsManager;return tryOrLog((e,r)=>{if(!t.all.includes(e.project)){r(`error`,`Imported project not found`,{node:e,property:`project`});return}let o=projectIdFrom(np(e));if(e.project===o){r(`error`,`Imported project cannot be the same as the current project`,{node:e,property:`project`});return}})},opacityPropertyRuleChecks=e=>tryOrLog((e,t)=>{let r=parseFloat(e.value);(isNaN(r)||r<0||r>100)&&t(`warning`,`Value ignored, must be between 0% and 100%`,{node:e,property:`value`})}),iconPropertyRuleChecks=e=>(e,t)=>{let r=e.$container;r.props.some(t=>isIconProperty(t)&&t!==e)&&t(`error`,`Icon must be defined once`,{node:e}),isElementStyleProperty(r)&&isElementBody(r.$container)&&r.$container.props.some(e=>isIconProperty(e))&&t(`warning`,`Redundant as icon defined on element`,{node:e}),e.value?.startsWith(`file://`)&&t(`error`,`Icon URI must not start with file://`,{node:e,property:`value`})},colorLiteralRuleChecks=e=>(e,t)=>{if(e.$type===`HexColor`){if(e.hex===void 0||on(e.hex)&&!e.hex.match(/^[a-fA-F0-9]+$/)){t(`error`,`Invalid HEX`,{node:e,property:`hex`});return}let r=tn(e.hex)?e.hex.toString().length:e.hex.length;r!==6&&r!==3&&r!==8&&t(`error`,`Invalid value "${e.$cstNode?.text}", must be 3, 6 or 8 characters long`,{node:e,property:`hex`});return}if(e.$type===`RGBAColor`){if((!tn(e.red)||e.red<0||e.red>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`red`}),(!tn(e.green)||e.green<0||e.green>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`green`}),(!tn(e.blue)||e.blue<0||e.blue>255)&&t(`error`,`Invalid value, must be between 0 and 255`,{node:e,property:`blue`}),tn(e.alpha)&&(e.alpha<0||e.alpha>1)&&t(`error`,`Invalid value, must be between 0 and 1`,{node:e,property:`alpha`}),on(e.alpha)){let r=parseFloat(e.alpha);(r<0||r>100)&&t(`error`,`Invalid value, must be between 0% and 100%`,{node:e,property:`alpha`})}return}W(e)},relationChecks=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{let o=t.forDocument(nt(e)),s=safeCall(()=>o._resolveRelationSource(e));if(!s){r(`error`,`Source not resolved`,{node:e,property:`source`});return}let c=safeCall(()=>o.parseFqnRef(e.target));if(!c){r(`error`,`Target not resolved`,{node:e,property:`target`});return}H.isImportRef(s)&&(H.isImportRef(c)?r(`warning`,`Relationship between imported elements may not be visible in origin projects`,{node:e}):r(`warning`,`Relationship from imported element to local element may not be visible in origin project`,{node:e,property:`source`})),Qr(H.flatten(s),H.flatten(c))&&r(`error`,`Invalid parent-child relationship`,{node:e})})},checkRelationBody=e=>tryOrLog((e,t)=>{e.$container.tags?.values&&e.tags?.values&&t(`error`,`Relation cannot have tags in both header and body`,{node:e.tags})}),extendRelationChecks=e=>{let t=e.likec4.ModelParser,r=new Le(e.shared,x.Linked);function getProjectFingerprints(t){return r.get(t,()=>new Set(R(e.shared.workspace.LangiumDocuments.projectDocuments(t).toArray(),Zt(e=>e.c4Relations??[]),F(e=>relationFingerprint(e)))))}return tryOrLog((e,r)=>{let o=nt(e),s=t.forDocument(o),c=safeCall(()=>s.parseFqnRef(e.source));if(!c){r(`error`,`Source not resolved`,{node:e,property:`source`});return}let u=safeCall(()=>s.parseFqnRef(e.target));if(!u){r(`error`,`Target not resolved`,{node:e,property:`target`});return}if(!H.isModelRef(c)&&!H.isImportRef(c)){r(`error`,`Source must reference a model element`,{node:e,property:`source`});return}if(!H.isModelRef(u)&&!H.isImportRef(u)){r(`error`,`Target must reference a model element`,{node:e,property:`target`});return}let d=projectIdFrom(o),p=(e.kind??e.dotKind?.kind)?.ref?.name??`default`,{title:m=``}=s.parseBaseProps({},{title:e.title}),h=relationFingerprint({source:c,target:u,kind:p,title:m,isBidirectional:e.isBidirectional||void 0});getProjectFingerprints(d).has(h)||r(`warning`,`This extend does not match any relation (by source, kind, target, title, and directionality)`,{node:e})})},checkSpecificationRule=e=>tryOrLog((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one specification per document`,{node:e,property:`name`})}),checkModel=e=>tryOrLog((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one model per document`,{node:e,property:`name`})}),checkGlobals=e=>tryOrLog((e,t)=>{e.$containerIndex&&e.$containerIndex>0&&t(`warning`,`Prefer one global block per document`,{node:e,property:`name`})}),checkElementKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{$f.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let o=projectIdFrom(e),s=t.projectElements(o,au).filter(t=>t.name===e.name&&t.node!==e).head();if(s){let t=s.documentUri!==nt(e).uri;r(`error`,`Duplicate element kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:s.nameSegment.range,uri:s.documentUri.toString()},message:`conflicting definition`}]}})}})},checkDeploymentNodeKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{$f.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let o=projectIdFrom(e),s=t.projectElements(o,Ul).filter(t=>t.name===e.name&&t.node!==e).head();if(s){let t=s.documentUri!==nt(e).uri;r(`error`,`Duplicate deploymentNode kind '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:s.nameSegment.range,uri:s.documentUri.toString()},message:`conflicting definition`}]}})}})},checkTag=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{let o=e.name,s=projectIdFrom(e),c=t.projectElements(s,`Tag`).filter(t=>t.name===o&&t.node!==e).head();if(c){let t=c.documentUri!==nt(e).uri;r(`error`,`Duplicate tag '${e.name}'`,{node:e,property:`name`,...t&&{relatedInformation:[{location:{range:c.nameSegment.range,uri:c.documentUri.toString()},message:`conflicting definition`}]}})}})},checkRelationshipKind=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{$f.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let o=projectIdFrom(e);t.projectElements(o,`RelationshipKind`).filter(t=>t.name===e.name).limit(2).count()>1&&r(`error`,`Duplicate RelationshipKind '${e.name}'`,{node:e,property:`name`})})},checkGlobalPredicate=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{let o=projectIdFrom(e),s=t.projectElements(o,Ou),c=t.projectElements(o,Du);s.concat(c).filter(t=>t.name===e.name).limit(2).count()>1&&r(`error`,`Duplicate GlobalPredicateGroup or GlobalDynamicPredicateGroup name '${e.name}'`,{node:e,property:`name`})})},checkGlobalStyleId=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{let o=projectIdFrom(e);t.projectElements(o,`GlobalStyleId`).filter(t=>t.name===e.name).limit(2).count()>1&&r(`error`,`Duplicate GlobalStyleId name '${e.name}'`,{node:e,property:`name`})})},rp=/@likec4-generated/,viewChecks=e=>{let t=e.shared.workspace.IndexManager;return tryOrLog((e,r)=>{let o=Me(e.$cstNode,[`BLOCK_COMMENT`]);if(o&&rp.test(o.text)&&r(`warning`,`ManualLayoutV1 is no longer supported; remove this block`,{node:e,range:o.range}),!e.name)return;$f.includes(e.name)&&r(`error`,`Reserved word: ${e.name}`,{node:e,property:`name`});let s=projectIdFrom(e);t.projectElements(s,`LikeC4View`).filter(t=>t.name===e.name).limit(2).count()>1&&r(`error`,`Duplicate view '${e.name}'`,{node:e,property:`name`})})},viewOrderChecks=e=>tryOrLog((e,t)=>{(!Number.isSafeInteger(e.value)||e.value<0)&&t(`error`,`View order must be a non-negative safe integer`,{node:e,property:`value`})});function collectFqnExprs(e){let t=[],r=e;for(;r;)r.value&&t.push(r.value),r=r.prev;return t.reverse()}const viewRuleRankChecks=e=>tryOrLog((e,t)=>{let r=collectFqnExprs(e.targets);r.length<2&&e.value===`same`&&t(`warning`,`Rank rule should have at least 2 targets`,{node:e,property:`targets`});let o=r.filter(isFqnRefExpr),s=o[0]?.ref?.parent;for(let r=1;r<o.length;r++){let c=o[r];e.value===`same`&&!areSame(s,c?.ref?.parent)&&t(`error`,`All targets must have the same parent rank same`,{node:e,property:`targets`})}});function areSame(e,t){return!e&&!t?!0:!e||!t||e.value.ref!==t.value.ref?!1:areSame(e.parent,t.parent)}const checkFqnExprWith=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{let o=getViewRulePredicateContainer(e);if(o?.$type!==`DynamicViewIncludePredicate`&&o?.isInclude!==!0){r(`error`,`Invalid usage inside "exclude"`,{node:e});return}let s=o.$type===`DynamicViewIncludePredicate`,c=t.forDocument(nt(o)),u=gr.unwrap(c.parseFqnExprWith(e).custom.expr);switch(!0){case gr.isWildcard(u)&&s:case gr.isElementKindExpr(u)&&s:case gr.isElementTagExpr(u)&&s:r(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return;case gr.isWildcard(u):case gr.isModelRef(u):case gr.isDeploymentRef(u):return;case gr.isElementKindExpr(u):case gr.isElementTagExpr(u):r(`error`,`Invalid target (expect reference to specific element)`,{node:e,property:`subject`});return;default:yi(u)}})},checkFqnRefExpr=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{let o=t.forDocument(nt(e)).parseFqnRefExpr(e),s=getViewRulePredicateContainer(e),c=isFqnRefInsideDeployment(e)&&!De(e,e=>isDeploymentViewRuleStyle(e)||isViewRuleStyle(e));if(s?.$type===`DeploymentViewRulePredicate`||c){if(!De(e,isRelationExpr)){if(gr.isModelRef(o)){r(`error`,`Deployment view predicate must reference deployment model`,{node:e});return}if(gr.isDeploymentRef(o)&&_r.isInsideInstanceRef(o.ref)){r(`error`,`Must reference deployment nodes or instances, but not internals`,{node:e});return}}z(e.selector)&&!isDeploymentNode$1(e.ref.value?.ref)&&r(`warning`,`Selector '${e.selector}' applies to deployment nodes only, ignored here`,{node:e,property:`selector`});return}if(s?.$type===`DynamicViewIncludePredicate`)switch(!0){case gr.isElementKindExpr(o):case gr.isElementTagExpr(o):case gr.isWildcard(o):r(`warning`,`Predicate is ignored, as not supported in dynamic views`,{node:e});return}})},checkIncomingRelationExpr=e=>tryOrLog((e,t)=>{if(e.to.$type===`WildcardExpression`&&!isInOutRelationExpr(e.$container)){let r=Be(e,isElementView$1);L(r?.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}}),checkOutgoingRelationExpr=e=>tryOrLog((e,t)=>{if(getViewRulePredicateContainer(e)?.$type===`ViewRulePredicate`&&e.$container.$type!==`DirectedRelationExpr`&&e.from.$type===`WildcardExpression`){let r=Be(e,isElementView$1);r&&L(r.viewOf)&&t(`warning`,`Predicate is ignored as it concerns all relationships`,{node:e})}}),checkRelationExpr=e=>{let t=e.likec4.ModelParser;return tryOrLog((e,r)=>{let o=Be(e,isDeploymentViewRulePredicate);if(!o||o.isInclude!==!0)return;let s=nt(e),c=t.forDocument(s),u=jr.unwrap(c.parseRelationExpr(e)),d=`Model reference is allowed in exclude predicate only`;if(jr.isDirect(u)){(Dr.isModelRef(u.source)||Dr.isModelRef(u.target))&&r(`error`,d,{node:e});return}let p;if(p=jr.isIncoming(u)?u.incoming:jr.isOutgoing(u)?u.outgoing:u.inout,Dr.isModelRef(p)){r(`error`,d,{node:e});return}})},checkRelationExprWith=e=>tryOrLog((e,t)=>{let r=getViewRulePredicateContainer(e);if(r&&r.$type!=`DynamicViewIncludePredicate`&&!r.isInclude){t(`error`,`Invalid usage inside "exclude"`,{node:e});return}});var LikeC4DocumentValidator=class extends te{services;constructor(e){super(e),this.services=e}async validateDocument(e,t,r){return this.services.shared.workspace.ProjectsManager.isExcluded(e)?[]:await super.validateDocument(e,t,r)}};Ze();const ip=xr(isImportsFromPoject,isImported,isGlobals,isGlobalPredicateGroup,isGlobalDynamicPredicateGroup,isGlobalStyle,isGlobalStyleGroup,isFqnExprWith,isRelationExprWith,isFqnExpr,isRelationExpr,isStepStatement,isDeploymentViewRule,isDeploymentViewRulePredicate,isExpressionV2,isRelationExpr,isFqnRefExpr,isViewProperty,isStyleProperty,isTags,isViewRule,isDynamicViewRule,isLikeC4View,isViewRuleStyleOrGlobalRef,isDeployedInstance,isDeploymentNode$1,isDeploymentRelation,isRelationshipStyleProperty,isDynamicViewDisplayVariantProperty,isMetadataBody,isMetadataProperty,isRelation,isRelationBody,isElementProperty,isStringProperty,isNavigateToProperty,isElement,isElementBody,isElementStyleProperty,isElementRef,isExtendElement,isExtendElementBody,isExtendDeployment,isExtendDeploymentBody,isExtendRelation,isExtendRelationBody,isSpecificationElementKind,isSpecificationRelationshipKind,isSpecificationDeploymentNodeKind,isSpecificationTag,isSpecificationColor,isSpecificationRule,isExpressions,isColorLiteral),findInvalidContainer=e=>{let t=e;for(;t&&!isLikeC4Grammar(t);){if(ip(t))return t;t=t.$container}};function checksFromDiagnostics(e){let t=e.state>=x.Validated?e.diagnostics?.filter(e=>e.severity===ve.Error)??[]:[],r=new WeakSet;for(let{node:e}of t)if(!(L(e)||r.has(e))&&(r.add(e),!ip(e))){let t=findInvalidContainer(e);t&&r.add(t)}let isValid=e=>!r.has(e);return{isValid,invalidNodes:r}}function registerValidationChecks(e){Y.debug(`registerValidationChecks`),e.validation.ValidationRegistry.register({DeployedInstance:deployedInstanceChecks(e),DeploymentNodeKind:checkDeploymentNodeKind(e),DeploymentNode:deploymentNodeChecks(e),DeploymentRelation:deploymentRelationChecks(e),ExtendDeployment:extendDeploymentChecks(e),ExtendRelation:extendRelationChecks(e),FqnRefExpr:checkFqnRefExpr(e),RelationExpr:checkRelationExpr(e),OpacityProperty:opacityPropertyRuleChecks(e),IconProperty:iconPropertyRuleChecks(e),SpecificationRule:checkSpecificationRule(e),Model:checkModel(e),Globals:checkGlobals(e),GlobalPredicateGroup:checkGlobalPredicate(e),GlobalDynamicPredicateGroup:checkGlobalPredicate(e),GlobalStyleId:checkGlobalStyleId(e),Step:stepSingle(e),StepSeries:stepSeries(e),SubflowStep:subflowStep(e),LikeC4View:viewChecks(e),Element:checkElement(e),ElementRef:checkElementRef(e),ElementKind:checkElementKind(e),Relation:relationChecks(e),RelationBody:checkRelationBody(e),Tag:checkTag(e),FqnExprWith:checkFqnExprWith(e),RelationExprWith:checkRelationExprWith(e),RelationshipKind:checkRelationshipKind(e),IncomingRelationExpr:checkIncomingRelationExpr(e),OutgoingRelationExpr:checkOutgoingRelationExpr(e),ImportsFromPoject:checkImportsFromPoject(e),ColorLiteral:colorLiteralRuleChecks(e),DynamicViewDisplayVariantProperty:dynamicViewDisplayVariant(e),ViewRuleRank:viewRuleRankChecks(e),ViewOrderProperty:viewOrderChecks(e)});let t=e.shared.lsp.Connection;t&&bi(()=>{e.shared.workspace.DocumentBuilder.onUpdate((e,r)=>{for(let e of r)Y.debug(`clear diagnostics for deleted ${e.path}`),t.sendDiagnostics({uri:e.toString(),diagnostics:[]}).catch(e=>Y.error(loggable(e)))})})}const ap=Y.getChild(`parser`),op={b:`\b`,f:`\f`,n:`
94
+ `,r:`\r`,t:` `,v:`\v`,0:`\0`};function unescapeKeepingSlash(e){let t=``;for(let r=1;r<e.length-1;r++){let o=e[r];if(o===`\\`){let o=e[++r]??``;t+=o===`/`?`\\/`:op[o]??o}else t+=o}return t}function parseTitleKeepingEscapedSlash(e){if(!e||!on(e.text))return;let t=e.$cstNode?.text;return t?unescapeKeepingSlash(t):e.text}function parseInlineTitleKeepingEscapedSlash(e,t,r=0){let o=Se(e?.$cstNode,t,r)?.text;return o?unescapeKeepingSlash(o):void 0}function toSingleLine(e){if(e==null)return;let t=removeIndent(e);return on(t)?t.split(`
97
95
  `).join(` `):`md`in t?{md:t.md.split(`
98
96
  `).join(` `)}:{txt:t.txt.split(`
99
- `).join(` `)}}function removeIndent(e){if(e!=null)switch(!0){case sn(e):return dedent(e).trim();case isMarkdownOrString(e)&&sn(e.markdown):return{md:dedent(e.markdown).trim()};case isMarkdownOrString(e)&&sn(e.text):return{txt:dedent(e.text).trim()};case isMarkdownOrString(e):return{txt:``};default:return}}function parseViewOrder(e){if(!(!e||/^\s*order\b\s*-/.test(e.$cstNode?.text??``)))return Number.isSafeInteger(e.value)&&e.value>=0?e.value:void 0}var BaseParser=class{services;doc;project;isValid;docUri;docPathInProject;constructor(e,t,r){this.services=e,this.doc=t,this.project=r,this.isValid=checksFromDiagnostics(t).isValid,this.docUri=t.uri.toString(),this.docPathInProject=C.relative(r.folderUri,t.uri)}logError(e,t,r){let o=e instanceof Error?e.message:typeof e==`string`?e:String(e);if(we(t)){let e=this.services.references.NameProvider.getName(t);e=e?`"${e}" (${t.$type})`:`${t.$type}`;let r=t.$cstNode,s=r?`:${r.range.start.line+1}:${r.range.start.character+1}`:``;o+=`\n\tat ${e} (${this.doc.uri.fsPath}${s})`}else t&&`$refText`in t&&(o+=`\n\tat reference "${t.$refText}" (${this.doc.uri.fsPath})`);r&&r!==`base`?np.getChild(r).debug(o):np.debug(o)}tryParse(e,t,r){try{return!t||!this.isValid(t)?void 0:r(t)}catch(r){this.logError(r,t,e);return}}tryMap(e,t,r){let o=0;return Qt(t,t=>{try{if(!t||!this.isValid(t))return[];let e=r(t,o);return e===void 0?[]:(o++,e)}catch(r){return this.logError(r,t,e),[]}})}resolveFqn(e){if(isImported(e)){let t=projectIdFrom(e),r=this.resolveFqn(ti(e.imported.ref,`FqnRef is empty of imported: ${e.$cstNode?.text}`));return this.doc.c4Imports.set(t,r),kr(t,r)}return isExtendElement(e)?readStrictFqn(e.element):isExtendDeployment(e)?readStrictFqn(e.deploymentNode):isDeploymentElement(e)?this.services.likec4.DeploymentsIndex.getFqn(e):this.services.likec4.FqnIndex.getFqn(e)}getAstNodePath(e){return this.services.workspace.AstNodeLocator.getAstNodePath(e)}getMetadata(e){if(!e||!this.isValid(e)||j(e.props))return;let extractValues=e=>{if(isMarkdownOrString(e)){let t=removeIndent(e);if(!t)return[];if(typeof t==`string`)return L(t)?[t]:[];{let e=t.md||t.txt;return L(e)?[e]:[]}}return isMetadataArray(e)?e.values.map(e=>removeIndent(e)).map(e=>typeof e==`string`?e:e.md||e.txt).filter(L):[]},t=I(e.props,Qt(e=>e.value?extractValues(e.value).map(t=>[e.key,t]):[[e.key,String(e.boolValue)]]),M(([e,t])=>L(t)));if(j(t))return;let r=I(t,Yt(([e])=>e),Fn(e=>e.map(([e,t])=>t))),o={};for(let[e,t]of Object.entries(r))t&&t.length>0&&(o[e]=t.length===1?t[0]:t);return j(o)?void 0:o}parseMarkdownOrString(e){if(isMarkdownOrString(e))return removeIndent(e)}convertTags(e){return this.parseTags(e)}parseTags(e){let t=e?.tags;if(!t)return null;let r=[];for(;t;)r.push(...this.tryMap(`base`,t.values,e=>ti(e.tag.ref,`Tag reference is not resolved`).name).filter(L)),t=t.prev;return Zr(r)?An(r):null}convertLinks(e){return this.parseLinks(e)}parseLinks(e){if(!e?.props||e.props.length===0)return;let t=this.tryMap(`base`,M(e.props,isLinkProperty),e=>{let t=e.value;if(tn(t))return;let r=L(e.title)?toSingleLine(e.title):void 0,o=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,t);return Vr({url:t,title:r,relative:o&&o!==t?o:void 0})});return Zr(t)?t:void 0}parseIconProperty(e){if(!e||!this.isValid(e))return;let{libicon:t,value:r}=e;switch(!0){case!!t:{let r=t.ref?.name;if(!r){this.logError(`Library icon ${t.$refText} is not a valid library icon`,e);return}return r}case r&&r===`none`:return r;case r&&vt(r):if(r.startsWith(`file:`)){this.logError(`Icon property '${r}' used the 'file' protocol which is not supported`,e);return}return r;case r&&r.startsWith(`@`):return this.parseImageAlias(r);case r&&mt(r):return dt(this.doc.uri.toString(),`../`,r);case r&&gt(r):return _t(this.project.folderUri.toString(),r);default:this.logError(`Icon property '${r}' is not a valid URL, library icon, image alias or 'none'`,e);return}}parseImageAlias(e){let t=e.indexOf(`/`),r=t>0?e.substring(0,t):e,o=t>0?e.substring(t+1):``,s={"@":`./images`,...this.project.config.imageAliases}[r];if(!s){np.warn(`Image alias "${r}" not found in project configuration`);return}let c=o?_t(s,o):s;return _t(this.project.folderUri.toString(),c)}parseColorLiteral(e){if(this.isValid(e)){if(isHexColor(e))return`#${e.hex}`;if(isRGBAColor(e)){let t=nn(e.alpha)?e.alpha:void 0;return sn(e.alpha)&&(t=parseAstPercent(e.alpha)/100),t===void 0?`rgb(${e.red},${e.green},${e.blue})`:`rgba(${e.red},${e.green},${e.blue},${t})`}H(e)}}parseElementStyle(e){if(!e)return{};if($t(e)){let t=this.parseStyleProps(e.find(isElementStyleProperty)?.props);try{let r=this.parseIconProperty(e.find(isIconProperty));r&&(t.icon=r)}catch(e){this.logError(e)}return t}return this.parseStyleProps(e.props)}parseStyleProps(e){let t={};if(!e||e.length===0)return t;for(let r of e)if(this.isValid(r))try{switch(!0){case isBorderProperty(r):L(r.value)&&(t.border=r.value);break;case isColorProperty(r):{let e=toColor(r);L(e)&&(t.color=e);break}case isShapeProperty(r):L(r.value)&&(t.shape=r.value);break;case isIconProperty(r):{let e=this.parseIconProperty(r);L(e)&&(t.icon=e);break}case isIconColorProperty(r):{let e=toColor(r);L(e)&&(t.iconColor=e);break}case isIconSizeProperty(r):L(r.value)&&(t.iconSize=parseAstSizeValue(r));break;case isIconPositionProperty(r):L(r.value)&&(t.iconPosition=parseAstIconPositionValue(r));break;case isOpacityProperty(r):t.opacity=parseAstOpacityProperty(r);break;case isMultipleProperty(r):t.multiple=Xt(r.value)?r.value:!1;break;case isShapeSizeProperty(r):L(r.value)&&(t.size=parseAstSizeValue(r));break;case isPaddingSizeProperty(r):L(r.value)&&(t.padding=parseAstSizeValue(r));break;case isTextSizeProperty(r):L(r.value)&&(t.textSize=parseAstSizeValue(r));break;default:H(r)}}catch(e){this.logError(e,r)}return Vr(t)}parseBaseProps(e,t){let r=removeIndent(t?.title??parseMarkdownAsString(e.title)),o=t?.description?{txt:removeIndent(t.description)}:this.parseMarkdownOrString(e.description),s=t?.summary?{txt:removeIndent(t.summary)}:this.parseMarkdownOrString(e.summary),c=toSingleLine(t?.technology)??removeIndent(parseMarkdownAsString(e.technology));return Vr({title:r,summary:s,description:o,technology:c})}};function*streamDeploymentModel(e){let t=jr.from(e.parseResult.value.deployments.flatMap(e=>e.elements)),r=[],o;for(;o=t.shift();){if(isDeploymentRelation(o)){r.push(o);continue}if(o.body&&o.body.elements.length>0)for(let e of o.body.elements)t.push(e);yield o}yield*r}function DeploymentModelParser(e){return class DeploymentModelParser extends e{parseDeployment(){let e=this.doc;for(let t of streamDeploymentModel(e))try{switch(!0){case isDeploymentRelation(t):this.isValid(t)&&e.c4DeploymentRelations.push(this.parseDeploymentRelation(t));break;case isDeployedInstance(t):e.c4Deployments.push(this.parseDeployedInstance(t));break;case isDeploymentNode$1(t):e.c4Deployments.push(this.parseDeploymentNode(t));break;case isExtendDeployment(t):{let r=this.parseExtendDeployment(t);r&&e.c4ExtendDeployments.push(r);break}default:H(t)}}catch(e){this.logError(e,t,`deployment`)}}parseDeploymentNode(e){let t=this.isValid,r=this.resolveFqn(e),o=ti(e.kind.ref,`DeploymentKind not resolved`).name,s=this.parseTags(e.body)??void 0,c=this.parseLinks(e.body),u=this.parseElementStyle(e.body?.props),d=this.getMetadata(e.body?.props.find(isMetadataProperty)),p=I(e.body?.props??[],M(t),M(isElementStringProperty),Ln(e=>[e.key,e.value])),{title:m,...h}=this.parseBaseProps(p,{title:e.title,summary:e.summary});return Vr({id:r,kind:o,title:m??ei(r),...h,tags:s,links:c,style:u,metadata:d})}parseDeployedInstance(e){let t=this.isValid,r=this.resolveFqn(e),o=this.parseFqnRef(e.target.modelElement);V(z.isModelRef(o)||z.isImportRef(o),`Target must be a model reference`);let s=this.parseTags(e.body)??void 0,c=this.parseElementStyle(e.body?.props),u=this.getMetadata(e.body?.props.find(isMetadataProperty)),d=I(e.body?.props??[],M(t),M(isElementStringProperty),Ln(e=>[e.key,e.value])),p=this.parseBaseProps(d,{title:e.title,summary:e.summary}),m=this.parseLinks(e.body);return Vr({id:r,element:o,tags:s,links:m,...p,style:c,metadata:u})}parseExtendDeployment(e){let t=this.parseTags(e.body),r=this.getMetadata(e.body?.props.find(isMetadataProperty)),o=this.parseLinks(e.body);if(!t&&j(r??{})&&!o)return null;let s=this.resolveFqn(e),c=this.getAstNodePath(e);return Vr({id:s,astPath:c,metadata:r,tags:t,links:o})}_resolveDeploymentRelationSource(e){if(qt(e.source))return this.parseFqnRef(e.source);if(e.$container.$type===`DeploymentNodeBody`||e.$container.$type===`DeployedInstanceBody`)return{deployment:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseDeploymentRelation(e){let t=this.isValid,r=this.getAstNodePath(e),o=this._resolveDeploymentRelationSource(e);V(z.isDeploymentRef(o),`Invalid source for deployment relation`);let s=this.parseFqnRef(e.target);V(z.isDeploymentRef(s),`Invalid target for deployment relation`);let c=this.convertTags(e)??this.convertTags(e.body)??void 0,u=this.convertLinks(e.body),d=(e.kind??e.dotKind?.kind)?.ref?.name,p=this.getMetadata(e.body?.props.find(isMetadataProperty)),m=I(e.body?.props??[],M(isRelationStringProperty),M(e=>L(e.value)),Ln(e=>[e.key,e.value])),h=I(e.body?.props??[],M(isRelationNavigateToProperty),Zt())?.value.view.ref?.name,g=this.parseBaseProps(m,{title:e.title}),_=e.body?.props.find(isRelationStyleProperty),v=stringHash$1(`deployment`,this.docUri,r,o.deployment,s.deployment);return Vr({id:v,source:o,target:s,...g,metadata:p,kind:d,tags:c,links:u,...toRelationshipStyle(_?.props,t),navigateTo:h,astPath:r})}}}function DeploymentViewParser(e){return class DeploymentViewParser extends e{parseDeploymentView(e){let t=e.body;V(t,`DynamicElementView body is not defined`);let r=t.props.filter(this.isValid),o=this.getAstNodePath(e),s=e.name;s||=`deployment_`+stringHash$1(this.doc.uri.toString(),o);let c=I(r,M(isViewStringProperty),Ln(e=>[e.key,e.value])),{title:u=null,description:d=null}=this.parseBaseProps(c,{title:parseTitleKeepingEscapedSlash(c.title)}),p=this.convertTags(t),m=this.convertLinks(t),h=parseViewOrder(r.find(isViewOrderProperty));return ff.writeId(e,s),{[R._type]:`deployment`,id:s,astPath:o,title:toSingleLine(u)??null,description:d,...h!==void 0&&{order:h},tags:p,links:Zr(m)?m:null,rules:this.tryMap(`deployment`,t.rules,e=>this.parseDeploymentViewRule(e))}}parseDeploymentViewRule(e){if(isDeploymentViewRulePredicate(e))return this.parseDeploymentViewRulePredicate(e);if(isViewRuleAutoLayout(e))return toAutoLayout(e);if(isViewRuleAncestors(e))return{includeAncestors:e.value};if(isDeploymentViewRuleStyle(e))return this.parseDeploymentViewRuleStyle(e);H(e)}parseDeploymentViewRulePredicate(e){let t=[],r=e.expr;for(;r;){try{let e=r.value;P(e)&&this.isValid(e)&&t.unshift(this.parseExpressionV2(e))}catch(e){logWarnError(e)}r=r.prev}return e.isInclude?{include:t}:{exclude:t}}parseDeploymentViewRuleStyle(e){let t=this.parseStyleProps(e.props.filter(isStyleProperty)),r=removeIndent(parseMarkdownAsString(e.props.find(isNotationProperty)?.value));return{targets:this.parseFqnExpressions(e.targets),style:t,...r&&{notation:r}}}}}const parseMetadataEquals=({operator:e,not:t},r)=>e?.startsWith(`!=`)?{neq:r}:e?.startsWith(`=`)?{eq:r}:t?{neq:r}:{eq:r},parseEquals=({operator:e,not:t},r)=>e.startsWith(`!=`)?{neq:r}:e.startsWith(`=`)?{eq:r}:t?{neq:r}:{eq:r};function parseParticipant(e){return!isWhereRelationParticipantKind(e)&&!isWhereRelationParticipantTag(e)&&!isWhereRelationParticipantMetadata(e)?null:e.participant}function parseWhereClause(e){switch(!0){case isWhereTagEqual(e):{let t=e.value.tag.ref?.name,r=parseParticipant(e);V(t,`Expected tag name`);let o={tag:parseEquals(e,t)};return r?{participant:r,operator:o}:o}case isWhereKindEqual(e):{let t=e.value?.ref?.name,r=parseParticipant(e);V(t,`Expected kind name`);let o={kind:parseEquals(e,t)};return r?{participant:r,operator:o}:o}case isWhereMetadataEqual(e):{let t=e.key,r=parseParticipant(e);V(t,`Expected metadata key`);let o={metadata:{key:t,...e.value==null?{}:{value:parseMetadataEquals(e,String(e.value))}}};return r?{participant:r,operator:o}:o}case isWhereElementNegation(e)||isWhereRelationNegation(e):return{not:parseWhereClause(e.value)};case isWhereBinaryExpression(e):{let t=parseWhereClause(e.left),r=parseWhereClause(e.right);return createBinaryOperator(e.operator.toLowerCase(),t,r)}default:H(e)}}function createBinaryOperator(e,t,r){if(r===null)return t;switch(e){case`and`:{let e=[Wr(t)?t.and:t,Wr(r)?r.and:r].flat();return V(Zr(e),`Expected non-empty array`),{and:e}}case`or`:{let e=[Qr(t)?t.or:t,Qr(r)?r.or:r].flat();return V(Zr(e),`Expected non-empty array`),{or:e}}default:H(e)}}function ExpressionV2Parser(e){return class ExpressionV2Parser extends e{parseFqnRef(e){let t=ti(e.value?.ref,()=>`Element "${e.$cstNode?.text}" is not resolved`);if(isImported(t)){let e={project:projectIdFrom(t),model:this.resolveFqn(ti(t.imported.ref,`Imported "${t.$cstNode?.text}" is not resolved`))};return this.doc.c4Imports.set(e.project,e.model),e}if(isElement(t)){let r=importsRef(e);if(r){let e={project:projectIdFrom(r),model:this.resolveFqn(t)};return this.doc.c4Imports.set(e.project,e.model),e}let o=instanceRef(e);return o?{deployment:this.resolveFqn(o),element:this.resolveFqn(t)}:{model:this.resolveFqn(t)}}if(isDeploymentElement(t))return{deployment:this.resolveFqn(t)};H(t)}parseExpressionV2(e){if(isFqnExprOrWith(e))return this.parseFqnExprOrWith(e);if(isRelationExprOrWith(e))return this.parseRelationExprOrWith(e);H(e)}parseFqnExprOrWith(e){if(isFqnExprWith(e))return this.parseFqnExprWith(e);if(isFqnExprOrWhere(e))return this.parseFqnExprOrWhere(e);H(e)}parseFqnExprWith(e){let t=this.parseFqnExprOrWhere(e.subject);return(e.custom?.props??[]).reduce((e,t)=>{if(!this.isValid(t))return e;if(isNavigateToProperty(t)){let r=t.value.view.$refText;return L(r)&&(e.custom.navigateTo=r),e}if(isNotesProperty(t)){let r=this.parseMarkdownOrString(t.value);return r&&(e.custom[t.key]=r),e}if(isElementStringProperty(t)){if(t.key===`description`||t.key===`summary`){let r=this.parseMarkdownOrString(t.value);return r&&(e.custom.description=r),e}let r=removeIndent(parseMarkdownAsString(t.value));return r&&(e.custom[t.key]=r),e}if(isIconProperty(t)){let r=this.parseIconProperty(t);return qt(r)&&(e.custom[t.key]=r),e}if(isColorProperty(t)){let r=toColor(t);return qt(r)&&(e.custom[t.key]=r),e}if(isShapeProperty(t)||isBorderProperty(t))return qt(t.value)&&(e.custom[t.key]=t.value),e;if(isOpacityProperty(t))return qt(t.value)&&(e.custom[t.key]=parseAstOpacityProperty(t)),e;if(isIconColorProperty(t)){let r=toColor(t);return qt(r)&&(e.custom[t.key]=r),e}if(isNotationProperty(t)){let r=L(t.value)?removeIndent(parseMarkdownAsString(t.value)):void 0;return r&&(e.custom[t.key]=r),e}if(isMultipleProperty(t))return Xt(t.value)&&(e.custom[t.key]=t.value),e;if(isShapeSizeProperty(t)||isTextSizeProperty(t)||isPaddingSizeProperty(t)||isIconSizeProperty(t))return L(t.value)&&(e.custom[t.key]=parseAstSizeValue(t)),e;if(isIconPositionProperty(t))return L(t.value)&&(e.custom[t.key]=t.value),e;H(t)},{custom:{expr:t}})}parseFqnExprOrWhere(e){if(isFqnExprWhere(e))return this.parseFqnExprWhere(e);if(isFqnExpr(e))return this.parseFqnExpr(e);H(e)}parseFqnExprWhere(e){return V(!isFqnExprWhere(e.subject),`FqnExprWhere is not allowed as subject of FqnExprWhere`),{where:{expr:this.parseFqnExpr(e.subject),condition:e.where?parseWhereClause(e.where):{kind:{neq:`--always-true--`}}}}}parseFqnExpr(e){if(isWildcardExpression(e))return{wildcard:!0};if(isElementKindExpression(e))return V(e.kind?.ref,`ElementKind "${e.$cstNode?.text}" is not resolved`),{elementKind:e.kind.ref.name,isEqual:e.isEqual};if(isElementTagExpression(e))return V(e.tag.tag.ref,`Tag ${e.$cstNode?.text} is not resolved`),{elementTag:e.tag.tag.ref.name,isEqual:e.isEqual};if(isFqnRefExpr(e))return this.parseFqnRefExpr(e);H(e)}parseFqnRefExpr(e){let t=this.parseFqnRef(e.ref);switch(!0){case e.selector===`._`:return{ref:t,selector:`expanded`};case e.selector===`.**`:return{ref:t,selector:`descendants`};case e.selector===`.*`:return{ref:t,selector:`children`};default:return{ref:t}}}parseFqnExpressions(e){let t=[],r=e;for(;r;){try{P(r.value)&&this.isValid(r.value)&&t.push(this.parseFqnExpr(r.value))}catch(e){this.logError(e,r.value,`fqnref`)}r=r.prev}return t.reverse()}parseRelationExprOrWith(e){if(isRelationExprWith(e))return this.parseRelationExprWith(e);if(isRelationExprOrWhere(e))return this.parseRelationExprOrWhere(e);H(e)}parseRelationExprWith(e){let t=this.parseRelationExprOrWhere(e.subject);return{customRelation:{...this.parseCustomRelationProperties(e.custom),expr:t}}}parseCustomRelationProperties(e){return(e?.props??[]).reduce((e,t)=>{if(isNotesProperty(t)){let r=this.parseMarkdownOrString(t.value);return r&&(e[t.key]=r),e}if(isRelationStringProperty(t)||isNotationProperty(t)){if(t.key===`description`){let r=this.parseMarkdownOrString(t.value);return r&&(e.description=r),e}let r=removeIndent(parseMarkdownAsString(t.value));return r&&(e[t.key]=r),e}if(isArrowProperty(t))return L(t.value)&&(e[t.key]=t.value),e;if(isColorProperty(t)){let r=toColor(t);return L(r)&&(e[t.key]=r),e}if(isLineProperty(t))return L(t.value)&&(e[t.key]=t.value),e;if(isRelationNavigateToProperty(t)){let r=t.value.view.ref?.name;return L(r)&&(e[t.key]=r),e}if(isMultipleProperty(t))return Xt(t.value)&&(e[t.key]=t.value),e;H(t)},{})}parseRelationExprOrWhere(e){if(isRelationExprWhere(e))return this.parseRelationExprWhere(e);if(isRelationExpr(e))return this.parseRelationExpr(e);H(e)}parseRelationExprWhere(e){V(!isRelationExprWhere(e.subject),`RelationExprWhere is not allowed as subject of RelationExprWhere`);let t=this.parseRelationExpr(e.subject),r=t.where?.expr??t,o=t.where?.condition,s=e.where?parseWhereClause(e.where):null,c;return c=s&&o?createBinaryOperator(`and`,o,s):s??o??{kind:{neq:`--always-true--`}},{where:{expr:r,condition:c}}}parseRelationExpr(e){switch(e.$type){case`DirectedRelationExpr`:return this.wrapInWhere({source:this.parseFqnExpr(e.source.from),target:this.parseFqnExpr(e.target),isBidirectional:e.source.isBidirectional},this.parseInlineKindCondition(e.source));case`InOutRelationExpr`:return{inout:this.parseFqnExpr(e.inout.to)};case`OutgoingRelationExpr`:return this.wrapInWhere({outgoing:this.parseFqnExpr(e.from)},this.parseInlineKindCondition(e));case`IncomingRelationExpr`:return{incoming:this.parseFqnExpr(e.to)};default:H(e)}}parseInlineKindCondition(e){let t=e.kind??e.dotKind?.kind;return t?t.ref?{kind:{eq:t.ref?.name}}:(this.logError(`RelationshipKind "${t.$refText}" is not resolved`,e,`fqnref`),null):null}wrapInWhere(e,t){return t?{where:{expr:e,condition:t}}:e}}}function GlobalsParser(e){return class GlobalsParser extends e{parseGlobals(){let{parseResult:e,c4Globals:t}=this.doc,r=this.isValid,o=e.value.globals.filter(r),s=o.flatMap(e=>e.predicates.filter(r));for(let e of s)try{let r=e.name;if(!L(r))continue;if(r in t.predicates){this.logError(`Global predicate named "${r}" is already defined`,e,`globals`);continue}this.parseAndStoreGlobalPredicateGroupOrDynamic(e,r,t)}catch(t){this.logError(t,e,`globals`)}let c=o.flatMap(e=>e.styles.filter(r));for(let e of c)try{let r=e.id.name;if(!L(r))continue;if(r in t.styles){this.logError(`Global style named "${r}" is already defined`,e,`globals`);continue}let o=this.parseGlobalStyleOrGroup(e);A(o,1)&&(t.styles[r]=o)}catch(t){this.logError(t,e,`globals`)}}parseAndStoreGlobalPredicateGroupOrDynamic(e,t,r){if(isGlobalPredicateGroup(e)){let o=this.parseGlobalPredicateGroup(e);A(o,1)&&(r.predicates[t]=o);return}if(isGlobalDynamicPredicateGroup(e)){let o=this.parseGlobalDynamicPredicateGroup(e);A(o,1)&&(r.dynamicPredicates[t]=o);return}H(e)}parseGlobalPredicateGroup(e){return e.predicates.map(e=>this.parseViewRulePredicate(e))}parseGlobalDynamicPredicateGroup(e){return e.predicates.map(e=>this.parseDynamicViewIncludePredicate(e))}parseGlobalStyleOrGroup(e){if(isGlobalStyle(e))return[this.parseViewRuleStyle(e)];if(isGlobalStyleGroup(e))return e.styles.map(e=>this.parseViewRuleStyle(e));H(e)}}}function ImportsParser(e){return class ImportsParser extends e{parseImports(){let e=this.doc.parseResult.value.imports??[];for(let t of e){let e=t.project,r=t.imports;for(;r;){try{this.doc.c4Imports.set(e,this.resolveFqn(ti(r.imported.ref,`ElementRef is empty of imported: ${r.imported.$refText}`)))}catch(e){this.logError(e,r,`imports`)}r=r.prev}}}}}function*streamModel(e){let t=jr.from(e.parseResult.value.models.flatMap(e=>e.elements)),r=[],o;for(;o=t.shift();){if(isRelation(o)){r.push(o);continue}if(isExtendRelation(o)){r.push(o);continue}if(o.body?.elements&&A(o.body.elements,1))for(let e of o.body.elements)t.push(e);yield o}yield*r}function ModelParser(e){return class ModelParser extends e{parseModel(){let e=this.doc;for(let t of streamModel(e))try{if(isElement(t)){e.c4Elements.push(this.parseElement(t));continue}if(isRelation(t)){e.c4Relations.push(this.parseRelation(t));continue}if(isExtendElement(t)){let r=this.parseExtendElement(t);r&&e.c4ExtendElements.push(r);continue}if(isExtendRelation(t)){let r=this.parseExtendRelation(t);r&&e.c4ExtendRelations.push(r);continue}H(t)}catch(e){this.logError(e,t,`model`)}}parseElement(e){let t=this.isValid,r=this.resolveFqn(e),o=ti(e.kind.ref,`Element kind is not resolved`).name,s=this.parseTags(e.body),c=this.parseElementStyle(e.body?.props),u=this.getMetadata(e.body?.props.find(isMetadataProperty)),d=this.getAstNodePath(e),[p,m,h]=e.props??[],g=I(e.body?.props??[],M(t),M(isElementStringProperty),Ln(e=>[e.key,e.value])),{title:_,...v}=this.parseBaseProps(g,{title:qt(p)?parseInlineTitleKeepingEscapedSlash(e,`props`,0)??p:parseTitleKeepingEscapedSlash(g.title),summary:m,technology:h});return xr({id:r,kind:o,astPath:d,title:_,metadata:u,tags:s??void 0,links:this.parseLinks(e.body),...v,style:c})}parseExtendElement(e){let t=this.parseTags(e.body),r=this.getMetadata(e.body?.props.find(isMetadataProperty)),o=this.parseLinks(e.body);if(!t&&tn(r)&&!o)return null;let s=this.getAstNodePath(e),c=this.resolveFqn(e);return xr({id:c,astPath:s,metadata:r,tags:t,links:o})}parseExtendRelation(e){let t=this.parseFqnRef(e.source),r=this.parseFqnRef(e.target);V(vr.isModelRef(t)||vr.isImportRef(t),`Source must be a model reference`),V(vr.isModelRef(r)||vr.isImportRef(r),`Target must be a model reference`);let o=this.parseTags(e.body),s=this.getMetadata(e.body?.props.find(isMetadataProperty)),c=this.getAstNodePath(e),u=this.parseLinks(e.body);if(!o&&j(s??{})&&!u)return null;let d=(e.kind??e.dotKind?.kind)?.ref?.name,{title:p=``}=this.parseBaseProps({},{title:e.title}),m=relationFingerprint({source:t,target:r,kind:d,title:p,isBidirectional:e.isBidirectional||void 0});return xr({id:m,astPath:c,isBidirectional:e.isBidirectional||void 0,metadata:s,tags:o,links:u})}_resolveRelationSource(e){if(qt(e.source)){let t=this.parseFqnRef(e.source);return V(vr.isModelRef(t)||vr.isImportRef(t),`Relation source must be a model reference`),t}if(isElementBody(e.$container)||isExtendElementBody(e.$container))return{model:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseRelation(e){let t=this.isValid,r=this._resolveRelationSource(e),o=this.parseFqnRef(e.target);V(vr.isModelRef(o)||vr.isImportRef(o),`Target must be a model reference`);let s=this.parseTags(e)??this.parseTags(e.body)??void 0,c=this.parseLinks(e.body),u=(e.kind??e.dotKind?.kind)?.ref?.name,d=this.getMetadata(e.body?.props.find(isMetadataProperty)),p=this.getAstNodePath(e),m=I(e.body?.props??[],M(isRelationStringProperty),M(e=>L(e.value)),Ln(e=>[e.key,e.value])),h=I(e.body?.props??[],M(isRelationNavigateToProperty),N(e=>e.value.view.ref?.name),M(L),Zt()),{title:g=``,description:_,technology:v}=this.parseBaseProps(m,{title:e.title,description:e.description,technology:e.technology}),y=e.body?.props.find(isRelationStyleProperty),b=stringHash$1(this.docUri,p,vr.flatten(r),vr.flatten(o));return xr({id:b,astPath:p,source:r,target:o,isBidirectional:e.isBidirectional||void 0,title:g,metadata:d,kind:u,tags:s,links:c,navigateTo:h,description:_,technology:v,...toRelationshipStyle(y?.props,t)})}}}function PredicatesParser(e){return class PredicatesParser extends e{parsePredicate(e){return this.parseExpressionV2(e)}parseElementPredicate(e){if(isFqnExprWith(e))return this.parseFqnExprWith(e);if(isFqnExprOrWhere(e))return this.parseFqnExprOrWhere(e);H(e)}parseElementPredicateOrWhere(e){return this.parseFqnExprOrWhere(e)}parseElementExpression(e){return this.parseFqnExpr(e)}parseElementPredicateWhere(e){return this.parseFqnExprWhere(e)}parseElementPredicateWith(e){return this.parseFqnExprWith(e)}parseRelationPredicate(e){return this.parseRelationExprOrWith(e)}parseRelationPredicateOrWhere(e){return this.parseRelationExprOrWhere(e)}parseRelationPredicateWhere(e){return this.parseRelationExprWhere(e)}parseRelationPredicateWith(e){return this.parseRelationExprWith(e)}parseRelationExpression(e){return this.parseRelationExpr(e)}}}function SpecificationParser(e){return class SpecificationParser extends e{parseSpecification(){let{parseResult:{value:{specifications:e}},c4Specification:t}=this.doc,r=this.isValid;for(let o of e.flatMap(e=>e.elements.filter(r)))try{Object.assign(t.elements,this.parseElementSpecificationNode(o))}catch(e){this.logError(e,o,`specification`)}for(let o of e.flatMap(e=>e.deploymentNodes.filter(r)))try{Object.assign(t.deployments,this.parseElementSpecificationNode(o))}catch(e){this.logError(e,o,`specification`)}let o=e.flatMap(e=>e.relationships.filter(this.isValid));for(let e of o){let{kind:r,props:o}=e;try{let s=r.name;if(!L(s))continue;if(s in t.relationships){this.logError(`Relationship kind "${s}" is already defined`,r,`specification`);continue}let c=this.parseTags(e),u=this.parseLinks(e),d=I(o.filter(isSpecificationRelationshipStringProperty)??[],M(e=>this.isValid(e)),Ln(e=>[e.key,e.value])),{summary:p,...m}=this.parseBaseProps(d),h=removeIndent(parseMarkdownAsString(d.notation)),g=o.filter(isMultipleProperty);g.length>1&&this.logError(`Duplicate 'multiple' property for relationship "${s}", using the first one`,r,`specification`);let _=g[0];t.relationships[s]=Vr({...m,notation:h,tags:c??void 0,...u&&R.isNonEmptyArray(u)&&{links:u},...toRelationshipStyle(o.filter(isRelationshipStyleProperty),this.isValid),..._&&{multiple:_.value}})}catch(e){this.logError(e,r,`specification`)}}let s=e.flatMap(e=>e.tags.filter(this.isValid));for(let e of s)try{let r=e.tag.name,o=this.getAstNodePath(e.tag),s=toColor(e)??(e.color&&this.parseColorLiteral(e.color));if(r in t.tags){this.logError(`Tag ${r} is already defined, skipping duplicate`,e,`specification`);continue}L(r)&&(t.tags[r]={astPath:o,...s?{color:s}:{}})}catch(t){this.logError(t,e,`specification`)}let c=e.flatMap(e=>e.colors.filter(r));for(let{name:e,color:r}of c)try{let o=e.name;if(o in t.colors){this.logError(`Custom color "${o}" is already defined`,e,`specification`);continue}t.colors[o]={color:vi(this.parseColorLiteral(r),`Color "${o}" is not valid`)}}catch(e){this.logError(e,r,`specification`)}}parseElementSpecificationNode(e){let{kind:t,props:r}=e,o=t.name;if(!L(o))throw Error(`DeploymentNodeKind name is not resolved`);let s=this.parseTags(e),c=this.parseElementStyle(r.find(isElementStyleProperty)),u=this.parseLinks(e),d=I(r.filter(isSpecificationElementStringProperty)??[],M(e=>this.isValid(e)),Ln(e=>[e.key,e.value])),p=this.parseBaseProps(d),m=removeIndent(parseMarkdownAsString(d.notation));return{[o]:Vr({...p,notation:m,tags:s??void 0,...u&&R.isNonEmptyArray(u)&&{links:u},style:c})}}}}function ViewsParser(e){return class ViewsParser extends e{parseViews(){let e=this.isValid;for(let t of this.doc.parseResult.value.views){let r=t.styles.flatMap(t=>{try{return e(t)?this.parseViewRuleStyleOrGlobalRef(t):[]}catch(e){return this.logError(e,t,`views`),[]}}),o=t.folder&&!j(t.folder.trim())?toSingleLine(t.folder):null;for(let s of t.views)try{if(!e(s))continue;switch(!0){case isElementView$1(s):this.doc.c4Views.push(this.parseElementView(s,r));break;case isDynamicView$1(s):this.doc.c4Views.push(this.parseDynamicElementView(s,r));break;case isDeploymentView$1(s):this.doc.c4Views.push(this.parseDeploymentView(s));break;default:H(s)}if(o){let e=this.doc.c4Views.at(-1);e.title=o+` / `+(e.title||e.id)}}catch(e){this.logError(e,s,`views`)}}}parseElementView(e,t){let r=e.body;V(r,`ElementView body is not defined`);let o=r.props.filter(this.isValid),s=this.getAstNodePath(e),c=null,u=e.viewOf;if(u){let t=safeCall(()=>this.parseModelElementRef(u,`Invalid reference to viewOf`));if(t)c=t;else{let t=e.name??`unnamed`,r=u.$cstNode?.text??`<unknown>`;this.logError(`viewOf ${t} not resolved ${r}`,u)}}let d=e.name;d||=`view_`+stringHash$1(this.doc.uri.toString(),s,c??``);let p=I(o,M(isViewStringProperty),Ln(e=>[e.key,e.value])),{title:m=null,description:h=null}=this.parseBaseProps(p,{title:parseTitleKeepingEscapedSlash(p.title)}),g=this.convertTags(r),_=this.convertLinks(r),v=parseViewOrder(o.find(isViewOrderProperty)),y={[R._type]:`element`,id:d,astPath:s,title:toSingleLine(m)??null,description:h,...v!==void 0&&{order:v},tags:g,links:Zr(_)?_:null,rules:[...t,...this.tryMap(`views`,r.rules,e=>this.parseElementViewRule(e))],...c&&{viewOf:c}};if(ff.writeId(e,y.id),`extends`in e){let t=e.extends.view.ref;return V(t?.name,`view extends is not resolved: `+e.$cstNode?.text),Object.assign(y,{extends:t.name})}return y}parseElementViewRule(e){if(isViewRulePredicate(e))return this.parseViewRulePredicate(e);if(isViewRuleGlobalPredicateRef(e))return this.parseViewRuleGlobalPredicateRef(e);if(isViewRuleStyleOrGlobalRef(e))return this.parseViewRuleStyleOrGlobalRef(e);if(isViewRuleAutoLayout(e))return toAutoLayout(e);if(isViewRuleGroup(e))return this.parseViewRuleGroup(e);if(isViewRuleRank(e))return this.parseViewRuleRank(e);H(e)}parseViewRulePredicate(e){let t=[],r=e.exprs;for(;r;){let{value:e,prev:o}=r;if(this.tryParse(`views`,e,()=>{let r=this.parsePredicate(e);t.unshift(r)}),!o)break;r=o}return e.isInclude?{include:t}:{exclude:t}}parseViewRuleGlobalPredicateRef(e){return{predicateId:e.predicate.$refText}}parseViewRuleStyleOrGlobalRef(e){if(isViewRuleStyle(e))return this.parseViewRuleStyle(e);if(isViewRuleGlobalStyle(e))return this.parseViewRuleGlobalStyle(e);H(e)}parseViewRuleGroup(e){let t=[];for(let r of e.groupRules)try{if(!this.isValid(r))continue;if(isViewRulePredicate(r)){t.push(this.parseViewRulePredicate(r));continue}if(isViewRuleGlobalPredicateRef(r)){t.push(this.parseViewRuleGlobalPredicateRef(r));continue}if(isViewRuleGroup(r)){t.push(this.parseViewRuleGroup(r));continue}H(r)}catch(e){this.logError(e,r,`views`)}return{title:toSingleLine(e.title)??null,groupRules:t,...this.parseStyleProps(e.props)}}parseViewRuleRank(e){let t=this.parseFqnExpressions(e.targets).filter(e=>R.ModelExpression.isFqnExpr(e));return{rank:e.value??`same`,targets:t}}parseViewRuleStyle(e){let t=this.parseFqnExpressions(e.targets).filter(e=>R.ModelExpression.isFqnExpr(e)),r=this.parseStyleProps(e.props.filter(isStyleProperty)),o=removeIndent(parseMarkdownAsString(e.props.find(isNotationProperty)?.value));return{targets:t,style:r,...o&&{notation:o}}}parseViewRuleGlobalStyle(e){return{styleId:e.style.$refText}}parseDynamicElementView(e,t){let r=e.body;V(r,`DynamicElementView body is not defined`);let o=this.isValid,s=r.props.filter(o),c=this.getAstNodePath(e),u=e.name;u||=`dynamic_`+stringHash$1(this.doc.uri.toString(),c);let d=I(s,M(isViewStringProperty),Ln(e=>[e.key,e.value])),{title:p=null,description:m=null}=this.parseBaseProps(d,{title:parseTitleKeepingEscapedSlash(d.title)}),h=this.convertTags(r),g=this.convertLinks(r),_=parseViewOrder(s.find(isViewOrderProperty));ff.writeId(e,u);let v=un(s,isDynamicViewDisplayVariantProperty)?.value;return{[R._type]:`dynamic`,id:u,astPath:c,title:toSingleLine(p)??null,description:m,..._!==void 0&&{order:_},tags:h,links:Zr(g)?g:null,variant:v,rules:[...t,...this.tryMap(`views`,r.rules,e=>this.parseDynamicViewRule(e))],steps:this.parseSteps(r.steps)}}parseDynamicViewRule(e){if(isDynamicViewIncludePredicate(e))return this.parseDynamicViewIncludePredicate(e);if(isDynamicViewGlobalPredicateRef(e))return this.parseViewRuleGlobalPredicateRef(e);if(isViewRuleStyleOrGlobalRef(e))return this.parseViewRuleStyleOrGlobalRef(e);if(isViewRuleAutoLayout(e))return toAutoLayout(e);H(e)}parseDynamicViewIncludePredicate(e){let t=[],r=e.exprs;for(;r;)this.tryParse(`views`,r.value,e=>{if(isFqnExprOrWith(e)){let r=this.parseElementPredicate(e);t.unshift(r)}}),r=r.prev;return{include:t}}parseSteps(e){return this.tryMap(`views`,e,e=>this.parseStepStatement(e))}parseStepStatement(e){switch(!0){case isSubflowStep(e):return this.parseSubflowStep(e);case isTryStep(e):return this.parseTryStep(e);case isAltSteps(e):return this.parseAltSteps(e);case isStepSeries(e):return this.parseStepSeries(e);case isStep(e):return this.parseStep(e);default:H(e)}}parseStepSeries(e){let t=this.recursiveParseStepSeries(e);return V(Zr(t),`Dynamic step chain must have at least one step`),{[R._type]:`series`,steps:t}}recursiveParseStepSeries(e,t){if(isStep(e.source)){if(!this.isValid(e.source))return[];let r=this.parseStep(e.source);if(r.isBackward)return[];let o={...this.parseAbstractDynamicStep(e),source:r.target};return o.target===r.source?o.isBackward=!0:t&&(t.push([r.source,r.target]),t.push([o.source,o.target])),[r,o]}t??=[];let r=this.recursiveParseStepSeries(e.source,t);if(!Zr(r)||!this.isValid(e))return[];let o=In(r),s={...this.parseAbstractDynamicStep(e),source:o.target},c=t.findIndex(([e,t])=>e===s.target&&t===s.source);return c===-1?t.push([s.source,s.target]):(s.isBackward=!0,t.splice(c,t.length-c)),[...r,s]}parseStep(e){let t={...this.parseAbstractDynamicStep(e),source:this.parseDynamicStepEndpoint(e.source,`source`)};return e.isBackward&&(t={...t,source:t.target,target:t.source,isBackward:!0}),t}parseAbstractDynamicStep(e){let t=pathInsideDynamicView(e),r={target:this.parseDynamicStepEndpoint(e.target,`target`),astPath:t},o=removeIndent(e.title);o&&(r.title=o);let s=e.kind?.ref?.name??e.dotKind?.kind.ref?.name;s&&(r.kind=s);for(let t of e.custom?.props??[])try{switch(!0){case isRelationNavigateToProperty(t):{let e=t.value.view.ref?.name;L(e)&&(r.navigateTo=e);break}case isRelationStringProperty(t):case isNotationProperty(t):if(qt(t.value)){if(t.key===`description`){let e=removeIndent(t.value);e&&(r.description=e)}else r[t.key]=removeIndent(parseMarkdownAsString(t.value))??``}break;case isNotesProperty(t):qt(t.value)&&(r[t.key]=removeIndent(t.value));break;case isArrowProperty(t):qt(t.value)&&(r[t.key]=t.value);break;case isColorProperty(t):{let e=toColor(t);qt(e)&&(r[t.key]=e);break}case isLineProperty(t):qt(t.value)&&(r[t.key]=t.value);break;case isMultipleProperty(t):break;default:H(t)}}catch(e){this.logError(e,t,`views`)}return r}parseModelElementRef(e,t){let r=this.parseFqnRef(e.modelElement);if(!R.FqnRef.isModelRef(r))throw Error(t);return R.FqnRef.flatten(r)}parseDynamicStepEndpoint(e,t){return this.parseModelElementRef(e,`Invalid reference to ${t}`)}parseSubflowStep(e){let t=e.kind===`parallel`?`par`:e.kind;switch(t){case`break`:case`loop`:case`opt`:case`par`:{let r=this.parseSteps(e.steps);return V(Zr(r),`Parallel steps must have at least one step`),R.exact({[R._type]:t,title:e.title,steps:r})}case`else`:case`if`:case`when`:throw Error(`Unsupported kind: ${t}`);default:H(t)}}parseTryStep(e){if(V(this.isValid(e)),isFinallyBlock(e)){let t=this.parseTryStep(e.tryCatch),r=this.parseSteps(e.finally.steps);return Zr(r)?{...t,finally:R.exact({title:e.title,steps:r})}:t}if(isCatchBlock(e)){let t=this.parseTryStep(e.try),r=this.parseSteps(e.catch.steps);return Zr(r)?{...t,catch:R.exact({title:e.title,steps:r})}:t}let t=this.parseSteps(e.steps);return V(Zr(t),`Try steps must have at least one step`),{[R._type]:`try`,try:R.exact({title:e.title,steps:t})}}parseAltSteps(e){let t=this.tryMap(`views`,e.branches,e=>{let t=e.kind;V(t===`if`||t===`else`||t===`when`,`Expected "if", "else", or "when", got "${t}"`);let r=this.parseSteps(e.steps);return V(Zr(r),`Branch steps must have at least one step`),R.exact({[R._type]:t,title:e.title,steps:r})});return V(Zr(t),`Alt must have at least one branch`),R.exact({[R._type]:`alt`,title:e.title,branches:t})}}}function pathInsideDynamicView(e){let t=e,r=[];for(;!isDynamicViewBody(t);)nn(t.$containerIndex)&&r.unshift(`@${t.$containerIndex}`),r.unshift(`/${t.$containerProperty??`__invalid__`}`),t=t.$container;return r.join(``)}Qe();const ip=I(BaseParser,ExpressionV2Parser,ImportsParser,ModelParser,DeploymentModelParser,DeploymentViewParser,PredicatesParser,SpecificationParser,ViewsParser,GlobalsParser);var DocumentParser=class extends ip{};const ap=q.getChild(`parser`),isError=e=>e.severity===ye.Error;var LikeC4ModelParser=class extends ADisposable{services;cachedParsers=new ai(e=>this.createParser(e));constructor(e){super(),this.services=e,this.onDispose(ne.create(()=>{this.cachedParsers.clear()}),e.shared.workspace.DocumentBuilder.onDocumentPhase(b.Linked,async e=>{this.cachedParsers.has(e)&&(ap.trace(`project {project}, Linked: clear cached parser {doc}`,{projectId:e.likec4ProjectId,doc:C.basename(e.uri)}),this.cachedParsers.delete(e))}),e.shared.workspace.DocumentBuilder.onBuildPhase(b.Linked,async e=>{for(let t of e)if(isLikeC4UserDocument(t))try{this.parse(t)}catch(e){logWarnError(e)}}),e.shared.workspace.DocumentBuilder.onDocumentPhase(b.Validated,async e=>{e.diagnostics?.some(isError)&&this.cachedParsers.has(e)&&(ap.trace(`project {project}, Validated: clear cached parser {doc} because of errors`,{project:e.likec4ProjectId,doc:C.basename(e.uri)}),this.cachedParsers.delete(e))}))}documents(e){return this.services.shared.workspace.LangiumDocuments.projectDocuments(e).map(e=>this.parse(e))}parse(e){return this.forDocument(e).doc}forDocument(e){return this.cachedParsers.get(e)}createParser(e){U(isLikeC4LangiumDocument(e),`Document ${e.uri.toString()} is not a LikeC4 document`);let t=this.services.shared.workspace.ProjectsManager.getProject(e),r=C.relative(t.folderUri,e.uri);ap.trace(`project {project}, create parser {doc}`,{project:t.id,doc:r}),e.state<b.Linked&&ap.debug(`Document {doc} is not linked, state is {state}`,{doc:r,state:e.state});let o={c4Specification:{tags:{},elements:{},relationships:{},colors:{},deployments:{}},c4Elements:[],c4ExtendElements:[],c4ExtendDeployments:[],c4ExtendRelations:[],c4Relations:[],c4Deployments:[],c4DeploymentRelations:[],c4Globals:{predicates:{},dynamicPredicates:{},styles:{}},c4Views:[],c4Imports:new oi(Set)};e=Object.assign(e,o);let s=new DocumentParser(this.services,e,t);try{s.parseSpecification(),s.parseImports(),s.parseModel(),s.parseDeployment(),s.parseGlobals(),s.parseViews()}catch(e){throw Error(`Error parsing document ${r}`,{cause:e})}return s}},LikeC4ValueConverter=class extends oe{runConverter(e,t,r){return e.name===`MarkdownString`?((t.startsWith(`"""`)&&t.endsWith(`"""`)||t.startsWith(`'''`)&&t.endsWith(`'''`))&&(t=t.slice(2,-2)),Xe.convertString(t)):super.runConverter(e,t,r)}};Qe();const{findNodeForKeyword:op}=$e,asViewStyleRule=(e,t,r=0)=>{let o=r>0?` `.repeat(r):``;return[o+`style ${e} {`,...rn(t).map(([e,t])=>o+` ${e} ${e===`opacity`?t.toString()+`%`:t}`),o+`}`]},isMatchingViewRule=(e,t)=>r=>{if(!isViewRuleStyle(r)&&!isDeploymentViewRuleStyle(r))return!1;let o=r.targets.value;if(!o||L(r.targets.prev)||o.$type!==`FqnRefExpr`||L(o.selector))return!1;let s=o.ref?.value?.ref;return(s?t.resolve(s):null)===e};function changeElementStyle(e,{view:t,viewAst:r,targets:o,style:s}){V(r.body,`View ${t.id} has no body`);let c=r.$cstNode;V(c,`viewCstNode`);let u=In(r.body.rules)?.$cstNode?.range.end??r.body.$cstNode?.range.end;V(u,`insertPos is not defined`);let d=c.range.start.character+2,p=e.likec4.FqnIndex,m=M(r.body.rules,e=>isViewRuleStyle(e)||isDeploymentViewRuleStyle(e)),h=t[Ir]===`element`?t.viewOf??null:null,g=[],_=[];o.forEach(e=>{let t=dn(m,isMatchingViewRule(e,p)),r=h&&Ur(h,e)?e.substring(h.length+1):e;t?g.push({fqn:r,rule:t}):_.push({fqn:r})});let v={start:u,end:u},includeRange=e=>{e.start.line<=v.start.line&&(e.start.line==v.start.line?v.start.character=Math.min(e.start.character,v.start.character):v.start=e.start),e.end.line>=v.end.line&&(e.end.line==v.end.line?v.end.character=Math.max(e.end.character,v.end.character):v.end=e.end)},y=[];if(_.length>0){let e=_.flatMap(({fqn:e})=>asViewStyleRule(e,s,d));y.push(Ge.insert(u,`
97
+ `).join(` `)}}function removeIndent(e){if(e!=null)switch(!0){case on(e):return dedent(e).trim();case isMarkdownOrString(e)&&on(e.markdown):return{md:dedent(e.markdown).trim()};case isMarkdownOrString(e)&&on(e.text):return{txt:dedent(e.text).trim()};case isMarkdownOrString(e):return{txt:``};default:return}}function parseViewOrder(e){if(e&&!/^\s*order\b\s*-/.test(e.$cstNode?.text??``))return Number.isSafeInteger(e.value)&&e.value>=0?e.value:void 0}var BaseParser=class{services;doc;project;isValid;docUri;docPathInProject;constructor(e,t,r){this.services=e,this.doc=t,this.project=r,this.isValid=checksFromDiagnostics(t).isValid,this.docUri=t.uri.toString(),this.docPathInProject=T.relative(r.folderUri,t.uri)}logError(e,t,r){let o=e instanceof Error?e.message:typeof e==`string`?e:String(e);if(Ce(t)){let e=this.services.references.NameProvider.getName(t);e=e?`"${e}" (${t.$type})`:`${t.$type}`;let r=t.$cstNode,s=r?`:${r.range.start.line+1}:${r.range.start.character+1}`:``;o+=`\n\tat ${e} (${this.doc.uri.fsPath}${s})`}else t&&`$refText`in t&&(o+=`\n\tat reference "${t.$refText}" (${this.doc.uri.fsPath})`);r&&r!==`base`?ap.getChild(r).debug(o):ap.debug(o)}tryParse(e,t,r){try{return!t||!this.isValid(t)?void 0:r(t)}catch(r){this.logError(r,t,e);return}}tryMap(e,t,r){let o=0;return Zt(t,t=>{try{if(!t||!this.isValid(t))return[];let e=r(t,o);return e===void 0?[]:(o++,e)}catch(r){return this.logError(r,t,e),[]}})}resolveFqn(e){if(isImported(e)){let t=projectIdFrom(e),r=this.resolveFqn(ti(e.imported.ref,`FqnRef is empty of imported: ${e.$cstNode?.text}`));return this.doc.c4Imports.set(t,r),Or(t,r)}return isExtendElement(e)?readStrictFqn(e.element):isExtendDeployment(e)?readStrictFqn(e.deploymentNode):isDeploymentElement(e)?this.services.likec4.DeploymentsIndex.getFqn(e):this.services.likec4.FqnIndex.getFqn(e)}getAstNodePath(e){return this.services.workspace.AstNodeLocator.getAstNodePath(e)}getMetadata(e){if(!e||!this.isValid(e)||N(e.props))return;let extractValues=e=>{if(isMarkdownOrString(e)){let t=removeIndent(e);if(!t)return[];if(typeof t==`string`)return z(t)?[t]:[];{let e=t.md||t.txt;return z(e)?[e]:[]}}return isMetadataArray(e)?e.values.map(e=>removeIndent(e)).map(e=>typeof e==`string`?e:e.md||e.txt).filter(z):[]},t=R(e.props,Zt(e=>e.value?extractValues(e.value).map(t=>[e.key,t]):[[e.key,String(e.boolValue)]]),P(([e,t])=>z(t)));if(N(t))return;let r=R(t,Jt(([e])=>e),Pn(e=>e.map(([e,t])=>t))),o={};for(let[e,t]of Object.entries(r))t&&t.length>0&&(o[e]=t.length===1?t[0]:t);return N(o)?void 0:o}parseMarkdownOrString(e){if(isMarkdownOrString(e))return removeIndent(e)}convertTags(e){return this.parseTags(e)}parseTags(e){let t=e?.tags;if(!t)return null;let r=[];for(;t;)r.push(...this.tryMap(`base`,t.values,e=>ti(e.tag.ref,`Tag reference is not resolved`).name).filter(z)),t=t.prev;return Xr(r)?kn(r):null}convertLinks(e){return this.parseLinks(e)}parseLinks(e){if(!e?.props||e.props.length===0)return;let t=this.tryMap(`base`,P(e.props,isLinkProperty),e=>{let t=e.value;if(en(t))return;let r=z(e.title)?toSingleLine(e.title):void 0,o=this.services.lsp.DocumentLinkProvider.relativeLink(this.doc,t);return Br({url:t,title:r,relative:o&&o!==t?o:void 0})});return Xr(t)?t:void 0}parseIconProperty(e){if(!e||!this.isValid(e))return;let{libicon:t,value:r}=e;switch(!0){case!!t:{let r=t.ref?.name;if(!r){this.logError(`Library icon ${t.$refText} is not a valid library icon`,e);return}return r}case r&&r===`none`:return r;case r&&_t(r):if(r.startsWith(`file:`)){this.logError(`Icon property '${r}' used the 'file' protocol which is not supported`,e);return}return r;case r&&r.startsWith(`@`):return this.parseImageAlias(r);case r&&pt(r):return ut(this.doc.uri.toString(),`../`,r);case r&&ht(r):return gt(this.project.folderUri.toString(),r);default:this.logError(`Icon property '${r}' is not a valid URL, library icon, image alias or 'none'`,e);return}}parseImageAlias(e){let t=e.indexOf(`/`),r=t>0?e.substring(0,t):e,o=t>0?e.substring(t+1):``,s={"@":`./images`,...this.project.config.imageAliases}[r];if(!s){ap.warn(`Image alias "${r}" not found in project configuration`);return}let c=o?gt(s,o):s;return gt(this.project.folderUri.toString(),c)}parseColorLiteral(e){if(this.isValid(e)){if(isHexColor(e))return`#${e.hex}`;if(isRGBAColor(e)){let t=tn(e.alpha)?e.alpha:void 0;return on(e.alpha)&&(t=parseAstPercent(e.alpha)/100),t===void 0?`rgb(${e.red},${e.green},${e.blue})`:`rgba(${e.red},${e.green},${e.blue},${t})`}W(e)}}parseElementStyle(e){if(!e)return{};if(Qt(e)){let t=this.parseStyleProps(e.find(isElementStyleProperty)?.props);try{let r=this.parseIconProperty(e.find(isIconProperty));r&&(t.icon=r)}catch(e){this.logError(e)}return t}return this.parseStyleProps(e.props)}parseStyleProps(e){let t={};if(!e||e.length===0)return t;for(let r of e)if(this.isValid(r))try{switch(!0){case isBorderProperty(r):z(r.value)&&(t.border=r.value);break;case isColorProperty(r):{let e=toColor(r);z(e)&&(t.color=e);break}case isShapeProperty(r):z(r.value)&&(t.shape=r.value);break;case isIconProperty(r):{let e=this.parseIconProperty(r);z(e)&&(t.icon=e);break}case isIconColorProperty(r):{let e=toColor(r);z(e)&&(t.iconColor=e);break}case isIconSizeProperty(r):z(r.value)&&(t.iconSize=parseAstSizeValue(r));break;case isIconPositionProperty(r):z(r.value)&&(t.iconPosition=parseAstIconPositionValue(r));break;case isOpacityProperty(r):t.opacity=parseAstOpacityProperty(r);break;case isMultipleProperty(r):t.multiple=Yt(r.value)?r.value:!1;break;case isShapeSizeProperty(r):z(r.value)&&(t.size=parseAstSizeValue(r));break;case isPaddingSizeProperty(r):z(r.value)&&(t.padding=parseAstSizeValue(r));break;case isTextSizeProperty(r):z(r.value)&&(t.textSize=parseAstSizeValue(r));break;default:W(r)}}catch(e){this.logError(e,r)}return Br(t)}parseBaseProps(e,t){let r=removeIndent(t?.title??parseMarkdownAsString(e.title)),o=t?.description?{txt:removeIndent(t.description)}:this.parseMarkdownOrString(e.description),s=t?.summary?{txt:removeIndent(t.summary)}:this.parseMarkdownOrString(e.summary),c=toSingleLine(t?.technology)??removeIndent(parseMarkdownAsString(e.technology));return Br({title:r,summary:s,description:o,technology:c})}};function*streamDeploymentModel(e){let t=Ar.from(e.parseResult.value.deployments.flatMap(e=>e.elements)),r=[],o;for(;o=t.shift();){if(isDeploymentRelation(o)){r.push(o);continue}if(o.body&&o.body.elements.length>0)for(let e of o.body.elements)t.push(e);yield o}yield*r}function DeploymentModelParser(e){return class DeploymentModelParser extends e{parseDeployment(){let e=this.doc;for(let t of streamDeploymentModel(e))try{switch(!0){case isDeploymentRelation(t):this.isValid(t)&&e.c4DeploymentRelations.push(this.parseDeploymentRelation(t));break;case isDeployedInstance(t):e.c4Deployments.push(this.parseDeployedInstance(t));break;case isDeploymentNode$1(t):e.c4Deployments.push(this.parseDeploymentNode(t));break;case isExtendDeployment(t):{let r=this.parseExtendDeployment(t);r&&e.c4ExtendDeployments.push(r);break}default:W(t)}}catch(e){this.logError(e,t,`deployment`)}}parseDeploymentNode(e){let t=this.isValid,r=this.resolveFqn(e),o=ti(e.kind.ref,`DeploymentKind not resolved`).name,s=this.parseTags(e.body)??void 0,c=this.parseLinks(e.body),u=this.parseElementStyle(e.body?.props),d=this.getMetadata(e.body?.props.find(isMetadataProperty)),p=R(e.body?.props??[],P(t),P(isElementStringProperty),In(e=>[e.key,e.value])),{title:m,...h}=this.parseBaseProps(p,{title:e.title,summary:e.summary});return Br({id:r,kind:o,title:m??ei(r),...h,tags:s,links:c,style:u,metadata:d})}parseDeployedInstance(e){let t=this.isValid,r=this.resolveFqn(e),o=this.parseFqnRef(e.target.modelElement);U(H.isModelRef(o)||H.isImportRef(o),`Target must be a model reference`);let s=this.parseTags(e.body)??void 0,c=this.parseElementStyle(e.body?.props),u=this.getMetadata(e.body?.props.find(isMetadataProperty)),d=R(e.body?.props??[],P(t),P(isElementStringProperty),In(e=>[e.key,e.value])),p=this.parseBaseProps(d,{title:e.title,summary:e.summary}),m=this.parseLinks(e.body);return Br({id:r,element:o,tags:s,links:m,...p,style:c,metadata:u})}parseExtendDeployment(e){let t=this.parseTags(e.body),r=this.getMetadata(e.body?.props.find(isMetadataProperty)),o=this.parseLinks(e.body);if(!t&&N(r??{})&&!o)return null;let s=this.resolveFqn(e),c=this.getAstNodePath(e);return Br({id:s,astPath:c,metadata:r,tags:t,links:o})}_resolveDeploymentRelationSource(e){if(Kt(e.source))return this.parseFqnRef(e.source);if(e.$container.$type===`DeploymentNodeBody`||e.$container.$type===`DeployedInstanceBody`)return{deployment:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseDeploymentRelation(e){let t=this.isValid,r=this.getAstNodePath(e),o=this._resolveDeploymentRelationSource(e);U(H.isDeploymentRef(o),`Invalid source for deployment relation`);let s=this.parseFqnRef(e.target);U(H.isDeploymentRef(s),`Invalid target for deployment relation`);let c=this.convertTags(e)??this.convertTags(e.body)??void 0,u=this.convertLinks(e.body),d=(e.kind??e.dotKind?.kind)?.ref?.name,p=this.getMetadata(e.body?.props.find(isMetadataProperty)),m=R(e.body?.props??[],P(isRelationStringProperty),P(e=>z(e.value)),In(e=>[e.key,e.value])),h=R(e.body?.props??[],P(isRelationNavigateToProperty),Xt())?.value.view.ref?.name,g=this.parseBaseProps(m,{title:e.title}),_=e.body?.props.find(isRelationStyleProperty),v=stringHash$1(`deployment`,this.docUri,r,o.deployment,s.deployment);return Br({id:v,source:o,target:s,isBidirectional:e.isBidirectional||void 0,...g,metadata:p,kind:d,tags:c,links:u,...toRelationshipStyle(_?.props,t),navigateTo:h,astPath:r})}}}function DeploymentViewParser(e){return class DeploymentViewParser extends e{parseDeploymentView(e){let t=e.body;U(t,`DynamicElementView body is not defined`);let r=t.props.filter(this.isValid),o=this.getAstNodePath(e),s=e.name;s||=`deployment_`+stringHash$1(this.doc.uri.toString(),o);let c=R(r,P(isViewStringProperty),In(e=>[e.key,e.value])),{title:u=null,description:d=null}=this.parseBaseProps(c,{title:parseTitleKeepingEscapedSlash(c.title)}),p=this.convertTags(t),m=this.convertLinks(t),h=parseViewOrder(r.find(isViewOrderProperty));return mf.writeId(e,s),{[V._type]:`deployment`,id:s,astPath:o,title:toSingleLine(u)??null,description:d,...h!==void 0&&{order:h},tags:p,links:Xr(m)?m:null,rules:this.tryMap(`deployment`,t.rules,e=>this.parseDeploymentViewRule(e))}}parseDeploymentViewRule(e){if(isDeploymentViewRulePredicate(e))return this.parseDeploymentViewRulePredicate(e);if(isViewRuleAutoLayout(e))return toAutoLayout(e);if(isViewRuleAncestors(e))return{includeAncestors:e.value};if(isDeploymentViewRuleStyle(e))return this.parseDeploymentViewRuleStyle(e);W(e)}parseDeploymentViewRulePredicate(e){let t=[],r=e.expr;for(;r;){try{let e=r.value;I(e)&&this.isValid(e)&&t.unshift(this.parseExpressionV2(e))}catch(e){logWarnError(e)}r=r.prev}return e.isInclude?{include:t}:{exclude:t}}parseDeploymentViewRuleStyle(e){let t=this.parseStyleProps(e.props.filter(isStyleProperty)),r=removeIndent(parseMarkdownAsString(e.props.find(isNotationProperty)?.value));return{targets:this.parseFqnExpressions(e.targets),style:t,...r&&{notation:r}}}}}const parseMetadataEquals=({operator:e,not:t},r)=>e?.startsWith(`!=`)?{neq:r}:e?.startsWith(`=`)?{eq:r}:t?{neq:r}:{eq:r},parseEquals=({operator:e,not:t},r)=>e.startsWith(`!=`)?{neq:r}:e.startsWith(`=`)?{eq:r}:t?{neq:r}:{eq:r};function parseParticipant(e){return!isWhereRelationParticipantKind(e)&&!isWhereRelationParticipantTag(e)&&!isWhereRelationParticipantMetadata(e)?null:e.participant}function parseWhereClause(e){switch(!0){case isWhereTagEqual(e):{let t=e.value.tag.ref?.name,r=parseParticipant(e);U(t,`Expected tag name`);let o={tag:parseEquals(e,t)};return r?{participant:r,operator:o}:o}case isWhereKindEqual(e):{let t=e.value?.ref?.name,r=parseParticipant(e);U(t,`Expected kind name`);let o={kind:parseEquals(e,t)};return r?{participant:r,operator:o}:o}case isWhereMetadataEqual(e):{let t=e.key,r=parseParticipant(e);U(t,`Expected metadata key`);let o={metadata:{key:t,...e.value==null?{}:{value:parseMetadataEquals(e,String(e.value))}}};return r?{participant:r,operator:o}:o}case isWhereElementNegation(e)||isWhereRelationNegation(e):return{not:parseWhereClause(e.value)};case isWhereBinaryExpression(e):{let t=parseWhereClause(e.left),r=parseWhereClause(e.right);return createBinaryOperator(e.operator.toLowerCase(),t,r)}default:W(e)}}function createBinaryOperator(e,t,r){if(r===null)return t;switch(e){case`and`:{let e=[Ur(t)?t.and:t,Ur(r)?r.and:r].flat();return U(Xr(e),`Expected non-empty array`),{and:e}}case`or`:{let e=[Zr(t)?t.or:t,Zr(r)?r.or:r].flat();return U(Xr(e),`Expected non-empty array`),{or:e}}default:W(e)}}function ExpressionV2Parser(e){return class ExpressionV2Parser extends e{parseFqnRef(e){let t=ti(e.value?.ref,()=>`Element "${e.$cstNode?.text}" is not resolved`);if(isImported(t)){let e={project:projectIdFrom(t),model:this.resolveFqn(ti(t.imported.ref,`Imported "${t.$cstNode?.text}" is not resolved`))};return this.doc.c4Imports.set(e.project,e.model),e}if(isElement(t)){let r=importsRef(e);if(r){let e={project:projectIdFrom(r),model:this.resolveFqn(t)};return this.doc.c4Imports.set(e.project,e.model),e}let o=instanceRef(e);return o?{deployment:this.resolveFqn(o),element:this.resolveFqn(t)}:{model:this.resolveFqn(t)}}if(isDeploymentElement(t))return{deployment:this.resolveFqn(t)};W(t)}parseExpressionV2(e){if(isFqnExprOrWith(e))return this.parseFqnExprOrWith(e);if(isRelationExprOrWith(e))return this.parseRelationExprOrWith(e);W(e)}parseFqnExprOrWith(e){if(isFqnExprWith(e))return this.parseFqnExprWith(e);if(isFqnExprOrWhere(e))return this.parseFqnExprOrWhere(e);W(e)}parseFqnExprWith(e){let t=this.parseFqnExprOrWhere(e.subject);return(e.custom?.props??[]).reduce((e,t)=>{if(!this.isValid(t))return e;if(isNavigateToProperty(t)){let r=t.value.view.$refText;return z(r)&&(e.custom.navigateTo=r),e}if(isNotesProperty(t)){let r=this.parseMarkdownOrString(t.value);return r&&(e.custom[t.key]=r),e}if(isElementStringProperty(t)){if(t.key===`description`||t.key===`summary`){let r=this.parseMarkdownOrString(t.value);return r&&(e.custom.description=r),e}let r=removeIndent(parseMarkdownAsString(t.value));return Kt(r)&&(e.custom[t.key]=r),e}if(isIconProperty(t)){let r=this.parseIconProperty(t);return Kt(r)&&(e.custom[t.key]=r),e}if(isColorProperty(t)){let r=toColor(t);return Kt(r)&&(e.custom[t.key]=r),e}if(isShapeProperty(t)||isBorderProperty(t))return Kt(t.value)&&(e.custom[t.key]=t.value),e;if(isOpacityProperty(t))return Kt(t.value)&&(e.custom[t.key]=parseAstOpacityProperty(t)),e;if(isIconColorProperty(t)){let r=toColor(t);return Kt(r)&&(e.custom[t.key]=r),e}if(isNotationProperty(t)){let r=z(t.value)?removeIndent(parseMarkdownAsString(t.value)):void 0;return r&&(e.custom[t.key]=r),e}if(isMultipleProperty(t))return Yt(t.value)&&(e.custom[t.key]=t.value),e;if(isShapeSizeProperty(t)||isTextSizeProperty(t)||isPaddingSizeProperty(t)||isIconSizeProperty(t))return z(t.value)&&(e.custom[t.key]=parseAstSizeValue(t)),e;if(isIconPositionProperty(t))return z(t.value)&&(e.custom[t.key]=t.value),e;W(t)},{custom:{expr:t}})}parseFqnExprOrWhere(e){if(isFqnExprWhere(e))return this.parseFqnExprWhere(e);if(isFqnExpr(e))return this.parseFqnExpr(e);W(e)}parseFqnExprWhere(e){return U(!isFqnExprWhere(e.subject),`FqnExprWhere is not allowed as subject of FqnExprWhere`),{where:{expr:this.parseFqnExpr(e.subject),condition:e.where?parseWhereClause(e.where):{kind:{neq:`--always-true--`}}}}}parseFqnExpr(e){if(isWildcardExpression(e))return{wildcard:!0};if(isElementKindExpression(e))return U(e.kind?.ref,`ElementKind "${e.$cstNode?.text}" is not resolved`),{elementKind:e.kind.ref.name,isEqual:e.isEqual};if(isElementTagExpression(e))return U(e.tag.tag.ref,`Tag ${e.$cstNode?.text} is not resolved`),{elementTag:e.tag.tag.ref.name,isEqual:e.isEqual};if(isFqnRefExpr(e))return this.parseFqnRefExpr(e);W(e)}parseFqnRefExpr(e){let t=this.parseFqnRef(e.ref);switch(!0){case e.selector===`._`:return{ref:t,selector:`expanded`};case e.selector===`.**`:return{ref:t,selector:`descendants`};case e.selector===`.*`:return{ref:t,selector:`children`};default:return{ref:t}}}parseFqnExpressions(e){let t=[],r=e;for(;r;){try{I(r.value)&&this.isValid(r.value)&&t.push(this.parseFqnExpr(r.value))}catch(e){this.logError(e,r.value,`fqnref`)}r=r.prev}return t.reverse()}parseRelationExprOrWith(e){if(isRelationExprWith(e))return this.parseRelationExprWith(e);if(isRelationExprOrWhere(e))return this.parseRelationExprOrWhere(e);W(e)}parseRelationExprWith(e){let t=this.parseRelationExprOrWhere(e.subject);return{customRelation:{...this.parseCustomRelationProperties(e.custom),expr:t}}}parseCustomRelationProperties(e){return(e?.props??[]).reduce((e,t)=>{if(isNotesProperty(t)){let r=this.parseMarkdownOrString(t.value);return r&&(e[t.key]=r),e}if(isRelationStringProperty(t)||isNotationProperty(t)){if(t.key===`description`){let r=this.parseMarkdownOrString(t.value);return r&&(e.description=r),e}let r=removeIndent(parseMarkdownAsString(t.value));return Kt(r)&&(e[t.key]=r),e}if(isArrowProperty(t))return z(t.value)&&(e[t.key]=t.value),e;if(isColorProperty(t)){let r=toColor(t);return z(r)&&(e[t.key]=r),e}if(isLineProperty(t))return z(t.value)&&(e[t.key]=t.value),e;if(isRelationNavigateToProperty(t)){let r=t.value.view.ref?.name;return z(r)&&(e[t.key]=r),e}if(isMultipleProperty(t))return Yt(t.value)&&(e[t.key]=t.value),e;W(t)},{})}parseRelationExprOrWhere(e){if(isRelationExprWhere(e))return this.parseRelationExprWhere(e);if(isRelationExpr(e))return this.parseRelationExpr(e);W(e)}parseRelationExprWhere(e){U(!isRelationExprWhere(e.subject),`RelationExprWhere is not allowed as subject of RelationExprWhere`);let t=this.parseRelationExpr(e.subject),r=t.where?.expr??t,o=t.where?.condition,s=e.where?parseWhereClause(e.where):null,c;return c=s&&o?createBinaryOperator(`and`,o,s):s??o??{kind:{neq:`--always-true--`}},{where:{expr:r,condition:c}}}parseRelationExpr(e){switch(e.$type){case`DirectedRelationExpr`:return this.wrapInWhere({source:this.parseFqnExpr(e.source.from),target:this.parseFqnExpr(e.target),isBidirectional:e.source.isBidirectional},this.parseInlineKindCondition(e.source));case`InOutRelationExpr`:return{inout:this.parseFqnExpr(e.inout.to)};case`OutgoingRelationExpr`:return this.wrapInWhere({outgoing:this.parseFqnExpr(e.from)},this.parseInlineKindCondition(e));case`IncomingRelationExpr`:return{incoming:this.parseFqnExpr(e.to)};default:W(e)}}parseInlineKindCondition(e){let t=e.kind??e.dotKind?.kind;return t?t.ref?{kind:{eq:t.ref?.name}}:(this.logError(`RelationshipKind "${t.$refText}" is not resolved`,e,`fqnref`),null):null}wrapInWhere(e,t){return t?{where:{expr:e,condition:t}}:e}}}function GlobalsParser(e){return class GlobalsParser extends e{parseGlobals(){let{parseResult:e,c4Globals:t}=this.doc,r=this.isValid,o=e.value.globals.filter(r),s=o.flatMap(e=>e.predicates.filter(r));for(let e of s)try{let r=e.name;if(!z(r))continue;if(r in t.predicates){this.logError(`Global predicate named "${r}" is already defined`,e,`globals`);continue}this.parseAndStoreGlobalPredicateGroupOrDynamic(e,r,t)}catch(t){this.logError(t,e,`globals`)}let c=o.flatMap(e=>e.styles.filter(r));for(let e of c)try{let r=e.id.name;if(!z(r))continue;if(r in t.styles){this.logError(`Global style named "${r}" is already defined`,e,`globals`);continue}let o=this.parseGlobalStyleOrGroup(e);M(o,1)&&(t.styles[r]=o)}catch(t){this.logError(t,e,`globals`)}}parseAndStoreGlobalPredicateGroupOrDynamic(e,t,r){if(isGlobalPredicateGroup(e)){let o=this.parseGlobalPredicateGroup(e);M(o,1)&&(r.predicates[t]=o);return}if(isGlobalDynamicPredicateGroup(e)){let o=this.parseGlobalDynamicPredicateGroup(e);M(o,1)&&(r.dynamicPredicates[t]=o);return}W(e)}parseGlobalPredicateGroup(e){return e.predicates.map(e=>this.parseViewRulePredicate(e))}parseGlobalDynamicPredicateGroup(e){return e.predicates.map(e=>this.parseDynamicViewIncludePredicate(e))}parseGlobalStyleOrGroup(e){if(isGlobalStyle(e))return[this.parseViewRuleStyle(e)];if(isGlobalStyleGroup(e))return e.styles.map(e=>this.parseViewRuleStyle(e));W(e)}}}function ImportsParser(e){return class ImportsParser extends e{parseImports(){let e=this.doc.parseResult.value.imports??[];for(let t of e){let e=t.project,r=t.imports;for(;r;){try{this.doc.c4Imports.set(e,this.resolveFqn(ti(r.imported.ref,`ElementRef is empty of imported: ${r.imported.$refText}`)))}catch(e){this.logError(e,r,`imports`)}r=r.prev}}}}}function*streamModel(e){let t=Ar.from(e.parseResult.value.models.flatMap(e=>e.elements)),r=[],o;for(;o=t.shift();){if(isRelation(o)){r.push(o);continue}if(isExtendRelation(o)){r.push(o);continue}if(o.body?.elements&&M(o.body.elements,1))for(let e of o.body.elements)t.push(e);yield o}yield*r}function ModelParser(e){return class ModelParser extends e{parseModel(){let e=this.doc;for(let t of streamModel(e))try{if(isElement(t)){e.c4Elements.push(this.parseElement(t));continue}if(isRelation(t)){e.c4Relations.push(this.parseRelation(t));continue}if(isExtendElement(t)){let r=this.parseExtendElement(t);r&&e.c4ExtendElements.push(r);continue}if(isExtendRelation(t)){let r=this.parseExtendRelation(t);r&&e.c4ExtendRelations.push(r);continue}W(t)}catch(e){this.logError(e,t,`model`)}}parseElement(e){let t=this.isValid,r=this.resolveFqn(e),o=ti(e.kind.ref,`Element kind is not resolved`).name,s=this.parseTags(e.body),c=this.parseElementStyle(e.body?.props),u=this.getMetadata(e.body?.props.find(isMetadataProperty)),d=this.getAstNodePath(e),[p,m,h]=e.props??[],g=R(e.body?.props??[],P(t),P(isElementStringProperty),In(e=>[e.key,e.value])),{title:_,...v}=this.parseBaseProps(g,{title:Kt(p)?parseInlineTitleKeepingEscapedSlash(e,`props`,0)??p:parseTitleKeepingEscapedSlash(g.title),summary:m,technology:h});return br({id:r,kind:o,astPath:d,title:_,metadata:u,tags:s??void 0,links:this.parseLinks(e.body),...v,style:c})}parseExtendElement(e){let t=this.parseTags(e.body),r=this.getMetadata(e.body?.props.find(isMetadataProperty)),o=this.parseLinks(e.body);if(!t&&en(r)&&!o)return null;let s=this.getAstNodePath(e),c=this.resolveFqn(e);return br({id:c,astPath:s,metadata:r,tags:t,links:o})}parseExtendRelation(e){let t=this.parseFqnRef(e.source),r=this.parseFqnRef(e.target);U(_r.isModelRef(t)||_r.isImportRef(t),`Source must be a model reference`),U(_r.isModelRef(r)||_r.isImportRef(r),`Target must be a model reference`);let o=this.parseTags(e.body),s=this.getMetadata(e.body?.props.find(isMetadataProperty)),c=this.getAstNodePath(e),u=this.parseLinks(e.body);if(!o&&N(s??{})&&!u)return null;let d=(e.kind??e.dotKind?.kind)?.ref?.name,{title:p=``}=this.parseBaseProps({},{title:e.title}),m=relationFingerprint({source:t,target:r,kind:d,title:p,isBidirectional:e.isBidirectional||void 0});return br({id:m,astPath:c,isBidirectional:e.isBidirectional||void 0,metadata:s,tags:o,links:u})}_resolveRelationSource(e){if(Kt(e.source)){let t=this.parseFqnRef(e.source);return U(_r.isModelRef(t)||_r.isImportRef(t),`Relation source must be a model reference`),t}if(isElementBody(e.$container)||isExtendElementBody(e.$container))return{model:this.resolveFqn(e.$container.$container)};throw Error(`RelationRefError: Invalid container for sourceless relation`)}parseRelation(e){let t=this.isValid,r=this._resolveRelationSource(e),o=this.parseFqnRef(e.target);U(_r.isModelRef(o)||_r.isImportRef(o),`Target must be a model reference`);let s=this.parseTags(e)??this.parseTags(e.body)??void 0,c=this.parseLinks(e.body),u=(e.kind??e.dotKind?.kind)?.ref?.name,d=this.getMetadata(e.body?.props.find(isMetadataProperty)),p=this.getAstNodePath(e),m=R(e.body?.props??[],P(isRelationStringProperty),P(e=>z(e.value)),In(e=>[e.key,e.value])),h=R(e.body?.props??[],P(isRelationNavigateToProperty),F(e=>e.value.view.ref?.name),P(z),Xt()),{title:g=``,description:_,technology:v}=this.parseBaseProps(m,{title:e.title,description:e.description,technology:e.technology}),y=e.body?.props.find(isRelationStyleProperty),b=stringHash$1(this.docUri,p,_r.flatten(r),_r.flatten(o));return br({id:b,astPath:p,source:r,target:o,isBidirectional:e.isBidirectional||void 0,title:g,metadata:d,kind:u,tags:s,links:c,navigateTo:h,description:_,technology:v,...toRelationshipStyle(y?.props,t)})}}}function PredicatesParser(e){return class PredicatesParser extends e{parsePredicate(e){return this.parseExpressionV2(e)}parseElementPredicate(e){if(isFqnExprWith(e))return this.parseFqnExprWith(e);if(isFqnExprOrWhere(e))return this.parseFqnExprOrWhere(e);W(e)}parseElementPredicateOrWhere(e){return this.parseFqnExprOrWhere(e)}parseElementExpression(e){return this.parseFqnExpr(e)}parseElementPredicateWhere(e){return this.parseFqnExprWhere(e)}parseElementPredicateWith(e){return this.parseFqnExprWith(e)}parseRelationPredicate(e){return this.parseRelationExprOrWith(e)}parseRelationPredicateOrWhere(e){return this.parseRelationExprOrWhere(e)}parseRelationPredicateWhere(e){return this.parseRelationExprWhere(e)}parseRelationPredicateWith(e){return this.parseRelationExprWith(e)}parseRelationExpression(e){return this.parseRelationExpr(e)}}}function SpecificationParser(e){return class SpecificationParser extends e{parseSpecification(){let{parseResult:{value:{specifications:e}},c4Specification:t}=this.doc,r=this.isValid;for(let o of e.flatMap(e=>e.elements.filter(r)))try{Object.assign(t.elements,this.parseElementSpecificationNode(o))}catch(e){this.logError(e,o,`specification`)}for(let o of e.flatMap(e=>e.deploymentNodes.filter(r)))try{Object.assign(t.deployments,this.parseElementSpecificationNode(o))}catch(e){this.logError(e,o,`specification`)}let o=e.flatMap(e=>e.relationships.filter(this.isValid));for(let e of o){let{kind:r,props:o}=e;try{let s=r.name;if(!z(s))continue;if(s in t.relationships){this.logError(`Relationship kind "${s}" is already defined`,r,`specification`);continue}let c=this.parseTags(e),u=this.parseLinks(e),d=R(o.filter(isSpecificationRelationshipStringProperty)??[],P(e=>this.isValid(e)),In(e=>[e.key,e.value])),{summary:p,...m}=this.parseBaseProps(d),h=removeIndent(parseMarkdownAsString(d.notation)),g=o.filter(isMultipleProperty);g.length>1&&this.logError(`Duplicate 'multiple' property for relationship "${s}", using the first one`,r,`specification`);let _=g[0];t.relationships[s]=Br({...m,notation:h,tags:c??void 0,...u&&V.isNonEmptyArray(u)&&{links:u},...toRelationshipStyle(o.filter(isRelationshipStyleProperty),this.isValid),..._&&{multiple:_.value}})}catch(e){this.logError(e,r,`specification`)}}let s=e.flatMap(e=>e.tags.filter(this.isValid));for(let e of s)try{let r=e.tag.name,o=this.getAstNodePath(e.tag),s=toColor(e)??(e.color&&this.parseColorLiteral(e.color));if(r in t.tags){this.logError(`Tag ${r} is already defined, skipping duplicate`,e,`specification`);continue}z(r)&&(t.tags[r]={astPath:o,...s?{color:s}:{}})}catch(t){this.logError(t,e,`specification`)}let c=e.flatMap(e=>e.colors.filter(r));for(let{name:e,color:r}of c)try{let o=e.name;if(o in t.colors){this.logError(`Custom color "${o}" is already defined`,e,`specification`);continue}t.colors[o]={color:vi(this.parseColorLiteral(r),`Color "${o}" is not valid`)}}catch(e){this.logError(e,r,`specification`)}}parseElementSpecificationNode(e){let{kind:t,props:r}=e,o=t.name;if(!z(o))throw Error(`DeploymentNodeKind name is not resolved`);let s=this.parseTags(e),c=this.parseElementStyle(r.find(isElementStyleProperty)),u=this.parseLinks(e),d=R(r.filter(isSpecificationElementStringProperty)??[],P(e=>this.isValid(e)),In(e=>[e.key,e.value])),p=this.parseBaseProps(d),m=removeIndent(parseMarkdownAsString(d.notation));return{[o]:Br({...p,notation:m,tags:s??void 0,...u&&V.isNonEmptyArray(u)&&{links:u},style:c})}}}}function ViewsParser(e){return class ViewsParser extends e{parseViews(){let e=this.isValid;for(let t of this.doc.parseResult.value.views){let r=t.styles.flatMap(t=>{try{return e(t)?this.parseViewRuleStyleOrGlobalRef(t):[]}catch(e){return this.logError(e,t,`views`),[]}}),o=t.folder&&!N(t.folder.trim())?toSingleLine(t.folder):null;for(let s of t.views)try{if(!e(s))continue;switch(!0){case isElementView$1(s):this.doc.c4Views.push(this.parseElementView(s,r));break;case isDynamicView$1(s):this.doc.c4Views.push(this.parseDynamicElementView(s,r));break;case isDeploymentView$1(s):this.doc.c4Views.push(this.parseDeploymentView(s));break;default:W(s)}if(o){let e=this.doc.c4Views.at(-1);e.title=o+` / `+(e.title||e.id)}}catch(e){this.logError(e,s,`views`)}}}parseElementView(e,t){let r=e.body;U(r,`ElementView body is not defined`);let o=r.props.filter(this.isValid),s=this.getAstNodePath(e),c=null,u=e.viewOf;if(u){let t=safeCall(()=>this.parseModelElementRef(u,`Invalid reference to viewOf`));if(t)c=t;else{let t=e.name??`unnamed`,r=u.$cstNode?.text??`<unknown>`;this.logError(`viewOf ${t} not resolved ${r}`,u)}}let d=e.name;d||=`view_`+stringHash$1(this.doc.uri.toString(),s,c??``);let p=R(o,P(isViewStringProperty),In(e=>[e.key,e.value])),{title:m=null,description:h=null}=this.parseBaseProps(p,{title:parseTitleKeepingEscapedSlash(p.title)}),g=this.convertTags(r),_=this.convertLinks(r),v=parseViewOrder(o.find(isViewOrderProperty)),y={[V._type]:`element`,id:d,astPath:s,title:toSingleLine(m)??null,description:h,...v!==void 0&&{order:v},tags:g,links:Xr(_)?_:null,rules:[...t,...this.tryMap(`views`,r.rules,e=>this.parseElementViewRule(e))],...c&&{viewOf:c}};if(mf.writeId(e,y.id),`extends`in e){let t=e.extends.view.ref;return U(t?.name,`view extends is not resolved: `+e.$cstNode?.text),Object.assign(y,{extends:t.name})}return y}parseElementViewRule(e){if(isViewRulePredicate(e))return this.parseViewRulePredicate(e);if(isViewRuleGlobalPredicateRef(e))return this.parseViewRuleGlobalPredicateRef(e);if(isViewRuleStyleOrGlobalRef(e))return this.parseViewRuleStyleOrGlobalRef(e);if(isViewRuleAutoLayout(e))return toAutoLayout(e);if(isViewRuleGroup(e))return this.parseViewRuleGroup(e);if(isViewRuleRank(e))return this.parseViewRuleRank(e);W(e)}parseViewRulePredicate(e){let t=[],r=e.exprs;for(;r;){let{value:e,prev:o}=r;if(this.tryParse(`views`,e,()=>{let r=this.parsePredicate(e);t.unshift(r)}),!o)break;r=o}return e.isInclude?{include:t}:{exclude:t}}parseViewRuleGlobalPredicateRef(e){return{predicateId:e.predicate.$refText}}parseViewRuleStyleOrGlobalRef(e){if(isViewRuleStyle(e))return this.parseViewRuleStyle(e);if(isViewRuleGlobalStyle(e))return this.parseViewRuleGlobalStyle(e);W(e)}parseViewRuleGroup(e){let t=[];for(let r of e.groupRules)try{if(!this.isValid(r))continue;if(isViewRulePredicate(r)){t.push(this.parseViewRulePredicate(r));continue}if(isViewRuleGlobalPredicateRef(r)){t.push(this.parseViewRuleGlobalPredicateRef(r));continue}if(isViewRuleGroup(r)){t.push(this.parseViewRuleGroup(r));continue}W(r)}catch(e){this.logError(e,r,`views`)}return{title:toSingleLine(e.title)??null,groupRules:t,...this.parseStyleProps(e.props)}}parseViewRuleRank(e){let t=this.parseFqnExpressions(e.targets).filter(e=>V.ModelExpression.isFqnExpr(e));return{rank:e.value??`same`,targets:t}}parseViewRuleStyle(e){let t=this.parseFqnExpressions(e.targets).filter(e=>V.ModelExpression.isFqnExpr(e)),r=this.parseStyleProps(e.props.filter(isStyleProperty)),o=removeIndent(parseMarkdownAsString(e.props.find(isNotationProperty)?.value));return{targets:t,style:r,...o&&{notation:o}}}parseViewRuleGlobalStyle(e){return{styleId:e.style.$refText}}parseDynamicElementView(e,t){let r=e.body;U(r,`DynamicElementView body is not defined`);let o=this.isValid,s=r.props.filter(o),c=this.getAstNodePath(e),u=e.name;u||=`dynamic_`+stringHash$1(this.doc.uri.toString(),c);let d=R(s,P(isViewStringProperty),In(e=>[e.key,e.value])),{title:p=null,description:m=null}=this.parseBaseProps(d,{title:parseTitleKeepingEscapedSlash(d.title)}),h=this.convertTags(r),g=this.convertLinks(r),_=parseViewOrder(s.find(isViewOrderProperty));mf.writeId(e,u);let v=ln(s,isDynamicViewDisplayVariantProperty)?.value;return{[V._type]:`dynamic`,id:u,astPath:c,title:toSingleLine(p)??null,description:m,..._!==void 0&&{order:_},tags:h,links:Xr(g)?g:null,variant:v,rules:[...t,...this.tryMap(`views`,r.rules,e=>this.parseDynamicViewRule(e))],steps:this.parseSteps(r.steps)}}parseDynamicViewRule(e){if(isDynamicViewIncludePredicate(e))return this.parseDynamicViewIncludePredicate(e);if(isDynamicViewGlobalPredicateRef(e))return this.parseViewRuleGlobalPredicateRef(e);if(isViewRuleStyleOrGlobalRef(e))return this.parseViewRuleStyleOrGlobalRef(e);if(isViewRuleAutoLayout(e))return toAutoLayout(e);W(e)}parseDynamicViewIncludePredicate(e){let t=[],r=e.exprs;for(;r;)this.tryParse(`views`,r.value,e=>{if(isFqnExprOrWith(e)){let r=this.parseElementPredicate(e);t.unshift(r)}}),r=r.prev;return{include:t}}parseSteps(e){return this.tryMap(`views`,e,e=>this.parseStepStatement(e))}parseStepStatement(e){switch(!0){case isSubflowStep(e):return this.parseSubflowStep(e);case isTryStep(e):return this.parseTryStep(e);case isAltSteps(e):return this.parseAltSteps(e);case isStepSeries(e):return this.parseStepSeries(e);case isStep(e):return this.parseStep(e);default:W(e)}}parseStepSeries(e){let t=this.recursiveParseStepSeries(e);return U(Xr(t),`Dynamic step chain must have at least one step`),{[V._type]:`series`,steps:t}}recursiveParseStepSeries(e,t){if(isStep(e.source)){if(!this.isValid(e.source))return[];let r=this.parseStep(e.source);if(r.isBackward)return[];let o={...this.parseAbstractDynamicStep(e),source:r.target};return o.target===r.source?o.isBackward=!0:t&&(t.push([r.source,r.target]),t.push([o.source,o.target])),[r,o]}t??=[];let r=this.recursiveParseStepSeries(e.source,t);if(!Xr(r)||!this.isValid(e))return[];let o=Fn(r),s={...this.parseAbstractDynamicStep(e),source:o.target},c=t.findIndex(([e,t])=>e===s.target&&t===s.source);return c===-1?t.push([s.source,s.target]):(s.isBackward=!0,t.splice(c,t.length-c)),[...r,s]}parseStep(e){let t={...this.parseAbstractDynamicStep(e),source:this.parseDynamicStepEndpoint(e.source,`source`)};return e.isBackward&&(t={...t,source:t.target,target:t.source,isBackward:!0}),t}parseAbstractDynamicStep(e){let t=pathInsideDynamicView(e),r={target:this.parseDynamicStepEndpoint(e.target,`target`),astPath:t},o=removeIndent(e.title);o&&(r.title=o);let s=e.kind?.ref?.name??e.dotKind?.kind.ref?.name;s&&(r.kind=s);for(let t of e.custom?.props??[])try{switch(!0){case isRelationNavigateToProperty(t):{let e=t.value.view.ref?.name;z(e)&&(r.navigateTo=e);break}case isRelationStringProperty(t):case isNotationProperty(t):if(Kt(t.value)){if(t.key===`description`){let e=removeIndent(t.value);e&&(r.description=e)}else r[t.key]=removeIndent(parseMarkdownAsString(t.value))??``}break;case isNotesProperty(t):Kt(t.value)&&(r[t.key]=removeIndent(t.value));break;case isArrowProperty(t):Kt(t.value)&&(r[t.key]=t.value);break;case isColorProperty(t):{let e=toColor(t);Kt(e)&&(r[t.key]=e);break}case isLineProperty(t):Kt(t.value)&&(r[t.key]=t.value);break;case isMultipleProperty(t):break;default:W(t)}}catch(e){this.logError(e,t,`views`)}return r}parseModelElementRef(e,t){let r=this.parseFqnRef(e.modelElement);if(!V.FqnRef.isModelRef(r))throw Error(t);return V.FqnRef.flatten(r)}parseDynamicStepEndpoint(e,t){return this.parseModelElementRef(e,`Invalid reference to ${t}`)}parseSubflowStep(e){let t=e.kind===`parallel`?`par`:e.kind;switch(t){case`break`:case`loop`:case`opt`:case`par`:{let r=this.parseSteps(e.steps);return U(Xr(r),`Parallel steps must have at least one step`),V.exact({[V._type]:t,title:e.title,steps:r})}case`else`:case`if`:case`when`:throw Error(`Unsupported kind: ${t}`);default:W(t)}}parseTryStep(e){if(U(this.isValid(e)),isFinallyBlock(e)){let t=this.parseTryStep(e.tryCatch),r=this.parseSteps(e.finally.steps);return Xr(r)?{...t,finally:V.exact({title:e.title,steps:r})}:t}if(isCatchBlock(e)){let t=this.parseTryStep(e.try),r=this.parseSteps(e.catch.steps);return Xr(r)?{...t,catch:V.exact({title:e.title,steps:r})}:t}let t=this.parseSteps(e.steps);return U(Xr(t),`Try steps must have at least one step`),{[V._type]:`try`,try:V.exact({title:e.title,steps:t})}}parseAltSteps(e){let t=this.tryMap(`views`,e.branches,e=>{let t=e.kind;U(t===`if`||t===`else`||t===`when`,`Expected "if", "else", or "when", got "${t}"`);let r=this.parseSteps(e.steps);return U(Xr(r),`Branch steps must have at least one step`),V.exact({[V._type]:t,title:e.title,steps:r})});return U(Xr(t),`Alt must have at least one branch`),V.exact({[V._type]:`alt`,title:e.title,branches:t})}}}function pathInsideDynamicView(e){let t=e,r=[];for(;!isDynamicViewBody(t);)tn(t.$containerIndex)&&r.unshift(`@${t.$containerIndex}`),r.unshift(`/${t.$containerProperty??`__invalid__`}`),t=t.$container;return r.join(``)}Ze();const sp=R(BaseParser,ExpressionV2Parser,ImportsParser,ModelParser,DeploymentModelParser,DeploymentViewParser,PredicatesParser,SpecificationParser,ViewsParser,GlobalsParser);var DocumentParser=class extends sp{};const cp=Y.getChild(`parser`),isError=e=>e.severity===ve.Error;var LikeC4ModelParser=class extends ADisposable{services;cachedParsers=new ai(e=>this.createParser(e));constructor(e){super(),this.services=e,this.onDispose(S.create(()=>{this.cachedParsers.clear()}),e.shared.workspace.DocumentBuilder.onDocumentPhase(x.Linked,async e=>{this.cachedParsers.has(e)&&(cp.trace(`project {project}, Linked: clear cached parser {doc}`,{projectId:e.likec4ProjectId,doc:T.basename(e.uri)}),this.cachedParsers.delete(e))}),e.shared.workspace.DocumentBuilder.onBuildPhase(x.Linked,async e=>{for(let t of e)if(isLikeC4UserDocument(t))try{this.parse(t)}catch(e){logWarnError(e)}}),e.shared.workspace.DocumentBuilder.onDocumentPhase(x.Validated,async e=>{e.diagnostics?.some(isError)&&this.cachedParsers.has(e)&&(cp.trace(`project {project}, Validated: clear cached parser {doc} because of errors`,{project:e.likec4ProjectId,doc:T.basename(e.uri)}),this.cachedParsers.delete(e))}))}documents(e){return this.services.shared.workspace.LangiumDocuments.projectDocuments(e).map(e=>this.parse(e))}parse(e){return this.forDocument(e).doc}forDocument(e){return this.cachedParsers.get(e)}createParser(e){G(isLikeC4LangiumDocument(e),`Document ${e.uri.toString()} is not a LikeC4 document`);let t=this.services.shared.workspace.ProjectsManager.getProject(e),r=T.relative(t.folderUri,e.uri);cp.trace(`project {project}, create parser {doc}`,{project:t.id,doc:r}),e.state<x.Linked&&cp.debug(`Document {doc} is not linked, state is {state}`,{doc:r,state:e.state});let o={c4Specification:{tags:{},elements:{},relationships:{},colors:{},deployments:{}},c4Elements:[],c4ExtendElements:[],c4ExtendDeployments:[],c4ExtendRelations:[],c4Relations:[],c4Deployments:[],c4DeploymentRelations:[],c4Globals:{predicates:{},dynamicPredicates:{},styles:{}},c4Views:[],c4Imports:new oi(Set)};e=Object.assign(e,o);let s=new DocumentParser(this.services,e,t);try{s.parseSpecification(),s.parseImports(),s.parseModel(),s.parseDeployment(),s.parseGlobals(),s.parseViews()}catch(e){throw Error(`Error parsing document ${r}`,{cause:e})}return s}},LikeC4ValueConverter=class extends ae{runConverter(e,t,r){return e.name===`MarkdownString`?((t.startsWith(`"""`)&&t.endsWith(`"""`)||t.startsWith(`'''`)&&t.endsWith(`'''`))&&(t=t.slice(2,-2)),Ye.convertString(t)):super.runConverter(e,t,r)}};Ze();const{findNodeForKeyword:lp}=Qe,asViewStyleRule=(e,t,r=0)=>{let o=r>0?` `.repeat(r):``;return[o+`style ${e} {`,...nn(t).map(([e,t])=>o+` ${e} ${e===`opacity`?t.toString()+`%`:t}`),o+`}`]},isMatchingViewRule=(e,t)=>r=>{if(!isViewRuleStyle(r)&&!isDeploymentViewRuleStyle(r))return!1;let o=r.targets.value;if(!o||z(r.targets.prev)||o.$type!==`FqnRefExpr`||z(o.selector))return!1;let s=o.ref?.value?.ref;return(s?t.resolve(s):null)===e};function changeElementStyle(e,{view:t,viewAst:r,targets:o,style:s}){U(r.body,`View ${t.id} has no body`);let c=ti(r.$cstNode,`cant find view cst node`),u=ti(r.body.$cstNode,`cant find view body cst node`),d=ti(lp(u,`}`),`cant find closing brace`);U(d.container,`Closing brace has no container`);let p=d.container.content,m=Fn(r.body.rules)?.$cstNode??p[p.indexOf(d)-1];U(m,`anchor is not defined`);let h=m.range.end,g=d.range.start.line===h.line?`
98
+ `+` `.repeat(c.range.start.character):``,_=c.range.start.character+2,v=[],y=e.likec4.FqnIndex,b=P(r.body.rules,e=>isViewRuleStyle(e)||isDeploymentViewRuleStyle(e)),x=t[Fr]===`element`?t.viewOf??null:null,ee=[],te=[];o.forEach(e=>{let t=un(b,isMatchingViewRule(e,y)),r=x&&Hr(x,e)?e.substring(x.length+1):e;t?ee.push({fqn:r,rule:t}):te.push({fqn:r})});let S={start:h,end:h},includeRange=e=>{e.start.line<=S.start.line&&(e.start.line==S.start.line?S.start.character=Math.min(e.start.character,S.start.character):S.start=e.start),e.end.line>=S.end.line&&(e.end.line==S.end.line?S.end.character=Math.max(e.end.character,S.end.character):S.end=e.end)};if(te.length>0){let e=te.flatMap(({fqn:e})=>asViewStyleRule(e,s,_));v.push(We.insert(h,`
100
99
  `+e.join(`
101
- `))),v.start={line:u.line+1,character:d},v.end={line:u.line+e.length,character:In(e)?.length??0}}if(g.length>0)for(let{rule:e}of g){let t=e.$cstNode;V(t,`RuleCstNode not found`);for(let[r,o]of rn(s)){let s=r===`opacity`?o.toString()+`%`:o,c=e.props.find(e=>e.key===r);if(c&&c.$cstNode){let{range:{start:e,end:t}}=c.$cstNode;includeRange({start:e,end:t}),y.push(Ge.replace({start:e,end:t},r+` `+s));continue}let u=op(t,`{`)?.range.end;V(u,`Opening brace not found`);let d=` `.repeat(t.range.start.character)+` `,p=d+r+` `+s;y.push(Ge.insert(u,`
102
- `+p)),includeRange({start:{line:u.line+1,character:d.length},end:{line:u.line+1,character:p.length}})}}return{modifiedRange:v,edits:y}}Qe();const{findNodeForKeyword:sp}=$e;function changeViewLayout(e,{view:t,viewAst:r,layout:o}){V(r.body,`View ${t.id} has no body`);let s=r.$cstNode;V(s,`viewCstNode`);let c=toAstViewLayoutDirection(o.direction),u=dn(r.body.rules,isViewRuleAutoLayout),d=`autoLayout ${c}`;if(nn(o.rankSep)&&(d+=` ${o.rankSep}`,nn(o.nodeSep)&&(d+=` ${o.nodeSep}`)),u&&u.$cstNode)return Ge.replace(u.$cstNode.range,d);let p=sp(r.body.$cstNode,`}`)?.range.start;V(p,`Closing brace not found`);let m=`\t${d}\n\t`;return Ge.insert(p,m)}function preparePayload(e,t){let r=t.shared.workspace,{viewId:o,projectId:s,change:c}=e,u=r.ProjectsManager.ensureProject(s),d=t.likec4.ModelLocator.locateViewAst(o,u.id);if(!d)throw Error(`View ${o} not found in project ${u.id}`);return{viewId:o,change:c,services:t,project:u,doc:d.doc,viewAst:d.viewAst,workspace:r}}function viewChangeHandler(e,t){return r=>{if(r.change.op===e)return t(r)}}const cp=viewChangeHandler(`change-property`,({change:e,viewAst:t})=>{let{title:r,description:o}=e,s=[];return r!==void 0&&s.push(updateViewTitle(t,r)),o!==void 0&&s.push(...updateViewDescription(t,o)),e.tag!==void 0&&s.push(...updateViewTags(t,e.tag)),s});function findExistingViewProperty(e,t){let r=e.body?.props;if(!(!r||!A(r,1)))return dn(r,e=>e.key===t&&e.$cstNode!==void 0)}function findInsertPosition(e,t){let r=t(ti(e.body,`View body is required`));if(!r)return jf.Position.create(0,0);let{line:o,character:s}=r;return jf.Position.create(o,s+1)}const doubleIndent=e=>gn(newline(),indent(indent(e)));function updateViewTitle(e,t){let r=findExistingViewProperty(e,`title`),o=withctx({title:t})(titleProperty());return r?jf.TextEdit.replace(r.$cstNode.range,printOperation(o)):jf.TextEdit.insert(findInsertPosition(e,e=>e.tags?.$cstNode?.range.end??e.$cstNode?.range.start),materialize(doubleIndent(o)).trimEnd())}function collectAllTagRefs(e){let t=[],r=e;for(;r;){let e=[];for(let t of r.values)t.$cstNode&&e.push(t);t.push(e),r=r.prev}return t.reverse().flat()}function addTag(e,t,r){let o=t.tags;return o?.$cstNode?jf.TextEdit.insert(o.$cstNode.range.end,`, #${r}`):jf.TextEdit.insert(findInsertPosition(e,e=>e.$cstNode?.range.start),materialize(doubleIndent(print(`#${r}`))).trimEnd())}function removeTag(e,t){let r=collectAllTagRefs(e.tags),o=r.findIndex(e=>e.tag.ref?.name===t);if(o<0)return;if(r.length===1){let t=e.tags;if(t?.$cstNode){let{start:e}=t.$cstNode.range;return jf.TextEdit.del({start:jf.Position.create(e.line,0),end:jf.Position.create(e.line+1,0)})}return}let s=r[o];if(o>0){let e=r[o-1];return jf.TextEdit.del({start:e.$cstNode.range.end,end:s.$cstNode.range.end})}let c=r[o+1];return jf.TextEdit.del({start:s.$cstNode.range.start,end:c.$cstNode.range.start})}function updateViewTags(e,t){let r=[],o=ti(e.body,`View body is required`);if(t.add){let s=Array.isArray(t.add)?t.add:[t.add];for(let t of s)t&&r.push(addTag(e,o,t))}if(t.remove){let e=Array.isArray(t.remove)?t.remove:[t.remove];for(let t of e){let e=t?removeTag(o,t):void 0;e&&r.push(e)}}return r}function updateViewDescription(e,t){let r=findExistingViewProperty(e,`description`),o=withctx({description:t},indent(indent(descriptionProperty())));if(r)return[jf.TextEdit.replace({start:{line:r.$cstNode.range.start.line,character:0},end:r.$cstNode.range.end},materialize(o).trimEnd())];let s=findInsertPosition(e,e=>I(e.props,N(e=>e.$cstNode?.range.end),M(L),In())??e.tags?.$cstNode?.range.end??e.$cstNode?.range.start);return[jf.TextEdit.insert({line:s.line+1,character:0},materialize(o))]}Qe();const lp=q.getChild(`model-changes`);var LikeC4ModelChanges=class{services;locator;constructor(e){this.services=e,this.locator=e.likec4.ModelLocator}async applyChange(e){let{viewId:t,projectId:r,change:o}=e;if(o.op===`change-property`){let t=preparePayload(e,this.services),r=cp(t);if(!r)return{success:!1,error:`No changes to apply`};let o=Array.isArray(r)?r:[r];return await this.applyTextEdits(t.doc,o)?{success:!0,location:null}:{success:!1,error:`Failed to apply text edits`}}let s=this.services.shared.workspace;try{let e=s.ProjectsManager.ensureProject(r);lp.debug`Applying model change ${o.op} to view ${t} in project ${e.id}`;let c=this.locator.locateViewAst(t,e.id);if(!c&&(o.op===`save-view-snapshot`||o.op===`reset-manual-layout`)&&!(await this.services.likec4.ModelBuilder.computeModel(e.id)).findView(t))throw Error(`View ${t} not found in project ${e.id}`);if(o.op===`save-view-snapshot`)return V(t===o.layout.id,`View ID does not match, expected `+t+`, got `+o.layout.id),{success:!0,location:await s.ManualLayouts.write(e,o.layout)};if(o.op===`reset-manual-layout`)return{success:!0,location:await s.ManualLayouts.remove(e,t)};if(!c)throw Error(`View ${t} not found in project ${e.id}`);let u={uri:c.doc.textDocument.uri,version:c.doc.textDocument.version},{edits:d,modifiedRange:p}=this.convertToTextEdit({lookup:c,change:o});return d.length?await this.applyTextEdits(c.doc,d)?{success:!0,location:{uri:u.uri,range:p}}:{success:!1,error:`Failed to apply changes`}:{success:!1,error:`No changes to apply`}}catch(t){let r=loggable(wrapError(t,`Failed to apply change ${e.change.op} ${e.viewId}`));return lp.warn(r),{success:!1,error:r}}}convertToTextEdit({lookup:e,change:t}){switch(t.op){case`change-element-style`:return changeElementStyle(this.services,{...e,targets:t.targets,style:t.style});case`change-autolayout`:{let r=changeViewLayout(this.services,{...e,layout:t.layout});return{modifiedRange:r.range,edits:[r]}}default:H(t)}}async applyTextEdits(e,t){let r=this.services.shared.lsp.Connection,o=this.services.shared.workspace;if(!r){let r=ge.applyEdits(e.textDocument,t);return await o.FileSystemProvider.writeFile(e.uri,r),await o.DocumentBuilder.update([e.uri],[]),!0}let s=await r.workspace.applyEdit({label:`LikeC4 - change view`,edit:{changes:{[e.textDocument.uri]:t}}});return s.applied?(await o.DocumentBuilder.update([e.uri],[]),s.applied):(lp.warn`Failed to apply text edits to document ${e.textDocument.uri}: ${s.failureReason}`,r.window.showErrorMessage(`Failed to apply changes: ${s.failureReason}`),!1)}},LikeC4NameProvider=class extends se{services;constructor(e){super(),this.services=e}getNameStrict(e){return ti(this.getName(e),`Failed getName for ${this.services.workspace.AstNodeLocator.getAstNodePath(e)}`)}getName(e){if(pe(e))return e.name;if(isImported(e))return e.imported.$refText;if(isDeployedInstance(e))return e.target.modelElement.value.$refText}getNameNode(e){if(pe(e))return super.getNameNode(e);if(isImported(e))return e.imported.$refNode;if(isDeployedInstance(e))return e.target.modelElement.value.$refNode}};function uniqueDescriptions(e){return I(e,Yt(e=>`${e.type}.${e.name}`),rn(),Qt(([e,t])=>t.length===1?t:[]))}var LikeC4ScopeComputation=class extends re{constructor(e){super(e)}async computeExports(e,t){let r=[];try{let{specifications:t,models:o,views:s,globals:c,likec4lib:u,deployments:d}=e.parseResult.value;this.exportLibrary(u,r,e),this.exportSpecification(t,r,e),this.exportModel(o,r,e),this.exportViews(s,r,e),this.exportGlobals(c,r,e),this.exportDeployments(d,r,e)}catch(e){logWarnError(e)}return r}exportViews(e,t,r){let o=e?.flatMap(e=>e.views);if(!(F(o)||o.length===0))for(let e of o)try{L(e.name)&&t.push(this.descriptions.createDescription(e,e.name,r))}catch(e){logWarnError(e)}}exportGlobals(e,t,r){if(!(F(e)||e.length===0)){for(let o of e.flatMap(e=>e.predicates))try{let e=o;L(e.name)&&t.push(this.descriptions.createDescription(e,e.name,r))}catch(e){logWarnError(e)}for(let o of e.flatMap(e=>e.styles))try{let e=o.id;L(e.name)&&t.push(this.descriptions.createDescription(e,e.name,r))}catch(e){logWarnError(e)}}}exportModel(e,t,r){if(!(F(e)||e.length===0))for(let o of e.flatMap(e=>e.elements))try{isElement(o)&&L(o.name)&&t.push(this.descriptions.createDescription(o,o.name,r))}catch(e){logWarnError(e)}}exportLibrary(e,t,r){if(!F(e))try{for(let o of e.flatMap(e=>e.icons))t.push(this.descriptions.createDescription(o,o.name,r))}catch(e){logWarnError(e)}}exportSpecification(e,t,r){if(!(F(e)||e.length===0))for(let o of e.flatMap(e=>[...e.elements,...e.relationships,...e.deploymentNodes,...e.tags,...e.colors]))try{switch(!0){case isSpecificationDeploymentNodeKind(o):case isSpecificationElementKind(o):L(o.kind.name)&&t.push(this.descriptions.createDescription(o.kind,o.kind.name,r));continue;case isSpecificationTag(o):L(o.tag.name)&&t.push(this.descriptions.createDescription(o.tag,o.tag.name,r),this.descriptions.createDescription(o.tag,`#`+o.tag.name,r));continue;case isSpecificationRelationshipKind(o):L(o.kind.name)&&t.push(this.descriptions.createDescription(o.kind,o.kind.name,r));continue;case isSpecificationColor(o):L(o.name.name)&&t.push(this.descriptions.createDescription(o.name,o.name.name,r));continue;default:H(o)}}catch(e){logWarnError(e)}}exportDeployments(e,t,r){let o=e?.flatMap(e=>e.elements);if(!(F(o)||o.length===0))for(let e of o)try{isDeploymentNode$1(e)&&L(e.name)&&t.push(this.descriptions.createDescription(e,e.name,r))}catch(e){logWarnError(e)}}computeLocalScopes(e,t){return new Promise(t=>{let r=e.parseResult.value,o=[],s=new ae;for(let t of r.models)try{o.push(...this.processContainer(t,s,e))}catch(e){logWarnError(e)}for(let t of r.deployments)try{o.push(...this.processDeployments(t,s,e))}catch(e){logWarnError(e)}for(let e of r.imports.flatMap(e=>e.imports))try{let t=e;for(;t;)o.push(this.descriptions.createDescription(t,t.imported.$refText)),t=t.prev}catch(e){logWarnError(e)}uniqueDescriptions(o).forEach(e=>{s.add(r,e)}),t(s)})}processContainer(e,t,r){let o=new ae,s=[];for(let c of e.elements){if(isRelation(c))continue;let e;if(isElement(c)?(L(c.name)&&o.add(c.name,this.descriptions.createDescription(c,c.name,r)),e=c.body,e&&(t.add(e,this.descriptions.createDescription(c,`this`,r)),t.add(e,this.descriptions.createDescription(c,`it`,r)))):isExtendElement(c)&&(e=c.body),e&&e.elements.length>0)try{s.push(...this.processContainer(e,t,r))}catch(e){logWarnError(e)}}s.length&&I(s,M(e=>!o.has(e.name)),Yt(e=>e.name),ln((e,t)=>{e.length===1&&o.add(t,e[0])}));let c=[...o.values()];return t.addAll(e,c),c}processDeployments(e,t,r){let o=new ae,s=[];for(let c of e.elements){if(isDeploymentRelation(c))continue;let e=c.body;if(!isExtendDeployment(c)){let s=this.nameProvider.getName(c);if(L(s)){let e=this.descriptions.createDescription(c,s,r);o.add(s,e)}e&&(t.add(e,this.descriptions.createDescription(c,`this`,r)),t.add(e,this.descriptions.createDescription(c,`it`,r)))}if(e)try{s.push(...this.processDeployments(e,t,r))}catch(e){logWarnError(e)}}s.length&&I(s,M(e=>!o.has(e.name)),Yt(e=>e.name),ln((e,t)=>{e.length===1&&o.add(t,e[0])}));let c=[...o.values()];return t.addAll(e,c),c}};const{getDocument:up}=Ee;var LikeC4ScopeProvider=class extends ue{services;indexManager;constructor(e){super(e),this.services=e,this.indexManager=e.shared.workspace.IndexManager}get fqnIndex(){return this.services.likec4.FqnIndex}get deploymentsIndex(){return this.services.likec4.DeploymentsIndex}getScope(e){try{let t=projectIdFrom(e.container),r=this.reflection.getReferenceType(e);try{let o=e.container;if(isFqnRef(o))return new de(this.streamForFqnRef(t,o,e));if(isStrictFqnRef(o))return this.getScopeForStrictFqnRef(t,o,e);if(r!==`Element`)return this.getProjectScope(t,r,e);if(isImported(o)){let e=projectIdFrom(o);return new de(this.fqnIndex.rootElements(e))}if(isStrictFqnElementRef(o)&&e.property===`el`){let s=o.parent;return s?new de(this.fqnIndex.directChildrenOf(t,readStrictFqn(s))):this.getProjectScope(t,r,e)}return new de(at(this.computeScope(t,e)))}catch(o){return logWarnError(o),this.getProjectScope(t,r,e)}}catch(e){return logWarnError(e),ce}}*genUniqueDescedants(e){if(!e)return;let t=projectIdFrom(e);if(isElement(e)){let r=this.fqnIndex.getFqn(e);yield*this.fqnIndex.uniqueDescedants(t,r);return}if(isDeploymentNode$1(e)){let r=this.deploymentsIndex.getFqn(e);yield*this.deploymentsIndex.uniqueDescedants(t,r)}}*genScopeExtendElement({element:e}){e.el.$nodeDescription&&(yield e.el.$nodeDescription,yield{...e.el.$nodeDescription,name:`this`},yield{...e.el.$nodeDescription,name:`it`}),yield*this.genUniqueDescedants(elementRef(e))}*genScopeElementView({viewOf:e,extends:t}){if(e){e.modelElement.value.$nodeDescription&&(yield e.modelElement.value.$nodeDescription),yield*this.genUniqueDescedants(elementRef(e));return}if(t){let e=t.view.ref;e&&(yield*this.genScopeElementView(e))}}getScopeForStrictFqnRef(e,t,r){let o=t.parent;return o?new de(this.deploymentsIndex.directChildrenOf(e,readStrictFqn(o)).filter(e=>this.reflection.isSubtype(e.type,zl))):this.getProjectScope(e,zl,r)}*genScopeExtendDeployment({deploymentNode:e}){e.value.$nodeDescription&&(yield e.value.$nodeDescription);let t=e.value.ref;t&&isDeploymentNode$1(t)&&(yield*this.genUniqueDescedants(t))}streamForFqnRef(e,t,r){let o=t.parent;if(!o)return at(this.genScopeForParentlessFqnRef(e,t,r));let s=o.value.ref;if(!s)return xe;if(isImported(s))return at(this.genUniqueDescedants(s.imported.ref));if(isDeploymentNode$1(s))return at(this.genUniqueDescedants(s));if(isDeployedInstance(s)){let e=s.target.modelElement.value.ref,t=isImported(e)?e.imported.ref:isElement(e)?e:void 0;return at(this.genUniqueDescedants(t))}return isElement(s)?at(this.genUniqueDescedants(s)):H(s)}*genScopeForParentlessFqnRef(e,t,r){Oe(t,isElementRef)||isFqnRefInsideModel(t)?yield*this.computeScope(e,r,tu):isFqnRefInsideGlobals(t)?(yield*this.computeScope(e,r,tu),yield*this.computeScope(e,r,zl),yield*this.computeScope(e,r,Ll)):(yield*this.computeScope(e,r,zl),yield*this.computeScope(e,r,Ll),Oe(t,isDeploymentViewBody)&&(yield*this.computeScope(e,r,tu)));let o=up(t).precomputedScopes;o&&(yield*o.values().filter(e=>this.reflection.isSubtype(e.type,Iu)))}*computeScope(e,t,r=this.reflection.getReferenceType(t)){let o=this.reflection.isSubtype(r,tu),s=this.reflection.isSubtype(r,Uc),c=up(t.container).precomputedScopes;if(!c){yield*this.getProjectScope(e,r,t).getAllElements();return}let byReferenceType=e=>this.reflection.isSubtype(e.type,r),u=t.container;for(;u;){let e=c.get(u).filter(byReferenceType);e.length>0&&(yield*e),s&&isExtendDeploymentBody(u)&&(yield*this.genScopeExtendDeployment(u.$container)),o&&isExtendElementBody(u)&&(yield*this.genScopeExtendElement(u.$container)),o&&isElementViewBody(u)&&(yield*this.genScopeElementView(u.$container)),u=u.$container}yield*this.getProjectScope(e,r,t).getAllElements()}getProjectScope(e,t,r){return t===`LibIcon`?super.getGlobalScope(t,r):this.globalScopeCache.get(`${e}::${t}`,()=>new le(this.indexManager.projectElements(e,t)))}getGlobalScope(e,t){if(e===`LibIcon`)return super.getGlobalScope(e,t);let r=projectIdFrom(t.container);return this.getProjectScope(r,e,t)}},Q=He();let dp;(function(e){e.type=new Q.NotificationType(`likec4/onDidChangeModel`)})(dp||={});let fp;(function(e){e.type=new Q.NotificationType0(`likec4/onDidChangeProjects`)})(fp||={});let pp;(function(e){let t=e.Method=`likec4/onDidChangeSnapshot`;e.type=new Q.NotificationType(t)})(pp||={});let mp;(function(e){e.type=new Q.NotificationType(`likec4/onRequestOpenView`)})(mp||={});let hp;(function(e){e.req=new Q.RequestType(`likec4/fetchComputedModel`)})(hp||={});let gp;(function(e){e.req=new Q.RequestType0(`likec4/fetchViewsFromAllProjects`)})(gp||={});let _p;(function(e){e.req=new Q.RequestType(`likec4/fetchLayoutedModel`)})(_p||={});let vp;(function(e){e.req=new Q.RequestType(`likec4/layout-view`)})(vp||={});let yp;(function(e){e.req=new Q.RequestType(`likec4/validate-layout`)})(yp||={});let bp;(function(e){e.req=new Q.RequestType0(`likec4/reload-projects`)})(bp||={});let xp;(function(e){e.req=new Q.RequestType0(`likec4/fetch-projects`)})(xp||={});let Sp;(function(e){e.req=new Q.RequestType(`likec4/register-project`)})(Sp||={});let Cp;(function(e){e.req=new Q.RequestType(`likec4/build`)})(Cp||={});let wp;(function(e){e.req=new Q.RequestType(`likec4/locate`)})(wp||={});let Tp;(function(e){e.req=new Q.RequestType(`likec4/change-view`)})(Tp||={});let Ep;(function(e){e.req=new Q.RequestType0(`likec4/metrics`)})(Ep||={});let Dp;(function(e){e.req=new Q.RequestType(`likec4/document-tags`)})(Dp||={});let Op;(function(e){e.req=new Q.RequestType0(`likec4/fetch-projects-overview`)})(Op||={});const $=q.getChild(`rpc`);var Rpc=class extends ADisposable{services;constructor(e){super(),this.services=e}init=bn(()=>{let e=this.services.shared.lsp.Connection;if(!e){$.info(`no connection, skip init ServerRpc`);return}$.info(`init ServerRpc`);let t=this.services.likec4,r=this.services.shared.workspace,o=r.LangiumDocuments,s=r.DocumentBuilder,sendDidChangeModelNotification=t=>{$.debug`send ${`onDidChangeModel`} for project ${t}`,e.sendNotification(dp.type,{projectId:t}).catch(e=>{$.warn(`[ServerRpc] error sending onDidChangeModel for project {project}`,{error:e,project:t})})},c=cn(e=>{if(typeof e==`string`){sendDidChangeModelNotification(e);return}for(let t of e)sendDidChangeModelNotification(t)},{reducer:(e,t)=>!e||e===t?t:e instanceof Set?(e.add(t),e):new Set([e,t]),triggerAt:`end`,minQuietPeriodMs:130,maxBurstDurationMs:400}),u=cn(t=>{t>1?$.debug`send ${`DidChangeProjectsNotification`} (${t} batched)`:$.debug`send ${`DidChangeProjectsNotification`}`,e.sendNotification(fp.type).catch(e=>{$.warn(`[ServerRpc] error sending DidChangeProjectsNotification:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:250,maxBurstDurationMs:700}),d=!0;this.onDispose(ne.create(()=>{c.cancel(),u.cancel()}),t.ModelBuilder.onModelParsed(e=>c.call(e)),r.ProjectsManager.onProjectsUpdate(()=>u.call(1)),e.onRequest(hp.req,async({projectId:e,cleanCaches:o=!1},s)=>{$.debug`received request ${`fetchComputedModel`} for project ${e}`,o&&($.debug`cleanCaches: ${o}`,e?(r.ManualLayouts.clearCaches(),await r.ProjectsManager.rebuildProject(e)):await r.WorkspaceManager.rebuildAll());let c=await t.ModelBuilder.computeModel(e,s);return c===Ai.EMPTY?{model:null}:{model:c.$data}}),e.onNotification(pp.type,async e=>{let t=x.parse(e.update??e.delete),o=`update`in e?{update:t}:{delete:t};$.debug`received notification ${`onDidChangeSnapshot`} with ${e}`,await r.ManualLayouts.handleFileSystemUpdate(o)}),e.onRequest(_p.req,async({projectId:e},r)=>{$.debug`received request ${`fetchLayoutedModel`} for project ${e}`;let o=await t.LanguageServices.layoutedModel(e);if(o===null)return{model:null};let s=await t.Views.diagrams(e,r);return{model:{...o.$data,_stage:`layouted`,views:an(s,e=>e.id)}}}),e.onRequest(vp.req,async({viewId:e,projectId:r,layoutType:o,hints:s},c)=>($.debug`received request ${`layoutView`} for ${e} from project ${r} (layout type: ${o??`not set`})`,{result:await t.Views.layoutView({viewId:e,projectId:r,layoutType:o,layoutHints:s,cancelToken:c})})),e.onRequest(yp.req,async({projectId:e},r)=>($.debug`received request ${`validateLayout`} for project ${e}`,{result:reportLayoutDrift((await t.Views.layoutAllViews(e,r)).map(e=>e.diagram))})),e.onRequest(xp.req,async()=>{$.debug`received request ${`FetchProjects`}`;let e=o.groupedByProject();return{projects:Fn(e,(e,t)=>{let{folderUri:o,config:{name:s,title:c}}=r.ProjectsManager.getProject(t);return{folder:o.toString(),config:{name:s,title:c},docs:N(e,e=>e.uri.toString())}})}}),e.onRequest(bp.req,async e=>{$.debug`received request ${`ReloadProjects`}`,r.ManualLayouts.clearCaches(),await r.ProjectsManager.reloadProjects(e)}),e.onRequest(Sp.req,async(e,t)=>{$.debug`received request ${`RegisterProject`}`,r.ManualLayouts.clearCaches();let o;return o=`configUri`in e?await r.ProjectsManager.registerConfigFile(x.parse(e.configUri),t):await r.ProjectsManager.registerProject(e,t),{id:o.id}}),e.onRequest(gp.req,async e=>{$.debug`received request ${`FetchViewsFromAllProjects`}`;let o=[];for(let s of r.ProjectsManager.all){await _e(e);try{let r=await t.Views.computedViews(s,e);o.push(...I(r,N(e=>({id:e.id,title:e.title??e.id,projectId:s})),Dn((e,t)=>e.id===`index`?-1:t.id===`index`?1:e.title.localeCompare(t.title))))}catch(e){$.warn(`Failed to fetch views for project ${s}:`,{error:e})}}return{views:o}}),e.onRequest(Cp.req,async({docs:t},r)=>{let c=t.map(e=>x.parse(e)),isNotChanged=e=>!c.some(t=>C.equals(t,e)),u=o.userDocuments.map(e=>e.uri).filter(isNotChanged).toArray();$.debug(`[ServerRpc] received request to build:
100
+ `)+g)),S.start={line:h.line+1,character:_},S.end={line:h.line+e.length,character:Fn(e)?.length??0}}if(ee.length>0)for(let{rule:e}of ee){let t=e.$cstNode;U(t,`RuleCstNode not found`);for(let[r,o]of nn(s)){let s=r===`opacity`?o.toString()+`%`:o,c=e.props.find(e=>e.key===r);if(c&&c.$cstNode){let{range:{start:e,end:t}}=c.$cstNode,o=r+` `+s;includeRange({start:e,end:{...t,character:e.character+o.length}}),v.push(We.replace({start:e,end:t},o));continue}let u=ti(lp(t,`}`),`cant find closing brace`).range.start,d=` `.repeat(t.range.start.character)+` `,p=r+` `+s;v.push(We.insert({line:u.line,character:0},d+p+`
101
+ `)),includeRange({start:{line:u.line,character:d.length},end:{line:u.line,character:d.length+p.length}})}}return{modifiedRange:S,edits:v}}Ze();const{findNodeForKeyword:up}=Qe;function changeViewLayout(e,{view:t,viewAst:r,layout:o}){U(r.body,`View ${t.id} has no body`);let s=r.$cstNode;U(s,`viewCstNode`);let c=toAstViewLayoutDirection(o.direction),u=un(r.body.rules,isViewRuleAutoLayout),d=`autoLayout ${c}`;if(tn(o.rankSep)&&(d+=` ${o.rankSep}`,tn(o.nodeSep)&&(d+=` ${o.nodeSep}`)),u&&u.$cstNode)return We.replace(u.$cstNode.range,d);let p=up(r.body.$cstNode,`}`)?.range.start;U(p,`Closing brace not found`);let m=`\t${d}\n\t`;return We.insert(p,m)}function preparePayload(e,t){let r=t.shared.workspace,{viewId:o,projectId:s,change:c}=e,u=r.ProjectsManager.ensureProject(s),d=t.likec4.ModelLocator.locateViewAst(o,u.id);if(!d)throw Error(`View ${o} not found in project ${u.id}`);return{viewId:o,change:c,services:t,project:u,doc:d.doc,viewAst:d.viewAst,workspace:r}}function viewChangeHandler(e,t){return r=>{if(r.change.op===e)return t(r)}}const dp=viewChangeHandler(`change-property`,({change:e,viewAst:t})=>{let{title:r,description:o}=e,s=[];return r!==void 0&&s.push(updateViewTitle(t,r)),o!==void 0&&s.push(...updateViewDescription(t,o)),e.tags!==void 0&&s.push(...updateViewTags(t,e.tags)),s});function findExistingViewProperty(e,t){let r=e.body?.props;if(r&&M(r,1))return un(r,e=>e.key===t&&e.$cstNode!==void 0)}function findInsertPosition(e,t){let r=t(ti(e.body,`View body is required`));if(!r)return Nf.Position.create(0,0);let{line:o,character:s}=r;return Nf.Position.create(o,s+1)}const doubleIndent=e=>hn(newline(),indent(indent(e)));function updateViewTitle(e,t){let r=findExistingViewProperty(e,`title`),o=Mi(e.$container.folder??``),s=Mi(t);for(;s[0]&&o[0]===s[0];)s.shift(),o.shift();t=s.join(` ${ji} `);let c=withctx({title:t})(titleProperty());return r?Nf.TextEdit.replace(r.$cstNode.range,printOperation(c)):Nf.TextEdit.insert(findInsertPosition(e,e=>e.tags?.$cstNode?.range.end??e.$cstNode?.range.start),materialize(doubleIndent(c)).trimEnd())}function replaceTags(e,t,r){let o=t.tags,s=print(r.map(e=>`#${e}`).join(` `));if(o?.$cstNode)return r.length===0?Nf.TextEdit.del({start:findInsertPosition(e,e=>e.$cstNode?.range.start),end:o.$cstNode.range.end}):Nf.TextEdit.replace(o.$cstNode.range,materialize(s));if(r.length!==0)return Nf.TextEdit.insert(findInsertPosition(e,e=>e.$cstNode?.range.start),materialize(doubleIndent(s)).trimEnd())}function updateViewTags(e,t){let r=replaceTags(e,ti(e.body,`View body is required`),t);return r?[r]:[]}function updateViewDescription(e,t){let r=findExistingViewProperty(e,`description`),o=withctx({description:t},indent(indent(descriptionProperty())));if(r)return[Nf.TextEdit.replace({start:{line:r.$cstNode.range.start.line,character:0},end:r.$cstNode.range.end},materialize(o).trimEnd())];let s=findInsertPosition(e,e=>R(e.props,F(e=>e.$cstNode?.range.end),P(z),Fn())??e.tags?.$cstNode?.range.end??e.$cstNode?.range.start);return[Nf.TextEdit.insert({line:s.line+1,character:0},materialize(o))]}Ze();const fp=Y.getChild(`model-changes`);var LikeC4ModelChanges=class{services;locator;constructor(e){this.services=e,this.locator=e.likec4.ModelLocator}async applyChange(e){let{viewId:t,projectId:r,change:o}=e;if(o.op===`change-property`){let t=preparePayload(e,this.services),r=dp(t);if(!r)return{success:!1,error:`No changes to apply`};let o=Array.isArray(r)?r:[r];return await this.applyTextEdits(t.doc,o)?{success:!0,location:null}:{success:!1,error:`Failed to apply text edits`}}let s=this.services.shared.workspace;try{let e=s.ProjectsManager.ensureProject(r);fp.debug`Applying model change ${o.op} to view ${t} in project ${e.id}`;let c=this.locator.locateViewAst(t,e.id);if(!c&&(o.op===`save-view-snapshot`||o.op===`reset-manual-layout`)&&!(await this.services.likec4.ModelBuilder.computeModel(e.id)).findView(t))throw Error(`View ${t} not found in project ${e.id}`);if(o.op===`save-view-snapshot`)return U(t===o.layout.id,`View ID does not match, expected `+t+`, got `+o.layout.id),{success:!0,location:await s.ManualLayouts.write(e,o.layout)};if(o.op===`reset-manual-layout`)return{success:!0,location:await s.ManualLayouts.remove(e,t)};if(!c)throw Error(`View ${t} not found in project ${e.id}`);let u={uri:c.doc.textDocument.uri,version:c.doc.textDocument.version},{edits:d,modifiedRange:p}=this.convertToTextEdit({lookup:c,change:o});return d.length?await this.applyTextEdits(c.doc,d)?{success:!0,location:{uri:u.uri,range:p}}:{success:!1,error:`Failed to apply changes`}:{success:!1,error:`No changes to apply`}}catch(t){let r=loggable(wrapError(t,`Failed to apply change ${e.change.op} ${e.viewId}`));return fp.warn(r),{success:!1,error:r}}}convertToTextEdit({lookup:e,change:t}){switch(t.op){case`change-element-style`:return changeElementStyle(this.services,{...e,targets:t.targets,style:t.style});case`change-autolayout`:{let r=changeViewLayout(this.services,{...e,layout:t.layout});return{modifiedRange:r.range,edits:[r]}}default:W(t)}}async applyTextEdits(e,t){let r=this.services.shared.lsp.Connection,o=this.services.shared.workspace;if(!r){let r=he.applyEdits(e.textDocument,t);return await o.FileSystemProvider.writeFile(e.uri,r),await o.DocumentBuilder.update([e.uri],[]),!0}let s=await r.workspace.applyEdit({label:`LikeC4 - change view`,edit:{changes:{[e.textDocument.uri]:t}}});return s.applied?(await o.DocumentBuilder.update([e.uri],[]),s.applied):(fp.warn`Failed to apply text edits to document ${e.textDocument.uri}: ${s.failureReason}`,r.window.showErrorMessage(`Failed to apply changes: ${s.failureReason}`),!1)}},LikeC4NameProvider=class extends oe{services;constructor(e){super(),this.services=e}getNameStrict(e){return ti(this.getName(e),`Failed getName for ${this.services.workspace.AstNodeLocator.getAstNodePath(e)}`)}getName(e){if(fe(e))return e.name;if(isImported(e))return e.imported.$refText;if(isDeployedInstance(e))return e.target.modelElement.value.$refText}getNameNode(e){if(fe(e))return super.getNameNode(e);if(isImported(e))return e.imported.$refNode;if(isDeployedInstance(e))return e.target.modelElement.value.$refNode}};function uniqueDescriptions(e){return R(e,Jt(e=>`${e.type}.${e.name}`),nn(),Zt(([e,t])=>t.length===1?t:[]))}var LikeC4ScopeComputation=class extends ne{constructor(e){super(e)}async computeExports(e,t){let r=[];try{let{specifications:t,models:o,views:s,globals:c,likec4lib:u,deployments:d}=e.parseResult.value;this.exportLibrary(u,r,e),this.exportSpecification(t,r,e),this.exportModel(o,r,e),this.exportViews(s,r,e),this.exportGlobals(c,r,e),this.exportDeployments(d,r,e)}catch(e){logWarnError(e)}return r}exportViews(e,t,r){let o=e?.flatMap(e=>e.views);if(!(L(o)||o.length===0))for(let e of o)try{z(e.name)&&t.push(this.descriptions.createDescription(e,e.name,r))}catch(e){logWarnError(e)}}exportGlobals(e,t,r){if(!(L(e)||e.length===0)){for(let o of e.flatMap(e=>e.predicates))try{let e=o;z(e.name)&&t.push(this.descriptions.createDescription(e,e.name,r))}catch(e){logWarnError(e)}for(let o of e.flatMap(e=>e.styles))try{let e=o.id;z(e.name)&&t.push(this.descriptions.createDescription(e,e.name,r))}catch(e){logWarnError(e)}}}exportModel(e,t,r){if(!(L(e)||e.length===0))for(let o of e.flatMap(e=>e.elements))try{isElement(o)&&z(o.name)&&t.push(this.descriptions.createDescription(o,o.name,r))}catch(e){logWarnError(e)}}exportLibrary(e,t,r){if(!L(e))try{for(let o of e.flatMap(e=>e.icons))t.push(this.descriptions.createDescription(o,o.name,r))}catch(e){logWarnError(e)}}exportSpecification(e,t,r){if(!(L(e)||e.length===0))for(let o of e.flatMap(e=>[...e.elements,...e.relationships,...e.deploymentNodes,...e.tags,...e.colors]))try{switch(!0){case isSpecificationDeploymentNodeKind(o):case isSpecificationElementKind(o):z(o.kind.name)&&t.push(this.descriptions.createDescription(o.kind,o.kind.name,r));continue;case isSpecificationTag(o):z(o.tag.name)&&t.push(this.descriptions.createDescription(o.tag,o.tag.name,r),this.descriptions.createDescription(o.tag,`#`+o.tag.name,r));continue;case isSpecificationRelationshipKind(o):z(o.kind.name)&&t.push(this.descriptions.createDescription(o.kind,o.kind.name,r));continue;case isSpecificationColor(o):z(o.name.name)&&t.push(this.descriptions.createDescription(o.name,o.name.name,r));continue;default:W(o)}}catch(e){logWarnError(e)}}exportDeployments(e,t,r){let o=e?.flatMap(e=>e.elements);if(!(L(o)||o.length===0))for(let e of o)try{isDeploymentNode$1(e)&&z(e.name)&&t.push(this.descriptions.createDescription(e,e.name,r))}catch(e){logWarnError(e)}}computeLocalScopes(e,t){return new Promise(t=>{let r=e.parseResult.value,o=[],s=new ie;for(let t of r.models)try{o.push(...this.processContainer(t,s,e))}catch(e){logWarnError(e)}for(let t of r.deployments)try{o.push(...this.processDeployments(t,s,e))}catch(e){logWarnError(e)}for(let e of r.imports.flatMap(e=>e.imports))try{let t=e;for(;t;)o.push(this.descriptions.createDescription(t,t.imported.$refText)),t=t.prev}catch(e){logWarnError(e)}uniqueDescriptions(o).forEach(e=>{s.add(r,e)}),t(s)})}processContainer(e,t,r){let o=new ie,s=[];for(let c of e.elements){if(isRelation(c))continue;let e;if(isElement(c)?(z(c.name)&&o.add(c.name,this.descriptions.createDescription(c,c.name,r)),e=c.body,e&&(t.add(e,this.descriptions.createDescription(c,`this`,r)),t.add(e,this.descriptions.createDescription(c,`it`,r)))):isExtendElement(c)&&(e=c.body),e&&e.elements.length>0)try{s.push(...this.processContainer(e,t,r))}catch(e){logWarnError(e)}}s.length&&R(s,P(e=>!o.has(e.name)),Jt(e=>e.name),cn((e,t)=>{e.length===1&&o.add(t,e[0])}));let c=[...o.values()];return t.addAll(e,c),c}processDeployments(e,t,r){let o=new ie,s=[];for(let c of e.elements){if(isDeploymentRelation(c))continue;let e=c.body;if(!isExtendDeployment(c)){let s=this.nameProvider.getName(c);if(z(s)){let e=this.descriptions.createDescription(c,s,r);o.add(s,e)}e&&(t.add(e,this.descriptions.createDescription(c,`this`,r)),t.add(e,this.descriptions.createDescription(c,`it`,r)))}if(e)try{s.push(...this.processDeployments(e,t,r))}catch(e){logWarnError(e)}}s.length&&R(s,P(e=>!o.has(e.name)),Jt(e=>e.name),cn((e,t)=>{e.length===1&&o.add(t,e[0])}));let c=[...o.values()];return t.addAll(e,c),c}};const{getDocument:pp}=Te;var LikeC4ScopeProvider=class extends le{services;indexManager;constructor(e){super(e),this.services=e,this.indexManager=e.shared.workspace.IndexManager}get fqnIndex(){return this.services.likec4.FqnIndex}get deploymentsIndex(){return this.services.likec4.DeploymentsIndex}getScope(e){try{let t=projectIdFrom(e.container),r=this.reflection.getReferenceType(e);try{let o=e.container;if(isFqnRef(o))return new ue(this.streamForFqnRef(t,o,e));if(isStrictFqnRef(o))return this.getScopeForStrictFqnRef(t,o,e);if(r!==`Element`)return this.getProjectScope(t,r,e);if(isImported(o)){let e=projectIdFrom(o);return new ue(this.fqnIndex.rootElements(e))}if(isStrictFqnElementRef(o)&&e.property===`el`){let s=o.parent;return s?new ue(this.fqnIndex.directChildrenOf(t,readStrictFqn(s))):this.getProjectScope(t,r,e)}return new ue(it(this.computeScope(t,e)))}catch(o){return logWarnError(o),this.getProjectScope(t,r,e)}}catch(e){return logWarnError(e),se}}*genUniqueDescedants(e){if(!e)return;let t=projectIdFrom(e);if(isElement(e)){let r=this.fqnIndex.getFqn(e);yield*this.fqnIndex.uniqueDescedants(t,r);return}if(isDeploymentNode$1(e)){let r=this.deploymentsIndex.getFqn(e);yield*this.deploymentsIndex.uniqueDescedants(t,r)}}*genScopeExtendElement({element:e}){e.el.$nodeDescription&&(yield e.el.$nodeDescription,yield{...e.el.$nodeDescription,name:`this`},yield{...e.el.$nodeDescription,name:`it`}),yield*this.genUniqueDescedants(elementRef(e))}*genScopeElementView({viewOf:e,extends:t}){if(e){e.modelElement.value.$nodeDescription&&(yield e.modelElement.value.$nodeDescription),yield*this.genUniqueDescedants(elementRef(e));return}if(t){let e=t.view.ref;e&&(yield*this.genScopeElementView(e))}}getScopeForStrictFqnRef(e,t,r){let o=t.parent;return o?new ue(this.deploymentsIndex.directChildrenOf(e,readStrictFqn(o)).filter(e=>this.reflection.isSubtype(e.type,Vl))):this.getProjectScope(e,Vl,r)}*genScopeExtendDeployment({deploymentNode:e}){e.value.$nodeDescription&&(yield e.value.$nodeDescription);let t=e.value.ref;t&&isDeploymentNode$1(t)&&(yield*this.genUniqueDescedants(t))}streamForFqnRef(e,t,r){let o=t.parent;if(!o)return it(this.genScopeForParentlessFqnRef(e,t,r));let s=o.value.ref;if(!s)return be;if(isImported(s))return it(this.genUniqueDescedants(s.imported.ref));if(isDeploymentNode$1(s))return it(this.genUniqueDescedants(s));if(isDeployedInstance(s)){let e=s.target.modelElement.value.ref,t=isImported(e)?e.imported.ref:isElement(e)?e:void 0;return it(this.genUniqueDescedants(t))}return isElement(s)?it(this.genUniqueDescedants(s)):W(s)}*genScopeForParentlessFqnRef(e,t,r){De(t,isElementRef)||isFqnRefInsideModel(t)?yield*this.computeScope(e,r,ru):isFqnRefInsideGlobals(t)?(yield*this.computeScope(e,r,ru),yield*this.computeScope(e,r,Vl),yield*this.computeScope(e,r,zl)):(yield*this.computeScope(e,r,Vl),yield*this.computeScope(e,r,zl),De(t,isDeploymentViewBody)&&(yield*this.computeScope(e,r,ru)));let o=pp(t).precomputedScopes;o&&(yield*o.values().filter(e=>this.reflection.isSubtype(e.type,Ru)))}*computeScope(e,t,r=this.reflection.getReferenceType(t)){let o=this.reflection.isSubtype(r,ru),s=this.reflection.isSubtype(r,Gc),c=pp(t.container).precomputedScopes;if(!c){yield*this.getProjectScope(e,r,t).getAllElements();return}let byReferenceType=e=>this.reflection.isSubtype(e.type,r),u=t.container;for(;u;){let e=c.get(u).filter(byReferenceType);e.length>0&&(yield*e),s&&isExtendDeploymentBody(u)&&(yield*this.genScopeExtendDeployment(u.$container)),o&&isExtendElementBody(u)&&(yield*this.genScopeExtendElement(u.$container)),o&&isElementViewBody(u)&&(yield*this.genScopeElementView(u.$container)),u=u.$container}yield*this.getProjectScope(e,r,t).getAllElements()}getProjectScope(e,t,r){return t===`LibIcon`?super.getGlobalScope(t,r):this.globalScopeCache.get(`${e}::${t}`,()=>new ce(this.indexManager.projectElements(e,t)))}getGlobalScope(e,t){if(e===`LibIcon`)return super.getGlobalScope(e,t);let r=projectIdFrom(t.container);return this.getProjectScope(r,e,t)}},mp=Ve();let hp;(function(e){e.type=new mp.NotificationType(`likec4/onDidChangeModel`)})(hp||={});let gp;(function(e){e.type=new mp.NotificationType0(`likec4/onDidChangeProjects`)})(gp||={});let _p;(function(e){let t=e.Method=`likec4/onDidChangeSnapshot`;e.type=new mp.NotificationType(t)})(_p||={});let vp;(function(e){e.type=new mp.NotificationType(`likec4/onRequestOpenView`)})(vp||={});let yp;(function(e){e.req=new mp.RequestType(`likec4/fetchComputedModel`)})(yp||={});let bp;(function(e){e.req=new mp.RequestType0(`likec4/fetchViewsFromAllProjects`)})(bp||={});let xp;(function(e){e.req=new mp.RequestType(`likec4/fetchLayoutedModel`)})(xp||={});let Sp;(function(e){e.req=new mp.RequestType(`likec4/layout-view`)})(Sp||={});let Cp;(function(e){e.req=new mp.RequestType(`likec4/validate-layout`)})(Cp||={});let wp;(function(e){e.req=new mp.RequestType0(`likec4/reload-projects`)})(wp||={});let Tp;(function(e){e.req=new mp.RequestType0(`likec4/fetch-projects`)})(Tp||={});let Ep;(function(e){e.req=new mp.RequestType(`likec4/register-project`)})(Ep||={});let Dp;(function(e){e.req=new mp.RequestType(`likec4/build`)})(Dp||={});let Op;(function(e){e.req=new mp.RequestType(`likec4/locate`)})(Op||={});let kp;(function(e){e.req=new mp.RequestType(`likec4/change-view`)})(kp||={});let Ap;(function(e){e.req=new mp.RequestType0(`likec4/metrics`)})(Ap||={});let jp;(function(e){e.req=new mp.RequestType(`likec4/document-tags`)})(jp||={});let Mp;(function(e){e.req=new mp.RequestType0(`likec4/fetch-projects-overview`)})(Mp||={});const $=Y.getChild(`rpc`);var Rpc=class extends ADisposable{services;constructor(e){super(),this.services=e}init=yn(()=>{let e=this.services.shared.lsp.Connection;if(!e){$.info(`no connection, skip init ServerRpc`);return}$.info(`init ServerRpc`);let t=this.services.likec4,r=this.services.shared.workspace,o=r.LangiumDocuments,s=r.DocumentBuilder,sendDidChangeModelNotification=t=>{$.debug`send ${`onDidChangeModel`} for project ${t}`,e.sendNotification(hp.type,{projectId:t}).catch(e=>{$.warn(`[ServerRpc] error sending onDidChangeModel for project {project}`,{error:e,project:t})})},c=sn(e=>{if(typeof e==`string`){sendDidChangeModelNotification(e);return}for(let t of e)sendDidChangeModelNotification(t)},{reducer:(e,t)=>!e||e===t?t:e instanceof Set?(e.add(t),e):new Set([e,t]),triggerAt:`end`,minQuietPeriodMs:130,maxBurstDurationMs:400}),u=sn(t=>{t>1?$.debug`send ${`DidChangeProjectsNotification`} (${t} batched)`:$.debug`send ${`DidChangeProjectsNotification`}`,e.sendNotification(gp.type).catch(e=>{$.warn(`[ServerRpc] error sending DidChangeProjectsNotification:`,{error:e})})},{reducer:(e,t)=>(e??0)+t,triggerAt:`end`,minQuietPeriodMs:250,maxBurstDurationMs:700}),d=!0;this.onDispose(S.create(()=>{c.cancel(),u.cancel()}),t.ModelBuilder.onModelParsed(e=>c.call(e)),r.ProjectsManager.onProjectsUpdate(()=>u.call(1)),e.onRequest(yp.req,async({projectId:e,cleanCaches:o=!1},s)=>{$.debug`received request ${`fetchComputedModel`} for project ${e}`,o&&($.debug`cleanCaches: ${o}`,e?(r.ManualLayouts.clearCaches(),await r.ProjectsManager.rebuildProject(e)):await r.WorkspaceManager.rebuildAll());let c=await t.ModelBuilder.computeModel(e,s);return c===Ai.EMPTY?{model:null}:{model:c.$data}}),e.onNotification(_p.type,async e=>{let t=C.parse(e.update??e.delete),o=`update`in e?{update:t}:{delete:t};$.debug`received notification ${`onDidChangeSnapshot`} with ${e}`,await r.ManualLayouts.handleFileSystemUpdate(o)}),e.onRequest(xp.req,async({projectId:e},r)=>{$.debug`received request ${`fetchLayoutedModel`} for project ${e}`;let o=await t.LanguageServices.layoutedModel(e);if(o===null)return{model:null};let s=await t.Views.diagrams(e,r);return{model:{...o.$data,_stage:`layouted`,views:rn(s,e=>e.id)}}}),e.onRequest(Sp.req,async({viewId:e,projectId:r,layoutType:o,hints:s},c)=>($.debug`received request ${`layoutView`} for ${e} from project ${r} (layout type: ${o??`not set`})`,{result:await t.Views.layoutView({viewId:e,projectId:r,layoutType:o,layoutHints:s,cancelToken:c})})),e.onRequest(Cp.req,async({projectId:e},r)=>($.debug`received request ${`validateLayout`} for project ${e}`,{result:reportLayoutDrift((await t.Views.layoutAllViews(e,r)).map(e=>e.diagram))})),e.onRequest(Tp.req,async()=>{$.debug`received request ${`FetchProjects`}`;let e=o.groupedByProject();return{projects:Pn(e,(e,t)=>{let{folderUri:o,config:{name:s,title:c}}=r.ProjectsManager.getProject(t);return{folder:o.toString(),path:r.WorkspaceManager.relativePath(o),config:{name:s,title:c},docs:F(e,e=>e.uri.toString())}})}}),e.onRequest(wp.req,async e=>{$.debug`received request ${`ReloadProjects`}`,r.ManualLayouts.clearCaches(),await r.ProjectsManager.reloadProjects(e)}),e.onRequest(Ep.req,async(e,t)=>{$.debug`received request ${`RegisterProject`}`,r.ManualLayouts.clearCaches();let o;return o=`configUri`in e?await r.ProjectsManager.registerConfigFile(C.parse(e.configUri),t):await r.ProjectsManager.registerProject(e,t),{id:o.id}}),e.onRequest(bp.req,async e=>{$.debug`received request ${`FetchViewsFromAllProjects`}`;let o=[];for(let s of r.ProjectsManager.all){await ge(e);try{let r=await t.Views.computedViews(s,e);o.push(...R(r,F(e=>({id:e.id,title:e.title??e.id,projectId:s})),En((e,t)=>e.id===`index`?-1:t.id===`index`?1:e.title.localeCompare(t.title))))}catch(e){$.warn(`Failed to fetch views for project ${s}:`,{error:e})}}return{views:o}}),e.onRequest(Dp.req,async({docs:t},r)=>{let c=t.map(e=>C.parse(e)),isNotChanged=e=>!c.some(t=>T.equals(t,e)),u=o.userDocuments.map(e=>e.uri).filter(isNotChanged).toArray();$.debug(`[ServerRpc] received request to build:
103
102
  changed (total ${c.length}):${t.map(e=>`
104
103
  - `+e).join(``)}
105
104
  deleted (total ${u.length}):${u.map(e=>`
106
105
  - `+e.toString()).join(`
107
- `)}`),!d&&c.length+u.length>0&&await Promise.allSettled([...c,...u].map(async t=>{let r=t.toString();$.debug(`clear diagnostics for ${r}`);try{await e.sendDiagnostics({uri:r,diagnostics:[]})}catch(e){$.warn(`error clearing diagnostics for ${r}: ${e}`)}})),d=!1,await _e(r),await s.update(c,u,r)}),e.onRequest(wp.req,e=>{$.debug`received request ${`locate`}, ${e}`;let r=e.projectId;switch(!0){case`element`in e:return t.ModelLocator.locateElement(e.element,r);case`relation`in e:return t.ModelLocator.locateRelation(e.relation,r);case`astPath`in e:return t.ModelLocator.locateDynamicViewStep({view:e.view,astPath:e.astPath,projectId:r});case`view`in e:return t.ModelLocator.locateView(e.view,r);case`deployment`in e:return t.ModelLocator.locateDeploymentElement(e.deployment,r);default:H(e)}}),e.onRequest(Tp.req,async e=>($.debug`received request ${`changeView`} of ${e.viewId} from project ${e.projectId}`,await t.ModelChanges.applyChange(e))),e.onRequest(Ep.req,async e=>{let o=null;for(let s of r.ProjectsManager.all)try{let r=await t.ModelBuilder.computeModel(s,e);if(r===Ai.EMPTY)continue;o??={elementKinds:0,deploymentKinds:0,relationshipKinds:0,tags:0,customColors:0,elements:0,deploymentNodes:0,relationships:0,views:0,projects:0},o.elementKinds+=on(r.specification.elements).length,o.deploymentKinds+=on(r.specification.deployments).length,o.relationshipKinds+=on(r.specification.relationships).length,o.tags+=on(r.specification.tags).length,o.customColors+=on(r.specification.customColors??{}).length,o.elements+=on(r.$data.elements).length,o.deploymentNodes+=[...r.deployment.nodes()].length,o.relationships+=on(r.$data.relations).length,o.views+=on(r.$data.views).length,o.projects+=1}catch(e){$.warn(`Error fetching telemetry metrics for project ${s}`,{err:e})}return await _e(e),{metrics:o}}),e.onRequest(Dp.req,async({documentUri:e},o)=>{let s=x.parse(e);$.debug`received request ${`GetDocumentTags`} for document ${s}`;let c=await t.ModelLocator.locateDocumentTags(s,o);return{projectId:r.ProjectsManager.ownerProjectId(s),tags:c??[]}}),e.onRequest(Op.req,async e=>($.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await t.LanguageServices.projectsOverview(e)})));function reportLayoutDrift(e){return I(e,M(e=>!!e.hasLayoutDrift),N(e=>{let r=t.ModelLocator.locateView(e.id);return V(r,`View ${e.id} not found`),{uri:r.uri,viewId:e.id,severity:jf.DiagnosticSeverity.Warning,message:`Layout drift detected for view '${e.id}'`,range:r.range}}))}});async openView(e){let t=this.services.shared.lsp.Connection;if(!t){$.warn(`No LSP connection`);return}await t.sendNotification(mp.type,e)}};Qe();var NodeKindProvider=class{services;constructor(e){this.services=e}getSymbolKind(e){let t=we(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case hasType(tu,hu,zl,Ll,Iu):return tt.Constructor;case hasType(Yu,Zu,Xu,Du,Cd):return tt.Namespace;case hasType(tl):return tt.Struct;case hasType(`Tag`,Bu,Pl,wd):return tt.EnumMember;case hasType(dd,xd):return tt.Event;case hasType(ru,Vl,yd,vd):return tt.TypeParameter}return tt.Field}getCompletionItemKind(e){let t=we(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case hasType(Pl):return S.Color;case hasType(tu,zl,Ll,hu,Iu):return S.Constructor;case hasType(Yu,Zu,Xu,Du,Cd):return S.Module;case hasType(tl):return S.Class;case hasType(`Tag`,Bu,Pl,wd):return S.EnumMember;case hasType(dd,xd):return S.Event;case hasType(ru,yd,Vl,vd):return S.TypeParameter;default:return S.Reference}}},WorkspaceSymbolProvider=class extends Ke{};const kp=q.getChild(`views`);var DefaultLikeC4Views=class extends ADisposable{services;#e;#t=new Er(e=>new ProjectStorage({projectId:e,storage:Xn(this.#e,e),layouter:e=>this.layouter.layout(e)}));ModelBuilder;constructor(e){super(),this.services=e,this.ModelBuilder=e.likec4.ModelBuilder,this.#e=Zn(),this.onDispose(this.#e,ne.create(()=>{this.#t.clear()}),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{kp.info`force clean cache`,this.#e.clear()}),e.shared.workspace.ManualLayouts.onManualLayoutUpdate(({projectId:e,viewId:t})=>{this.#t.has(e)&&t&&this.projectStorage(e).clearView(t)}))}get layouter(){return this.services.likec4.Layouter}async computedViews(e,t){let r=await this.ModelBuilder.computeModel(e,t);return Nn(r.$data.views)}async _layoutAllViews(e,t){let r=Nn(e.$data.views);if(r.length===0)return[];let o=e.project.id,s=kp.getChild(o),c=this.projectStorage(o),u=[],d=e.$styles,p=[];for(let e of r){let t={view:e,styles:d},r=await c.get(t);if(r){p.push(r);continue}u.push(t)}if(p.length>0&&(u.length>0?s.trace`cached ${p.length} views, need to layout ${u.length} views`:s.trace`cached all ${p.length} views`),u.length>0){let e=performanceMark();await this.layouter.batchLayout({batch:u,cancelToken:t,onSuccess:(e,t)=>{p.push(c.remember(e,t))},onError:(e,t)=>{s.warn(`Fail layout view ${e.view.id}`,{error:t})}}),s.debug`layouted ${u.length} views in ${e.pretty}`}return t&&t.isCancellationRequested&&await _e(t),p.length!==r.length&&s.warn`layouted ${p.length} of ${r.length} views`,p}async layoutAllViews(e,t){let r=await this.ModelBuilder.computeModel(e,t);return await this._layoutAllViews(r,t)}async layoutView({viewId:e,layoutType:t,projectId:r,cancelToken:o,layoutHints:s}){let c=await this.ModelBuilder.computeModel(r,o),u=c.findView(e)?.$view;r=c.project.id;let d=kp.getChild(r);if(s){V(u,`View ${e} not found in model`),d.debug`using provided AI layout hints for view ${e}`;let{dot:t,diagram:r}=await this.layouter.aiLayout({view:u,styles:c.$styles},s);return{dot:t,diagram:r}}if(!u){d.warn`view ${e} not found in model`;let t=c.findManualLayout(e);if(t){d.info`found manual layout for ${e}`;let r={...t};return r.drifts=[`not-exists`],r._layout=`manual`,{diagram:r,dot:`# manual layout`}}return null}let p=this.projectStorage(r);try{let e={view:u,styles:c.$styles},r=await p.getOrExecute(e);return L(t)?{dot:r.dot,diagram:this.withLayoutType(r.diagram,c,t)}:r}catch(e){let t=loggable(e);return d.warn(t),this.reportViewError(u,r,t),Promise.reject(e)}}async diagrams(e,t){let r=await this.ModelBuilder.computeModel(e,t);return(await this._layoutAllViews(r,t)).map(({diagram:e})=>this.withLayoutType(e,r,`manual`))}async viewsAsGraphvizOut(e,t){let r=`All-LayoutedViews-DotWithSvg`,o=this.services.shared.workspace.Cache;if(o.has(r))return await Promise.resolve(o.get(r));let s=await this.ModelBuilder.computeModel(e,t),c=Nn(s.$data.views);if(c.length===0)return[];let u=c.map(async e=>{let{dot:t,svg:r}=await this.layouter.svg({view:e,styles:s.$styles});return{id:e.id,dot:t,svg:r}}),d=[],p=await Promise.allSettled(u);for(let e of p)e.status===`fulfilled`?d.push(e.value):logWarnError(e.reason);return o.set(r,d),d}async openView(e,t){await this.services.Rpc.openView({viewId:e,projectId:t})}async adhocView(e,t){kp.trace`layouting adhoc view...`;let r=await this.ModelBuilder.computeModel(t),o=Ui(r,e),{diagram:s}=await this.layouter.layout({view:{...o,hash:``,_type:`element`},styles:r.$styles});return kp.debug`layouting adhoc view... done`,s}reportViewError(e,t,r){this.projectStorage(t).reportViewError(e,()=>{this.services.shared.lsp.Connection?.window.showErrorMessage(`LikeC4: ${r}`)})}withLayoutType(e,t,r){if(!r)return e;let o=t.findManualLayout(e.id);return o?r===`manual`?e[Pr]===`manual`?(kp.error`View ${e.id} already has manual layout, this should not happen`,e):zr(e,o):Br(e,o):e}projectStorage(e){return this.#t.get(e)}},ProjectStorage=class{#e;#t;#n;constructor(e){this.#e=kp.getChild(e.projectId),this.#t=e.storage,this.#n=e.layouter}async get(e){let t=cacheKey(e),r=await this.#t.get(t);if(r)return this.#e.trace`cache hit for ${e.view.id}`,mergeWithCachedLayout(e.view,r);this.#e.trace`cache miss for ${e.view.id}`}async getOrExecute(e){let t=cacheKey(e),r=await this.#t.get(t);if(r)return this.#e.trace`cache hit for ${e.view.id}`,mergeWithCachedLayout(e.view,r);this.#e.trace`cache miss for ${e.view.id}`;let o=performanceMark(),s=await this.#n(e);return this.#e.trace(`layouted {view} in ${o.pretty}`,{view:e.view.id}),await this.#t.set(t,s),this.resetViewError(e.view),s}remember=(e,t)=>{let r=cacheKey(e);return t&&(this.#t.set(r,t).catch(e=>{this.#e.error(e)}),this.resetViewError(e.view)),t};reportViewError(e,t){let r=`error:${e.id}`;this.#t.has(r).then(e=>{e||(this.#t.set(r,`true`),t())})}async clearView(e){this.resetViewError(e);let t=await this.#t.keys(`v:${e}:`);if(t.length!==0){this.#e.trace`clear ${t.length} cached entries for view ${e}`;for(let e of t)await this.#t.remove(e)}}clearAll(){this.#e.trace`clear caches`,this.#t.clear()}resetViewError(e){let t=typeof e==`string`?e:e.id;this.#t.del(`error:${t}`)}};function cacheKey(e){return`v:${e.view.id}:${e.view.hash}:${e.styles.fingerprint}`}function mergeWithCachedLayout(e,t){return{dot:t.dot,diagram:Rr(e,t.diagram)}}const Ap={graphviz(){return new Dc}};function WithGraphviz(e){return{graphviz(){return e}}}function createLikeC4SharedModule(e){return{lsp:{NodeKindProvider:e=>new NodeKindProvider(e),WorkspaceSymbolProvider:e=>new WorkspaceSymbolProvider(e)},workspace:{Cache:e=>new Re(e,b.Validated),IndexManager:e=>new IndexManager(e),LangiumDocuments:e=>new LangiumDocuments(e),ProjectsManager:e=>new yf(e),WorkspaceManager:e=>new LikeC4WorkspaceManager(e),FileSystemProvider:()=>e.fileSystemProvider(),FileSystemWatcher:t=>e.fileSystemWatcher(t),ManualLayouts:t=>e.manualLayouts(t)}}}function bind(e){return t=>new e(t)}function createLikeC4Module(e){return{documentation:{DocumentationProvider:bind(LikeC4DocumentationProvider)},validation:{DocumentValidator:bind(LikeC4DocumentValidator)},Rpc:bind(Rpc),likec4:{LanguageServices:bind(DefaultLikeC4LanguageServices),Graphviz:t=>e.graphviz(t),Layouter:e=>new QueueGraphvizLayoter({graphviz:e.likec4.Graphviz}),Views:bind(DefaultLikeC4Views),DeploymentsIndex:bind(DeploymentsIndex),ModelChanges:bind(LikeC4ModelChanges),FqnIndex:bind(FqnIndex),ModelParser:bind(LikeC4ModelParser),ModelBuilder:bind(DefaultLikeC4ModelBuilder),ModelLocator:bind(LikeC4ModelLocator),LastSeen:bind(LastSeenArtifacts)},lsp:{CompletionProvider:bind(LikeC4CompletionProvider),DocumentHighlightProvider:bind(LikeC4DocumentHighlightProvider),DocumentSymbolProvider:bind(LikeC4DocumentSymbolProvider),SemanticTokenProvider:bind(LikeC4SemanticTokenProvider),HoverProvider:bind(LikeC4HoverProvider),CodeLensProvider:bind(LikeC4CodeLensProvider),DocumentLinkProvider:bind(LikeC4DocumentLinkProvider),Formatter:bind(LikeC4Formatter),CodeActionProvider:bind(LikeC4CodeActionProvider)},references:{NameProvider:bind(LikeC4NameProvider),ScopeComputation:bind(LikeC4ScopeComputation),ScopeProvider:bind(LikeC4ScopeProvider)},parser:{ValueConverter:bind(LikeC4ValueConverter)}}}function createLanguageServices$1(e={},t,r,o){let s=createSharedServices(e),c=[Ie({shared:s}),uf,createLikeC4Module({...kf,...Af,...Ap,...e}),t,r,o].reduce(_merge,{}),u=me(c);return s.ServiceRegistry.register(u),registerValidationChecks(u),e.connection?bi(()=>s.workspace.WorkspaceManager.ready.then(()=>u.Rpc.init())):s.workspace.ConfigurationProvider.initialized({}),{shared:s,likec4:u}}t(createLanguageServices$1,`createLanguageServices`);function createSharedServices(e={}){let t={...kf,...Af,...e};return me(Se(t),lf,createLikeC4SharedModule(t))}function _merge(e,t){if(t)for(let[r,o]of Object.entries(t)){if(r===`__proto__`||r===`constructor`||r===`prototype`||o===void 0)continue;let t=Object.hasOwn(e,r),s=e[r];e[r]=t&&s!==null&&o!==null&&typeof s==`object`&&typeof o==`object`?_merge(s,o):o}return e}function configureLogger(e){let t=e?.configureLogger??!1;if(t!==!1){if(t===`stderr`){configureLanguageServerLogger({useStdErr:!0,colors:!1,logLevel:e?.logLevel});return}configureLanguageServerLogger({colors:Ii,logLevel:e?.logLevel})}}function createLanguageServices(e){let t=W.getChild(`lang`),r=g(e,{useFileSystem:!0,manualLayouts:!0,watch:!1,graphviz:`wasm`}),o=r.graphviz===`binary`;return t.info(`${Zi.dim(`layout`)} ${o?`binary`:`wasm`}`),createLanguageServices$1({...r.useFileSystem?{...WithFileSystem(r.watch),...r.manualLayouts?Cf:Af}:{...kf,...Af},...WithGraphviz(o?new GraphvizBinaryAdapter:new Dc)})}async function fromWorkspace(e,t){let r=ar(e),o=x.file(r).toString(),s=ht(o),c=W.getChild(`lang`),u=g(t,{..._c,useFileSystem:!0,manualLayouts:!0,watch:!1});configureLogger(u);let d=createLanguageServices(u),p={name:tr(r),uri:s},m=d.shared.workspace.WorkspaceManager;c.info(`${Zi.dim(`workspace:`)} ${r}`),m.initialize({capabilities:{},processId:null,rootUri:p.uri,workspaceFolders:[p]}),await m.initialized({});let h=d.shared.workspace.LangiumDocuments.userDocuments.toArray();if(h.length===0&&(c.error(`no LikeC4 sources found`),t?.throwIfInvalid))throw await d.likec4.likec4.LanguageServices.dispose(),Error(`no LikeC4 sources found`);return c.info(`${Zi.dim(`workspace:`)} found ${h.length} source files`),handleInitOptions(d,W,t)}async function fromSources(e,t){configureLogger(t);let r=W.getChild(`lang`);return await createFromSources(createLanguageServices(g(t,{..._c,useFileSystem:!1,watch:!1,manualLayouts:!1})),r,e,t)}function fromSource(e,t){return fromSources({"source.c4":e},t)}async function writeDSL(e,t,r){let o=await e.toDSL(r?.project),s=rr(t,r?.fileName??`model.c4`);return await er(s,o,`utf-8`),s}export{getConsoleSink as C,loggable as E,W as S,getConsoleFormatter as T,toStringLF as _,createLanguageServices$1 as a,configureLogger$1 as b,Cf as c,configureLanguageServerLogger as d,q as f,Qi as g,Dc as h,writeDSL as i,Pc as l,QueueGraphvizLayoter as m,fromSources as n,WithGraphviz as o,GraphvizBinaryAdapter as p,fromWorkspace as r,WithFileSystem as s,fromSource as t,Fc as u,stripIndent as v,getAnsiColorFormatter as w,createLogger as x,Zi as y};
106
+ `)}`),!d&&c.length+u.length>0&&await Promise.allSettled([...c,...u].map(async t=>{let r=t.toString();$.debug(`clear diagnostics for ${r}`);try{await e.sendDiagnostics({uri:r,diagnostics:[]})}catch(e){$.warn(`error clearing diagnostics for ${r}: ${e}`)}})),d=!1,await ge(r),await s.update(c,u,r)}),e.onRequest(Op.req,e=>{$.debug`received request ${`locate`}, ${e}`;let r=e.projectId;switch(!0){case`element`in e:return t.ModelLocator.locateElement(e.element,r);case`relation`in e:return t.ModelLocator.locateRelation(e.relation,r);case`astPath`in e:return t.ModelLocator.locateDynamicViewStep({view:e.view,astPath:e.astPath,projectId:r});case`view`in e:return t.ModelLocator.locateView(e.view,r);case`deployment`in e:return t.ModelLocator.locateDeploymentElement(e.deployment,r);default:W(e)}}),e.onRequest(kp.req,async e=>($.debug`received request ${`changeView`} of ${e.viewId} from project ${e.projectId}`,await t.ModelChanges.applyChange(e))),e.onRequest(Ap.req,async e=>{let o=null;for(let s of r.ProjectsManager.all)try{let r=await t.ModelBuilder.computeModel(s,e);if(r===Ai.EMPTY)continue;o??={elementKinds:0,deploymentKinds:0,relationshipKinds:0,tags:0,customColors:0,elements:0,deploymentNodes:0,relationships:0,views:0,projects:0},o.elementKinds+=an(r.specification.elements).length,o.deploymentKinds+=an(r.specification.deployments).length,o.relationshipKinds+=an(r.specification.relationships).length,o.tags+=an(r.specification.tags).length,o.customColors+=an(r.specification.customColors??{}).length,o.elements+=an(r.$data.elements).length,o.deploymentNodes+=[...r.deployment.nodes()].length,o.relationships+=an(r.$data.relations).length,o.views+=an(r.$data.views).length,o.projects+=1}catch(e){$.warn(`Error fetching telemetry metrics for project ${s}`,{err:e})}return await ge(e),{metrics:o}}),e.onRequest(jp.req,async({documentUri:e},o)=>{let s=C.parse(e);$.debug`received request ${`GetDocumentTags`} for document ${s}`;let c=await t.ModelLocator.locateDocumentTags(s,o);return{projectId:r.ProjectsManager.ownerProjectId(s),tags:c??[]}}),e.onRequest(Mp.req,async e=>($.debug`received request ${`FetchProjectsOverview`}`,{projectsView:await t.LanguageServices.projectsOverview(e)})));function reportLayoutDrift(e){return R(e,P(e=>!!e.hasLayoutDrift),F(e=>{let r=t.ModelLocator.locateView(e.id);return U(r,`View ${e.id} not found`),{uri:r.uri,viewId:e.id,severity:Nf.DiagnosticSeverity.Warning,message:`Layout drift detected for view '${e.id}'`,range:r.range}}))}});async openView(e){let t=this.services.shared.lsp.Connection;if(!t){$.warn(`No LSP connection`);return}await t.sendNotification(vp.type,e)}};Ze();var NodeKindProvider=class{services;constructor(e){this.services=e}getSymbolKind(e){let t=Ce(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case hasType(ru,_u,Vl,zl,Ru):return et.Constructor;case hasType(Zu,$u,Qu,ku,Td):return et.Namespace;case hasType(rl):return et.Struct;case hasType(`Tag`,Hu,Il,Ed):return et.EnumMember;case hasType(pd,Cd):return et.Event;case hasType(au,Ul,xd,bd):return et.TypeParameter}return et.Field}getCompletionItemKind(e){let t=Ce(e)?e.$type:e.type,hasType=(...e)=>e.some(e=>this.services.AstReflection.isSubtype(t,e));switch(!0){case hasType(Il):return w.Color;case hasType(ru,Vl,zl,_u,Ru):return w.Constructor;case hasType(Zu,$u,Qu,ku,Td):return w.Module;case hasType(rl):return w.Class;case hasType(`Tag`,Hu,Il,Ed):return w.EnumMember;case hasType(pd,Cd):return w.Event;case hasType(au,xd,Ul,bd):return w.TypeParameter;default:return w.Reference}}},WorkspaceSymbolProvider=class extends Ge{};const Np=Y.getChild(`views`);var DefaultLikeC4Views=class extends ADisposable{services;#e;#t=new Tr(e=>new ProjectStorage({projectId:e,storage:Yn(this.#e,e),layouter:e=>this.layouter.layout(e)}));ModelBuilder;constructor(e){super(),this.services=e,this.ModelBuilder=e.likec4.ModelBuilder,this.#e=Xn(),this.onDispose(this.#e,S.create(()=>{this.#t.clear()}),e.shared.workspace.WorkspaceManager.onForceCleanCache(()=>{Np.info`force clean cache`,this.#e.clear()}),e.shared.workspace.ManualLayouts.onManualLayoutUpdate(({projectId:e,viewId:t})=>{this.#t.has(e)&&t&&this.projectStorage(e).clearView(t)}))}get layouter(){return this.services.likec4.Layouter}async computedViews(e,t){let r=await this.ModelBuilder.computeModel(e,t);return Mn(r.$data.views)}async _layoutAllViews(e,t){let r=Mn(e.$data.views);if(r.length===0)return[];let o=e.project.id,s=Np.getChild(o),c=this.projectStorage(o),u=[],d=e.$styles,p=[];for(let e of r){let t={view:e,styles:d},r=await c.get(t);if(r){p.push(r);continue}u.push(t)}if(p.length>0&&(u.length>0?s.trace`cached ${p.length} views, need to layout ${u.length} views`:s.trace`cached all ${p.length} views`),u.length>0){let e=performanceMark();await this.layouter.batchLayout({batch:u,cancelToken:t,onSuccess:(e,t)=>{p.push(c.remember(e,t))},onError:(e,t)=>{s.warn(`Fail layout view ${e.view.id}`,{error:t})}}),s.debug`layouted ${u.length} views in ${e.pretty}`}return t&&t.isCancellationRequested&&await ge(t),p.length!==r.length&&s.warn`layouted ${p.length} of ${r.length} views`,p}async layoutAllViews(e,t){let r=await this.ModelBuilder.computeModel(e,t);return await this._layoutAllViews(r,t)}async layoutView({viewId:e,layoutType:t,projectId:r,cancelToken:o,layoutHints:s}){let c=await this.ModelBuilder.computeModel(r,o),u=c.findView(e)?.$view;r=c.project.id;let d=Np.getChild(r);if(s){U(u,`View ${e} not found in model`),d.debug`using provided AI layout hints for view ${e}`;let{dot:t,diagram:r}=await this.layouter.aiLayout({view:u,styles:c.$styles},s);return{dot:t,diagram:r}}if(!u){d.warn`view ${e} not found in model`;let t=c.findManualLayout(e);if(t){d.info`found manual layout for ${e}`;let r={...t};return r.drifts=[`not-exists`],r._layout=`manual`,{diagram:r,dot:`# manual layout`}}return null}let p=this.projectStorage(r);try{let e={view:u,styles:c.$styles},r=await p.getOrExecute(e);return z(t)?{dot:r.dot,diagram:this.withLayoutType(r.diagram,c,t)}:r}catch(e){let t=loggable(e);return d.warn(t),this.reportViewError(u,r,t),Promise.reject(e)}}async diagrams(e,t){let r=await this.ModelBuilder.computeModel(e,t);return(await this._layoutAllViews(r,t)).map(({diagram:e})=>this.withLayoutType(e,r,`manual`))}async viewsAsGraphvizOut(e,t){let r=`All-LayoutedViews-DotWithSvg`,o=this.services.shared.workspace.Cache;if(o.has(r))return await Promise.resolve(o.get(r));let s=await this.ModelBuilder.computeModel(e,t),c=Mn(s.$data.views);if(c.length===0)return[];let u=c.map(async e=>{let{dot:t,svg:r}=await this.layouter.svg({view:e,styles:s.$styles});return{id:e.id,dot:t,svg:r}}),d=[],p=await Promise.allSettled(u);for(let e of p)e.status===`fulfilled`?d.push(e.value):logWarnError(e.reason);return o.set(r,d),d}async openView(e,t){await this.services.Rpc.openView({viewId:e,projectId:t})}async adhocView(e,t){Np.trace`layouting adhoc view...`;let r=await this.ModelBuilder.computeModel(t),o=Gi(r,e),{diagram:s}=await this.layouter.layout({view:{...o,hash:``,_type:`element`},styles:r.$styles});return Np.debug`layouting adhoc view... done`,s}reportViewError(e,t,r){this.projectStorage(t).reportViewError(e,()=>{this.services.shared.lsp.Connection?.window.showErrorMessage(`LikeC4: ${r}`)})}withLayoutType(e,t,r){if(!r)return e;let o=t.findManualLayout(e.id);return o?r===`manual`?e[Nr]===`manual`?(Np.error`View ${e.id} already has manual layout, this should not happen`,e):Rr(e,o):zr(e,o):e}projectStorage(e){return this.#t.get(e)}},ProjectStorage=class{#e;#t;#n;constructor(e){this.#e=Np.getChild(e.projectId),this.#t=e.storage,this.#n=e.layouter}async get(e){let t=cacheKey(e),r=await this.#t.get(t);if(r)return this.#e.trace`cache hit for ${e.view.id}`,mergeWithCachedLayout(e.view,r);this.#e.trace`cache miss for ${e.view.id}`}async getOrExecute(e){let t=cacheKey(e),r=await this.#t.get(t);if(r)return this.#e.trace`cache hit for ${e.view.id}`,mergeWithCachedLayout(e.view,r);this.#e.trace`cache miss for ${e.view.id}`;let o=performanceMark(),s=await this.#n(e);return this.#e.trace(`layouted {view} in ${o.pretty}`,{view:e.view.id}),await this.#t.set(t,s),this.resetViewError(e.view),s}remember=(e,t)=>{let r=cacheKey(e);return t&&(this.#t.set(r,t).catch(e=>{this.#e.error(e)}),this.resetViewError(e.view)),t};reportViewError(e,t){let r=`error:${e.id}`;this.#t.has(r).then(e=>{e||(this.#t.set(r,`true`),t())})}async clearView(e){this.resetViewError(e);let t=await this.#t.keys(`v:${e}:`);if(t.length!==0){this.#e.trace`clear ${t.length} cached entries for view ${e}`;for(let e of t)await this.#t.remove(e)}}clearAll(){this.#e.trace`clear caches`,this.#t.clear()}resetViewError(e){let t=typeof e==`string`?e:e.id;this.#t.del(`error:${t}`)}};function cacheKey(e){return`v:${e.view.id}:${e.view.hash}:${e.styles.fingerprint}`}function mergeWithCachedLayout(e,t){return{dot:t.dot,diagram:Lr(e,t.diagram)}}const Pp={graphviz(){return new kc}};function WithGraphviz(e){return{graphviz(){return e}}}function createLikeC4SharedModule(e){return{lsp:{NodeKindProvider:e=>new NodeKindProvider(e),WorkspaceSymbolProvider:e=>new WorkspaceSymbolProvider(e)},workspace:{Cache:e=>new Le(e,x.Validated),IndexManager:e=>new IndexManager(e),LangiumDocuments:e=>new LangiumDocuments(e),ProjectsManager:e=>new xf(e),WorkspaceManager:e=>new LikeC4WorkspaceManager(e),FileSystemProvider:t=>e.fileSystemProvider(t),FileSystemWatcher:t=>e.fileSystemWatcher(t),ManualLayouts:t=>e.manualLayouts(t)}}}function bind(e){return t=>new e(t)}function createLikeC4Module(e){return{documentation:{DocumentationProvider:bind(LikeC4DocumentationProvider)},validation:{DocumentValidator:bind(LikeC4DocumentValidator)},Rpc:bind(Rpc),likec4:{LanguageServices:bind(DefaultLikeC4LanguageServices),Graphviz:t=>e.graphviz(t),Layouter:e=>new QueueGraphvizLayoter({graphviz:e.likec4.Graphviz}),Views:bind(DefaultLikeC4Views),DeploymentsIndex:bind(DeploymentsIndex),ModelChanges:bind(LikeC4ModelChanges),FqnIndex:bind(FqnIndex),ModelParser:bind(LikeC4ModelParser),ModelBuilder:bind(DefaultLikeC4ModelBuilder),ModelLocator:bind(LikeC4ModelLocator),LastSeen:bind(LastSeenArtifacts)},lsp:{CompletionProvider:bind(LikeC4CompletionProvider),DocumentHighlightProvider:bind(LikeC4DocumentHighlightProvider),DocumentSymbolProvider:bind(LikeC4DocumentSymbolProvider),SemanticTokenProvider:bind(LikeC4SemanticTokenProvider),HoverProvider:bind(LikeC4HoverProvider),CodeLensProvider:bind(LikeC4CodeLensProvider),DocumentLinkProvider:bind(LikeC4DocumentLinkProvider),Formatter:bind(LikeC4Formatter),CodeActionProvider:bind(LikeC4CodeActionProvider)},references:{NameProvider:bind(LikeC4NameProvider),ScopeComputation:bind(LikeC4ScopeComputation),ScopeProvider:bind(LikeC4ScopeProvider)},parser:{ValueConverter:bind(LikeC4ValueConverter)}}}function createLanguageServices$1(e={},t,r,o){let s=createSharedServices(e),c=[Fe({shared:s}),ff,createLikeC4Module({...jf,...Mf,...Pp,...e}),t,r,o].reduce(_merge,{}),u=pe(c);return s.ServiceRegistry.register(u),registerValidationChecks(u),e.connection?bi(()=>s.workspace.WorkspaceManager.ready.then(()=>u.Rpc.init())):s.workspace.ConfigurationProvider.initialized({}),{shared:s,likec4:u}}t(createLanguageServices$1,`createLanguageServices`);function createSharedServices(e={}){let t={...jf,...Mf,...e};return pe(xe({...t,fileSystemProvider:()=>new NoopFileSystemProvider}),df,createLikeC4SharedModule(t))}function _merge(e,t){if(t)for(let[r,o]of Object.entries(t)){if(r===`__proto__`||r===`constructor`||r===`prototype`||o===void 0)continue;let t=Object.hasOwn(e,r),s=e[r];e[r]=t&&s!==null&&o!==null&&typeof s==`object`&&typeof o==`object`?_merge(s,o):o}return e}function configureLogger(e){let t=e?.configureLogger??!1;if(t!==!1){if(t===`stderr`){configureLanguageServerLogger({useStdErr:!0,colors:!1,logLevel:e?.logLevel});return}configureLanguageServerLogger({colors:Ri,logLevel:e?.logLevel})}}function createLanguageServices(e){let t=K.getChild(`lang`),r=_(e,{useFileSystem:!0,manualLayouts:!0,watch:!1,graphviz:`wasm`}),o=r.graphviz===`binary`;return t.info(`${$i.dim(`layout`)} ${o?`binary`:`wasm`}`),createLanguageServices$1({...r.useFileSystem?{...WithFileSystem(r.watch),...r.manualLayouts?Tf:Mf}:{...jf,...Mf},...WithGraphviz(o?new GraphvizBinaryAdapter:new kc)})}async function fromWorkspace(e,t){let r=ir(e),o=C.file(r).toString(),s=mt(o),c=K.getChild(`lang`),u=_(t,{...yc,useFileSystem:!0,manualLayouts:!0,watch:!1});configureLogger(u);let d=createLanguageServices(u),p={name:er(r),uri:s},m=d.shared.workspace.WorkspaceManager;c.info(`${$i.dim(`workspace:`)} ${r}`),m.initialize({capabilities:{},processId:null,rootUri:p.uri,workspaceFolders:[p]}),await m.initialized({});let h=d.shared.workspace.LangiumDocuments.userDocuments.toArray();if(h.length===0&&(c.error(`no LikeC4 sources found`),t?.throwIfInvalid))throw await d.likec4.likec4.LanguageServices.dispose(),Error(`no LikeC4 sources found`);return c.info(`${$i.dim(`workspace:`)} found ${h.length} source files`),handleInitOptions(d,K,t)}async function fromSources(e,t){configureLogger(t);let r=K.getChild(`lang`);return await createFromSources(createLanguageServices(_(t,{...yc,useFileSystem:!1,watch:!1,manualLayouts:!1})),r,e,t)}function fromSource(e,t){return fromSources({"source.c4":e},t)}async function writeDSL(e,t,r){let o=await e.toDSL(r?.project),s=nr(t,r?.fileName??`model.c4`);return await $n(s,o,`utf-8`),s}export{getConsoleSink as C,loggable as E,K as S,getConsoleFormatter as T,toStringLF as _,createLanguageServices$1 as a,configureLogger$1 as b,Tf as c,configureLanguageServerLogger as d,Y as f,ea as g,kc as h,writeDSL as i,Ic as l,QueueGraphvizLayoter as m,fromSources as n,WithGraphviz as o,GraphvizBinaryAdapter as p,fromWorkspace as r,WithFileSystem as s,fromSource as t,Lc as u,stripIndent as v,getAnsiColorFormatter as w,createLogger as x,$i as y};